C您想在 Linux 或類 Unix 系統上寫入硬盤嗎? 你的 Linux 硬盤有問題嗎?想要診斷壞的服務器磁盤問題嗎?為什麼我會在屏幕上收到“磁盤已滿”消息?我想學習如何解決磁盤已滿/損壞和故障問題。 試試這八個技巧來診斷 Linux 和 Unix 服務器上的硬盤驅動器問題。
各種Linux硬盤問題
作為開發人員或系統管理員,您可能會遇到以下問題:
- Linux 或 Unix 機器上的磁盤空間不足
- 磁盤損壞
- 文件系統損壞
- 磁盤配額
- RAID卡故障
- 由於軟件/硬件 RAID 等導致的 SSD/HDD 故障。
請參閱有關如何解決 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 命令工具。但是,這些工具必須預先安裝在盒子中。
修復磁盤已滿時的問題
- 使用 gzip、bzip2 或 tar 命令壓縮未壓縮的日誌和其他文件。
gzip /ftpusers/tmp/*.log bzip2 /ftpusers/tmp/large.file.name
- 要刪除類 Unix 系統上不需要的文件,請使用 rm 命令。
rm -rf /ftpusers/tmp/*.bmp
- 使用 rsync 命令將文件移動到另一個系統或外部硬盤驅動器。
rsync --remove-source-files -azv /ftpusers/tmp/*.mov /mnt/usbdisk/ rsync --remove-source-files -azv /ftpusers/tmp/*.mov server2:/path/to/dest/dir/
- 在類 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
- 截斷特定文件。這對日誌文件很有用。
truncate -s 0 /ftpusers/ftp.upload.log ### bash/sh etc ## >/ftpusers/ftp.upload.log ## perl ## perl -e'truncate "filename", LENGTH'
- 查找和刪除在 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-i 節點是否短缺?
df 命令報告有足夠的可用空間,但係統可能會聲稱文件系統已滿。您需要使用以下命令查看在文件系統上標識文件及其屬性的 inode:$ df -i
$ df -i /ftpusers/
樣本輸出:
Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda8 6250496 11568 6238928 1% /ftpusers
所以 /ftpuusers 一共有 62,50,496 個 inode,但只有 11,568 個。 您可以在 /ftpuusers 分區中自由創建另外 62,38,928 個文件。 如果您想使用 100% inode,請嘗試以下選項。
- 找到您不需要的文件並刪除它們或將它們移動到另一台服務器。
- 找到您不需要的大文件並刪除它們或將它們移動到另一台服務器。
4-我的硬盤快死了嗎?
日誌文件中的 I/O 錯誤(例如 /var/log/messages)表明您的硬盤有問題,可能是故障。 您可以使用 smartctl 命令檢查硬盤錯誤,該命令是 Linux 和 UNIX 等操作系統上的 SMART 磁盤控制和監視實用程序。語法如下:
smartctl -a /dev/DEVICE # check for /dev/sda on a Linux server smartctl -a /dev/sda
您還可以使用磁盤工具獲得相同的信息
筆記: 不要對 SMART 工具抱有太多期望。它可能不起作用。進行定期備份。
5-您的硬盤和服務器是否太熱?
高溫會使服務器變慢。因此,有必要保持服務器和磁盤的適當溫度。高溫會導致服務器關閉或損壞文件系統或磁盤。 通過使用 hddtemp 或 smartctl 實用程序從支持此功能的驅動器上的 SMART 讀取數據,檢查基於 Linux 或 Unix 系統的硬盤溫度。只有現代硬盤驅動器具有溫度傳感器。 hddtemp 還支持從 SCSI 驅動器讀取 SMART 信息。 hddtemp 充當簡單的命令行工具或從所有服務器獲取信息的守護程序。
hddtemp /dev/DISK hddtemp /dev/sg0
您還可以使用 smartctl 命令,如下所示:
smartctl -d ata -A /dev/sda | grep -i temperature
在 Linux 上,您可以使用 nvme 命令查找 NVMe SSD 溫度。$ sudo nvme smart-log /dev/nvme1n1
如何獲得CPU溫度?
您可以使用 lm_sensor 等 Linux 硬件監控工具來獲取基於 Linux 的系統的 CPU 溫度。
sensors
Debian Linux 服務器的示例輸出:
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.
7 – 在 Linux 上處理軟件 RAID
要檢查 Linux 軟件 RAID 的當前狀態,請輸入以下命令:
## get detail on /dev/md0 raid ## mdadm --detail /dev/md0 ## Find status ## cat /proc/mdstat watch cat /proc/mdstat
故障硬盤需要更換。您需要刪除發生故障的正確驅動器。此示例替換 /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
請參閱特定於供應商的文檔以更換故障磁盤。
監控磁盤狀態
請參閱上一個教程。
- 使用 smartd 監控 Linux 或 UNIX 操作系統上的硬盤狀態
- 用於監視磁盤空間的 Shell 腳本
- 磁盤已滿時 UNIX 收到警報
- 使用 shell 腳本監控 UNIX/Linux 服務器磁盤空間
- 監視磁盤空間和發送電子郵件的 Perl 腳本
- NAS備份服務器磁盤監控shell腳本
除了腳本之外,您還可以使用基於雲的或自託管的磁盤監控工具。一些例子:
結論是
我們希望這些技巧可以幫助您解決基於 Linux / Unix 的服務器上的系統磁盤問題。我們還建議您實施適當的備份計劃,以便您可以從磁盤故障、意外文件刪除、文件損壞或完全服務器損壞中恢復。
- Debian / Ubuntu:為雲中的加密備份安裝 Duplicaty
- 方法:MySQL數據庫,自動備份web服務器文件到FTP服務器
- 如何設置 Red Hat & CentOS Linux 遠程備份/快照服務器
- 使用 Debian / Ubuntu Linux rsnapshot 增量備份實用程序安裝和配置遠程文件系統快照
- Linux 磁帶備份使用 mt 和 tar 命令教程
- FreeBSD 安裝 Rsnapshot 文件系統快照備份實用程序