解決八種Linux硬碟問題的技巧

nixCraft發表於2014-12-01

不能在Linux或者類UNIX系統的硬碟上寫入資料?想解決伺服器上磁碟損壞的問題嗎?想知道你為什麼總是在螢幕上看到“磁碟已滿”的字眼嗎?想學習處理這些問題的辦法嗎?試試一下這8個解決Linux及UNIX伺服器硬碟問題的小貼士吧。

#1 - 錯誤: 裝置上無剩餘空間

當你的類UNIX系統磁碟寫滿了時你會在螢幕上看到這樣的資訊。本例中,我執行fallocate命令然後我的系統就會提示磁碟空間已經耗盡:

$ fallocate -l 1G test4.img
fallocate: test4.img: fallocate failed: No space left on device

第一步是執行df命令來檢視一個有分割槽的檔案系統的總磁碟空間和可用空間的資訊:

$ df

或者試試可讀性比較強的輸出格式:

$ df -h

部分輸出內容:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda6       117G   54G   57G  49% /
udev            993M  4.0K  993M   1% /dev
tmpfs           201M  264K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1002M     0 1002M   0% /run/shm
/dev/sda1       1.8G  115M  1.6G   7% /boot
/dev/sda7       4.7G  145M  4.4G   4% /tmp
/dev/sda9       9.4G  628M  8.3G   7% /var
/dev/sda8        94G  579M   89G   1% /ftpusers
/dev/sda10      4.0G  4.0G     0 100% /ftpusers/tmp

使用df命令輸出可以清楚地發現,在 /dev/sda10 分割槽下總共4.0Gb的空間被全部寫滿了。

修復磁碟寫滿的問題

1.用gzip,bzip2或tar命令壓縮未壓縮的日誌和其它檔案

gzip /ftpusers/tmp/*.log
bzip2 /ftpusers/tmp/large.file.name

2.在類UNIX系統中用rm命令刪除不想要的檔案

rm -rf /ftpusers/tmp/*.bmp

3.用rsync命令移動檔案至其它系統或外接硬碟:

rsync --remove-source-files -azv /ftpusers/tmp/*.mov /mnt/usbdisk/
rsync --remove-source-files -azv /ftpusers/tmp/*.mov server2:/path/to/dest/dir/

4.在類UNIX系統中找出最佔磁碟空間的目錄或檔案

du -a /ftpusers/tmp | sort -n -r | head -n 10
du -cks * | sort -rn | head

5.清空指定檔案。這招對日誌檔案很有效:

truncate -s 0 /ftpusers/ftp.upload.log
### bash/sh等 ##
>/ftpusers/ftp.upload.log
## perl ##
perl -e'truncate "filename", LENGTH'

6.在Linux和UNIX中找出並刪除顯示著但已經被刪除的大檔案:

## 基於Linux/Unix/OSX/BSD等系統 ##
lsof -nP | grep '(deleted)'

## 只基於Linux ##
find /proc/*/fd -ls | grep  '(deleted)'

清空它:

 ## 基於Linux/Unix/OSX/BSD等所有系統 ##
> "/path/to/the/deleted/file.name"
## 只基於Linux ##
> "/proc/PID-HERE/fd/FD-HERE"

#2 - 檔案系統是隻讀模式嗎?

當你嘗試新建或儲存一個檔案時,你可能最終得到諸如以下的錯誤:

$ cat > file
-bash: file: Read-only file system

執行mount命令來檢視被掛載的檔案系統是否處於只讀狀態:

$ mount
$ mount | grep '/ftpusers'

在基於Linux的系統中要修復這個問題,只需將這個處於只讀狀態的檔案系統重新掛載即可:

# mount -o remount,rw /ftpusers/tmp

(LCTT 譯註:如果硬碟由於硬體故障而 fallback 到只讀模式,建議不要強制變回讀寫模式,而是趕快替換硬碟)

另外,我是這樣用rw模式重新掛載FreeBSD 9.x伺服器的根目錄的:

# mount -o rw /dev/ad0s1a /

#3 - Am I running out of inodes?

有時候,df命令能顯示出磁碟有空餘的空間但是系統卻聲稱檔案系統已經寫滿了。此時你需要用以下命令來檢查能在檔案系統中識別檔案及其屬性的索引節點

$ df -i
$ df -i /ftpusers/

部分輸出內容:

Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/sda8      6250496 11568 6238928    1% /ftpusers

如上 /ftpusers 下有總計62,50,496KB大小的索引節點但是隻有11,568KB被使用。你可以在 /ftpusers 位置下另外建立62,38,928KB大小的檔案。如果你的索引節點100%被使用了,試試看以下的選項:

  • 找出不想要的檔案並刪除它,或者把它移動到其它伺服器上。
  • 找出不想要的大檔案並刪除它,或者把它移動到其它伺服器上。

(LCTT 譯註:如果一個分割槽儲存了太多的小檔案,會出現 inode 用完而儲存扇區還有空閒的情況,這種情況下要麼清除小檔案或在不需要獨立訪問的情況下將它們打包成一個大檔案;要麼將資料儲存好之後重新分割槽,並設定分割槽的 -t news 屬性,增加 inode 分配)

