复制时,USB 驱动器名称从 /dev/sdb 更改为 /dev/sdc(然后再改回来)?

复制时,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 硬盘

答案1

您的配置似乎有很多问题。

  1. 将 USB 驱动器放在 fstab 中是没有意义的。Fstab 是系统存储设备及其挂载点的静态列表。您将静态驱动器/分区标识(基于控制器/设备地址)分配给静态挂载点。对于 USB 驱动器来说,这两者都不是真正的静态。在您的第一个示例中,如果您在系统中安装第二个硬盘,您将遇到问题:它将变成 /dev/sdb,将您当前的 USB 驱动器移动到 /dev/sdc,从而在启动时破坏您的配置。

  2. 此外,将驱动器放入 fstab 中并设置“自动”选项会告诉系统该驱动器将在启动时安装。如果由于某种原因驱动器在启动时断开连接,您的服务器将在启动过程中失败,这是一种非常不理想的情况。如果驱动器对于系统运行不是必需的,它至少不应该有“自动”选项。

  3. “nouser”选项是不必要的,它是默认选项。除非您真的知道自己在做什么,否则“sync”选项是个非常糟糕的想法。它不仅严重影响性能,还会对驱动器造成额外磨损,特别是闪存介质。

  4. fs_passno = 3(fstab 的第六列)会导致未定义的行为。有效值仅为 0、1 或 2。

  5. 将 NTFS 与用于备份 Linux 服务器的驱动器一起使用。您为什么要这样做?所有 Linux NTFS 实现都不理想,不足以在其上运行任何 Linux 子系统。您应该使用原生 Linux 文件系统,例如 Ext3。

从您的内核日志中,我可以预测其中一个或多个可能是有效的:

  1. 您的磁盘分区错误,即文件系统使用错误的参数格式化,大于实际分区;或者分区表中的分区(逻辑大小)大于驱动器的物理大小。这是您看到的“缓冲区 I/O 错误”造成的。您应该考虑完全重置此磁盘(包括分区表),然后从头开始重新分区和重新格式化。

  2. 您的磁盘中有一个坏扇区(“end_request:I/O 错误”)。您应该考虑运行badblocks磁盘进行检查。

  3. 您的 USB 外壳无法正常工作(来自“USB 重置”)。如果是外置硬盘,则应使用独立电源。USB 端口有时提供的 5V 500mA 不足以维持硬盘的机械运行。它也可能过热,特别是廉价的 USB 闪存驱动器。

  4. NTFS 文件系统已损坏。可以使用 修复它ntfsfix,但您应该再次记住NTFS 不是 Linux 原生文件系统。为了获得最佳效果,您需要一个 Windows 系统来正确检查此分区(使用 Scandisk)。

其他建议包括:停止使用 NTFS 并选择本机 Linux 文件系统,从 fstab 中删除该条目,手动将磁盘作为备份脚本的一部分挂载,完成后将其卸载并使用 UUID 或文件系统标签来引用磁盘。

答案2

您想调查 udev。它负责命名 /dev 下的设备节点,您可以设置规则来为您的 USB 密钥赋予唯一的名称。

答案3

如果你不想使用 UUID 或磁盘标签,那么总是有/dev/disk/by-/*设备名称。您还可以通过 make-model-serial 或 i/o 端口选择磁盘。

答案4

我见过廉价的 USB 设备在进行大量复制时做出各种愚蠢的事情。

(我工作的地方有我们软件的 USB 评估版,我添加了一个 4Gb 的记忆棒来制作它们。)去年我可能处理了几十根记忆棒。

我确信我见过廉价机型在频繁使用时 USB 状态机卡住的情况。同样,Ubuntu,但版本是 8.04LTS。

再次,呼应之前的海报,尝试不同的端口;我发现使用我所使用的笔记本电脑的供电扩展坞上的 USB 端口有帮助。

总体建议是坚持使用名牌驱动器。

相关内容