Ext4 to Btrfs 转换手记

想了N久开头怎么写,最后决定不废话,直接进入正题!

Btrfs是Linux新推出的文件系统格式,关于它的介绍可以看这里,本文就不再多说了。

一、安装btrfs-tools:

 

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来识别分区,这个我们都需要进行处理,步骤如下:

查看当前的文件系统:

 

mount

 

会看到类似下面的输出:

 

/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的部分:

 

/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:

 

sudo cp /etc/fstab{,.bak}
sudo vim /etc/fstab

 

打开之后将挂载点的UUID部分全部替换为分区的设备路径,注意对应,因为/boot分区和其他非ext分区不需要转换,所以就不用改了:

 

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这个工具是否可用:

 

type btrfs-convert

 

记下返回的路径,一般为/sbin/btrfs-convert

重启,进入grub的菜单后按e编辑启动命令,在以'linux'开头的那一行,将内核参数,即‘root=UUID’之后的(包括‘root=UUID’)的都删掉,但不要删掉下一行,然后输入'initramfs',按下 Ctrl-X 开始引导。

不出意外,一会会进入Busybox的终端,命令提示符为'(initramfs)',此时系统没有挂载任何分区。

三、执行转换

首先我们需要btrfs-convert这个工具:

挂载根目录分区'/dev/sdb6'(这个路径应该在之前有记录),

 

mkdir ext4_root
mount -t ext4 /dev/sdb6 ext4_root

拷贝,并卸载,

 

cp ext4_root/sbin/btrfs-convert /sbin/
umount /dev/sdb6

检查分区错误,

 

fsck.ext4 -f /dev/sdb6
fsck.ext4 -f /dev/sdb7
fsck.ext4 -f /dev/sdb8

转换,

 

btrfs-convert /dev/sdb6
btrfs-convert /dev/sdb7
btrfs-convert /dev/sdb8

转换需要一定的时间,注意不要终端电源或关机。

四、完成

当所有分区都转换完成后,不要急着重启,还记得/boot分区的设备路径么,马上就用到它。

重启,进入grub菜单后,按下e编辑启动命令,在内核参数即以'root=UUID'开头的部分,将'root='后的UUID删除掉,换为之前记录的根目录的设备路径,我的是 /dev/sdb6,就改为'root=/dev/sdb6',务必要设置正确,否则内核会无法挂载根目录分区。

最后内核参数应该是这样的形式:

linux ... root=/dev/sdb6 ro ...

按下Ctrl-X开始引导,进入系统后需要更新一下grub:

 

sudo update-grub 

至此,转换结束。

 

Enjoy!