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 命令工具。但是,這些工具必須預先安裝在盒子上。
修復磁盤已滿時的問題
- 使用 gzip 或 bzip2 或 tar 命令壓縮未壓縮的日誌和其他文件。
gzip /ftpusers/tmp/*.log bzip2 /ftpusers/tmp/large.file.name
- 使用 rm 命令刪除類 Unix 系統上不必要的文件。
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 – 你的 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
您還可以使用磁盤工具獲得相同的信息
筆記: 不要對 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
請參閱特定於供應商的文檔以更換故障磁盤。
監控磁盤運行狀況
請參閱以前的教程。
- 在 Linux 或 UNIX 操作系統上使用 smartd 監控硬盤運行狀況
- 用於監視磁盤空間的 shell 腳本
- 磁盤已滿時 UNIX 收到警報
- 使用 Shell 腳本監控 UNIX/Linux 服務器磁盤空間
- 用於監控磁盤空間和發送電子郵件的 Perl 腳本
- NAS備份服務器磁盤監控shell腳本
除了腳本之外,還提供基於雲的或自託管的磁盤監控工具。一些例子:
結論是
我們希望這些技巧可以幫助您解決基於 Linux/Unix 的服務器上的系統磁盤問題。我們還建議實施良好的備份計劃,以便您可以從磁盤故障、意外文件刪除、文件損壞或服務器完全破壞中恢復。
- Debian/Ubuntu:為雲加密備份安裝 Duplicity
- HowTo:自動備份 MySQL 數據庫、Web 服務器文件到 FTP 服務器
- 如何設置 Red Hat & CentOS Linux 遠程備份/快照服務器
- 使用 Debian/Ubuntu Linux rsnapshot 增量備份實用程序安裝和配置遠程文件系統快照
- Linux 磁帶備份教程使用 mt 和 tar 命令
- FreeBSD 安裝 Rsnapshot 文件系統快照備份實用程序