|
发表于 2003-11-15 14:47:04
|
显示全部楼层
我来发一个我原来没有发的帖子吧。或许对你点帮助。里面就有initrd文件的做法。
Mandrake Linux乾坤大转换
呵呵,现在生产出来的硬盘的越来越大是事实,已经达到海量级别了。但我们都会惊奇地发现自己的硬盘间一定会越来越小,经常吃紧,没有办法。由于机器的ide接口已经用完,只得搞个性价都不错的scsi硬盘,还有一张相对还是昂贵的scsi卡。呵呵,花费200多块大洋,搞了张带宽为40M新的Adatec ACI-780 PCI SCSI Controller,二手的scsi硬盘9.1G是IBM的,转数好像是一万转,感觉那个带宽为40M的pci的SCSI卡不错,以后有机会还可以加scsi硬盘呢。下面说说我是如何把我原来装在ide硬盘的Mandrake linux 9.0转换到scsi硬盘上的。
原来的Mandrake linux 9.0装在hdc上,用GRUB引导,GRUB装在hda的MBR.
- #df
- 文件系统 1K-块 已用 可用 已用% 挂载点
- /dev/hdc6 869620 186348 639096 23% /
- /dev/hdc7 124427 20502 97501 18% /boot
- /dev/hdc11 3024580 2030344 840592 71% /usr
- /dev/hdc2 2751348 446804 2164780 18% /var
- /dev/hdc8 10448056 7151824 3296232 69% /mnt/win_c2
- /dev/hda1 2926096 602560 2323536 21% /mnt/win_c
- /dev/hdc9 5106676 2837192 2269484 56% /mnt/win_d2
- /dev/hdc10 16322112 14793440 1528672 91% /mnt/win_e2
-
复制代码
系统文件是ext3的:
- #more /etc/fstab
- /dev/hdc6 / ext3 defaults 1 1
- /dev/hdc7 /boot ext3 defaults 1 2
- none /dev/pts devpts mode=0620 0 0
- /dev/hdd /mnt/cdrdvd auto user,iocharset=gb2312,codepage=936,noauto,ro,exec 0 0
- /dev/fd0 /mnt/floppy auto user,iocharset=gb2312,sync,codepage=936,noauto,exec 0
- 0
- /dev/hda1 /mnt/win_c vfat iocharset=gb2312,codepage=936 0 0
- /dev/hdc8 /mnt/win_c2 vfat iocharset=gb2312,codepage=936 0 0
- /dev/hdc9 /mnt/win_d2 vfat iocharset=gb2312,codepage=936 0 0
- /dev/hdc10 /mnt/win_e2 vfat iocharset=gb2312,codepage=936 0 0
- none /proc proc defaults 0 0
- /dev/hdc11 /usr ext3 defaults 1 2
- /dev/hdc2 /var ext3 defaults 1 2
- /dev/hdc5 swap swap defaults 0 0
-
复制代码
下面分两部分说明我是如何实现Mandrake Linux 9.0乾坤大转移的。第一部分:加载scsi模块和制造initrd文件;第二部分是实现系统转移。
一、加载scsi模块和制造initrd文件。
当我挂上硬盘的时候,就开始了痛苦的历程:
在启动的时候,主板能找到,显示scsi的id号为0,scsi卡的带宽40M,ok,不错,一路下来。但到了grub引导的时候,只出现Grub的字样就不动了,等了老半天还是没有动静,原来以为是grub引导坏了,用软盘启动,刷新下grub,再重新启动,也是到了grub引导的时候,在出现Grub等字样后,接下就是“Error 17",就停在那里不动了。
认为是scsi硬盘的问题,于是想把它重新分区格式化,于是又用萎软的dos盘启动,用dm快速分区格式化成FAT32,一路都顺利,没有什么问题。但再启动的时候,还是原来一样,出现"Error17"的字样就不动了。
自认为是Grub的引导问题,于是又用萎软的dos盘搞下fdisk/mbr,把grub给干掉了,再启动萎软,能找到刚才已经分好的scsi硬盘的分区。说明scsi硬盘没有问题。于是认为是Grub的问题,再用Mandrkae linux的启动盘启动Mandrake linux 9.0,这次改用lilo引导,装在hda的MBR,但在重新用lilo引导的时候,还是不照,出现了一砣砣的"99"的字样就死翘翘在那里了,ft,看来是Mandrake linux 9.0内核的问题。后来查阅"LILO分析"神仙语录得知:
- 0x09:"DMA试图越过64k边界"。建议忽略COMPACT参数
-
复制代码
可我在/ect/lilo.conf里面并没有用到compact这个参数哦。
看来用原来的Mandrake Linux 9.0 Grub或lilo都不能引导系统了,奇怪的是,当我把scsi硬盘拔掉的时候,不管是Grub或lilo,Mandrake linux 9.0都能顺利引导整个机器。这样看来,和内核有一定的关系?后来,搞了老半天,把SCSI硬盘挂上,用grub或lilo都不能引导。看来问题是出在grub或lilo的某个文件上了。到底是那个呢?呵呵,再次查阅神仙语录得知:
- 使用SCSI设备的人,倘若没有将SCSI的驱动程序放入核心,一定要让Kernel运行initial ramdisk功能,预先载入定义在模块的功能。
-
复制代码
看来,是initrd文件出了问题。为了证明这点,me决定再升级下原来的Mandrake linux 9.0,什么都不装,就是像过场白一样,scsi的设备都找到,升级完后,再做张新的boot盘吧。再次启动,不管是我用grub或lilo引导的时候,都出现上面一样的错误。但仍然能用boot盘启动,看了Mandrake linux系统已经自动加载了相关的scsi模块了。难道要我天天用软盘引导Mandrake linux哦?
没有有办法,只能用新做的boot盘启动机器,看看硬盘引导和软盘引导的文件中的initrd到底有什么区别?
- # mount /mnt/floppy
- mount: block device /dev/fd0 is write-protected, mounting read-only
- # ls /mnt/floppy/
- boot.msg* initrd.img* ldlinux.sys* syslinux.cfg* vmlinuz*
- # cp /mnt/floppy initrd.img /tmp
- # cp /boot/initrd-2.4.19-16mdk.img /tmp
-
复制代码
打开initrd文件
- #cat /tmp/initrd.img | gunzip > /tmp/initrd
- #cat /tmp/initrd-2.4.19-16mdk.img | gunzip > /tmp/initrd-2.4.19-16mdk
- #file initrd
- initrd: Linux rev 1.0 ext2 filesystem data
-
复制代码
把它们mount上来:
- #mount -o loop /tmp/initrd /mnt/iso1
- #mount -o loop /tmp/initrd-2.4.19-16mdk /mnt/iso2
- #ls /mnt/iso1/lib/
- 8390.o ext3.o ne.o sd_mod.o
- aic7xxx.o jbd.o scsi_mod.o
- #ls /mnt/iso2/lib/
- ext3.o jbd.o
-
复制代码
ft哦,原来是lilo或grub引导的时候,scsi模块都没有"要让Kernel运行initial ramdisk功能,预先载入定义在模块的功能"
- # more /mnt/iso1/linuxrc /mnt/iso2/linuxrc
- ::::::::::::::
- /mnt/iso1/linuxrc
- ::::::::::::::
- #!/bin/nash
- echo "Loading scsi_mod module"
- insmod /lib/scsi_mod.o
- echo "Loading aic7xxx module"
- insmod /lib/aic7xxx.o
- echo "Loading sd_mod module"
- insmod /lib/sd_mod.o
- echo "Loading jbd module"
- insmod /lib/jbd.o
- echo "Loading ext3 module"
- insmod /lib/ext3.o
- echo "Loading 8390 module"
- insmod /lib/8390.o
- echo "Loading ne module"
- insmod /lib/ne.o io=0x340 irq=3
- echo Mounting /proc filesystem
- mount -t proc /proc /proc
- echo Creating root device
- mkrootdev /dev/root
- echo 0x0100 > /proc/sys/kernel/real-root-dev
- umount /proc
- echo Mounting root filesystem
- mount --ro -t ext3 /dev/root /sysroot
- pivot_root /sysroot /sysroot/initrd
- echo Remounting devfs at correct place if necessary
- handledevfs
- ::::::::::::::
- /mnt/iso2/linuxrc
- ::::::::::::::
- #!/bin/nash
- echo "Loading jbd module"
- insmod /lib/jbd.o
- echo "Loading ext3 module"
- insmod /lib/ext3.o
- echo Mounting /proc filesystem
- mount -t proc /proc /proc
- echo Creating root device
- mkrootdev /dev/root
- echo 0x0100 > /proc/sys/kernel/real-root-dev
- umount /proc
- echo Mounting root filesystem
- mount --ro -t ext3 /dev/root /sysroot
- pivot_root /sysroot /sysroot/initrd
- echo Remounting devfs at correct place if necessary
- handledevfs
-
复制代码
这也说明了上面的判断:ramdisk image功能对于没有将scsi驱动程序放到核心中是必需的。由于Manadake linux 9.0在一般的情况没有把它放进去,所以还要制造某个版本的kernel的initrd ramdisk image file,先看我的系统用了多少个内核:
- ls /lib/modules/
- 2.4.19-16mdk/ 2.4.19-16mdksecure/ 2.4.19-1mdklinus/
-
复制代码
显然,系统有三个不同的内核。先备份原来的initrd文件,以防万一,再造适用scsi硬盘的initrd文件。
- #mv /boot/initrd-2.4.19-16mdk.img /boot/initrd-2.4.19-16mdk.img.noscsi
- #mv /boot/initrd-2.4.19-16mdksecure.img /boot/initrd-2.4.19-16mdksecure.img.noscsi
- #mv /boot/initrd-2.4.19-1mdklinus.img /boot/initrd-2.4.19-1mdklinus.img.noscsi
- #mkinitrd /boot/initrd-2.4.19-16mdk.img 2.4.19-16mdk
- #mkinitrd /boot/initrd-2.4.19-16mdksecure.img 2.4.19-16mdksecure
- #mkinitrd /boot/initrd-2.4.19-1mdklinus.img 2.4.19-1mdklinus
-
复制代码
这样不同版本的kernel的initrd ramdisk image file就做完了。但不要忘记更新下你的lilo或grub,例如lilo,如果你的initrd文件名变了,你要修改下你的/etc/lilo.conf文件的相应的内容,然后更新下lilo:
这样你reboot,就可以正常用我的scsi硬盘了。这里说明一下,我用新的启动盘里面的内核文件和initrd文件,也能启动系统。
当然,你知道了问题的所在,你可以不用这么麻烦,你用你旧版本的启动盘启动机器,然后用modprobe加载scsi模块:sd_mod、aic7xxx(这是对应scsi卡的模块)、scsi_mod,最后再造不同版本的kernel的initrd ramdisk image file就可以了。initrd变了,记得更新下你的lilo或grub。
当然啦,如果核心已经有了scsi驱动的程序,你完全可以不看这一部分,比如,我的机器原来也装有个Debian,内核是2.4.18bf的,能成功引导,这是后来试了才知道的。上面的这些可能对于像遇到像我这种情况的人还多少有点儿帮助的。呵呵
二、Mandrake linux 乾坤大转移
开始重要声明两点:一是文件属性不能改变,二是注意修改/etc/fstab文件和/etc/lilo.conf或/boot/grub/menu.lst文件。
由于我原来的Mandrake linux 9.0的系统格式是ext3,因而,在scsi硬盘上也一定要格式一致。先把scsi格式化成ext3.
- #mkswap /dev/sda5
- #mke2fs -j /dev/sda6
- #mke2fs -j /dev/sda7
- #mke2fs -j /dev/sda8
-
复制代码
原来的Mandrake linux的分区挂接情况是这样的
- 文件系统 1K-块 已用 可用 已用% 挂载点
- /dev/hdc6 869620 186348 639096 23% /
- /dev/hdc7 124427 20502 97501 18% /boot
- /dev/hdc11 3024580 2030344 840592 71% /usr
- /dev/hdc2 2751348 446804 2164780 18% /var
-
复制代码
而现在打算在scsi硬盘这样做:
- 文件系统 1K-块 挂载点
- /dev/sda7 4814936 /
- /dev/sda6 101089 /boot
- /dev/sda8 3621020 /usr
-
复制代码
swap区:hdc5-------------------->sda5
root区:hdc6-------------------->sda7
boot区:hdc7-------------------->sda6
usr 区:hdc11------------------->sda8
细心的人会发现hdc硬盘(称为源盘)和scsi(称为目标盘)的挂接点不一样,少了一个var区。没有关系,如果你的机器的系统只有一个/,那第你很快做了。但要注意,在mount点,目标盘的某个分区空间不能小于源盘的一个(几个)分区已用的空间,这个道理很显然。
下面说明下我的步骤:
1、首先把你的非linux分区umount掉,不然有可能够你受的。例如,我的是这样:
- #cd /
- #umount /mnt/win_c
- #umount /mnt/win_c2
- #umount /mnt/win_d2
- #umount /mnt/win_e2
-
复制代码
这样,可以防止萎软的分区跑到/mnt目录下。如果你mount了其它的非系统的分区,最好还是先umount掉吧。再进行下面的步骤。
2、转移文件系统
建议先从小到大的源分区转移。下面是我的转移情况,如果你的分区不一样,请要读懂下面的。
- #mount /dev/sda6 /mnt/iso1
- #(cd /boot && tar cpf - .) | (cd /mnt/iso1 && tar xpf -)
-
复制代码
由于我的boot里面的文件不大,屏幕一下就roll过去了。再tar usr分区,
- #cd /
- #umount /mnt/iso1
- #mount /dev/sda8 /mnt/iso1
- #(cd /usr && tar cpf - .) | (cd /mnt/iso1 && tar xpf -)
-
复制代码
由于usr相对文件比较多些,所以屏幕在不断的roll,但不用多久,usr分区就搞完了,由于我在目标盘并没有给源盘的var分了区,所以不理它。下面再搞root区,由于这个区很重要,而且它已经包括了前面已经tar过去的东西,比如我的情况:它包括boot区和usr区。记住,一般最后搞root区,注意:如果你的目标的root区相对比较小,你可以在tar的同时,一边用rm删除已经tar过去的目录下的所有文件,比如,我的情况:
- #cd /
- #umount /mnt/iso1
- #mount /dev/sda8 /mnt/iso1
- #(cd / && tar cpf - .) | (cd /mnt/iso1 && tar xpf -)
-
复制代码
同时。你要rm掉已经tar过去的目录下的重复的文件,在另外一个终端:
- #cd /mnt/iso1/boot/* -rf
- #rm /mnt/iso1/usr/* -rf
-
复制代码
这样防止无用重复的文件出现,你的目标root区实在小的话,多重复下上面那rm几个命令,就可以了,等tar 完后,最后再来二(或几)次rm.
这样,你的系统文件已经给转移完成了。
这里说明下:可能还有更好的的办法,但我觉得这种方法利用系统的几个命令就实现了,也可以实现你的linux的备份。如果你的目标mount点更多,你多做几步就是了。但我感觉转移root区相对要考虑多些,如果你的目标盘mount点越多,相应要处理的步骤就相对多些而已。只要你明白上面的道理,其实转多少个目标mount点一样能行。
3、修改/etc/fstab文件和/ect/lilo.conf或/boot/grub/menu.list文件
开始开进入目标的Mandrake linux 9.0:
- #mount /dev/sda7 /mnt/iso1
- #mount /dev/sda6 /mnt/iso1/boot
- #mount /dev/sda8 /mnt/iso1/usr
- #mount -o bind /proc /mnt/iso1/proc
- #chroot /mnt/iso1 /bin/bash
-
复制代码
这样你就进入到目标的Mandrake linux了。
由于目标硬盘变了,就得修改/etc/fstab文件,例如我的:
- #vim /etc/fstab
- /dev/sda7 / ext3 defaults 1 1
- /dev/sda6 /boot ext3 defaults 1 2
- none /dev/pts devpts mode=0620 0 0
- /dev/hdd /mnt/cdrdvd auto user,iocharset=gb2312,codepage=936,noauto,ro,exec 0 0
- /dev/fd0 /mnt/floppy auto user,iocharset=gb2312,sync,codepage=936,noauto,exec 0 0
- /dev/hda1 /mnt/win_c vfat iocharset=gb2312,codepage=936 0 0
- /dev/hdc8 /mnt/win_c2 vfat iocharset=gb2312,codepage=936 0 0
- /dev/hdc9 /mnt/win_d2 vfat iocharset=gb2312,codepage=936 0 0
- /dev/hdc10 /mnt/win_e2 vfat iocharset=gb2312,codepage=936 0 0
- none /proc proc defaults 0 0
- /dev/sda8 /usr ext3 defaults 1 2
- /dev/sda5 swap swap defaults 0 0
-
复制代码
接下来,如果你想把它当作主引导器,就要修改它的配置文件,比如,我把lilo作为主引导器。其内容为:
-
- boot=/dev/hda
- map=/boot/map
- vga=normal
- default=linux
- keytable=/boot/us.klt
- prompt
- nowarn
- password=pk
- #(这里说明下,我的lilo的password为pk只是作为一个示范而已,可以不要,这是关系到lilo的安全问题)
- timeout=300
- message=/boot/message
- menu-scheme=wb:bw:wb:bw
- #配置scsi硬盘的内核,为启动盘的的内核
- image=/boot/scsi/scsimdk
- label=scsimdk
- root=/dev/sda7
- initrd=/boot/scsi/scsimdk.img
- append="quite devfs=mount hdd=ide-scsi"
- vga=788
- read-only
-
- #这是原来的配置内核
- ##################################################
- image=/boot/vmlinuz
- label=linux
- root=/dev/sda7
- initrd=/boot/initrd.img
- append="quite devfs=mount hdd=ide-scsi"
- vga=788
- read-only
- image=/boot/vmlinuz-secure
- label=linux-secure
- root=/dev/sda7
- initrd=/boot/initrd-secure.img
- append="quite devfs=mount hdd=ide-scsi"
- read-only
- #Linuz的内核
- image=/boot/vmlinuz-linus
- label=linux-linus
- root=/dev/sda7
- initrd=/boot/initrd-linus.img
- append="devfs=mount hdd=ide-scsi"
- read-only
- image=/boot/vmlinuz
- label=failsafe
- root=/dev/sda7
- initrd=/boot/initrd.img
- append="failsafe devfs=nomount hdd=ide-scsi"
- read-only
- #####################################################
- #Mandrake已经安装的内核完
- #引导萎软
- other=/dev/hda1
- label=Ms-Winme
- table=/dev/hda
- #软盘引导
- other=/dev/fd0
- label=floppy
- unsafe
- #引导Debian
- other=/dev/hda5
- label=Debian
- # table=/dev/hda5
复制代码
记得,更新下你的引导器,
- #/sbin/lilo
- [code]
-
- 这样,我的Mandrake linux 9.0实现了乾坤大转移了。在reboot之前,记得退出目标的linux哦。
-
- [code]
- #exit
- #cd /
- #umount /mnt/iso1/usr
- #umount /mnt/iso1/boot
- #umount /mnt/iso1
-
复制代码
reboot后,就可以启动你在目标盘安家的Mandrake了。
对于你用grub作为主引导器或你的机器已经有了其它的引导方式,请你自己自行修改变可以了,都一样道理的。
以上全部在Mandrake linux 9.0中测试通过,但其它的发行版本你也可参考下,或许对你有点作用,或许压根儿你用不上。这个帖子为"Mandrake一些FAQ(2)"中的"Q52:如何实现分区转移哦?"的姐妹篇。
后记:如果你的情况是这样的:你大转移的都是ide硬盘对ide硬盘或者是scsi硬盘对scsi硬盘,反正就是同一种类型的硬盘,你可能没有这么麻烦,至少在处理initrd是不用那么麻烦;假如你的linux系统只分了一个/区和swap区,而你又不想再在目的盘是再分,那么,实现起来更加方便了。呵呵,像我这样的情况是比较特别些。不过,至少在这过程中学到了一些以前不动手所学不到的东西。我记得曾经看过样的一个帖子:如何整个 Linux 移到另一个硬碟。他们好像是用cp过去的,我感觉还是用tar保险。不过,这个帖子曾经提到过几点建议:
- 1. rdev /vmlinuz /dev/xxxx, 这是将 root file system (那颗新硬碟)设到 kernel 中;
- 2. 修改 /etc/fstab, 设定新硬碟各 partition 所要 mount 的目录;
- 3. 可能要做一片 linux 开机片 (dd if=/vmlinuz of=/dev/fd0),
- 因为新硬碟的 MBR 尚未写入 lilo 的程式码;
- 4. 用软碟开机;
- 5. 修改 /etc/lilo.conf, 将开机设为那颗新硬碟, 然後执行 lilo,
- 这样应可以用硬碟开机;
复制代码
我感觉只要一张启动盘就可以了,不管是lilo的还是grub的。但还是grub引导盘好些 |
|