Linux
複製時 USB 驅動器將名稱從 /dev/sdb 更改為 /dev/sdc (然後再返回)?
我在 Ubuntu 9.04 伺服器安裝中的文件夾中安裝了一個 USB 驅動器。掛載選項儲存在 /etc/fstab 中以便於掛載/解除安裝:
# <file system> <mount point> <type> <options> <dump> <pass> /dev/sdb1 /media/backup ntfs nouser,auto,sync 0 3
(我已經將該部分更改為 UUID 以查看它是否有助於解決問題)。備份一直在每天早上將文件複製到磁碟,沒有問題。剛才我試圖將其中一個文件複製到另一個文件夾,結果出現錯誤:
cp: reading `ts01-even.tgz': Input/output error
我發現問題的發生是因為 /dev/sdb 已更改為 /dev/sdc。如果我掛載 /dev/sdc 並再次嘗試複製文件,驅動器將變回 /dev/sdb。將 fstab 文件系統從 /dev/sdX1 更改為 UUID 後,行為沒有任何差異。此外,我曾經能夠列出 tarball 的文件內容,但現在嘗試這樣做會導致上述行為。有任何想法嗎?
更新:
執行備份腳本並將備份儲存在 USB HD 上不會產生問題,但在 tarball 中列出文件會產生問題。這是 tarball 命令“tar -ztf FILENAME”期間 syslog 的輸出:
Jul 3 15:09:14 ts01 kernel: [308398.446893] Buffer I/O error on device sdc1, logical block 786433 Jul 3 15:09:28 ts01 ntfs-3g[7468]: ntfs_attr_pread_i: ntfs_pread failed: Input/output error Jul 3 15:09:28 ts01 ntfs-3g[7468]: Failed to read of MFT, mft=5 count=1 br=-1: Input/output error Jul 3 15:09:28 ts01 kernel: [308412.404579] Buffer I/O error on device sdc1, logical block 786433 Jul 3 15:09:29 ts01 ntfs-3g[7468]: Unmounting /dev/sdc1 (FreeAgent Drive) Jul 3 15:09:32 ts01 ntfs-3g[29176]: Version 2009.2.1 external FUSE 27 Jul 3 15:09:32 ts01 ntfs-3g[29176]: Mounted /dev/sdb1 (Read-Write, label "FreeAgent Drive", NTFS 3.1) Jul 3 15:09:32 ts01 ntfs-3g[29176]: Cmdline options: rw,sync Jul 3 15:09:32 ts01 ntfs-3g[29176]: Mount options: rw,sync,silent,allow_other,nonempty,relatime,fsname=/dev/sdb1,blkdev,blksize=4096 Jul 3 15:10:01 ts01 /USR/SBIN/CRON[29630]: (root) CMD ([ -x /usr/sbin/update-motd ] && /usr/sbin/update-motd 2>/dev/null) Jul 3 15:11:35 ts01 kernel: [308539.310031] usb 1-1: reset high speed USB device using ehci_hcd and address 38 ... (log repeated with a different address) Jul 3 15:12:47 ts01 kernel: [308611.790038] usb 1-1: reset high speed USB device using ehci_hcd and address 38 Jul 3 15:12:49 ts01 kernel: [308613.148837] end_request: I/O error, dev sdb, sector 84779391 Jul 3 15:12:49 ts01 kernel: [308613.148871] Buffer I/O error on device sdb1, logical block 10597416 ... (log repeated with a different address, with the logical block incrementing by 1 each time) Jul 3 15:12:49 ts01 kernel: [308613.149090] Buffer I/O error on device sdb1, logical block 10597425 Jul 3 15:12:49 ts01 ntfs-3g[29176]: ntfs_attr_pread_i: ntfs_pread failed: Input/output error Jul 3 15:12:49 ts01 ntfs-3g[29176]: ntfs_attr_pread error reading '/TS01_Backup/ts01-even.tgz' at offset 177012736: 131072 <> -1: Input/output error Jul 3 15:12:49 ts01 ntfs-3g[29176]: ntfs_attr_pread_i: ntfs_pread failed: Input/output error Jul 3 15:12:49 ts01 ntfs-3g[29176]: ntfs_attr_pread error reading '/TS01_Backup/ts01-even.tgz' at offset 177012736: 4096 <> -1: Input/output error
我發現了一些似乎相關的東西,但按照說明進行操作並沒有成功:FreeAgent Drives
您的配置似乎有很多問題。
- 將 USB 驅動器放入 fstab 是沒有意義的。Fstab 是系統儲存設備及其掛載點的大部分靜態列表。您將靜態驅動器/分區標識(基於控制器/設備地址)分配給靜態安裝點。對於 USB 驅動器來說,這些都不是靜態的。在您的第一個範例中,如果您在系統中安裝第二個硬碟,您會遇到問題:它將變成 /dev/sdb,將您目前的 USB 驅動器移動到 /dev/sdc,從而在啟動時破壞您的配置。
- 此外,將驅動器置於 fstab 並帶有“auto”選項會告訴系統該驅動器將在引導時安裝。如果由於某種原因驅動器在引導時斷開連接,您的伺服器將在引導過程中出現故障,這是一個非常不受歡迎的情況。如果驅動器不是系統執行所必需的,它至少不應該有“自動”選項。
- “nouser”選項是不必要的,它是預設的。除非您真的知道自己在做什麼,否則“同步”選項是一個非常糟糕的主意。它不僅會嚴重影響性能,還會導致驅動器的額外磨損,特別是快閃記憶體介質。
- fs_passno = 3(fstab 的第六列)導致未定義的行為。有效值僅為 0、1 或 2。
- 將 NTFS 與用於備份 Linux 伺服器的驅動器一起使用。你為什麼這樣做?所有 Linux NTFS 實現都不是最理想的,不足以執行任何 Linux 子系統。您應該使用原生 Linux 文件系統,例如 Ext3。
從您的核心日誌中,我可以預測其中一項或多項可能是有效的:
- 您有一個分區錯誤的磁碟,即文件系統使用錯誤的參數格式化,比實際分區大;或者分區表中的分區(邏輯大小)大於驅動器的物理大小。這來自您看到的“緩衝區 I/O 錯誤”。您應該考慮完全重置此磁碟,包括分區表,並從頭開始重新分區和重新格式化。
- 您的磁碟中有一個壞扇區(“end_request:I/O 錯誤”)。您應該考慮
badblocks
在磁碟上執行來檢查。- 您的 USB 外殼無法正常工作(來自“usb 重置”)。如果是外置硬碟,則應使用獨立電源。USB 埠(有時)提供的 5V 500mA 不足以保持硬碟驅動器的機制執行。它也可能過熱,特別是便宜的 USB 快閃記憶體驅動器。
- NTFS 文件系統已損壞。使用 修復它可能是可能的
ntfsfix
,但您應該再次記住,NTFS 不是本機 Linux 文件系統。為獲得最佳效果,您需要一個 Windows 系統來正確檢查此分區(使用 Scandisk)。其他建議包括:停止使用 NTFS 並選擇本機 Linux 文件系統,從 fstab 中刪除該條目,手動掛載磁碟作為備份腳本的一部分,完成後解除安裝它並使用 UUID 或文件系統標籤來引用磁碟。