本文转载自微信公众号《DBA的杂念》,作者潇湘隐士。转载本文请联系DBA杂念公众号。在Linux系统中,有时重启需要很长时间。如果进一步查看细节,你会发现大部分时间花在了磁盘自检(fsck)上。有时候时间比较急,磁盘自检时间很长,着急啊!如下图所示,如果你是磁盘自检的新手,肯定会有很多疑惑。下面将对这几个方面一一进行说明。我希望你能回答你的疑惑。下面的实验版本是RedHatEnterpriseLinuxServerrelease5.7,请注意不同版本之间的差异。为什么磁盘需要自检?现在的文件系统是非常可靠的,出问题的很少,但是总是有可能出现意外或者错误,比如掉电,硬件故障等等,所以Linux会使用fsck来检查和修复文件系统。fsck命令(filesystemconsistencycheck)意思是文件系统一致性检查。fsck可以安全自动修复以下五类问题:未引用的inode;令人难以置信的大量链接;磁盘块映射表中没有记录未使用的数据块;文件中列出的空闲数据块仍在使用中;超级块中的摘要信息不正确。通常,在启动时使用fsck-p检查硬盘驱动器,它会检查/etc/fstab中列出的所有本地文件系统。大多数系统都设置为在启动时自动运行fsck,希望在使用系统之前检测到并纠正任何错误。因为使用错误的文件系统会使问题变得更糟。所以磁盘自检是很有必要的,这也是为什么大部分系统都会设置开机自动运行fsck(有一定的规律,不是每次都启动磁盘自检,要看你的配置,下面会解释),所以如果没有特殊需要,最好不要取消磁盘自检。磁盘什么时候自检?上面说了并不是每次重启都会做磁盘自检,那么如何查看磁盘自检的规则呢?这时候需要使用tune2fs命令[root@DB-Server~]#tune2fs-l/dev/sda2|grep-E"Maximummountcount|Checkinterval"Maximummountcount:-1Checkinterval:604800(1week)[root@DB-Server~]#如上图,Checkinterval表示磁盘自检fsck的时间间隔,Maximummountcount表示强制自检的挂载次数,即达到最大挂载次数后,设备再次开机会强制自检。以上信息告诉我们磁盘自检间隔为一周,也就是7天。Maximummountcount值-1会禁用此功能。如何更改磁盘自检设置?如果我想设置磁盘自检间隔为一个月,那么可以设置[root@DB-Server~]#tune2fs-l/dev/sda2|grep-i-E'mount|check'Lastmountedon:默认mountoptions:user_xattraclLastmounttime:MonJul411:30:542016Mountcount:94Maximummountcount:-1Lastchecked:SunJan421:34:242015Checkinterval:604800(1周)Nextcheckafter:SunJan1121:34:242015[root@DB-Serverune~]#tune2fs2.sfda1/tun39(2006年5月29日)将检查间隔设置为2592000秒[root@DB-Server~]#tune2fs-l/dev/sda2|grep-i-E'mount|check'Lastmountedon:默认挂载选项:user_xattraclLastmounttime:MonJul411:30:542016Mountcount:94Maximummountcount:-1Lastchecked:SunJan421:34:242015Checkinterval:2592000(1month)Nextcheckafter:TueFeb321:34:242015[root@DB-Server~]#如果我要挂载两次磁盘进行磁盘自检,可以设置如下:[root@DB-Server~]#tune2fs-l/dev/sda2|grep-i-E'mount|check'Lastmountedon:Defaultmountoptions:user_xattraclLastmounttime:MonJul411:30:542016Mountcount:94Maximummountcount:-1Lastchecked:SunJan421:34:242015Checkinterval:2592000(1month)Nextcheckafter:TueFeb321:34:242015[root@DB-Server~]#tune2fs-c2/dev/sda2tune2fs1.39(29-May-2006)Settingmaximalmountcountto2[root@DB-服务器~]#tune2fs-l/dev/sda2|grep-i-E'mount|check'Lastmountedon:Defaultmountoptions:user_xattraclLastmounttime:MonJul411:30:542016Mountcount:94Maximummountcount:2Lastchecked:SunJan421:34:242015Checkinterval:2592000(1个月))Nextcheckafter:TueFeb321:34:242015[root@DB-Server~]#当然,你也可以一起设置,如下所示[root@DB-Server~]#tune2fs-i60-c10/dev/sda2tune2fs1.39(29-2006年5月)将最大安装计数设置为10将检查之间的间隔设置为5184000秒你有新邮件在/var/spool/mail/root[root@DB-Server~]#tune2fs-l/dev/sda2|grep-i-E'mount|check'Lastmountedon:<不可用>默认安装选项:user_xattraclLastmounttime:MonJul411:30:542016Mountcount:94Maximummountcount:10Lastchecked:SunJan421:34:242015Checkinterval:5184000(2months)Nextcheckafter:ThuMar521:34:242015[root@DB-Server~]#如何取消磁盘自检设置?如何取消和关闭磁盘自检?我们可以有以下方法:1:使用命令tune2fs-i0-c0取消磁盘自检,如下图[root@DB-Server~]#tune2fs-l/dev/sda2|grep-i-E'mount|check'Lastmountedon:默认mountoptions:user_xattraclLastmounttime:MonJul411:30:542016Mountcount:94Maximummountcount:10Lastchecked:SunJan421:34:242015Checkinterval:5184000(2months)Nextcheckafter:ThuMar521~Server~Serverroot@2015[]#tune2fs-i0-c0/dev/sda2tune2fs1.39(29-May-2006)Settingmaximalmountvercountto-1Settingintervalbetweenchecksto0@root~secondsser[]#[root@DB-Server~]#tune2fs-l/dev/sda2|grep-i-E'mount|check'Lastmountedon:默认mountoptions:user_xattraclLastmounttime:MonJul411:30:542016Mountcount:94Maximummountcount:-1Lastchecked:SunJan421:34:242015Checkinterval:0()[root@DB-Server~]#2:修改/etc/fstab中第六列的值/etc/fstab的分区表中第六列(pass):Indicateself-testorder(0表示不自检,1或2表示自检,如果是根分区就设置为1,其他分区只能是2)[root@DB-Server~]#more/etc/fstabLABEL=//ext3defaults11LABEL=/boot/bootext3defaults12tmpfs/dev/shmtmpfsdefaults00/dev/mapper/VolGroup01-LogVol00/u02ext3defaults02/dev/VolGroup02/LogVol00/u05ext3defaults12#/dev/VolGroup03/LogVol00/u06ext3defaults11devpts/dev/ptsdevptsgid=5,mode=62000sysfs/syssysfsdefaults00proc/procprocdefaults00LABEL=SWAP-sda3swapswapdefaults00[root@DB-Server~]#more/etc/fstabLABEL=//ext3defaults10LABEL=/boot/boottext3defaults10tmpfs/dev/shmtmpfsdefaults00/dev/mapper/VolGroup01-LogVol001defaultV00/u02extdev/VolGroup03/LogVol00/u06ext3defaults10devpts/dev/ptsdevptsgid=5,mode=62000sysfs/syssysfsdefaults00proc/procprocdefaults00LABEL=SWAP-sda3swapswapdefaults00Youhavenewmailin/var/spool/mail/root[root@DB-Server~]#关于这两个的优先级我有经过测试,即使Maximummountcount和Checkinterval中的条件有遇到过,如果在/etc/fstab中关闭了磁盘自检,那么重启时就不会进行磁盘自检,也就是说/etc/fstab设置中的优先级更高。3:使用参数-f跳过自检[root@DB-Server~]#shutdown-rfnow这种方法是临时的,不需要修改系统配置。4:在/boot/grub/grub.conf中添加fastboot,如下所示[root@DB-Server/]#cd/boot[root@DB-Serverboot]#lsconfig-2.6.18-274.el5grubinitrd-2.6。18-274.el5.imglost+foundsymvers-2.6.18-274.el5.gzSystem.map-2.6.18-274.el5vmlinuz-2.6.18-274.el5[root@DB-Serverboot]#cdgrub/[root@DB-Servergrub]#lsdevice.mapfat_stage1_5grub.confjfs_stage1_5minix_stage1_5splash.xpm.gzstage2vstafs_stage1_5e2fs_stage1_5ffs_stage1_5iso9660_stage1_5menu.lstreiserfs_stage1_5stage1ufs2_stage1_5xfs_stage1_5[root@DB-Servergrub]#moregrub.conf#grub.confgeneratedbyanaconda##Notethatyoudonothavetorerungrubaftermakingchangestothisfile#NOTICE:Youhavea/bootpartition.Thismeansthat#allkernelandinitrdpathsarerelativeto/boot/,eg.#root(hd0,0)#kernel/vmlinuz-versionroroot=/dev/sda2#initrd/initrd-version.img#boot=/dev/sdadefault=0timeout=5splashimage=(hd0,0)/grub/splash.xpm。gzhiddenmenutitleRedHatEnterpriseLinuxServer(2.6.18-274.el5)root(hd0,0)kernel/vmlinuz-2.6.18-274.el5roroot=LABEL=/rhgbquietinitrd/initrd-2.6。18-274.el5.imgfastbootYouhavenewmailin/var/spool/mail/root[root@DB-Servergrub]#kernel/vmlinuz-2.6.18-274.el5roroot=LABEL=/rhgbquietinitrd/initrd-2.6.18-274.el5.img如何强制fastboot下次重启磁盘自检?下次root时如何强制系统进行磁盘自检?方法一:使用tune2fs调整Maximummountcount和Checkinterval的值,使其满足下次重启时磁盘的要求自检方法二:关于这个,在RHEL中,可以看到在/etc/rc.sysinit(Debian或UbuntuLinux下查看/etc/init.d/checkfs.sh)中的代码如下:所以,你只需要创建一个forcefsck文件,下次重启时,你可以强制它执行磁盘自检。[root@DB-Server/]#touch/forcefsck[root@DB-Server/]#rebootBroadcastmessagefromroot(pts/1)(MonJul414:33:592016):系统正在停机重启!重启过程中会看到磁盘自检。重启后会发现刚才生成的forcefsck文件没有了。方法三:使用shutdown相关参数强制磁盘自检[root@DB-Server/]#manshutdown#shutdown-rFnow参考:http://www.pc-freak.net/blog/changing-setting-33-times-standard-fsck-file-system-check-debian-linux-desktop-systems/http://www.cyberciti.biz/faq/linux-force-fsck-on-the-next-reboot-or-boot-sequence/www.cyberciti.biz/faq/linux-unix-bypassing-fsck/