解決Linux硬盤問題的8個技巧:磁盤已滿或無法寫入


C。在您的 Linux 或類 Unix 系統中寫入硬盤時遇到問題?Linux 硬盤驅動器有問題?想診斷服務器中的壞磁盤問題?為什麼?我想知道如何解決完整/損壞或故障磁盤問題。 試試這八個技巧來診斷 Linux 和 Unix 服務器上的硬盤問題。

各種Linux硬盤問題

開發者或系統管理員可能會遇到以下問題

  • Linux 或 Unix 機器上的磁盤空間不足
  • 磁盤損壞
  • 文件系統損壞
  • 磁盤配額
  • RAID卡故障
  • SSD/HDD 故障,例如軟件/硬件 RAID

請參閱有關如何解決 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 的總空間,其中使用了 4.0Gb。您還可以使用為您的服務器或桌面提供磁盤使用信息的 duf、ncdu 或 pydf 命令工具。但是,這些工具必須預先安裝在盒子上。

duf 命令的工作原理

使用 ncdu 命令檢查 Linux 或 Unix 上的磁盤佔用

pydf 是另一個用於解決 Linux 和 Unix 硬盤問題的豐富多彩且有用的視覺輔助工具。

修復磁盤已滿時的問題

  1. 使用 gzip 或 bzip2 或 tar 命令壓縮未壓縮的日誌和其他文件。
    gzip /ftpusers/tmp/*.log
    bzip2 /ftpusers/tmp/large.file.name
  2. 使用 rm 命令刪除類 Unix 系統上不必要的文件。
     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
    # check for the whole disk #
    du -cks / | sort -rn | head
  5. 截斷特定文件。這對日誌文件很有用。
    truncate -s 0 /ftpusers/ftp.upload.log
    ### bash/sh etc ##
    >/ftpusers/ftp.upload.log
    ## perl ##
    perl -e'truncate "filename", LENGTH'
  6. 查找和刪除在 Linux 或 Unix 上打開但已刪除的大文件。
    ## Works on Linux/Unix/OSX/BSD etc ##
    lsof -nP | grep '(deleted)'
     
    ## Only works on Linux ##
    find /proc/*/fd -ls | grep  '(deleted)'

    截斷:

     ## works on Linux/Unix/BSD/OSX etc all ##
    > "/path/to/the/deleted/file.name"
    ## works on Linux only ##
    > "/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

從 FreeBSD 9.x 服務器以 rw 模式重新安裝的另一個示例:
# mount -o rw /dev/ad0s1a /

當檢測到磁盤或文件系統問題時,Linux 文件系統進入只讀模式。因此,最好檢查磁盤是否嚴重故障。檢查磁盤的整體運行狀況。
$ sudo smartctl -d ata -H /dev/sda

測試完成後,運行以下命令查看磁盤是否出現故障
$ sudo smartctl --attributes --log=selftest /dev/sda

有關 smartctl 命令的更多信息,請參閱測試 Linux 服務器 SCSI/SATA/SSD 硬盤驅動器是否存在錯誤頁面。

3 – 你的 inode 用完了嗎?

df 命令可能會報告有足夠的可用空間,但係統聲稱文件系統已滿。您需要檢查在文件系統上標識文件及其屬性的 inode,如下所示:
$ df -i
$ df -i /ftpusers/

示例輸出:

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

所以 /ftpusers 總共有 62,50,496 個 inode,但只有 11,568 個在使用。 您可以在 /ftpusers 分區中自由創建另外 62,38,928 個文件。 如果使用 100% inode,請嘗試以下選項:

  • 查找不必要的文件並刪除它們或將它們移動到另一台服務器。
  • 查找並刪除不必要的大文件或將它們移動到另一台服務器。

4 – 我的硬盤死了嗎?

日誌文件(例如 /var/log/messages)中的 I/O 錯誤表明您的硬盤存在問題。 您可以使用 smartctl 命令檢查硬盤是否有錯誤,該命令是 Linux 和 UNIX 等操作系統中的 SMART 磁盤控制和監視實用程序。語法是:

smartctl -a /dev/DEVICE
# check for /dev/sda on a Linux server
smartctl -a /dev/sda

您還可以使用磁盤工具獲得相同的信息

Linux 磁盤實用程序

筆記: 不要對 SMART 工具抱有太多期望。在某些情況下它可能不起作用。創建定期備份。

5 – 您的硬盤和服務器是否過熱?

高溫會降低服務器的運行性能。因此,有必要為服務器和磁盤保持適當的溫度。高溫會關閉服務器或損壞文件系統和磁盤。 通過使用 hddtemp 或 smartctl 實用程序從 SMART 讀取支持此功能的驅動器的數據,檢查基於 Linux 或 Unix 的系統上的硬盤溫度。只有現代硬盤驅動器才有溫度傳感器。 hddtemp 還支持從 SCSI 驅動器讀取 SMART 信息。 hddtemp 用作簡單的命令行工具或用作從所有服務器獲取信息的守護程序。

