lanzatool: detrashify
This commit is contained in:
parent
de451fa5af
commit
5dbb8e7452
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"v1": {
|
||||
"init": "/nix/store/7zrsjhxi0c93m2l89rj8jdp9khm8fc6s-nixos-system-tuxedo-22.11.20221115.85d6b39/init",
|
||||
"initrd": "/nix/store/7a4plccwni1sldhyra75f7m44xgsgiqw-initrd-linux-6.0.8/initrd",
|
||||
"kernel": "/nix/store/nsw0422iwp4linayqx727pi4fdyja0wv-linux-6.0.8/bzImage",
|
||||
"init": "/run/current-system/init",
|
||||
"initrd": "/run/current-system/initrd",
|
||||
"kernel": "/run/current-system/kernel",
|
||||
"kernelParams": [
|
||||
"amd_iommu=on",
|
||||
"amd_iommu=pt",
|
||||
|
@ -13,12 +13,12 @@
|
|||
"systemd.unified_cgroup_hierarchy=1",
|
||||
"loglevel=4"
|
||||
],
|
||||
"label": "NixOS 21.11.20210810.dirty (Linux 5.15.30)",
|
||||
"toplevel": "/nix/store/7zrsjhxi0c93m2l89rj8jdp9khm8fc6s-nixos-system-tuxedo-22.11.20221115.85d6b39",
|
||||
"label": "LanzaOS",
|
||||
"toplevel": "/run/current-system",
|
||||
"extension": {
|
||||
"esp": "test",
|
||||
"bootctl": "/nix/store/89366aivz6v8a34yyni2m04ca9hwrl92-systemd-250.4/bin/bootctl",
|
||||
"osRelease": "/nix/store/734vglb01ssz73wlihad7xa9yzvwlvx6-etc-os-release"
|
||||
"esp": "esp",
|
||||
"bootctl": "/run/current-system/sw/bin/bootctl",
|
||||
"osRelease": "/etc/os-release"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@ pub fn install(_: &Path, bootspec: &Path, lanzaboote_bin: &Path) -> Result<()> {
|
|||
&esp_paths.kernel,
|
||||
&esp_paths.initrd,
|
||||
)
|
||||
.unwrap();
|
||||
.expect("Failed to assemble stub");
|
||||
|
||||
// Copy the files to the ESP
|
||||
fs::create_dir_all(&esp_paths.nixos)?;
|
||||
|
|
|
@ -18,20 +18,29 @@ pub fn assemble(
|
|||
let kernel_cmdline_file = Path::new("/tmp/kernel_cmdline");
|
||||
fs::write(kernel_cmdline_file, kernel_cmdline.join(" "))?;
|
||||
let kernel_path_file = Path::new("/tmp/kernel_path");
|
||||
fs::write(kernel_path_file, kernel_path.to_str().unwrap())?;
|
||||
fs::write(kernel_path_file, path_to_string(kernel_path))?;
|
||||
let initrd_path_file = Path::new("/tmp/initrd_path");
|
||||
fs::write(initrd_path_file, initrd_path.to_str().unwrap())?;
|
||||
fs::write(initrd_path_file, path_to_string(initrd_path))?;
|
||||
|
||||
let pe_binary = fs::read(lanzaboote_bin)?;
|
||||
let pe = goblin::pe::PE::parse(&pe_binary)?;
|
||||
|
||||
let image_base = pe
|
||||
.header
|
||||
.optional_header
|
||||
.expect("Failed to find optional header, you're fucked")
|
||||
.windows_fields
|
||||
.image_base;
|
||||
|
||||
let os_release_offs = u64::from(
|
||||
pe.sections
|
||||
.iter()
|
||||
.find(|s| s.name().unwrap() == ".sdmagic")
|
||||
.and_then(|s| Some(s.size_of_raw_data + s.virtual_address))
|
||||
.unwrap(),
|
||||
.last()
|
||||
.and_then(|s| Some(s.virtual_size + s.virtual_address))
|
||||
.expect("Failed to find the offset"),
|
||||
);
|
||||
// The Virtual Memory Addresss (VMA) is relative ot the image base, aka the image base
|
||||
// needs to be added to the virtual address to get the actual (but still virtual address)
|
||||
let os_release_offs = os_release_offs + image_base;
|
||||
|
||||
let kernel_cmdline_offs = os_release_offs + file_size(os_release)?;
|
||||
let initrd_path_offs = kernel_cmdline_offs + file_size(kernel_cmdline_file)?;
|
||||
|
@ -54,8 +63,8 @@ pub fn assemble(
|
|||
format!(".kernelp={}", path_to_string(kernel_path_file)),
|
||||
String::from("--change-section-vma"),
|
||||
format!(".kernelp={:#x}", kernel_path_offs),
|
||||
lanzaboote_bin.to_str().unwrap().to_owned(),
|
||||
String::from("stub.efi"),
|
||||
path_to_string(lanzaboote_bin),
|
||||
String::from("lanzaboote-image.efi"),
|
||||
];
|
||||
|
||||
let status = Command::new("objcopy").args(&args).status()?;
|
||||
|
@ -68,7 +77,13 @@ pub fn assemble(
|
|||
|
||||
// All Linux file paths should be convertable to strings
|
||||
fn path_to_string(path: &Path) -> String {
|
||||
path.to_owned().into_os_string().into_string().unwrap()
|
||||
path.to_owned()
|
||||
.into_os_string()
|
||||
.into_string()
|
||||
.expect(&format!(
|
||||
"Failed to convert path '{}' to a string",
|
||||
path.display()
|
||||
))
|
||||
}
|
||||
|
||||
fn file_size(path: &Path) -> Result<u64> {
|
||||
|
|
Loading…
Reference in New Issue