Support a manifest line syntax for mounting from and to /sysroot

After a resource image has bind mounted directories to the /sysroot
tree, this new syntax makes it possible to then mount further directories
from /sysroot on top of the newly mounted tree.
This commit is contained in:
Bruce Leidl 2020-12-07 17:15:14 -05:00
parent ac46b45f05
commit ecca0f5002

View File

@ -299,28 +299,47 @@ impl ResourceImage {
} }
// Process a single line from the resource image manifest file. // Process a single line from the resource image manifest file.
//
// Each line describes a bind mount from the resource image root to the system root fs. // Each line describes a bind mount from the resource image root to the system root fs.
// The line may contain either a single path or a pair of source and target paths separated by the colon (':') character. //
// The line may contain either a single path or a pair of source and target paths separated by
// the colon (':') character.
//
// If no colon character is present then the source and target paths are the same. // If no colon character is present then the source and target paths are the same.
// The source path from the mounted resource image will be bind mounted to the target path on the system rootfs. //
// The source path from the mounted resource image will be bind mounted to the target path on
// the system rootfs (unless the source path begins with '/sysroot' in which case both the source
// and target are paths on the system rootfs).
//
fn process_manifest_line(&self, line: &str) -> Result<()> { fn process_manifest_line(&self, line: &str) -> Result<()> {
let line = line.trim_start_matches('/');
let (path_from, path_to) = if line.contains(':') { let (path_from, path_to) = if line.contains(':') {
let v = line.split(':').collect::<Vec<_>>(); let v = line.split(':').collect::<Vec<_>>();
if v.len() != 2 { if v.len() != 2 {
bail!("badly formed line '{}'", line); bail!("badly formed line '{}'", line);
} }
(v[0], v[1].trim_start_matches('/')) (v[0], v[1])
} else { } else {
(line, line) (line,line)
}; };
let from = self.mount_path().join(path_from); let from = if path_from.starts_with("/sysroot/") {
let to = Path::new("/sysroot").join(path_to); Path::new(path_from).to_owned()
} else {
self.mount_path().join(path_from.trim_start_matches('/'))
};
info!("Bind mounting {} to {} from manifest", from.display(), to.display()); let to = Path::new("/sysroot").join(path_to.trim_start_matches("/"));
util::mount(&from.to_string_lossy(), to, Some("--bind"))
if !from.exists() {
warn!("Skipping bind mount of {} to {} because source path does not exist", from.display(), to.display());
} else if !to.exists() {
warn!("Skipping bind mount of {} to {} because target path does not exist", from.display(), to.display());
} else {
info!("Bind mounting {} to {} from manifest", from.display(), to.display());
util::mount(&from.to_string_lossy(), to, Some("--bind"))?;
}
Ok(())
} }
// If the /storage directory is not mounted, attempt to mount it. // If the /storage directory is not mounted, attempt to mount it.