Linux 磁盤自檢 你了解嗎?
本文轉(zhuǎn)載自微信公眾號(hào)「DBA閑思雜想錄」,作者瀟湘隱者 。轉(zhuǎn)載本文請(qǐng)聯(lián)系DBA閑思雜想錄公眾號(hào)。
在Linux系統(tǒng)中,有時(shí)候重啟會(huì)耗費(fèi)非常長(zhǎng)的時(shí)間,如果你進(jìn)一步檢查細(xì)節(jié),就會(huì)發(fā)現(xiàn)絕大部分時(shí)間都耗費(fèi)在磁盤自檢(fsck)上了,有時(shí)候遇到時(shí)間比較緊急的情況,磁盤自檢耗費(fèi)的時(shí)間非常長(zhǎng),真的是讓人心焦火急的!如下截圖所示
關(guān)于磁盤自檢,如果是新手,肯定都會(huì)有不少疑惑,下面從這幾個(gè)方面一一講述,希望能解答你的疑惑。下面實(shí)驗(yàn)版本為Red Hat Enterprise Linux Server release 5.7,請(qǐng)注意不同版本之間的區(qū)別。
為什么磁盤需要自檢呢?
現(xiàn)在的文件系統(tǒng)已經(jīng)非??煽?,極少出現(xiàn)問題,但是總有意外或錯(cuò)誤出現(xiàn)的概率,例如斷電、硬件失敗等,所以Linux會(huì)使用fsck來(lái)檢查和修復(fù)文件系統(tǒng)。fsck命令(filesystem consistency check),意思是文件系統(tǒng)一致性檢查。fsck能夠安全、自動(dòng)修復(fù)下面這5類問題:
- 未被引用的inode;
- 難以置信的超大鏈接數(shù)
- 沒有記錄在磁盤塊映射表中的未用數(shù)據(jù)塊
- 列出的空閑數(shù)據(jù)塊還在某個(gè)文中使用;
- 超級(jí)塊中不正確的匯總信息。
通常情況下,硬盤在啟動(dòng)時(shí)使用fsck -p來(lái)進(jìn)行檢查,它將檢查/etc/fstab中列出的所有本地文件系統(tǒng)。大多數(shù)系統(tǒng)設(shè)置為啟動(dòng)時(shí)自動(dòng)運(yùn)行fsck,希望任何錯(cuò)誤在系統(tǒng)使用前被檢測(cè)到,并得到修正。因?yàn)槭褂缅e(cuò)誤的文件系統(tǒng)可能使得問題變得更加糟糕。所以磁盤自檢是有必要的,這也是為什么大多數(shù)系統(tǒng)將其設(shè)置為啟動(dòng)時(shí)自動(dòng)運(yùn)行fsck(有一定規(guī)律,不是每次啟動(dòng)都會(huì)做磁盤自檢,取決于你的配置,下面闡述),所以沒有特殊必要的話,最好不要取消磁盤自檢。
什么時(shí)候磁盤才會(huì)自檢?
上面所述,并不是每次重啟都會(huì)做磁盤自檢,那么磁盤自檢的規(guī)律如何查看呢?此時(shí)需要借助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表示執(zhí)行磁盤自檢fsck的時(shí)間間隔,Maximum mount count表示強(qiáng)制自檢的掛載次數(shù),即達(dá)到最大掛載次數(shù)后,再次開機(jī)時(shí)就會(huì)強(qiáng)制自檢。上面信息告訴我們,磁盤自檢的時(shí)間間隔為一周,也就是7天。Maximum mount count 值為-1表示禁用這個(gè)功能。
如何更改磁盤自檢設(shè)置?
假如我要將磁盤自檢的時(shí)間間隔設(shè)置為一個(gè)月,那么可以如下設(shè)置
- [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 ~]#
如果我要設(shè)置磁盤掛載2次就必須進(jìn)行磁盤自檢,那么可以如下設(shè)置:
- [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 ~]#
當(dāng)然,你也可以一起設(shè)置,如下所示
- [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 ~]#
如何取消磁盤自檢設(shè)置?
如何取消、關(guān)閉磁盤自檢呢?我們可以有下面幾種方式:
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分區(qū)表中第六列(pass):指明自檢順序。(0為不自檢,1或者2為要自檢,如果是根分區(qū)要設(shè)為1,其他分區(qū)只能是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 ~]#
關(guān)于這兩者的優(yōu)先級(jí),我測(cè)試過,即使已經(jīng)滿足了Maximum mount count和Check interval里面的條件,如果在/etc/fstab里面關(guān)閉了磁盤自檢,那么在重啟時(shí),并不會(huì)做磁盤自檢,也就是說/etc/fstab設(shè)置里面的優(yōu)先級(jí)要高一些。
3:使用參數(shù)-f 跳過自檢
- [root@DB-Server ~]# shutdown -rf now
這種方式是臨時(shí)的,不需要修改系統(tǒng)配置。
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 quietinitrd /initrd-2.6.18-274.el5.img fastboot
如何強(qiáng)制下次重啟磁盤自檢?
如何強(qiáng)制系統(tǒng)下次root時(shí),進(jìn)行磁盤自檢?
方法1:使用tune2fs調(diào)整Maximum mount count和Check interval的值,使其下次重啟時(shí)滿足磁盤自檢。
方法2:關(guān)于這個(gè),在RHEL中,你可以在/etc/rc.sysinit 中看到如下代碼(Debian or Ubuntu Linux下查看/etc/init.d/checkfs.sh)如下所示:
所以,你只需要?jiǎng)?chuàng)建一個(gè)forcefsck文件,下次重啟時(shí),就能強(qiáng)制其進(jìn)行磁盤自檢。
- [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!
重啟過程中,你就會(huì)看到磁盤自檢。重啟后,你會(huì)發(fā)現(xiàn)剛才生成的forcefsck文件已經(jīng)不見了。
方法3:使用shutdown相關(guān)參數(shù)強(qiáng)制磁盤自檢
- [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/