Manjaro ext4 文件系统转 Btrfs

【施工中】

转换步骤

磁盘 /dev/sdaa 挂载为 Linux 根分区,下文命令可能需要调整。

由于操作时需要对根分区进行操作,强烈建议操作前进行全盘备份并在 LiveCD 环境下进行操作。

注意:任何对数据的操作都是有风险的,如果你不能承受数据丢失的风险,请勿操作。

注意:如果转换中出现任何异样,你都可以使用备份子卷 /ext2_saved 来回滚。请勿强行对转换失败的分区做出更改。使用 btrfs-convert -r /dev/target_partition 命令进行回滚。

检查文件系统

首先使用 fsck 检查磁盘,保证现有分区没有问题。

fsck.ext4 /dev/sda2

开始文件系统转换

分区检查通过后就可以开始转换。执行以下命令进行转换。

btrfs-convert /dev/sda2

待出现 conversion complete 表明转换完成。现在分区的文件系统已经是 Btrfs 了,但是还不能重启,还需要对现有的文件进行修改才能顺利引导进系统。

挂载分区并修改 fstab

首先需要挂载分区,方便我们修改文件。这里我们将分区挂载到 /mnt 目录下。

mount /dev/sda2 /mnt

使用磁盘工具检查分区的 UUID,这里使用 lsblk 命令。

lsblk -f

使用文本编辑工具修改 /mnt/etc/fstab 文件,修改挂载到根目录的分区类型(type)为 btrfs、文件系统检查顺序(pass)为 0(启动时不进行磁盘检查),并检查转换后的分区 UUID 是否改变,修改挂载分区(file system)。

重建初始化内存盘

manjaro-chroot /mnt bash

进入原系统后,使用 mkinitcpio 重建初始化内存盘。

mkinitcpio -P

安装 grub-btrfs

您可能还需要支持 btrfs 的 grub 版本,因为默认的 grub 无法处理稀疏文件。在chroot 中,运行以下命令。 :point_down:

pacman -S grub-btrfs

其他

启用透明压缩

为了能够利用 Btrfs 的透明压缩功能,可以对转换好的分区进行压缩并修改 fstab 挂载选项。

首先需要对转换好的分区进行全盘压缩。

# btrfs filesystem defragment -r -v -czstd /mnt

随后需要修改 fstab 文件,在根目录文件系统的挂载选项(options)一栏中增加 compress=zstd 选项,以便系统启动时应用压缩选项。

lsblk
NAME        MAJ:MIN RM    SIZE RO TYPE MOUNTPOINTS
...
sdz           8:32   1   59,5G  0 disk
├─sdz1        8:33   1    250M  0 part
├─sdz2        8:34   1      1M  0 part 
└─sdz3        8:35   1   59,3G  0 part 
sdy           8:48   1   14,7G  0 disk 
├─sdy1        8:49   1    250M  0 part 
├─sdy2        8:50   1      1M  0 part 
└─sdy3        8:51   1   14,5G  0 part 

我们的 64GB 内存条是 /dev/sdz。 3 个分区,60GB 大小,250MB 启动分区,59G 数据分区 – 适合。以下任何地方使用“sdz1”、“sdz3”或“z3$”时,都必须将“z”替换为“适当的”字母。 请务必事先检查 ext4 文件系统是否正常

fsck.ext4 /dev/sdz3
e2fsck 1.46.2 (28-Feb-2021)
/dev/sdz3: sauber, 219881/3891200 Dateien, 1312455/15541243 Blöcke

 立即转换为 btrfs

btrfs-convert /dev/sdz3
create btrfs filesystem:
	blocksize: 4096
	nodesize:  16384
	features:  extref, skinny-metadata (default)
	checksum:  crc32c
free space report:
	total:     63656931328
	free:      57548845056 (90.40%)
creating ext2 image file
creating btrfs metadata
copy inodes [.] [    219706/    219881]
conversion complete

 使其再次可启动(调整 UUID)

UUID 和 PARTUUID 已更改。稍后我们将需要这两个数字。 (然后您可以通过复制和粘贴来粘贴)

ls -lA /dev/disk/by-uuid |egrep 'z3$'
lrwxrwxrwx 1 root root 10 19. Jun 07:58 1a488830-65f7-4913-bf4d-dfe3f3ab5634 -> ../../sdz3

ls -lA /dev/disk/by-partuuid |egrep ‘z3$’

lrwxrwxrwx 1 root root 10 19. Jun 07:58 026eb222-79f0-4dd8-8735-4ea6735f9203 -> ../../sdz3

 挂载分区

sudo mkdir -p /mnt/alma/1 /mnt/alma/3
mount -t vfat /dev/sdz1 /mnt/alma/1
mount -t btrfs -o subvol=/,defaults,compress=zstd:9 /dev/sdz3 /mnt/alma/3

 创建 grub.cfg 和 fstab 的备份

cp /mnt/alma/1/grub/grub.cfg /mnt/alma/1/grub/grub.cfg.old
cp /mnt/alma/3/etc/fstab /mnt/alma/3/etc/fstab.old

 调整 grub.cfg 以便棒启动

  • 显示旧值
cat /mnt/alma/1/grub/grub.cfg |egrep -o '[0-f]{8}[0-f-]{28}'
d8fb2a88-6bc3-4f79-9ac0-5be115f04ec5
...
  • 新值应该是:
