secure boot 与 openSUSE 似乎水火不容

这个问题我已经折腾了整整3天了,朝九晚十那种。
我黑五打折新买了一块sata固态硬盘用来装linux,打算用一个lvm容器装opensuse和ubuntu,ubuntu装上了,没有任何毛病。opensuse我把secure boot也装上了,但是secure boot一开,不管是opensuse的系统还是安装盘都不好使,电脑直接卡在那,键盘的numlock和capslock等3个灯可以开关,也可以用ctrl+alt+delete重启,但打死也进不去。我试过以下方法:

  1. 重装,tw、leap 42和15都试过
  2. 自己给内核签名并导入db、KEK
  3. 从/usr/lib64/efi/里换来opensuse单签名的shim,且把opensuse的公钥放到secure boot的db,KEK里
  4. 清空dbx黑名单
  5. 清空了整个secure boot凭据库(这么干和关闭secure boot没区别,虽然可以启动但是系统内mokutil显示secure boot未启用)
  6. 把EFI分区下opensuse的每一个efi文件都添加到db里
  7. 把ubuntu的shim给opensuse用,但是卡进了grub rescue里
  8. 关闭secure boot把我能找到的所有的密钥文件一个一个导入到MOK里,重启后会显示“按任意建来修改MOK”,我按了它就卡那了,再按一下回车又正常启动了。我还尝试过用uefi自带的shell来启动MokManagement.efi,效果是一样的,如果secure boot开启直接卡死,没开就正常启动。
  9. 更新最新UEFI固件并将以上方法全部重试。

我找遍了我能找的所有资料,大学的图书馆都找了,试过了所有的方法,结论就是secure boot与opensuse水火不容。

至于我为什么对secure boot这么执着,是因为我另一块nvme固态装了windows而且开了bitlocker,secure boot不能关,secure boot不能关,secure boot不能关,因为恢复密钥我找不到了。。。。。。

我把同样的安装盘放到我平时学习用的一个secure boot关不掉的Windows 10平板上,UEFI还是什么东西问了一句是否信任这个盘,我选了yes就直接安装了,一点毛病都没有。。。从此开始我觉得可能是我这台电脑的问题

配置:
AMD Ryzen 5 1600, 华擎AB350-ITX/ac, AMD Radeon RX580,
WD Black 250GB NVMe SSD, 金士顿 240GB SATA SSD, 希捷 2TB 普通硬盘

硬盘情况:

tommyvct@RYZEN-TOMMYVCT-UBUNTU:~$ lsblk
NAME                 MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                  7:0    0  87.9M  1 loop /snap/core/5662
loop1                  7:1    0  42.1M  1 loop /snap/gtk-common-themes/701
loop2                  7:2    0   2.3M  1 loop /snap/gnome-calculator/260
loop3                  7:3    0    45M  1 loop /snap/core18/442
loop4                  7:4    0  34.6M  1 loop /snap/gtk-common-themes/818
loop5                  7:5    0   3.7M  1 loop /snap/gnome-system-monitor/57
loop6                  7:6    0 135.8M  1 loop /snap/discord/79
loop7                  7:7    0 140.9M  1 loop /snap/gnome-3-26-1604/70
loop8                  7:8    0 173.3M  1 loop /snap/spotify/26
loop9                  7:9    0    13M  1 loop /snap/gnome-characters/124
loop10                 7:10   0 140.7M  1 loop /snap/gnome-3-26-1604/74
loop11                 7:11   0 195.2M  1 loop /snap/vlc/555
loop12                 7:12   0   481M  1 loop /snap/intellij-idea-community/101
loop13                 7:13   0   2.3M  1 loop /snap/gnome-calculator/238
loop14                 7:14   0  14.5M  1 loop /snap/gnome-logs/45
loop15                 7:15   0 135.8M  1 loop /snap/discord/82
loop16                 7:16   0  88.2M  1 loop /snap/core/5897
loop17                 7:17   0    13M  1 loop /snap/gnome-characters/139
sda                    8:0    0 223.6G  0 disk 
├─sda1                 8:1    0   512M  0 part /boot/efi
└─sda2                 8:2    0 223.1G  0 part 
  ├─harmony-ubuntu_root
  │                  253:0    0    65G  0 lvm  /
  ├─harmony-ubuntu_swap
  │                  253:1    0   976M  0 lvm  [SWAP]
  ├─harmony-opensuse_swap
  │                  253:2    0     1G  0 lvm  
  ├─harmony-harmony_home
  │                  253:3    0  91.1G  0 lvm  /home
  └─harmony-opensuse_root
                 253:4    0    65G  0 lvm  
