我在 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
你想调查udev。这负责在 /dev 下命名设备节点,您可以设置规则为您的 USB 密钥提供唯一名称。
您的配置似乎有很多问题。
将 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 或文件系统标签来引用磁盘。
如果您不想使用 UUID 或磁盘标签,则总是有
/dev/disk/by-
foo/*
设备名称。在那里,您还可以通过 make-model-serial 或 i/o 端口选择磁盘。在我看来,您的设备要么在复制过程中出现故障,要么没有从计算机获得足够的电量。
它连接到哪个 USB 端口?如果您有外部供电的 USB 集线器,请使用它。
否则,请尽可能靠近主板 - 某些计算机在前/顶部端口或扩展插槽的额外 USB 端口处可用的电源较少。
我见过廉价的 USB 设备在大量复制过程中会做各种愚蠢的事情。
(在我工作的地方,我们的软件有一个 USB 评估版,我添加了一个 4Gb 的记忆棒来生产它们。)去年我可能已经处理了几十个记忆棒。
我很确定我已经看到 USB 记忆棒上的状态机在廉价型号的大量使用下被卡住了。同样,Ubuntu,但 8.04LTS。
再次呼应之前的海报,尝试不同的端口;我在我正在使用的笔记本电脑的供电坞站上找到了一个正在使用的 USB 端口。
大量建议是坚持使用名牌驱动器。
您可以给卷一个标签,然后按标签安装它,例如
然后它可以插入任何端口或任何设备名称,它会被找到。您也可以使用 uuid,但它们不太方便。
您可以运行 USB 设备的表面扫描并查找坏扇区。syslog 中的输入/输出错误消息可能意味着存在坏扇区。我使用希捷的 seatools 进行固定 IDE/SATA 驱动器表面扫描。看看它是否可以识别您的 USB 驱动器。