Ext4 to Btrfs 转换手记
想了N久开头怎么写,最后决定不废话,直接进入正题!
Btrfs是Linux新推出的文件系统格式,关于它的介绍可以看这里,本文就不再多说了。
一、安装btrfs-tools:
1 | sudo apt-get install btrfs-tools |
二、准备:
首先确定你的内核版本在2.6.31以上,目前Ubuntu上2.6.35-25是比较新的内核版本,推荐使用,另外/boot必须是单独分区,因为grub暂时不支持btrfs,所以无法读取,这也就意味着/和/boot分在一个区的话,将不能对/进行转换。
然后要确定你的分区是不是都以UUID为识别方式挂载,因为转换为btrfs之后,分区的UUID会改变,所以如果使用UUID来挂载的话,会造成转换后无法挂载分区,特别是要转换系统分区的用户要注意。另外,Ubuntu默认的grub设置里也是用UUID来识别分区,这个我们都需要进行处理,步骤如下:
查看当前的文件系统:
1 | mount |
会看到类似下面的输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /dev/sdb6 on / type ext4 (rw) proc on /proc type proc (rw,noexec,nosuid,nodev) none on /sys type sysfs (rw,noexec,nosuid,nodev) fusectl on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) none on /dev type devtmpfs (rw,mode=0755) none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) none on /dev/shm type tmpfs (rw,nosuid,nodev) none on /var/run type tmpfs (rw,nosuid,mode=0755) none on /var/lock type tmpfs (rw,noexec,nosuid,nodev) /dev/sdb2 on /boot type ext2 (rw) /dev/sdb8 on /usr type ext4 (rw) /dev/sdb7 on /home type ext4 (rw) /dev/sda6 on /media/DOC type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) /dev/sdb1 on /media/OFAN-Mobile_ type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) /dev/sda7 on /media/OTHER type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) /dev/sda5 on /media/PROG type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) /dev/sda1 on /media/Win7 type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev) gvfs-fuse-daemon on /home/ofan/ .gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=ofan) |
这里重点看ext4的部分:
1 2 3 4 | /dev/sdb6 on / type ext4 (rw) /dev/sdb8 on /usr type ext4 (rw) /dev/sdb7 on /home type ext4 (rw) /dev/sdb2 on /boot type ext2 (rw) |
这里需要记下哪个分区对应了哪个挂载点,另外你可能需要用笔记下/boot的设备路径,然后以root用户身份打开并编辑/etc/fstab,更改之前务必做好备份,这里用是vim:
1 2 | sudo cp /etc/fstab {,.bak} sudo vim /etc/fstab |
打开之后将挂载点的UUID部分全部替换为分区的设备路径,注意对应,因为/boot分区和其他非ext分区不需要转换,所以就不用改了:
1 2 3 4 5 6 7 8 9 10 11 | proc /proc proc nodev,noexec,nosuid 0 0 /dev/sdb6 / btrfs defaults 0 1 UUID=4e968ab2-cbd8-446b-b4eb-4bbef87521ea /boot ext2 defaults 0 2 /dev/sdb7 /home btrfs rw 0 0 UUID=5EF043EBF043C84B /media/DOC ntfs-3g defaults,nosuid,nodev,locale=zh_CN.utf8 0 0 UUID=96F60915F608F771 /media/OFAN-Mobile_ ntfs-3g defaults,nosuid,nodev,locale=zh_CN.utf8 0 0 UUID=762E4A0E2E49C837 /media/OTHER ntfs-3g defaults,locale=zh_CN.utf8 0 0 UUID=406E3EBC6E3EAA94 /media/PROG ntfs-3g defaults,locale=zh_CN.utf8 0 0 UUID=DCA0F1B9A0F19A6A /media/Win7 ntfs-3g defaults,locale=zh_CN.utf8 0 0 /dev/sdb8 /usr btrfs defaults 0 2 UUID=06b702fc-87c6-4fa8-b9f1-2bcfd70667f8 none swap sw 0 0 |
不要急着重启,检查下btrfs-convert这个工具是否可用:
1 | type btrfs-convert |
记下返回的路径,一般为/sbin/btrfs-convert
重启,进入grub的菜单后按e编辑启动命令,在以'linux'开头的那一行,将内核参数,即‘root=UUID’之后的(包括‘root=UUID’)的都删掉,但不要删掉下一行,然后输入'initramfs',按下 Ctrl-X 开始引导。
不出意外,一会会进入Busybox的终端,命令提示符为'(initramfs)',此时系统没有挂载任何分区。
三、执行转换
首先我们需要btrfs-convert这个工具:
挂载根目录分区'/dev/sdb6'(这个路径应该在之前有记录),
1 2 | mkdir ext4_root mount -t ext4 /dev/sdb6 ext4_root |
拷贝,并卸载,
1 2 | cp ext4_root /sbin/btrfs-convert /sbin/ umount /dev/sdb6 |
检查分区错误,
1 2 3 | fsck .ext4 -f /dev/sdb6 fsck .ext4 -f /dev/sdb7 fsck .ext4 -f /dev/sdb8 |
转换,
1 2 3 | btrfs-convert /dev/sdb6 btrfs-convert /dev/sdb7 btrfs-convert /dev/sdb8 |
转换需要一定的时间,注意不要终端电源或关机。
四、完成
当所有分区都转换完成后,不要急着重启,还记得/boot分区的设备路径么,马上就用到它。
重启,进入grub菜单后,按下e编辑启动命令,在内核参数即以'root=UUID'开头的部分,将'root='后的UUID删除掉,换为之前记录的根目录的设备路径,我的是 /dev/sdb6,就改为'root=/dev/sdb6',务必要设置正确,否则内核会无法挂载根目录分区。
最后内核参数应该是这样的形式:
1 | linux ... root= /dev/sdb6 ro ... |
按下Ctrl-X开始引导,进入系统后需要更新一下grub:
1 | sudo update-grub |
至此,转换结束。
Enjoy!
2010年10月20日 16:37
好文章,不过我还是等btrfs稳定版了再试
数据重要呀 :D
2010年12月20日 05:48
使用betrfs文件系统后启动慢了不少, 没有ext4文件系统快。
2011年8月19日 18:10
在虚拟机下试,发现btrfs占用很大的空间
2018年7月19日 12:34
Very useful info, thanks !
2020年4月09日 14:04
Very useful information I will post the post and come back to find out your information. Thanks for the dark post that will definitely come back.