sdb                    8:16   0   1.8T  0 disk 
└─sdb1                 8:17   0   1.8T  0 part 
nvme0n1              259:0    0 238.5G  0 disk 
├─nvme0n1p1          259:1    0   499M  0 part 
├─nvme0n1p2          259:2    0   100M  0 part 
├─nvme0n1p3          259:3    0    16M  0 part 
├─nvme0n1p4          259:4    0 237.1G  0 part 
└─nvme0n1p5          259:5    0   819M  0 part

tommyvct@RYZEN-TOMMYVCT-UBUNTU:~$ sudo fdisk -l
[sudo] password for tommyvct:
Disk /dev/loop0: 87.9 MiB, 92123136 bytes, 179928 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop1: 42.1 MiB, 44183552 bytes, 86296 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop2: 2.3 MiB, 2355200 bytes, 4600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop3: 45 MiB, 47235072 bytes, 92256 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop4: 34.6 MiB, 36216832 bytes, 70736 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop5: 3.7 MiB, 3878912 bytes, 7576 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop6: 135.8 MiB, 142352384 bytes, 278032 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop7: 140.9 MiB, 147722240 bytes, 288520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/nvme0n1: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8564D689-2B54-4244-8FD4-2F6435181C66

Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 1023999 1021952 499M Windows recovery environment
/dev/nvme0n1p2 1024000 1228799 204800 100M EFI System
/dev/nvme0n1p3 1228800 1261567 32768 16M Microsoft reserved
/dev/nvme0n1p4 1261568 498437106 497175539 237.1G Microsoft basic data
/dev/nvme0n1p5 498438144 500115455 1677312 819M Windows recovery environment

Disk /dev/sda: 223.6 GiB, 240057409536 bytes, 468862128 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 35A9CAE9-93B9-42B7-8A2F-F05BCA0791AB

Device Start End Sectors Size Type
/dev/sda1 2048 1050623 1048576 512M EFI System
/dev/sda2 1050624 468860927 467810304 223.1G Linux LVM

Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x4c30baad

Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 3907026943 3907024896 1.8T 7 HPFS/NTFS/exFAT

Disk /dev/mapper/harmony-ubuntu_root: 65 GiB, 69793218560 bytes, 136314880 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/harmony-ubuntu_swap: 976 MiB, 1023410176 bytes, 1998848 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop8: 173.3 MiB, 181735424 bytes, 354952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop9: 13 MiB, 13619200 bytes, 26600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop10: 140.7 MiB, 147496960 bytes, 288080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop11: 195.2 MiB, 204644352 bytes, 399696 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop12: 481 MiB, 504303616 bytes, 984968 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop13: 2.3 MiB, 2355200 bytes, 4600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop14: 14.5 MiB, 15208448 bytes, 29704 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop15: 135.8 MiB, 142352384 bytes, 278032 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop16: 88.2 MiB, 92483584 bytes, 180632 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop17: 13 MiB, 13619200 bytes, 26600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/harmony-opensuse_swap: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/harmony-harmony_home: 91.1 GiB, 97832140800 bytes, 191078400 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/harmony-opensuse_root: 65 GiB, 69793218560 bytes, 136314880 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

理论上是不可能的,因为就连 /boot 在 LVM 里的都已经支持了:

https://bugzilla.opensuse.org/show_bug.cgi?id=917427

所以我觉得是 shim 的问题,可能你后装 Ubuntu 的话这个问题你就要发到那边去了…可能你需要用先装的那个系统的 shim 里的 builitin key(Canonical 的或者 SUSE 的)去 sign 后装的那个系统的 grubx64.efi。而且后装的系统是不能用官方 ISO 直接装的,因为里面的 grub2 不是用那个 key sign 的。而且无论你装几个系统,shim 只能有一个。所以针对后装的系统,你可能需要定制一下 ISO:不装 shim,同时把用自己提取出来的 key sign 的 grub2 放进去。

