2008-07-17

系统启动时LVM居然未激活

最近rp相当底下,这次更新了一些包。之后重启发现又再度出现在fsck时出错进入维护模式了。看一下发现/dev/vgname/lvname不存在。
因此推断肯定是在fsck时vg还没有激活,手动激活之后exit果然能正常启动。

好了,知道问题出在那里就好解决了。
我们找到启动脚本。编辑一下就好。。。
在我的ubuntu下

sudo gedit /etc/rcS.d/S30checkfs.sh

在最前面加入:
##Activition lvm volume group
/sbin/modprobe dm_mod
/sbin/vgscan
/sbin/vgchange -a y
##

ok,重启下就解决了。。。。

原理在于,我们需要在fsck这一步骤出错前。激活vg,这样才能通过这个步骤到下一个步骤 S35mountall.sh

此外可以参考此片段:出自blog.chinaunix.net

然后需要在系统启动脚本中加入激活LVM的命令
并且必须在挂载/etc/fstab中的文件系统之前激活LVM,不然怎么挂载阿。^_^
我写在了/etc/rc.d/init.d/mountfs这个脚本中,它的作用是
在fsck检查各个分区后,将/分区及其他分区重新挂载成read-write的

/sbin/vgscan -------->需要加入的两行
/sbin/vgchange -a y

mountfs脚本主要内容是:(传递start参数)

echo "Remounting root file system in read-write mode..."
mount -n -o remount,rw /
echo "Recording existing mounts in /etc/mtab..."
> /etc/mtab
mount -f / || failed=1
mount -f /proc || failed=1
if grep -q '[[:space:]]sysfs' /proc/mounts ; then
mount -f /sys || failed=1
fi
echo "Mounting remaining file systems..."
##############LVM##############
/sbin/vgscan #------->在挂载其他文件系统之前
/sbin/vgchange -a y #---->就激活了LVM,随后就挂载上啦
mount -a -O no_netdev #--->依照/etc/fstab挂载FS

这样系统启动时,就会激活LVM,并自动挂载上。

一篇关于LVM的文章中说,将这两条命令加在了检查文件系统脚本中,但是我加在那里
不成功,可能因为在checkfs时,系统是read-only的,而vgchange -a y
需要写入数据却无法写入,所以不行.

udev服务先于checkfs启动,并且通过mount -n -t ramfs ramfs /dev
将/dev挂载成ramfs,完全在内存中活动,无论根分区是否可写,/dev都是可写的。
莫非vgchange -a y 还要向其他位置写入数据?有待研究:)

在其他的发行版中,如Red Hat,Mandrake中,检查根文件系统,依照/etc/fstab
挂载各个文件系统,开启SWAP分区...等等,这些都是通过/etc/rc.d/rc.sysinit完成的
而在LFS中则是将这个脚本 分成了若干的小脚本,然后逐一的运行它们。
个人认为这样可以更直观的了解系统的启动过程,方便修改。
所以在其他发行版中,激活lvm,就要写到/etc/rc.d/rc.sysinit中
并且必须要在挂载/etc/fstab中文件系统之前激活。还要注意激活时,系统是rw的。

最后我又在mountfs中添加了关闭VG的语句,这样可以
在系统关机/重启的时候自动关闭VG。

/sbin/vgchange -a n ------>添加这句

当系统关机/重启时,mountfs会依照/etc/fstab卸载所有的文件系统:
mountfs
脚本内容 : (传递stop参数)

echo "Unmounting all other currently mounted file systems..."
umount -a -d -r -t noramfs
/sbin/vgchange -a n # --->加在了这里

在卸载LV卷后,才可以关闭VG,开始我加在了umount上面一行就不行。提示仍有LV在使用。

其他发行版中,关闭VG要比激活VG容易多啦。只要加在halt/reboot这个服务脚本里就可以。
其实只要卸载文件系统后的服务脚本都可以,随你喜欢了。 ^_^

没有评论: