声明:本文所有内容必需以超级用户身分或权限操作,任何人如因本文而引起任何损毁,资料及精神损失等,或一切问题,本人绝不负责。
You are at your own risks!
Pre-requisites(先要满足条件):
1. 内核版本是 2.6.28 或以後,或者已有补丁或支持 ext4 文件系统格式者
2. e2fsprog-1.41.3 或以後
3. rsync (当然用 tar、cp 等都行)
4. 一张急救用的 Linux LiveCD,如 Sidux、SystemRescueCD 之类,以便救援之用
5. 先做好备份
前言
早年硬盘的容量不如现在的硬盘动不动有几佰G,很多时候都有机会面对空间不足而要想办法扩容的问题,适逢最近有"知朋旧友"推荐 ext4 文件系统格式,於是起了尝试改用的念头。
我一直很保守,只用 ext2/ext3,从未用过什麽 jfs、xfs、Reiserfs 之类,一方面对这些 filesystem
没有透彻认识,一方面是因为 ext2/ext3 容易处理问题,可以随便找张 Linux 的 LiveCD
来解决,不愁支援问题。言归正传,现有一机器,硬盘以 Debian 启动时的情景,有如下分区(挂点):
/dev/sda2 / ext3 (12G, Debian Unstable)
/dev/sda3 swap
/dev/sda5 /media/sda5 ext3 (12G, CLFS-SVN 64-bit multi-lib)
/dev/sda6 /mnt/sda6 ext3 (12G, LFS-SVN 32-bit)
/dev/sda7 /mnt/sda7 ext3 (20G, free space)
开始之前,首先要面对一个新问题,时下的 grub-0.97 (legacy) 对 ext4 并没有支持,要先行处理,方法有三:
1. 用开发中的 grub2,已有 ext4 支援但我现在不了解,也暂时不想花时间钻研
2. 为 grub-0.97 打补丁,Google 的 SoC 里有提供,某些大发行版也有,但很奇怪,patch 的时候会报错,不敢动了 :(
3. 建立 grub-0.97 能辨识的 /boot 分区,这是容易的事情了,用之!
第一步:建立新分区
我希望扩张 sda2 的 Debian 系统挪到 sda6 以後的分区,并采用 ext4,但我不打算干掉 sda6 上的 LFS 系统,也就是我可以利用 sda7 作重新规划。
先用 cfdisk 把 sda7 干掉,然後再划出一个 50MB 的 sda7 及把余下的空间划作 sda8,即是
/dev/sda7 50MB 用作 /boot
/dev/sda8 ~20G (20G - 50MB) 作 ext4 供移植用
划好後不能急於格式化,要重启一次系统,因为 /dev 要重新 propagate 一次,否则日後会有问题。重启後把 sda7 格成 ext2 就可以了,用 mke2fs /dev/sda7 即可
/boot 一般就只有放置几个内核映像,模块都是放在 /lib/modules 里的,所以不需要大容量,日志也可以不要,省掉还可让启动时快速一点点。
e2fsprog 本身提供 mkfs.ext4 命令,不知何故,我用 mkfs.ext4 -j /dev/sda8 或者 mke2fs -T ext4 /dev/sda8 两者格出来的分区都会报错,只好先格成 ext3 再转换了:
mke2fs -j /dev/sda8
然後
tune2fs -O extents,uninit_bg,dir_index /dev/sda8
跟随
fsck -pf /dev/sda8
fsck 会出现大量 error 并会自动 fixed,据官方文件这是正确的,可放心继续。至此,分区的准备工作已完成。
第二步:/boot 的转移
过程如下:
mkdir /mnt/sda{7,8}
mount /dev/sda7 /mnt/sda7
rsync -av /boot
/ /mnt/sda7 (注意 /boot 後面带有 "
/")
umount /mnt/sda7
编辑 /etc/fstab
增加 /dev/sda7 为 /boot,即是
/dev/sda7 /boot ext2 defaults,errors=remount-ro 0 1
再执行
mv /boot /BOOT (不删除,备份原有的,日後再干掉未迟)
mkdir /boot
mount /dev/sda7 /boot
由於 /boot 已独立,grub 需要微调,继续执行
grub
>root (hd0,6) (原来是 sda2 里的一部份,现在要指向 sda7)
>setup (hd0) (依然是 MBR)
>quit
再修改 /boot/grub/menu.lst
原来是
root (hd0,1)
kernel /boot/lfskernel-2.6.28 root=/dev/sda2 ro nomce vga=0x317
改作
root (hd0,
6)
kernel
(hd0,6)/lfskernel-2.6.28 root=/dev/sda2 ro nomce vga=0x317
用 kexec 见 或者重启一次系统,如无意外,系统应该正常起动,重新登陆後用 mount 命令应该可见 /dev/sda7 会被挂成 /boot 了
第三步:系统传送
前面的都是为了最後这步而做的准备工作。好了,以 root 身分继续操作:
mount /dev/sda8 /mnt/sda8 (mount 应该可见 /mnt/sda8 是以 ext4 挂载的)
rsync -av --exclude "/boot" --exclude "/proc" --exclude "/mnt" --exclude "/media" / /mnt/sda8
这里把几个目录排除掉,原因是:
/boot 已在独立分区,无需再送往 sda8
/proc 内容是系统自动建立的,日後内容同样是动态生成的
/mnt 及 /media 挂点的内容只需在新系统起动後如常挂载即可
完成後把刚才及必要的挂点重新建立:
mkdir /mnt/sda8/{boot,proc,mnt,media}
以下的就按自己实际需要补回:
mkdir /mnt/sda8/mnt/{cdrom,scd0,sda2,sda6,sda.....}
mkdir /mnt/sda8/media/sda{1,2,5....}
编辑 /mnt/sda8/etc/fstab
/dev/sda2 / ext3 defaults,errors=remount-ro 0 1
更正为
/dev/sda
8 / ext
4 defaults,errors=remount-ro 0 1
(如原来有 /dev/sda8 /mnt/sda8 ext3 ...... 删除之或注掉)
再次编辑 /boot/grub/menu.lst
root (hd0,6)
kernel (hd0,6)/lfskernel-2.6.28 root=/dev/sda2 ro nomce vga=0x317
改作
root (hd0,6)
kernel (hd0,6)/lfskernel-2.6.28 root=/dev/sda
8 ro nomce vga=0x317
现在一切就绪了,再三仔细检查,如无错误就可以用 kexec 或者重新起动系统。
如一切正常,系统可再次起动,启动後 sda7 仍是 /boot,但现在的 / 已是 sda8 而非 sda2 了。
sda2 可临时保留,过一段时间後在 sda8 下操作都无任何问题便可干掉它。
好了,大功告成! Linux 就是好,移植性甚高,可随意变换分区使用。对比哪些受注册表拖累,变换分区等於重新安装的操作系统,早应弃之!
补充一下,利用 kexec 来切换内核,其实也能变相切换 Linux 系统。现在我只有 2.6.28 内核在 /boot (新的
/dev/sda7 里),如果 sda6 及 sda8 各自的 /lib/modules 里都带有相同的内核模块,那麽只需用 root=
指定不同的分区,便能切换成相关的 Linux 系统了!设 root=/dev/sda8 就用 Debian, root=/dev/sda6
就用 LFS,哈哈!好不快哉!
结语
本文示范了:
1. /boot 分区的移植,既然 /boot 能移植,其他分区如 /home,/var,/usr 之类也可以如法泡制,只不过 /boot 要多做一步 grub 的微调工作。
2. / 分区的移植,既然 / 能移植到其他分区,其实移植到移动设备如移动硬盘或 U 盘都行,只要内核加入足够的支援便行
3. 建立备份习惯,好让有问题之时还原系统。
其他的日後有机会再探讨吧,再会!
d00m3d 敬上
(2009年1月18日)
參考文献
http://www.ibm.com/developerworks/li...xt4/index.html
PS:还有其他小贴士集合在此 【毁灭小贴士】集合 :)