在Linux系統中,有時候重啟會耗費非常長的時間,如果你進一步檢查細節,就會發現絕大部分時間都耗費在磁盤自檢(fsck)上了,有時候遇到時間比較緊急的情況,磁盤自檢耗費的時間非常長,真的是讓人心焦火急的!如下截圖所示
關於磁盤自檢,如果是新手,肯定都會有不少疑惑,下面從這幾個方面一一講述,希望能解答你的疑惑。下面實驗版本為Red Hat Enterprise Linux Server release 5.7,請注意不同版本之間的區別。
為什麼磁盤需要自檢呢?
現在的文件系統已經非常可靠,極少出現問題,但是總有意外或錯誤出現的概率,例如斷電、硬件失敗等,所以Linux會使用fsck來檢查和修復文件系統。fsck命令(filesystem consistency check),意思是文件系統一致性檢查。fsck能夠安全、自動修復下面這5類問題:
未被引用的inode;
難以置信的超大鏈接數
沒有記錄在磁盤塊映射表中的未用數據塊
列出的空閒數據塊還在某個文中使用;
超級塊中不正確的匯總信息。
通常情況下,硬盤在啟動時使用fsck -p來進行檢查,它將檢查/etc/fstab中列出的所有本地文件系統。大多數系統設置為啟動時自動運行fsck,希望任何錯誤在系統使用前被檢測到,並得到修正。因為使用錯誤的文件系統可能使得問題變得更加糟糕。所以磁盤自檢是有必要的,這也是為什麼大多數系統將其設置為啟動時自動運行fsck(有一定規律,不是每次啟動都會做磁盤自檢,取決於你的配置,下面闡述),所以沒有特殊必要的話,最好不要取消磁盤自檢。
什麼時候磁盤才會自檢?
上面所述,並不是每次重啟都會做磁盤自檢,那麼磁盤自檢的規律如何查看呢? 此時需要借助tune2fs命令
[root@DB-Server ~]# tune2fs -l /dev/sda2 | grep -E "Maximum mount count|Check interval"
Maximum mount count: -1
Check interval: 604800 (1 week)
[root@DB-Server ~]#
如上所示,Check interval表示執行磁盤自檢fsck的時間間隔,Maximum mount count表示強制自檢的掛載次數,即達到最大掛載次數後,再次開機時就會強制自檢。上面信息告訴我們,磁盤自檢的時間間隔為一周,也就是7天。Maximum mount count 值為-1表示禁用這個功能。
如何更改磁盤自檢設置?
加入我要將磁盤自檢的時間間隔設置為一個月,那麼可以如下設置
[root@DB-Server ~]# tune2fs -l /dev/sda2 | grep -i -E 'mount|check'
Last mounted on: <not available>
Default mount options: user_xattr acl
Last mount time: Mon Jul 4 11:30:54 2016
Mount count: 94
Maximum mount count: -1
Last checked: Sun Jan 4 21:34:24 2015
Check interval: 604800 (1 week)
Next check after: Sun Jan 11 21:34:24 2015
[root@DB-Server ~]# tune2fs -i 30 /dev/sda2
tune2fs 1.39 (29-May-2006)
Setting interval between checks to 2592000 seconds
[root@DB-Server ~]# tune2fs -l /dev/sda2 | grep -i -E 'mount|check'
Last mounted on: <not available>
Default mount options: user_xattr acl
Last mount time: Mon Jul 4 11:30:54 2016
Mount count: 94
Maximum mount count: -1
Last checked: Sun Jan 4 21:34:24 2015
Check interval: 2592000 (1 month)
Next check after: Tue Feb 3 21:34:24 2015
[root@DB-Server ~]#
如果我要設置磁盤掛載2次就必須進行磁盤自檢,那麼可以如下設置:
[root@DB-Server ~]# tune2fs -l /dev/sda2 | grep -i -E 'mount|check'
Last mounted on: <not available>
Default mount options: user_xattr acl
Last mount time: Mon Jul 4 11:30:54 2016
Mount count: 94
Maximum mount count: -1
Last checked: Sun Jan 4 21:34:24 2015
Check interval: 2592000 (1 month)
Next check after: Tue Feb 3 21:34:24 2015
[root@DB-Server ~]# tune2fs -c 2 /dev/sda2
tune2fs 1.39 (29-May-2006)
Setting maximal mount count to 2
[root@DB-Server ~]# tune2fs -l /dev/sda2 | grep -i -E 'mount|check'
Last mounted on: <not available>
Default mount options: user_xattr acl
Last mount time: Mon Jul 4 11:30:54 2016
Mount count: 94
Maximum mount count: 2
Last checked: Sun Jan 4 21:34:24 2015
Check interval: 2592000 (1 month)
Next check after: Tue Feb 3 21:34:24 2015
[root@DB-Server ~]#
當然,你也可以一起設置,如下所示
[root@DB-Server ~]# tune2fs -i 60 -c 10 /dev/sda2
tune2fs 1.39 (29-May-2006)
Setting maximal mount count to 10
Setting interval between checks to 5184000 seconds
You have new mail in /var/spool/mail/root
[root@DB-Server ~]# tune2fs -l /dev/sda2 | grep -i -E 'mount|check'
Last mounted on: <not available>
Default mount options: user_xattr acl
Last mount time: Mon Jul 4 11:30:54 2016
Mount count: 94
Maximum mount count: 10
Last checked: Sun Jan 4 21:34:24 2015
Check interval: 5184000 (2 months)
Next check after: Thu Mar 5 21:34:24 2015
[root@DB-Server ~]#
如何取消磁盤自檢設置?
如何取消、關閉磁盤自檢呢?我們可以有下面幾種方式:
1: 使用命令tune2fs -i 0 -c 0 取消磁盤自檢,如下所示
[root@DB-Server ~]# tune2fs -l /dev/sda2 | grep -i -E 'mount|check'
Last mounted on: <not available>
Default mount options: user_xattr acl
Last mount time: Mon Jul 4 11:30:54 2016
Mount count: 94
Maximum mount count: 10
Last checked: Sun Jan 4 21:34:24 2015
Check interval: 5184000 (2 months)
Next check after: Thu Mar 5 21:34:24 2015
[root@DB-Server ~]# tune2fs -i 0 -c 0 /dev/sda2
tune2fs 1.39 (29-May-2006)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds
[root@DB-Server ~]#
[root@DB-Server ~]# tune2fs -l /dev/sda2 | grep -i -E 'mount|check'
Last mounted on: <not available>
Default mount options: user_xattr acl
Last mount time: Mon Jul 4 11:30:54 2016
Mount count: 94
Maximum mount count: -1
Last checked: Sun Jan 4 21:34:24 2015
Check interval: 0 (<none>)
[root@DB-Server ~]#
2:修改/etc/fstab中第六列的值
/etc/fstab分區表中第六列(pass):指明自檢順序。 (0為不自檢,1或者2為要自檢,如果是根分區要設為1,其他分區只能是2)
[root@DB-Server ~]# more /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
/dev/mapper/VolGroup01-LogVol00 /u02 ext3 defaults 0 2
/dev/VolGroup02/LogVol00 /u05 ext3 defaults 1 2
#/dev/VolGroup03/LogVol00 /u06 ext3 defaults 1 1
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda3 swap swap defaults 0 0
[root@DB-Server ~]# more /etc/fstab
LABEL=/ / ext3 defaults 1 0
LABEL=/boot /boot ext3 defaults 1 0
tmpfs /dev/shm tmpfs defaults 0 0
/dev/mapper/VolGroup01-LogVol00 /u02 ext3 defaults 0 0
/dev/VolGroup02/LogVol00 /u05 ext3 defaults 1 0
#/dev/VolGroup03/LogVol00 /u06 ext3 defaults 1 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda3 swap swap defaults 0 0
You have new mail in /var/spool/mail/root
[root@DB-Server ~]#
關於這兩者的優先級,我測試過,即使已經滿足了Maximum mount count和Check interval裡面的條件,如果在/etc/fstab裡面關閉了磁盤自檢,那麼在重啟時,並不會做磁盤自檢,也就是說/etc/fstab設置裡面的優先級要高一些。
3:使用參數-f 跳過自檢
[root@DB-Server ~]# shutdown -rf now
這種方式是臨時的,不需要修改系統配置。
4:在/boot/grub/grub.conf 中添加fastboot,如下所示
[root@DB-Server /]# cd /boot
[root@DB-Server boot]# ls
config-2.6.18-274.el5 grub initrd-2.6.18-274.el5.img lost+found symvers-2.6.18-274.el5.gz System.map-2.6.18-274.el5 vmlinuz-2.6.18-274.el5
[root@DB-Server boot]# cd grub/
[root@DB-Server grub]# ls
device.map fat_stage1_5 grub.conf jfs_stage1_5 minix_stage1_5 splash.xpm.gz stage2 vstafs_stage1_5
e2fs_stage1_5 ffs_stage1_5 iso9660_stage1_5 menu.lst reiserfs_stage1_5 stage1 ufs2_stage1_5 xfs_stage1_5
[root@DB-Server grub]# more grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-274.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-274.el5 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.18-274.el5.img fastboot
You have new mail in /var/spool/mail/root
[root@DB-Server grub]#
kernel /vmlinuz-2.6.18-274.el5 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.18-274.el5.img fastboot
如何強制下次重啟磁盤自檢?
如何強制系統下次root時,進行磁盤自檢?
方法1: 使用tune2fs調整Maximum mount count和Check interval的值,使其下次重啟時滿足磁盤自檢。
方法2:關於這個,在RHEL中,你可以在/etc/rc.sysinit 中看到如下代碼(Debian or Ubuntu Linux下查看/etc/init.d/checkfs.sh)如下所示:
所以,你只需要創建一個forcefsck文件,下次重啟時,就能強制其進行磁盤自檢。
[root@DB-Server /]# touch /forcefsck
[root@DB-Server /]# reboot
Broadcast message from root (pts/1) (Mon Jul 4 14:33:59 2016):
The system is going down for reboot NOW!
重啟過程中,你就會看到磁盤自檢。重啟後,你會發現剛才生成的forcefsck文件已經不見了。
方法3:使用shutdown相關參數強制磁盤自檢
[root@DB-Server /]# man shutdown
# shutdown -rF now
參考資料:
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/
http://xxxxxx/Linuxjc/1139317.html TechArticle