From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 211AC20EC91 for ; Tue, 30 Apr 2024 11:41:31 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 04A3E30124; Tue, 30 Apr 2024 11:41:41 +0200 (CEST) Mime-Version: 1.0 Date: Tue, 30 Apr 2024 11:41:04 +0200 Message-Id: From: "Stefan Sterz" To: "Proxmox VE development discussion" X-Mailer: aerc 0.17.0-69-g65571b67d7d3-dirty References: <20240430085434.86655-1-a.lauterer@proxmox.com> In-Reply-To: <20240430085434.86655-1-a.lauterer@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL -0.066 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pve-devel] [PATCH 1/2] assistant: keep prepared iso bootable on uefi with flash drives X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" On Tue Apr 30, 2024 at 10:54 AM CEST, Aaron Lauterer wrote: > By mapping files into the ISO, the UUID for the partitions change as > they depend on the timestamp. The result is, that grub cannot find its > partition anymore and the user ends up on the grub shell. > > This only happens when booting from a blockdev in UEFI mode. E.g. a USB > flash drive. Alternatively one can `dd` the ISO to a small (2GiB) VM > disk and mark it as the first boot device. > > Booting in legacy mode or via CDROM (e.g. pass through via IPMI), it > worked. > > Xorriso can report the commands needed to recreate the source ISO. The > '-volume_date uuid' is the one needed to override the same UUIDs. We > therefore read it first from the source iso and pass it as parameter > whenever we inject a file into the iso. > > Signed-off-by: Aaron Lauterer > --- > proxmox-auto-install-assistant/src/main.rs | 44 ++++++++++++++++++++-- > 1 file changed, 41 insertions(+), 3 deletions(-) > > diff --git a/proxmox-auto-install-assistant/src/main.rs b/proxmox-auto-install-assistant/src/main.rs > index 0debd29..e9213f7 100644 > --- a/proxmox-auto-install-assistant/src/main.rs > +++ b/proxmox-auto-install-assistant/src/main.rs > @@ -276,6 +276,7 @@ fn show_system_info(_args: &CommandSystemInfo) -> Result<()> { > > fn prepare_iso(args: &CommandPrepareISO) -> Result<()> { > check_prepare_requirements(args)?; > + let uuid = get_iso_uuid(&args.input)?; > > if args.fetch_from == FetchAnswerFrom::Iso && args.answer_file.is_none() { > bail!("Missing path to the answer file required for the fetch-from 'iso' mode."); > @@ -331,10 +332,15 @@ fn prepare_iso(args: &CommandPrepareISO) -> Result<()> { > instmode_file_tmp.push("auto-installer-mode.toml"); > fs::write(&instmode_file_tmp, toml::to_string_pretty(&config)?)?; > > - inject_file_to_iso(&tmp_iso, &instmode_file_tmp, "/auto-installer-mode.toml")?; > + inject_file_to_iso( > + &tmp_iso, > + &instmode_file_tmp, > + "/auto-installer-mode.toml", > + &uuid, > + )?; > > if let Some(answer_file) = &args.answer_file { > - inject_file_to_iso(&tmp_iso, answer_file, "/answer.toml")?; > + inject_file_to_iso(&tmp_iso, answer_file, "/answer.toml", &uuid)?; > } > > println!("Moving prepared ISO to target location..."); > @@ -371,11 +377,14 @@ fn final_iso_location(args: &CommandPrepareISO) -> PathBuf { > target.to_path_buf() > } > > -fn inject_file_to_iso(iso: &PathBuf, file: &PathBuf, location: &str) -> Result<()> { > +fn inject_file_to_iso(iso: &PathBuf, file: &PathBuf, location: &str, uuid: &String) -> Result<()> { > let result = Command::new("xorriso") > .arg("--boot_image") > .arg("any") > .arg("keep") > + .arg("-volume_date") > + .arg("uuid") > + .arg(uuid) > .arg("-dev") > .arg(iso) > .arg("-map") > @@ -391,6 +400,35 @@ fn inject_file_to_iso(iso: &PathBuf, file: &PathBuf, location: &str) -> Result<( > Ok(()) > } > > +fn get_iso_uuid(iso: &PathBuf) -> Result { > + let result = Command::new("xorriso") > + .arg("-dev") > + .arg(iso) > + .arg("-report_system_area") > + .arg("cmd") > + .output()?; > + if !result.status.success() { > + bail!( > + "Error determining the UUID of the source ISO: {}", > + String::from_utf8_lossy(&result.stderr) > + ); > + } > + let mut uuid = String::new(); > + for line in String::from_utf8(result.stdout)?.lines() { > + if line.starts_with("-volume_date uuid") { > + uuid = line > + .split(' ') > + .last() > + .unwrap() nit: while this probably won't happen, if xorriso ever starts returning nothing to the above command, this unwrap may panic. it might be nice to do a `ok_or_else(|| bail!("xorisso command behaved unexpectedly"))?` or similar here. > + .replace('\'', "") > + .trim() > + .into(); > + break; > + } > + } > + Ok(uuid) > +} > + > fn get_disks() -> Result>> { > let unwantend_block_devs = vec![ > "ram[0-9]*", _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel