mounts: implement new org.osbuild.bind mount#1711
Conversation
Similar to `stages` and `sources` we need some basic infrastructure so that we can use a `mounts_module` fixture for the coming tests to the mount modules.
This adds a new `org.osbuild.bind` mount feature to the osbuild
mount modules. This allows to (r)bind mount parts of another mount
into the tree (or replace the default tree for a stage entirely).
The use case is the `bootc install to-filesystem` where we get
a populated disk and need to do customizations directly there
without going through an intermediate tree.
Note that right now only "--rbind" is supported and used but
we could trivially change that to become an option in either
direction. Given that the main use-case right now is to be
paried with `org.osbuild.ostree.deployment` and here the
`rbind` is crucial I would leave that the default.
Here is an example what this looks like:
```json
{
"type": "org.osbuild.users",
"options": {
"users": {
"alice": {
"home": "/home/alice",
"groups": [
"wheel"
],
"password": "$6$NV3P7UzUqP3xb1ML$3qnHpWs037VRTaOc.kirQ4.RwNz4gu9dkhAhpBYVCkHw8CMhpBKnegyyqw0QfURowarZnRnQi.jo4JEzIOvPO/",
"key": "ssh-rsa AAA ... user@email.com"
}
}
},
"devices": {
"disk": {
"type": "org.osbuild.loopback",
"options": {
"filename": "disk.raw",
"partscan": true
}
}
},
"mounts": [
{
"name": "part4",
"type": "org.osbuild.ext4",
"source": "disk",
"target": "/",
"partition": 4
},
...
{
"name": "ostree.deployment",
"type": "org.osbuild.ostree.deployment",
"options": {
"source": "mount",
"deployment": {
"default": true
}
}
},
{
"name": "bind",
"type": "org.osbuild.bind",
"target": "tree://",
"options": {
"source": "mount://"
}
}
]
},
```
|
It would be cool to be able to do something like this, but rather define it at the pipeline level such that the |
This idea did come up while we were discussing approaches for this problem. What I like about the solution in the PR though is that it requires very minimal changes (none of which are internal to osbuild's core) and fits a lot cleaner into the current flow. There's definitely something a bit more elegant to your proposed solution though. The general principle that pipelines operate on a single tree is maintained and it makes it easier to reason about when that holds. |
[draft: to get early feedback, I think adding a few more test cases would make sense here too but it should be okay]
[edit: the remaining issue is that org.osbuild.user may need to be able to create /var/home as useradd will not follow symlinks when creating dirs]
This adds a new
org.osbuild.bindmount feature to the osbuildmount modules. This allows to (r)bind mount parts of another mount
into the tree (or replace the default tree for a stage entirely).
The use case is the
bootc install to-filesystemwhere we geta populated disk and need to do customizations directly there
without going through an intermediate tree.
Note that right now only "--rbind" is supported and used but
we could trivially change that to become an option in either
direction. Given that the main use-case right now is to be
paried with
org.osbuild.ostree.deploymentand here therbindis crucial I would leave that the default.Here is an example what this looks like:
{ "type": "org.osbuild.users", "options": { "users": { "alice": { "home": "/home/alice", "groups": [ "wheel" ], "password": "$6$NV3P7UzUqP3xb1ML$3qnHpWs037VRTaOc.kirQ4.RwNz4gu9dkhAhpBYVCkHw8CMhpBKnegyyqw0QfURowarZnRnQi.jo4JEzIOvPO/", "key": "ssh-rsa AAA ... user@email.com" } } }, "devices": { "disk": { "type": "org.osbuild.loopback", "options": { "filename": "disk.raw", "partscan": true } } }, "mounts": [ { "name": "part4", "type": "org.osbuild.ext4", "source": "disk", "target": "/", "partition": 4 }, ... { "name": "ostree.deployment", "type": "org.osbuild.ostree.deployment", "options": { "source": "mount", "deployment": { "default": true } } }, { "name": "bind", "type": "org.osbuild.bind", "target": "tree://", "options": { "source": "mount://" } } ] },