由于项目需要,在一台服务器上部署了iscsi的initiator,并用LVM管理iscsi挂载的分区,当每次重启的时候,系统会报错:
fsck.ext3 ...
File system check faild. Please repair CONTROL-D will exit from this shell and manually continue system startup...
*** when you leave the shell
Give root password for maintenance
(or type Control-D to continue):
经过一番检查,认定是由于lvm跟chechfs.sh两个脚本先于iscsi initiator启动,这样造成了内核检查文件系统的时候,没有发现/etc/fstab中标明的iscsi设备,从而提示出错。这个错误倒无所谓,但是每次报错的时候正是启动的过程,还不能通过ssh的终端远程连接,每次只能跑到机房里来按这个ctrl+d。于是打算研究研究,该如何解决。方法其实就很简单了,只要将iscsi initiator先于lvm和checkfs.sh启动就行了,于是找到/etc/rcS.d目录,发现其中启动lvm的软链接为S26lvm,启动checkfs.sh的软链接为S30checkfs,这里S表示start,S后的数字表示顺序,也就是当系统启动的时候,内核会根据/etc/rcS.d目录下S后的数字顺序,依次启动各个服务。于是创建如下的软链接:
ln -s /etc/rcS.d/S20iscsi.d /etc/init.d/iscsid
ln -s /etc/rcS.d/S21iscsi /etc/init.d/iscsi
(我的系统为centos 5.2,initiator为iscsi-initiator-utils,属于open-iscsi开源项目的一部分)
重启,果然发现在启动lvm之前,iscsi initiator首先连到了target端,问题基本解决了。
但是,紧接着发现另一个问题,假如我把target端的ip san关掉或者拔掉网线,这时候重启服务器,发现系统无法挂载iscsi设备,内核仍然让我输入ctrl+d,才肯进入系统,这该咋办?于是找到“File system check faild. Please repair CONTROL-D will exit from this shell and manually continue system startup”错误信息的出处,原来是chechfs.sh这个脚本,它的功能是负责在每次启动系统的时候用fsck来扫描硬盘,于是打开这个脚本,发现里面有这样一段话:
if [ $? -gt 1 ]
then
log_action_end_msg "$?" || true
log_failure_msg "File system check failed. Please repair manually."
log_failure_msg "CONTROL-D will exit from this shell and continue system startup."
# Start a single user shell on the console
/sbin/sulogin $CONSOLE
else
log_action_end_msg 0
fi
其中/sbin/sulogin $CONSOLE大约就是阻塞并等待输入ctrl+d的命令了,将它注释掉,再重启,问题解决