这有一张次序图,不过是俄文的,但是你应该能看明白:

解决思路1:
这个教程应该能用的上
我现在的思路是,能在secure boot开启的情况下启动opensuse安装u盘就是大胜利
image
我用ubuntu的shim里的内置密钥来对这里所有的EFI按照上面的教程全部签名
理想的效果就是这几个EFI跟ubuntu的签名一样,因为ubuntu能启动,所以签名后的EFI也应该能启动
那么现在阻止我的最大问题就是ubuntu的shim密钥到哪里找?

解决思路2:
我更新了一下Ubuntu的grub,现在Ubuntu的grub菜单里有了opensuse的选项,点进去会提示找不到内核和内存盘
这个grub有毒,只认ubuntu的根分区为root,我把opensuse的boot整个拷贝到ubuntu的boot下一个新目录后再去试图加载opensuse内核,结果提示签名无效

解决思路3:
用ubuntu的grub来引导opensuse的grub
在grub2下chainload opensuse的grub,每个efi都试了,要么提示double free要么alloc magic broken

解决思路4:
用ubuntu的内核引导opensuse
好像是我没用对,我手动命令行启动但是我怎么也找不到内核在哪

我觉得还是这个思路比较靠谱,签名无效我可以找opensuse官方内核的签名(因为我用的就是官方内核)用MoKutil导入
总的来说就是不要suse的任何bootloader,全交给ubuntu的grub2来处理,因为这个bootloader有shim,能正常启动
那么现在问题变成了如何正确配置ubuntu的grub来启动suse,我自己凭直觉瞎配和ubuntu更新grub自动检测外来系统生成的配置是一样的,就是不好使

@tommyvct

secure boot 是这样的,Windows 固件内置了一个 key, Ubuntu 的 shim 内置了 Canonical 的 key,引导时候会用这两个 key 来校验 grub2,然后是 kernel(注意还有 kernel,就是 initrd 和 vmlinuz。我看你一直在搞 grub2 的 efi 而忽略了这个)。添加新的 key 是用 MOKManager。但是注意:

shim 只能装一个,也就是说现在 Ubuntu 的 key 已经确定了。这个 key 只签名了 Ubuntu 的 grub2 efi 和内核。也只能用来校验 Ubuntu 的 grub2 efi。也就是说,如果你搞不到 Canonical 的 key,你签不了 openSUSE 的 grub2,openSUSE 也就既不能带 shim 也不能带 grub2。

于是给你的思路查缺补漏一下:

解决思路一:

安装介质和安装后的都要签名。只签名介质只能引导安装,但装好的不能启动。至于 Canonical key 在哪里,我提示一下,shim 是不会把所有大的小的发行版的 key 搜硬编码的,它本身也是一个需要编译的软件,比如 openSUSE 的 cert 和 signature 就在这儿:

我觉得你能搞这个多装,应该也是有一定技术自信的人啦,你看下对应的 shim.spec 就能明白我们的 key 是怎么编译进去的。同样找到 Ubuntu 的 shim 包也一定能够提取出 key pair 的。

然后要把安装介质里的签了,安装,安装时注意不能和 Ubuntu 的 /boot 装到一个盘(因为比如 /boot/grub2/grub.cfg 这些是同名的会覆盖),而且不能勾选写入到磁盘头部(因为 Ubuntu 的已经写了),其实与其这么多注意,还不如不安装 openSUSE 的 grub2 了。安装完肯定进不去,需要先进 Ubuntu 去签名安装好的 openSUSE 的 grub2 和 kernel。然后就是方法三了。

解决思路二:

裁剪 openSUSE 的 ISO,或者直接定制选项(可以实现),不安装 grub2 和 shim。然后把 openSUSE 的 initrd 和 vmlinuz(可能还有别的)用 Ubuntu 的 shim key 签名了。然后配置用 Ubuntu 的 grub2 引导 openSUSE。

解决思路4 是实现不了的。因为 vmlinuz 和 kernel 是一一对应的,kernel 不只是 vmlinuz 还有 /lib/modules 下的东西,硬链接的。你引导 Ubuntu 的 vmlinuz 要的就是 Ubuntu 的 root 分区下的 /lib/modules,那样又引导 Ubuntu 了。

我还有一个解决思路五:

openSUSE 不安装 shim 和 grub2,用 Ubuntu 的,也不去找 shim key 了。直接自己做一个,然后把 key pair 导入到 MOK 的 db。用自己做的 key 去签名 openSUSE 的内核。然后用 Ubuntu 的 grub2 去引导 openSUSE 的内核。

https://en.opensuse.org/openSUSE:UEFI#Booting_a_custom_kernel

2赞

神奇的玛丽苏,百科全书玛丽苏

2赞

Ubuntu 引导 openSUSE 的内核可以这么做,openSUSE 不装 shim 和 grub2。先把 boot 选到 / 里面,然后回 Ubuntu 挂载 openSUSE 根分区。把 /boot 下面的 initrd 和 vmlinuz 复制到 Ubuntu 的 /boot。然后在 Ubuntu 下面去 grub2-mkconfig -o /boot/grub2/grub.cfg。然后修改下那个 grub.cfg,我传了一份我的 openSUSE 的 grub.cfg,对应的 menuentry 可以比对的:https://transfer.sh/NQ6XT/grub.cfg

menuentry 'openSUSE Tumbleweed' --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-8ced0bbc-e7fe-422d-8de0-762ca3b8f7be' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_gpt
    insmod btrfs
    set root='hd1,gpt4'
    if [ x$feature_platform_search_hint = xy ]; then
        search --no-floppy --fs-uuid --set=root --hint-bios=hd1,gpt4 --hint-efi=hd1,gpt4 --hint-baremetal=ahci1,gpt4 8ced0bbc-e7fe-422d-8de0-762ca3b8f7be
    else
        search --no-floppy --fs-uuid --set=root 8ced0bbc-e7fe-422d-8de0-762ca3b8f7be
    fi
    echo '载入 Linux 4.19.4-1-default ...'
    linuxefi /boot/vmlinuz-4.19.4-1-default root=UUID=8ced0bbc-e7fe-422d-8de0-762ca3b8f7be ${extra_cmdline} quiet splash=silent resume=/dev/disk/by-uuid/1cdfd0db-6a71-4f3d-8c6e-bcb3ed87cf70 showopts plymouth.enable=0 nomodeset
    echo ‘载入初始化内存盘....’
    initrdefi /boot/initrd-4.19.4-1-default
}

记得 menuentry 里的 hd1,gpt4 和 8ced0bbc-e7fe-422d-8de0-762ca3b8f7be 这些你需要修改一下(sudo blkid 可以看到)。

然后 chroot 到 openSUSE 的根分区去,修改 /etc/fstab,把 /boot 修改为 Ubuntu 的 /boot 分区,然后把 openSUSE 根分区下的 /boot 备份后删除。

1赞

这样的话我就只需要签名两个拷过去的内核文件就ok了?
用哪对证书文件对opensuse的内核签名更靠谱(启动失败率更低),Canonical的还是自己造的?
直接把opensuse的那对证书文件导入mok可以么?

/boot 下有这些内容:

boot.readme
message
symvers-4.19.4-1-default.gz
vmlinux-4.19.4-1-default.gz
config-4.19.4-1-default
sysctl.conf-4.19.4-1-default
initrd-4.19.4-1-default
symtypes-4.19.4-1-default.gz
System.map-4.19.4-1-default 
vmlinuz-4.19.4-1-default

都要拷贝过去,但是我感觉只有这几个需要签:

vmlinux-4.19.4-1-default.gz
initrd-4.19.4-1-default
vmlinuz-4.19.4-1-default
1赞

谢谢女王大人,我明天再研究一下
人在加拿大,该睡觉了,哈哈

1赞