#4 - 我的硬碟驅動器宕了嗎?

日誌檔案中的輸入/輸出錯誤(例如 /var/log/messages)說明硬碟出了一些問題並且可能已經失效,你可以用smartctl命令來檢視硬碟的錯誤,這是一個在類UNIX系統下控制和監控硬碟狀態的一個命令。語法如下:

smartctl -a /dev/DEVICE
# 在Linux伺服器下檢查 /dev/sda 
smartctl -a /dev/sda

你也可以用"Disk Utility"這個軟體來獲得同樣的資訊。

圖 01: Gnome磁碟工具(Applications > System Tools > Disk Utility)

注意: 不要對S.M.A.R.T.工具期望太高,它在某些狀況下無法工作,我們要定期做備份。

#5 - 我的硬碟驅動器和伺服器是不是太熱了?

高溫會引起伺服器低效,所以你需要把伺服器和磁碟維持在一個平穩適當的溫度,高溫甚至能導致伺服器當機或損壞檔案系統和磁碟。用hddtemp或smartctl功能,透過從支援S.M.A.R.T.功能的硬碟上讀取資料的方式,從而查出你的Linux或基於UNIX系統上的硬碟溫度。只有現代硬驅動器有溫度感測器。hddtemp功能也支援從SCSI驅動器讀取S.M.A.R.T.資訊。hddtemp能作為一個簡單的命令列工具或守護程式來從所有伺服器中獲取資訊:

hddtemp /dev/DISK
hddtemp /dev/sg0

部分輸出內容如下:

圖 02: hddtemp正在執行

你也可以像下面顯示的那樣使用smartctl命令:

smartctl -d ata -A /dev/sda | grep -i temperature

我怎麼獲取CPU的溫度

你可以使用Linux硬體監控工具,例如像用基於Linux系統的lm_sensor功能來獲取CPU溫度

sensors

Debian伺服器的部分輸出內容:

圖 03: sensors命令提供了一臺Linux計算機的CPU核心溫度和其它資訊

#6 - 處理損壞的檔案系統

伺服器上的檔案系統可能會因為硬體重啟或一些其它的錯誤比如壞的扇區而損壞。你可以用fsck命令來修復損壞的檔案系統

umount /ftpusers
fsck -y /dev/sda8

來看看怎麼應對Linux檔案系統故障的更多資訊。

#7 - 處理Linux中的軟陣列

輸入以下命令來檢視Linux軟陣列的最近狀態:

 ## 獲得 /dev/md0 上磁碟陣列的具體內容 ##
mdadm --detail /dev/md0

## 檢視狀態 ##
cat /proc/mdstat
watch cat /proc/mdstat

部分輸出內容:

圖 04: 檢視Linux軟陣列狀態命令

你需要把有故障的硬體驅動器更換掉,別刪錯了。本例中,我更換了 /dev/sdb (RAID 6中的第二個硬體驅動器)。沒必要依靠離線儲存檔案來修復Linux上的磁碟陣列,因為這隻在你的伺服器支援熱插拔硬碟的情況下才能工作:

## 從一個md0陣列中刪除磁碟 ##
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md0 --remove /dev/sdb1

# 對 /dev/sdbX 的剩餘部分做相同操作 ##
# 如果不是熱插拔硬碟就執行關機操作 ##
shutdown -h now

## 從 /dev/sda 複製分割槽表至新的 /dev/sdb 下 ##
sfdisk -d /dev/sda | sfdisk /dev/sdb
fdisk -l

## 新增 ##
mdadm --manage /dev/md0 --add /dev/sdb1
# 對 /dev/sdbX 的剩餘部分做相同操作 ##

# 現在md0會再次同步,透過螢幕檢視 ## 
watch cat /proc/mdstat

來看看加快Linux磁碟陣列同步速度的小貼士來獲取更多資訊。

#8 - 處理硬陣列

你可以用samrtctl命令或者供應商特定的命令來檢視磁碟陣列和你所管理的磁碟的狀態:

## SCSI磁碟 
smartctl -d scsi --all /dev/sgX

## Adaptec磁碟陣列
/usr/StorMan/arcconf getconfig 1

## 3ware磁碟陣列
tw_cli /c0 show

對照供應商特定文件來更換你的故障磁碟。

監控磁碟的健康狀況

來看看我們先前的教程:

  1. Monitoring hard disk health with smartd under Linux or UNIX operating systems
  2. Shell script to watch the disk space
  3. UNIX get an alert when disk is full
  4. Monitor UNIX / Linux server disk space with a shell scrip
  5. Perl script to monitor disk space and send an email
  6. NAS backup server disk monitoring shell script

結論

我希望以上這些小貼士會幫助你改善在基於Linux/Unix伺服器上的系統磁碟問題。我還建議執行一個好的備份計劃從而有能力從磁碟故障、意外的檔案刪除操作、檔案損壞和伺服器完全被破壞等意外情況中恢復:


via: http://www.cyberciti.biz/datacenter/linux-unix-bsd-osx-cannot-write-to-hard-disk/

作者:nixCraft 譯者:ZTinoZ 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章