Linux中國

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

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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國