hddtemp /dev/DISK
hddtemp /dev/sg0

圖 02:運行中的 hddtemp

您還可以像這樣使用 smartctl 命令:

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

在 Linux 中,您可以使用 nvme 命令檢查 NVMe SSD 的溫度。
$ sudo nvme smart-log /dev/nvme1n1

Linux 查找 NVMe SSD 溫度命令

如何獲得CPU溫度?

可以使用 lm_sensor 等 Linux 硬件監控工具來獲取基於 Linux 的系統的 CPU 溫度。

sensors

Debian Linux 服務器的示例輸出:

圖 03:在 Linux 中提供 CPU 核心溫度和其他信息的傳感器命令

6 – 處理損壞的文件系統

服務器上的文件系統可能會因硬重啟或其他錯誤(如壞塊)而損壞。您可以使用 fsck 命令修復損壞的文件系統:

umount /ftpusers
fsck -y /dev/sda8

有關更多信息,請了解如何在 Linux 文件系統故障中倖存下來。 你是在 Linux 還是 FreeBSD 上使用 ZFS?試試下面的命令來檢查你的 ZFS 文件系統的完整性

# Step 1. Get pool list 
sudo zpool list
 
# Step 2. No fsck utility equivalent exists for ZFS. Instead we use the following
sudo zpool scrub rpool
 
# Step 3. Check pool status for errors
sudo zpool status -v rpool
 
# Step 4. Replace disk if you see error reported by above commands.

解決 Linux 硬盤問題的 8 個技巧:磁盤已滿、無法寫入磁盤等

7 – 在 Linux 中處理軟件 RAID

要檢查 Linux 軟件 RAID 的當前狀態,請輸入以下命令:

 ## get detail on /dev/md0 raid ##
mdadm --detail /dev/md0
 
## Find status ##
cat /proc/mdstat
watch cat /proc/mdstat

圖 04:檢查 Linux 軟件 RAID 命令的狀態

您應該更換故障硬盤。您必須卸下發生故障的正確驅動器。在本例中,替換 /dev/sdb(RAID 6 中的第二個硬盤)。在不使存儲脫機的情況下修復 Linux 中的 RAID。這僅在服務器支持熱插拔硬盤驅動器時才有效。

## remove disk from an array md0 ##
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md0 --remove /dev/sdb1
 
# Do the same steps again for rest of /dev/sdbX ##
# Power down if not hot-swappable hard disk: ##
shutdown -h now
 
## copy partition table from /dev/sda to newly replaced /dev/sdb ##
sfdisk -d /dev/sda | sfdisk /dev/sdb
fdisk -l
 
## Add it ##
mdadm --manage /dev/md0 --add /dev/sdb1
# do the same steps again for rest of /dev/sdbX ##
 
# Now md0 will sync again. See it on screen ## 
watch cat /proc/mdstat

有關更多信息,請參閱在 Linux 上提高 RAID 同步速度的技巧。

8 – 處理硬件 RAID

您可以使用 samrtctl 命令或供應商特定的命令檢查控制器中 RAID 和磁盤的狀態。

## SCSI disk 
smartctl -d scsi --all /dev/sgX
 
## Adaptec RAID array
/usr/StorMan/arcconf getconfig 1
 
## 3ware RAID Array
tw_cli /c0 show

請參閱特定於供應商的文檔以更換故障磁盤。

監控磁盤運行狀況

請參閱以前的教程。

  1. 在 Linux 或 UNIX 操作系統上使用 smartd 監控硬盤運行狀況
  2. 用於監視磁盤空間的 shell 腳本
  3. 磁盤已滿時 UNIX 收到警報
  4. 使用 Shell 腳本監控 UNIX/Linux 服務器磁盤空間
  5. 用於監控磁盤空間和發送電子郵件的 Perl 腳本
  6. NAS備份服務器磁盤監控shell腳本

除了腳本之外,還提供基於雲的或自託管的磁盤監控工具。一些例子:

  1. 雲表 與 AWS 雲集成並設置磁盤佔用警報
    Cloudwatch Linux 服務器磁盤監控
  2. 服務器密度 SaaS 基於雲的監控
  3. 納吉奧斯 或類似的開源軟件

結論是

我們希望這些技巧可以幫助您解決基於 Linux/Unix 的服務器上的系統磁盤問題。我們還建議實施良好的備份計劃,以便您可以從磁盤故障、意外文件刪除、文件損壞或服務器完全破壞中恢復。

  • Debian/Ubuntu:為雲加密備份安裝 Duplicity
  • HowTo:自動備份 MySQL 數據庫、Web 服務器文件到 FTP 服務器
  • 如何設置 Red Hat & CentOS Linux 遠程備份/快照服務器
  • 使用 Debian/Ubuntu Linux rsnapshot 增量備份實用程序安裝和配置遠程文件系統快照
  • Linux 磁帶備份教程使用 mt 和 tar 命令
  • FreeBSD 安裝 Rsnapshot 文件系統快照備份實用程序