成了!但是装出来的系统有很多问题

  1. opensuse下/boot分区下有一个@文件夹,里面是ubuntu的root,并没有直接挂载在(lvm/harmony-ubuntu_root)/boot上,而是直接挂在了(lvm/harmony-ubuntu_root)上,所以更新内核的时候新的内核被直接放在/boot里的,我需要手动把几个内核文件拷到ubuntu的boot里,再去改grub才能算是成功升级
  2. opensuse下/home分区同样有一个@文件夹,里面有ubuntu的/home分区,而且可以访问;ubuntu下只能看到ubuntu自己的home,看不到也没法访问opensuse的home。这是不对的,我安装的时候opensuse的home是和ubuntu用一个,兄弟关系,为什么打起架来了呢?(有可能我2个系统用的用户名是同一个的原因。。。。)
  3. 调试grub脚本的时候我就看到过/@/boot这种写法,我严重怀疑opensuse里的@就是grub给的
  4. opensuse自带的amdgpu驱动报错,没有运行,界面非常卡,估计是因为内核的位置有问题造成的
  5. 关机关不上,tty1 会提示一些像是某个程序hang超过了280秒之类的,但就是不关机
    其实我感觉最大的问题可能就在于fstab怎么写的,我可能就没写对

/dev/harmony/opensuse_root / btrfs defaults 0 0
/dev/harmony/opensuse_swap swap swap defaults 0 0
/dev/harmony/opensuse_root /var btrfs subvol=/@/var 0 0
/dev/harmony/opensuse_root /usr/local btrfs subvol=/@/usr/local 0 0
/dev/harmony/opensuse_root /tmp btrfs subvol=/@/tmp 0 0
/dev/harmony/opensuse_root /srv btrfs subvol=/@/srv 0 0
/dev/harmony/opensuse_root /root btrfs subvol=/@/root 0 0
/dev/harmony/opensuse_root /opt btrfs subvol=/@/opt 0 0
/dev/harmony/harmony_home /home btrfs defaults 0 0
/dev/harmony/harmony_home /home/@home btrfs subvol=/@home 0 0
/dev/harmony/ubuntu_root /boot btrfs defaults 0 0

这个是我的grub脚本,我觉得奇怪的@就是从这来的
https://transfer.sh/Cqb2L/grub.cfg

@tommyvct

我怀疑是跟 lvm 和 btrfs 有关。btrfs 是不能单独挂载子卷的,lvm 应该也不能把逻辑分区挑几个单独挂载。就是先挂母卷,再挂子卷;先挂扩展分区,再挂逻辑分区。这个过程中造成了同一母卷、同一扩展分区的内容可见。至于那个 @ 可能是 lvm 的符号

你把你的 lvm 信息和你 Ubuntu 的 /etc/fstab 也让我看看。

啥?
btrfs还分子母卷??
整个盘成了个俄罗斯套娃???
GPT表还有扩展和逻辑分区????
蒙蔽ing
目前这个opensuse肯定不能用,我已经打算考完试重装了

我有点后悔当时装ubuntu的时候没把boot单独分区
我把/boot/efi分出lvm vg外是没问题的
我在想如果我把每个系统的/boot都单分个区,是不是就能规避这个问题?
EFI分区启动grub,grub读取(lvm/harmony-ubuntu_boot)/grub里的配置文件,程序走完显示菜单,选择ubuntu就加载(lvm/harmony-ubuntu_boot)里的内核,选择opensuse就加载(lvm/harmony-opensuse_boot)里的内核,完全独立互不干扰。
suse如果更新官方内核就直接更新(因为db里有suse的证书),如果需要自定义内核就麻烦一点,自己造一个导入db
ubuntu更新就直接走mokmanager

$ sudo pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               harmony
  PV Size               <223.07 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              57105
  Free PE               0
  Allocated PE          57105
  PV UUID               9NvQgj-8SrU-bNlk-tFRk-W7D0-HBx7-psp1s0
   
$ sudo vgdisplay 
  --- Volume group ---
  VG Name               harmony
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  15
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                5
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <223.07 GiB
  PE Size               4.00 MiB
  Total PE              57105
  Alloc PE / Size       57105 / <223.07 GiB
  Free  PE / Size       0 / 0   
  VG UUID               n2BK6H-gqum-F0YV-3Lz5-vW4P-vy7t-Wkvwdb
   
