From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <pve-devel-bounces@lists.proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68])
	by lore.proxmox.com (Postfix) with ESMTPS id 211AC20EC91
	for <inbox@lore.proxmox.com>; 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: <D0XCWYADW8SQ.1W8HI4SD4J9NO@proxmox.com>
From: "Stefan Sterz" <s.sterz@proxmox.com>
To: "Proxmox VE development discussion" <pve-devel@lists.proxmox.com>
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 <pve-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/>
List-Post: <mailto:pve-devel@lists.proxmox.com>
List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe>
Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: pve-devel-bounces@lists.proxmox.com
Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com>

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 <a.lauterer@proxmox.com>
> ---
>  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<String> {
> +    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<BTreeMap<String, BTreeMap<String, String>>> {
>      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