[deepin exploration] 安装deepin到btrfs子卷的方法之一
Tofloor
poster avatar
广雅居士
deepin
2024-04-02 21:55
Author

我们都知道deepin不支持安装系统boot到btrfs分区,更不要提安装到子卷了,实际上我们有一个很简单的方法安装deepin到btrfs分区的子卷,可以说物理机直接安装,也可以安装到虚拟机在导出到物理机,今天就先简单说一下直接物理机btrfs子卷的方法。大家知道linux硬盘分区时sda1、NVMe0n1p2之类的,为了照顾不同的硬盘,也为了叙述方便,本帖一概按1#分区2#分区方式叙述。

在用启动优盘启动安装程序后,选择手动分区,把硬盘分为三个分区:1#分区为efi分区,这个没什么可说的,2#分区为btrfs分区,挂载为/分区,3#分区为ext3、ext4分区,挂载为boot目录。为什么要把boot分到3#分区呢?当然是我有强迫症了,诸位看官看到最后就明白了。

现在正常安装系统,完成后进入系统,在根目录下执行命令:sudo btrfs subvolume snapshot / @deepin

现在在你的系统根目录下既有个@deepin子卷,里面有个半成品的系统了,为什么说是半成品呢?因为它几个缺点,不能直接使用。

  1. 子卷系统的boot目录没有引导内核文件,这个好解决,直接把根系统的boot目录复制过去就可以了,我一般是用 sudo cp -a /boot/* /@deepin/boot完成,注意很可能把efi目录内容也复制过去了,而我们的efi目是要挂载efi分区的,强迫症就把里面的内容删除下,懒人不删除也没事儿。
  2. fstab文件是错误的要更改,因为fstab还是根系统的文件挂载,要手动改一下,最关键是subvol=@deepin参数,告诉系统把@deepin子卷挂载为根目录,如果有子卷ID的参数,建议删除或者 sudo btrfs subvolume show 查询下ID参数。注意删除/boot挂载boot分区那行,因为我们已经复制boot分区内容到子卷boot目录了。UUID=b28288ee-cb94-4c59-933f-05ab523f7f97 / btrfs defaults,subvol=@deepin 0 0
  3. 子卷的grub.cfg文件引导参数不对,这个不建议手动修改,先修改根目录grub.cfg引导命令,临时引导下子卷系统,加上 rootflags=subvol=@deepin参数告诉内核去那里挂载根目录就可以了。
    		linux	/boot/vmlinuz-6.1.0-18-amd64 root=UUID=b28288ee-cb94-4c59-933f-05ab523f7f97 ro rootflags=subvol=@deepin  quiet
    		echo	'Loading initial ramdisk ...'
    		initrd	/boot/initrd.img-6.1.0-18-amd64
    

现在引导进子卷系统,执行命令 sudo update-grub更新下子卷的grub.cfg文件基本成形了。


还没完,现在还有修改一个efi分区下的小grub.cfg文件,就在这里:
图片.png

在efi分区的boot目和deepin等目录下可以找到它,打开内容如下,注意第二行,高息grub2那里可以找到grub.cfg文件,要修改成子卷里的grub.cfg路径。

search.fs_uuid b28288ee-cb94-4c59-933f-05ab523f7f97 root 
set prefix=($root)'/@deepin/boot/grub'
configfile $prefix/grub.cfg

现在到了杀驴时刻了,你可以删除根目录下的所有常规文件,注意别铲除@deepin子卷,然后在删除3#分区,并入2#分区。


为什么要把boot分区放到3#分区,你理解了吗?

Reply Favorite View the author
All Replies
1 / 2
To page
广雅居士
deepin
2024-04-02 21:58
#1

行文粗糙,有不妥之处假期再改吧,最关键的精华就是 sudo btrfs subvolume snapshot / @deepin命令的使用,这条命令可以直接把/分区快照到@deepin子卷里。

Reply View the author
f@deepin
deepin
2024-04-02 22:11
#2

难道 / 严格来说,也是子卷,所以也可以快照 ?不得不说,btrfs 666

Reply View the author
广雅居士
deepin
2024-04-02 22:32
#3
f@deepin

难道 / 严格来说,也是子卷,所以也可以快照 ?不得不说,btrfs 666

大概可以这么理解。

Reply View the author
jjcui8595
deepin
2024-04-02 22:55
#4

学习,收藏like

Reply View the author
阿尼樱奈奈
Moderator
2024-04-03 08:19
#5

like

Reply View the author
乾豫恒益
deepin
2024-04-03 09:08
#6

like like

Reply View the author
Ziggy
deepin
2024-04-03 09:55
#7

你或许需要这个

https://bbs.deepin.org/post/269851

pride

Reply View the author
广雅居士
deepin
2024-04-03 20:25
#8
Ziggy

你或许需要这个

https://bbs.deepin.org/post/269851

pride

谢谢,你写得比我详细。上一天班太累了,写的比较马虎,也不知道大家能不能看的明白。

Reply View the author
f@deepin
deepin
2024-04-04 07:04
#9

os安装到btrfs备忘录.wps.zip

那我也分享一下自己乱总结的安装要点proud

Reply View the author
打击越
deepin
2024-04-04 07:36
#10

不错,终于把 boot 分区干掉了

不过,在修改 efi 分区里面的配置重启后,grub 还是 boot 分区的

最后运行 sudo dpkg-reconfigure grub-efi-amd64 修改的 efi 才生效!

Reply View the author
广雅居士
deepin
2024-04-04 08:40
#11
打击越

不错,终于把 boot 分区干掉了

不过,在修改 efi 分区里面的配置重启后,grub 还是 boot 分区的

最后运行 sudo dpkg-reconfigure grub-efi-amd64 修改的 efi 才生效!

看着boot分区碍眼。

Reply View the author
广雅居士
deepin
2024-04-04 08:46
#12
打击越

不错,终于把 boot 分区干掉了

不过,在修改 efi 分区里面的配置重启后,grub 还是 boot 分区的

最后运行 sudo dpkg-reconfigure grub-efi-amd64 修改的 efi 才生效!

efi 分区有两个或者更多的目录,比如boot、deepin之类,每个都要修改。

Reply View the author
Tent
deepin
2024-04-04 10:43
#13

我也来分享下我的操作。

操作前的基础环境是:一共分了efi、/、数据盘这3个分区,boot在根分区里,只根分区使用btrfs。

操作之后,根目录改到/@下。

0、操作前的分区情况

UUID=b5c645b1-4b98-4d61-a643-ffd164cb6789 / btrfs rw,relatime,ssd,space_cache,subvolid=5,subvol=/ 0 0
UUID=7A1A-9AED /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2
UUID="96df16da-7fe6-41c9-8c66-b9dfd5c20d72" /data ext4 rw,relatime 0 2
/data/home /home none defaults,bind 0 0
/data/opt /opt none defaults,bind 0 0
/data/var /var none defaults,bind 0 0
/data/root /root none defaults,bind 0 0
tmpfs /tmp tmpfs defaults,noatime,mode=1777,size=6g 0 0

1、创建快照并修改相关配置文件

#1、创建根分区快照
sudo btrfs subvolume snapshot / /@
#2、备份所需修改的文件或目录
sudo cp -a /boot/efi/EFI /boot/efi/EFI_bak
sudo cp /@/etc/fstab /@/etc/fstab_bak
sudo cp /@/boot/grub/grub.cfg /@/boot/grub/grub.cfg_bak
#3、修改efi中的grub.cfg
sudo find /boot/efi/EFI -name grub.cfg | sudo xargs sed -i 's/\/boot/\/@\/boot/'
#4、修改快照中的fstab
sudo sed -i 's/subvol=\//subvol=@/' /@/etc/fstab
#5、修改快照中的grub.cfg
sudo sed -ri 's/root=UUID.*$/\0 rootflags=subvol=@/' /@/boot/grub/grub.cfg

2、重启系统

3、再次更新grub.cfg配置

#1、给grub配置项添加rootflags
echo 'GRUB_CMDLINE_LINUX_DEFAULT="rootflags=subvol=@ $GRUB_CMDLINE_LINUX_DEFAULT"' > 99_rootflags_subvol.conf
sudo mv 99_rootflags_subvol.conf /etc/default/grub.d/99_rootflags_subvol.conf
#2、重新生成grub.cfg
sudo update-grub

4、清理原根目录下的文件

#1、挂载根分区
sudo mount `df | grep -w / | awk '{print $1}'` /mnt
#2、清理根分区文件,要保留@目录。为了数据安全,建议手工一项一项来删除
cd /mnt
#以下命令仅做记录,建议手工一项一项删
#sudo rm -r !(@)
#sudo rm -r .*
#3、删除完成后再次确认,是否只留下了@目录
sudo ls -al /mnt
#4、卸载/mnt挂载点,并确认是否卸载成功
cd;sudo umount /mnt;df | grep mnt
Reply View the author
广雅居士
deepin
2024-04-04 12:30
#14
Tent

我也来分享下我的操作。

操作前的基础环境是:一共分了efi、/、数据盘这3个分区,boot在根分区里,只根分区使用btrfs。

操作之后,根目录改到/@下。

0、操作前的分区情况

UUID=b5c645b1-4b98-4d61-a643-ffd164cb6789 / btrfs rw,relatime,ssd,space_cache,subvolid=5,subvol=/ 0 0
UUID=7A1A-9AED /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2
UUID="96df16da-7fe6-41c9-8c66-b9dfd5c20d72" /data ext4 rw,relatime 0 2
/data/home /home none defaults,bind 0 0
/data/opt /opt none defaults,bind 0 0
/data/var /var none defaults,bind 0 0
/data/root /root none defaults,bind 0 0
tmpfs /tmp tmpfs defaults,noatime,mode=1777,size=6g 0 0

1、创建快照并修改相关配置文件

#1、创建根分区快照
sudo btrfs subvolume snapshot / /@
#2、备份所需修改的文件或目录
sudo cp -a /boot/efi/EFI /boot/efi/EFI_bak
sudo cp /@/etc/fstab /@/etc/fstab_bak
sudo cp /@/boot/grub/grub.cfg /@/boot/grub/grub.cfg_bak
#3、修改efi中的grub.cfg
sudo find /boot/efi/EFI -name grub.cfg | sudo xargs sed -i 's/\/boot/\/@\/boot/'
#4、修改快照中的fstab
sudo sed -i 's/subvol=\//subvol=@/' /@/etc/fstab
#5、修改快照中的grub.cfg
sudo sed -ri 's/root=UUID.*$/\0 rootflags=subvol=@/' /@/boot/grub/grub.cfg

2、重启系统

3、再次更新grub.cfg配置

#1、给grub配置项添加rootflags
echo 'GRUB_CMDLINE_LINUX_DEFAULT="rootflags=subvol=@ $GRUB_CMDLINE_LINUX_DEFAULT"' > 99_rootflags_subvol.conf
sudo mv 99_rootflags_subvol.conf /etc/default/grub.d/99_rootflags_subvol.conf
#2、重新生成grub.cfg
sudo update-grub

4、清理原根目录下的文件

#1、挂载根分区
sudo mount `df | grep -w / | awk '{print $1}'` /mnt
#2、清理根分区文件,要保留@目录。为了数据安全,建议手工一项一项来删除
cd /mnt
#以下命令仅做记录,建议手工一项一项删
#sudo rm -r !(@)
#sudo rm -r .*
#3、删除完成后再次确认,是否只留下了@目录
sudo ls -al /mnt
#4、卸载/mnt挂载点,并确认是否卸载成功
cd;sudo umount /mnt;df | grep mnt

牛人。

Reply View the author
广雅居士
deepin
2024-04-04 12:31
#15

这就叫办法总比困难多。

Reply View the author
Tent
deepin
2024-04-04 13:28
#16
Tent

我也来分享下我的操作。

操作前的基础环境是:一共分了efi、/、数据盘这3个分区,boot在根分区里,只根分区使用btrfs。

操作之后,根目录改到/@下。

0、操作前的分区情况

UUID=b5c645b1-4b98-4d61-a643-ffd164cb6789 / btrfs rw,relatime,ssd,space_cache,subvolid=5,subvol=/ 0 0
UUID=7A1A-9AED /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2
UUID="96df16da-7fe6-41c9-8c66-b9dfd5c20d72" /data ext4 rw,relatime 0 2
/data/home /home none defaults,bind 0 0
/data/opt /opt none defaults,bind 0 0
/data/var /var none defaults,bind 0 0
/data/root /root none defaults,bind 0 0
tmpfs /tmp tmpfs defaults,noatime,mode=1777,size=6g 0 0

1、创建快照并修改相关配置文件

#1、创建根分区快照
sudo btrfs subvolume snapshot / /@
#2、备份所需修改的文件或目录
sudo cp -a /boot/efi/EFI /boot/efi/EFI_bak
sudo cp /@/etc/fstab /@/etc/fstab_bak
sudo cp /@/boot/grub/grub.cfg /@/boot/grub/grub.cfg_bak
#3、修改efi中的grub.cfg
sudo find /boot/efi/EFI -name grub.cfg | sudo xargs sed -i 's/\/boot/\/@\/boot/'
#4、修改快照中的fstab
sudo sed -i 's/subvol=\//subvol=@/' /@/etc/fstab
#5、修改快照中的grub.cfg
sudo sed -ri 's/root=UUID.*$/\0 rootflags=subvol=@/' /@/boot/grub/grub.cfg

2、重启系统

3、再次更新grub.cfg配置

#1、给grub配置项添加rootflags
echo 'GRUB_CMDLINE_LINUX_DEFAULT="rootflags=subvol=@ $GRUB_CMDLINE_LINUX_DEFAULT"' > 99_rootflags_subvol.conf
sudo mv 99_rootflags_subvol.conf /etc/default/grub.d/99_rootflags_subvol.conf
#2、重新生成grub.cfg
sudo update-grub

4、清理原根目录下的文件

#1、挂载根分区
sudo mount `df | grep -w / | awk '{print $1}'` /mnt
#2、清理根分区文件,要保留@目录。为了数据安全,建议手工一项一项来删除
cd /mnt
#以下命令仅做记录,建议手工一项一项删
#sudo rm -r !(@)
#sudo rm -r .*
#3、删除完成后再次确认,是否只留下了@目录
sudo ls -al /mnt
#4、卸载/mnt挂载点,并确认是否卸载成功
cd;sudo umount /mnt;df | grep mnt

第3步好像完全不用做,可以省掉

Reply View the author
广雅居士
deepin
2024-04-04 16:50
#17

实际上deepin在子卷运行的很好,不知道为什么深度一直不提供安装到子卷功能。

Reply View the author
广雅居士
deepin
2024-04-06 13:03
#18
打击越

不错,终于把 boot 分区干掉了

不过,在修改 efi 分区里面的配置重启后,grub 还是 boot 分区的

最后运行 sudo dpkg-reconfigure grub-efi-amd64 修改的 efi 才生效!

可能是那一长串的uuid你没有追改吧?

写的太匆忙忽略了。

Reply View the author
打击越
deepin
2024-04-06 19:00
#19
广雅居士

可能是那一长串的uuid你没有追改吧?

写的太匆忙忽略了。

可能版本不同,修改完 grub.cfg , 要更新 grubx64.efi 才生效!

rhett@rhett-PC:~$ ls -lh /boot/efi/EFI/deepin/
总计 3.2M
-rwxr-xr-x 1 root root  108 2023年 3月10日 BOOTX64.CSV
-rwxr-xr-x 1 root root  83K 2023年 3月10日 fbx64.efi
-rwxr-xr-x 1 root root  127  4月 3日 03:22 grub.cfg
-rwxr-xr-x 1 root root 1.2M 2022年 3月11日 grub.efi
-rwxr-xr-x 1 root root 284K  4月 3日 05:28 grubx64.efi
-rwxr-xr-x 1 root root 823K 2023年 3月10日 mmx64.efi
-rwxr-xr-x 1 root root 906K 2023年 3月10日 shimx64.efi
Reply View the author
毛毛虫
deepin
2024-06-17 08:28
#20
广雅居士

行文粗糙,有不妥之处假期再改吧,最关键的精华就是 sudo btrfs subvolume snapshot / @deepin命令的使用,这条命令可以直接把/分区快照到@deepin子卷里。

想问下snapshot / @deepin 与 create sub @deepin; cp -a / @deepin有什么区别?

Reply View the author
1 / 2
To page