$ sudo lvdisplay 
  --- Logical volume ---
  LV Path                /dev/harmony/ubuntu_root
  LV Name                ubuntu_root
  VG Name                harmony
  LV UUID                QzAYQ9-CeG7-sGFc-9Jo9-Nmwz-xVhb-YkZuHO
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2018-11-27 04:23:26 -0600
  LV Status              available
  # open                 1
  LV Size                65.00 GiB
  Current LE             16640
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/harmony/ubuntu_swap
  LV Name                ubuntu_swap
  VG Name                harmony
  LV UUID                vCfJ0s-b5E4-MJt4-tOmu-53Am-N3Wi-B2223o
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2018-11-27 04:23:26 -0600
  LV Status              available
  # open                 2
  LV Size                976.00 MiB
  Current LE             244
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
   
  --- Logical volume ---
  LV Path                /dev/harmony/opensuse_swap
  LV Name                opensuse_swap
  VG Name                harmony
  LV UUID                qdnE1K-iqLZ-kO4t-aZNx-db3E-UKcZ-NuDQe5
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2018-11-27 04:46:13 -0600
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/harmony/harmony_home
  LV Name                harmony_home
  VG Name                harmony
  LV UUID                irC20q-kxrL-mtoS-20P0-7bFa-yg0H-dzEGKk
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2018-11-27 04:48:09 -0600
  LV Status              available
  # open                 1
  LV Size                91.11 GiB
  Current LE             23325
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3
   
  --- Logical volume ---
  LV Path                /dev/harmony/opensuse_root
  LV Name                opensuse_root
  VG Name                harmony
  LV UUID                nht5lP-00LG-O9H0-txds-9ORU-hj23-WO1tya
  LV Write Access        read/write
  LV Creation host, time install, 2018-11-30 20:17:22 -0600
  LV Status              available
  # open                 0
  LV Size                65.00 GiB
  Current LE             16640
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:4
  
$ sudo cat /etc/fstab 
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system>                     <mount point>       <type>       <options>            <dump>  <pass>
/dev/mapper/harmony-ubuntu_root           /              btrfs   defaults,subvol=@           0      1
# /boot/efi was on /dev/sda1 during installation
UUID=2477-9E71                        /boot/efi          vfat        umask=0077              0      1
/dev/mapper/harmony-harmony_home        /home           btrfs   defaults,subvol=@home        0      2
/dev/mapper/harmony-ubuntu_swap          none            swap            sw                  0      0

可能我没说清楚,比如你把 /dev/sda5 格式化成 btrfs,/var 是一个 btrfs 子卷,你不能不挂 sda5 直接挂 /var 吧,因为真实数据还是存在 /dev/sda5 上的。同样的好比 / 是 vg 上的一个分区,你不能不挂 vg 直接把 / 挂上吧。这时候假设 /dev/sda5 和 vg 上有别的东西,是不是也可见了?

至于你后面说的东西,/boot 在 vg 里也是同样的实现,没必要单独分区啊,另外我看了,其实 swap 也没必要搞两个的。

正确的 openSUSE 的 /etc/fstab 应该是这样:

UUID=2477-9E71                        /boot/efi          vfat        umask=0077              0      0
/dev/mapper/harmony-opensuse_root / btrfs defaults,subvol=@ 0 1
/dev/mapper/harmony-ubuntu_swap swap swap defaults 0 0
/dev/mapper/harmony-boot /boot vfat umask=0777 0 0
/dev/mapper/harmony-opensuse_root /var btrfs subvol=/@/var 0 0
/dev/mapper/harmony-opensuse_root /usr/local btrfs subvol=/@/usr/local 0 0
/dev/mapper/harmony-opensuse_root /tmp btrfs subvol=/@/tmp 0 0
/dev/mapper/harmony-opensuse_root /srv btrfs subvol=/@/srv 0 0
/dev/mapper/harmony-opensuse_root /root btrfs subvol=/@/root 0 0
/dev/mapper/harmony-opensuse_root /opt btrfs subvol=/@/opt 0 0
/dev/mapper/harmony-harmony_home /home btrfs subvol=@home 0 2

之前的有这些问题:

/dev/harmony/opensuse_root 这种格式是挂载完的。也就是说 lvm 是 Ubuntu 的 grub2 挂载上的。/dev/mapper/harmony-opensuse_root 这种才是没挂载的。我觉得应该是用这种格式(但 openSUSE 的 initrd 里面要有 lvm 相关的内核模块)。