ls -lA /dev/disk/by-uuid |egrep 'sdz3'
lrwxrwxrwx 1 root root 10 19. Jun 07:58 1a488830-65f7-4913-bf4d-dfe3f3ab5634 -> ../../sdz3
  • 根据以上值编写sed
sed -i** 's/d8fb2a88-6bc3-4f79-9ac0-5be115f04ec5/1a488830-65f7-4913-bf4d-dfe3f3ab5634/g' **/mnt/alma/1/grub/grub.cfg
  • 请检查新值
cat /mnt/alma/1/grub/grub.cfg |egrep -o '[0-f]{8}[0-f-]{28}'
> 1a488830-65f7-4913-bf4d-dfe3f3ab5634

 调整btrfs布局

btrfs 这里根本没有布局。我更喜欢平面布局(为 snapper 准备):

toplevel	   	    (volume root directory, not to be mounted by default)
  ├─@	   	        (subvolume root directory, mount at /)	
  ├─@home 		    (subvolume home directory, mount at /home)
  ├─@nosnap 	    (subvolume without snapshots, mount at /var/log ...)
  ├─@snapshots 	    (snapshots of /, mount at /.snapshots)
  ├─@home.snapshots (snapshots of /home, mount at /home/.snapshots)
  └─@ext4_saved	    (subvolume of saved ext4 filesystem-data, delete later on)

系统管理指南 – btrfs Wiki 3

btrfs subvolume create /mnt/alma/3/@

创建子卷“/mnt/alma/3/@”

btrfs subvolume create /mnt/alma/3/@home

创建子卷 ‘/mnt/alma/3/ @home ‘

btrfs subvolume create /mnt/alma/3/@nosnap

创建子卷 ‘/mnt/alma/3/ @nosnap ‘

btrfs subvolume create /mnt/alma/3/@snapshots

创建子卷 ‘/mnt/alma/3/ @snapshots ‘

btrfs subvolume create /mnt/alma/3/@home.snapshots

创建子卷 ‘/mnt/alma/3/ @home.snapshots ‘

mv /mnt/alma/3/ext2_saved /mnt/alma/3/@ext2_saved
mv /mnt/alma/3/home/\* /mnt/alma/3/@home/
mv /mnt/alma/3/[a-z]\* /mnt/alma/3/@/
btrfs subvolume set-default /mnt/alma/3/@

 调整fstab(挂载/,/ home)

https://www.reddit.com/r/linux/comments/imgler/btrfs_relatime_vs_noatime_huge_performance/ 3

棒上的 fstab 文件必须适应 btrfs 和布局。为此,我们需要 btrfs 分区的 PARTUUID

ls -lA /dev/disk/by-partuuid |egrep ‘sdz3’

lrwxrwxrwx 1 root root 10 19. Jun 07:58 026eb222-79f0-4dd8-8735-4ea6735f9203 -> ../../sdz3 

fstab 必须手动编辑。我使用mcedit,但nanovim也同样好。我们预先将partuuid写在fstab的末尾。然后编辑就更容易了。:眨眼:

ls -lA /dev/disk/by-partuuid |egrep ‘sdz3’ >> /mnt/alma/3/@/etc/fstab

mcedit /mnt/alma/3/@/etc/fstab

  • vfat 行保持不变
  • 带有 ext4 的行被注释掉 (#)
  • 同样,带有“lrwxrwxrwx”的行,其中partuuid是(#)
  • 此 PARTUUID 为 / 和 /home 创建 2 个新行

我的结果如下所示:

# UUID=d8fb2a88-6bc3-4f79-9ac0-5be115f04ec5	/         	ext4      	rw,noatime	0 1
# lrwxrwxrwx 1 root root 10 19. Jun 07:58 026eb222-79f0-4dd8-8735-4ea6735f9203 -> ../../sdz3
PARTUUID=026eb222-79f0-4dd8-8735-4ea6735f9203	/	btrfs	rw,noatime,compress=zstd:9,subvol=@	0 0
PARTUUID=026eb222-79f0-4dd8-8735-4ea6735f9203	/home	btrfs	rw,noatime,compress=zstd:9,subvol=@home	0 0
UUID=003C-4A02      	/boot     	vfat      	rw,noatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro	0 2

编辑 /boot/mkinitcpio.conf

注释(#)掉原来的 HOOKS

HOOKS=(base systemd autodetect modconf block keyboard sd-vconsole filesystems shutdown)

删除 ext4 数据的备份(不要忘记!)

btrfs subvolume delete -c /mnt/3/@ext2_saved

挂出

umount /mnt/3
umount /mnt/1

mount -t btrfs -o subvol=@ /dev/sda2 /mnt
mount -t btrfs -o subvol=@home /dev/sda2 /mnt/home
mount -t btrfs -o subvol=@log /dev/sda2 /mnt/var/log
mount -t btrfs -o subvol=@cache /dev/sda2 /mnt/var/cache
mount -t vfat  /dev/sda1 /mnt/boot/efi
mount --bind /dev /mnt/dev
mount -t proc proc /mnt/proc
mount -t sysfs sysfs /mnt/sys
mount -t efivarfs efivarfs /mnt/sys/firmware/efi/efivars
sudo chroot /mnt
pacman -S grub-btrfs && grub-install && update-grub
#grub-install --recheck --no-rs-codes --modules="btrfs zstd part_gpt part_msdos"
update-grub

已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注