loongson / Firmware

Firmware Of LoongArch Machines
86 stars 21 forks source link

无法在新世界固件的 A2101 主板和 L71 笔记本上启动 AOSC OS LiveKit #56

Closed MingcongBai closed 2 weeks ago

MingcongBai commented 1 year ago

AOSC OS 的 LiveKit 启动盘在搭载新世界固件的龙梦 A2101 主板和同方 L71 笔记本上启动失败,在 EFI Shell 中发现 bootloongarch64.efi 文件被截断为了 bootloon.efi 的格式。启动盘是用 grub-mkrescue 生成的,但在其他架构上没有发现这个问题(亦有可能是因为其他架构少有超过 8.3 格式的 .EFI 可执行文件名)。

有问题的 iso 可以从这里下载 https://releases.aosc.io/os-loongarch64/livekit/aosc-os_livekit_20230707_loongarch64.iso

此外,Qemu 8.0 中并不能复现这个问题。

注:笔记本机主为 @KatyushaScarlet

xry111 commented 1 year ago

我有点怀疑 AOSC 的启动盘的 ESP 是不是 FAT16……

KatyushaScarlet commented 1 year ago

以下是在L71主板上的情况: IMG_20230811_213332 ISO写入USB设备的方式为dd

xry111 commented 1 year ago

好像并不是 FAT16 的问题,因为我的 LoongArch 系统盘上 ESP 也是 FAT16 然而使用没问题……

xry111 commented 1 year ago

嘶,AOSC 的 ISO 里面 ESP 是个 FAT12 分区:

/dev/loop0p2: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "MTOO4042", sectors/cluster 2, root entries 240, sectors 5760 (volumes <=32 MB), sectors/FAT 9, sectors/track 36, serial number 0x2303281d, unlabeled, FAT (12 bit), followed by FAT

xry111 commented 1 year ago

把 ESP 弄成 FAT16,顺便把路径改成全大写试一下?

我现在只能远程访问我的 LoongArch 设备所以没法自己试:

losetup /dev/loop0 aosc-os_livekit_20230707_loongarch64.iso -P
mount -t vfat /dev/loop0p2 /mnt
cp /mnt/efi/boot/bootloongarch64.efi /tmp/BOOTLOONGARCH64.efi
umount /mnt
mkfs.vfat -F 16 /dev/loop0p2
mount -t vfat /dev/loop0p2 /mnt
mkdir -p /mnt/EFI/BOOT
cp /tmp/BOOTLOONGARCH64.efi /mnt/EFI/BOOT
umount /mnt
losetup -d /dev/loop0
MingcongBai commented 1 year ago

我手上目前也没有可以直接用的设备,或许可以等下周让 @eatradish 回家试试看 A2101 ……

另供参考:这是我们的 grub-mkrescue 参数

jiegec commented 1 year ago

但即使是 FAT12,只要能识别 LFN,文件名就是完整的。我测了一下,在 Linux 下面 mount AOSC 的 image,是可以看到完整的文件名的,说明是有 LFN。

用 QEMU+EDKII 上游固件测了一下,确实能看到完整的文件名,也可以自动启动到 LiveOS。

xry111 commented 1 year ago

但即使是 FAT12,只要能识别 LFN,文件名就是完整的。我测了一下,在 Linux 下面 mount AOSC 的 image,是可以看到完整的文件名的,说明是有 LFN。

用 QEMU+EDKII 上游固件测了一下,确实能看到完整的文件名,也可以自动启动到 LiveOS。

是的,所以这可能是个 bug,但是如果 FAT16 就能用的话可以先用着。

yetist commented 1 year ago

AOSC OS 的 LiveKit 启动盘在搭载新世界固件的龙梦 A2101 主板和同方 L71 笔记本上启动失败,在 EFI Shell 中发现 bootloongarch64.efi 文件被截断为了 bootloon.efi 的格式。启动盘是用 grub-mkrescue 生成的,但在其他架构上没有发现这个问题(亦有可能是因为其他架构少有超过 8.3 格式的 .EFI 可执行文件名)。

有问题的 iso 可以从这里下载 https://releases.aosc.io/os-loongarch64/livekit/aosc-os_livekit_20230707_loongarch64.iso

此外,Qemu 8.0 中并不能复现这个问题。

注:笔记本机主为 @KatyushaScarlet

应该是iso制作有问题

jiegec commented 1 year ago

对比 AOSC OS 和 LoongArchLinux:

NAME        FSTYPE      FSVER            LABEL       UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
loop0       iso9660                      LiveKit     2023-07-07-00-53-58-00
├─loop0p1
├─loop0p2   vfat        FAT12                        2303-281D
└─loop0p3
loop1       iso9660     Joliet Extension ARCH_202308 2023-08-04-04-53-04-00
├─loop1p1   iso9660     Joliet Extension ARCH_202308 2023-08-04-04-53-04-00
├─loop1p2   vfat        FAT16            ARCHISO_EFI 501C-4C7F
└─loop1p3
tivycc commented 1 year ago

AOSC OS 的 LiveKit 启动盘在搭载新世界固件的龙梦 A2101 主板和同方 L71 笔记本上启动失败,在 EFI Shell 中发现 bootloongarch64.efi 文件被截断为了 bootloon.efi 的格式。启动盘是用 grub-mkrescue 生成的,但在其他架构上没有发现这个问题(亦有可能是因为其他架构少有超过 8.3 格式的 .EFI 可执行文件名)。

有问题的 iso 可以从这里下载 https://releases.aosc.io/os-loongarch64/livekit/aosc-os_livekit_20230707_loongarch64.iso

此外,Qemu 8.0 中并不能复现这个问题。

注:笔记本机主为 @KatyushaScarlet

1、采用商业版昆仑固件V4.0,可以准确识别文件名。 2、移植商业版文件系统至开源BIOS,仍可复现 可以公布EFI分区制作的详细步骤,与此同时追踪BIOS识别过程

MingcongBai commented 1 year ago

另外一个案例,TC512A0 主板也有同样问题

MingcongBai commented 1 year ago

终于破案,是由于 GRUB 中的 util/grub-mkrescue.c 没有指定 ISO Level 导致的;工具似乎默认选用了 ISO Level 1,文件名限制为 8.3 长度了。给 GRUB 打如下补丁后生成的 ISO,可以在 A2101/TC512A0 上启动了:

diff -Naur grub-2.12-rc1/util/grub-mkrescue.c grub-2.12-rc1.iso-level/util/grub-mkrescue.c
--- grub-2.12-rc1/util/grub-mkrescue.c  2023-09-19 07:56:32.823829975 +0000
+++ grub-2.12-rc1.iso-level/util/grub-mkrescue.c        2023-09-19 18:09:26.979596573 +0000
@@ -514,6 +514,8 @@
   xorriso_push ("-as");
   xorriso_push ("mkisofs");
   xorriso_push ("-graft-points");
+  xorriso_push ("-iso-level");
+  xorriso_push ("3");

   iso9660_dir = grub_util_make_temporary_dir ();
   grub_util_info ("temporary iso9660 dir is `%s'", iso9660_dir);
MingcongBai commented 1 year ago

GRUB 修复已提交到上游,希望能赶上 2.12

MarsDoge commented 2 weeks ago

@MingcongBai 请确认该issues是否可以关闭?

MingcongBai commented 2 weeks ago

是的,可以关闭了,感谢提醒 @MarsDoge