/dev/harmony/harmony_home /home btrfs defaults 0 0
/dev/harmony/harmony_home /home/@home btrfs subvol=/@home 0 0
/dev/harmony/ubuntu_root /boot btrfs defaults 0 0

现在坑的地方在这里。第一的 harmony_home 挂载了两次。都是同一个东西。第三行把 harmony-ubuntu_root 挂载为 openSUSE 下的 /boot,这家伙在 Ubuntu 下是 /。这个是目前无解的地方。

我一直假设你有一个单独的 /boot 分区(不管是在 lvm 里面还是外面),结果你没有 :joy: 结果就是我建议你把 initrd 和 vmlinuz 放到 /boot 里,但这个 /boot 跟 Ubuntu 的 / 是同一个盘,它无法独立到 openSUSE 中。所有你遇到的情况都是预期的,所以你没有必要重装,解决方法我想应该是这样(你也许需要先做一个 openSUSE rescue system 以防万一):

首先进 Ubuntu,用 vg 相关的命令把 harmony-opensuse_swap 给格式化了,然后挂载,把 Ubuntu 的 /boot 下除了 /boot/efi 以外的东西全部复制过去。然后改 Ubuntu 的 /etc/fstab 把 /boot 独立出来,类似:

/dev/mapper/harmony-boot /boot vfat umask=0777 0 0

然后编辑 Ubuntu 的 grub.cfg 里 Ubuntu 的 menuentry:

// 这里的 root 是 vmlinuz 所在分区,要改成 boot 分区对应的 ID
set root='lvmid/n2BK6H-gqum-F0YV-3Lz5-vW4P-vy7t-Wkvwdb/QzAYQ9-CeG7-sGFc-9Jo9-Nmwz-xVhb-YkZuHO'
linux   /@/boot/vmlinuz-4.18.0-12-generic root=/dev/mapper/harmony-ubuntu_root ro rootflags=subvol=@  quiet splash $vt_handoff
initrd  /@/boot/initrd.img-4.18.0-12-generic

保证 Ubuntu 能够引导。然后再对应改 openSUSE 的。有了独立的 boot,内核就不会装到 /boot 去了。

成了!
我把所有的swap砍了(16GB内存没必要用swap),改了个2个boot出来,opensuse直接重装(因为啥也没有),成功双启动!
顺便显卡驱动问题也解决了,是因为引导的时候有一个nomodeset的内核参数,这个阻止了amdgpu的加载,去掉就没问题了
但是现在还有几个问题:

  1. home分区并未真正共享,opensuse下ubuntu的home仍然在@home下,我改了fstab也没用
    真正的共用一个home会产生非常多的冲突,很多脚本文件比如.bashrc都会重叠,轻则桌面行为异常,重则桌面彻底崩溃!
    把他们分开反而是正确的
    我在harmony_home里新建了2个btrfs子卷挂作2个home,两个home共用90GB的空间,比分2个btrfs lv更灵活
    一个挂到home,一个挂到home里的一个文件夹,把这个文件夹添加到文件浏览器的书签里一样方便
  2. 关机非常的慢,有时会提示/var卸载失败
    多用几次就好了


画了张原理图

1赞

其实我想说一个 /boot 就够用,两个 /boot 降低难度了……

另外你说的 /home 分区的事,我觉得有两个可能:

  1. /etc/fstab 还是没写对
  2. Ubuntu 和 openSUSE 下的用户名的 uid/gid 对不上

至于 /var,也许是因为 lvm 是动态增长的,所以放在 lvm 里就限制了速度

我刚才才想明白其实一个boot确实可以,就像home一样用一个btrfs分区的2个子卷就能搞定,也没啥难度

至于fstab就那样吧,真的把home揉到一起两个桌面会打架,我已经黑了3次桌面了😰

你要分两个子卷可能就开不开机了。grub2 应该识别不了 btrfs。开机第一时间用的是 /boot/efi,然后是 grub2,这些都是唯一的,那么 /boot 自然也可以是唯一的,它就是个放 initrd 和 vmlinuz 的地方

1赞