LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5057|回复: 6

【毁灭小贴士】分区移植法

[复制链接]
发表于 2009-1-18 18:17:04 | 显示全部楼层 |阅读模式
声明:本文所有内容必需以超级用户身分或权限操作,任何人如因本文而引起任何损毁,资料及精神损失等,或一切问题,本人绝不负责。[color="RoyalBlue"]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[color="Red"]/ /mnt/sda7 (注意 /boot 後面带有 "[color="Red"]/")
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,[color="Red"]6)
kernel [color="Red"](hd0,6)/lfskernel-2.6.28 root=/dev/sda2 ro nomce vga=0x317

用 kexec 见 http://www.linuxsir.cn/bbs/thread335331.html 或者重启一次系统,如无意外,系统应该正常起动,重新登陆後用 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[color="Red"]8 / ext[color="Red"]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[color="Red"]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 盘都行,只要内核加入足够的支援便行 http://www.linuxsir.cn/bbs/thread236435.html
3. 建立备份习惯,好让有问题之时还原系统。

其他的日後有机会再探讨吧,再会!

d00m3d 敬上 http://www.linuxsir.cn/bbs/thread343284.html
(2009年1月18日)

參考文献

http://www.ibm.com/developerworks/library/l-ext4/index.html
http://ext4.wiki.kernel.org/index.php/Ext4_Howto
http://kernelnewbies.org/Ext4

PS:还有其他小贴士集合在此 【毁灭小贴士】集合 :)
http://www.linuxsir.cn/bbs/thread329032.html
发表于 2009-1-18 20:53:57 | 显示全部楼层
谢谢,记号慢点照做。
回复 支持 反对

使用道具 举报

发表于 2009-1-19 10:19:56 | 显示全部楼层
刚刚换了笔记本,正有这样的行动打算,不想 d00m3d 兄已经做了,呵呵,等我完成的(要等开学了),我也写一个类似的.
回复 支持 反对

使用道具 举报

发表于 2009-3-19 21:39:29 | 显示全部楼层
很有收获,感谢楼主的无私分享。
回复 支持 反对

使用道具 举报

发表于 2009-3-21 08:37:52 | 显示全部楼层
呵呵,我转移过 n次了,都没有问题。

不过我是直接cp(指定了权限不变等参数)文件。rsync的好处是?只想到失败的话,第二次传就是增量的。

文章总结得不错啊。:%
回复 支持 反对

使用道具 举报

发表于 2009-3-24 22:34:54 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

发表于 2009-7-26 10:59:58 | 显示全部楼层
学习学习,好东西
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表