摘要:在这章里,我们将从设备级别来考虑数据。

存储媒介

本章介绍以下命令:

  • mount - 挂载一个文件系统
  • umount - 卸载一个文件系统
  • fsck - 检查和修复一个文件系统
  • fdisk - 分区表控制器
  • mkfs - 创建文件系统
  • fdformat - 格式化一张软盘
  • dd - 把面向块的数据直接写入设备
  • genisoimage(mkisofs)- 创建一个ISO 9660的映像文件
  • wodim(cdrecord)- 把数据写入光存储媒介
  • md5sum - 计算MD5检验码

挂载和卸载存储设备

虽然现在Linux的桌面系统使得存储设备的管理变得很简单,只要把设备连上去就能工作,但还是有必要学习如何把设备手动连接到系统中,原因有二:

  1. 在非桌面系统中,如服务器,经常有极端的存储需求和复杂的配置要求,依然要手动完成。
  2. 学会手动连接设备,有助于理解Linux“一切皆文件”的重要思想。

管理存储设备的第一步就是把设备连接到文件系统树中,这个过程叫做挂载

Linux只有单一的文件系统树。区别于Windows,C盘D盘E盘等都有自己各自的文件系统树。

在文件/etc/fstab可以列出系统启动时要挂载的设备:

# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sdb6 during installation
UUID=ff5b0906-61da-4d74-8d9e-f9481aad129a /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sdb2 during installation
UUID=F81E-84BD  /boot/efi       vfat    umask=0077      0       1
# /home was on /dev/sdb7 during installation
UUID=c1a6df2f-ea8f-4094-9890-0860993a72e4 /home           ext4    defaults        0       2
# swap was on /dev/sdb8 during installation
UUID=dd1c784e-c69f-4c9e-b363-d050be0ba8e8 none            swap    sw              0       0

这些是硬盘分区。每行由六个字段组成,如下所示:

字段 内容 说明
file system 文件系统 一个UUID值。UUID 全称是 Universally Unique Identifier,也就是说,每个分区有一个唯一的 UUID 值,这样就不会发生分区识别混乱的问题了。
mount point 挂载点 设备所连接到的文件系统树的目录。
type 文件系统类型 Linux 允许挂载许多文件系统类型。大多数本地的Linux 文 件 系 统 是 ext4, 但 是 也 支 持 很 多 其 它 的,比方说 FAT16 (msdos), FAT32 (vfat),NTFS (ntfs),CD-ROM (iso9660),等等。
options 选项 文件系统可以通过各种各样的选项来挂载。有可能,例如,挂载只读的文件系统,或者挂载阻止执行任何程序的文件系统(一个有用的安全特性,避免删除媒介。)
dump 频率 一位数字,指定是否和在什么时间用 dump 命令来备份一个文件系统。
pass 次序 一位数字,指定 fsck 命令按照什么次序来检查文件系统。

查看挂载的文件系统列表

mount 命令被用来挂载文件系统。执行这个不带参数的命令,将会显示一系列当前挂载的文件系统:

xuxg@xuxg-ubuntu:~$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
/dev/sdb7 on /home type ext4 (rw,relatime)
...(省略)

这个列表的格式是:设备 on 挂载点 type 文件系统类型(选项)。比如第三行所示设备/dev/sdb7作为家目录(/home)被挂载,文件系统类型是ext4,并且可读可写(rw)。

可以通过mount命令和umount命令来挂载/卸载设备。

一个挂载点就是文件系统树中的一个目录。

确定设备名称

列出目录/dev(所有设备的住所)的内容,我们会看到许许多多的设备:

xuxg@xuxg-ubuntu:~$ ls /dev
autofs           loop1               rfkill    tty23  tty60      uhid
block            loop10              rtc       tty24  tty61      uinput
bsg              loop11              rtc0      tty25  tty62      urandom
btrfs-control    loop12              sda       tty26  tty63      usb

这个列表的内容揭示了一些设备命名的模式。这里有几个:

命名样式 设备
/dev/fd* 软盘驱动器
/dev/hd* 老系统中的 IDE(PATA) 磁盘。
/dev/lp* 打印机
/dev/sd* SCSI 磁盘。在最近的 Linux 系统中,内核把所有类似于磁盘的设备(包括 PATA/SATA 硬盘,闪存,和 USB 存储设备,比如说可移动的音乐播放器和数码相机)看作 SCSI 磁盘。剩下的命名系统类似于上述所描述的旧的/dev/hd* 命名方案。
/dev/sr* 光盘(CD/DVD 读取器和烧写器)

创建新的文件系统

想要用 Linux 本地文件系统来重新格式化一个U盘,而不是它现用的 FAT32系统。这涉及到两个步骤:

  1. (可选的)创建一个新的分区布局,若已存在的分区不是我们喜欢的。
  2. 在这个闪存上创建一个新的空的文件系统。

用 fdisk 命令操作分区

这个 fdisk 程序允许我们直接在底层与类似磁盘的设备(比如说硬盘驱动器和闪存驱动器)进行交互。使用这个工具可以在设备上编辑,删除,和创建分区。

用 mkfs 命令创建一个新的文件系统

mkfs(“make file system” 的简写),它能创建各种格式的文件系统。

测试和修复文件系统

在之前讨论文件/etc/fstab 时,我们会在每行的末尾看到一些神秘的数字。每次系统启动时,在挂载系统之前,都会按照惯例检查文件系统的完整性。这个任务由fsck 程序(是”file system check” 的简写)完成。每个 fstab 项中的最后一个数字指定了设备的检查顺序。若最后一个数字是0则相应设备不会被检查。在上面的实例中,我们看到首先检查/boot/efi/根,然后是/home ,而swap不检查。

除了检查文件系统的完整性之外,fsck 还能修复受损的文件系统,其成功度依赖于损坏的数量。在类 Unix 的文件系统中,文件恢复的部分被放置于 lost+found 目录里面,位于每个文件系统的根目录下面。

格式化软盘

fdformat 程序用来格式化软盘。

直接把数据移入/出设备

dd程序能执行此任务。它可以把数据块从一个地方复制到另一个地方。

比方说我们有两个相同容量的 USB 闪存驱动器,并且要精确地把第一个驱动器(中的内容)复制给第二个。如果连接两个设备到计算机上,它们各自被分配到设备/dev/sdb/dev/sdc上,这样我们就能通过下面的命令把第一个驱动器中的所有数据复制到第二个驱动器中。

dd if=/dev/sdb of=/dev/sdc

警告!这个 dd 命令非常强大。虽然它的名字来自于“数据定义”,有时候也把它叫做“清除磁盘”因为用户经常会误输入 if 或 of 的规范。在按下回车键之前,要再三检查输入与输出规范!

创建 CD-ROM 映像

写入一个可记录的 CD-ROM(一个 CD-R 或者是 CD-RW)由两步组成;

  1. 首先,构建一个 iso映像文件,这就是一个 CD-ROM 的文件系统映像。有两种可能:一是已有一张CD-ROM创建一个CD-ROM的映像拷贝,二是从文件集合中创建一个映像
  2. 第二步,把这个映像文件写入到 CD-ROM媒介中。

创建一个 CD-ROM 的映像拷贝

如果想要制作一张现有 CD-ROM 的 iso 映像,我们可以使用 dd 命令来读取 CD-ROW 中的所有数据块,并把它们复制到本地文件中。比如说我们有一张 Ubuntu CD,用它来制作一个 iso文件,以后我们可以用它来制作更多的拷贝。插入这张 CD 之后,确定它的设备名称(假定是/dev/cdrom),然后像这样来制作 iso 文件:

dd if=/dev/cdrom of=ubuntu.iso

这项技术也适用于 DVD 光盘,但是不能用于音频 CD,因为它们不使用文件系统来存储数据。对于音频 CD,看一下 cdrdao 命令。

从文件集合中创建一个映像

创建一个包含目录内容的 iso 映像文件,我们使用 genisoimage 程序。为此,我们首先创建一个目录,这个目录中包含了要包括到此映像中的所有文件,然后执行这个 genisoimage命令来创建映像文件。例如,如果我们已经创建一个叫做 ∼/cd-rom-files 的目录,然后用文件填充此目录,再通过下面的命令来创建一个叫做cd-rom.iso 映像文件:

genisoimage -o cd-rom.iso -R -J ~/cd-rom-files

-R 选项添加元数据为 Rock Ridge 扩展,这允许使用长文件名和 POSIX 风格的文件权限。同样地,这个 -J 选项使 Joliet 扩展生效,这样 Windows 中就支持长文件名了。

写入 CD-ROM 镜像

有了一个映像文件之后,我们可以把它烧写到光盘中。下面讨论的大多数命令对可记录的CD-ROW 和 DVD 媒介都适用。

直接挂载一个 ISO 镜像

有一个诀窍,我们可以用它来挂载 iso 映像文件,虽然此文件仍然在我们的硬盘中,但我们当作它已经在光盘中了。添加 -o loop选项来挂载(同时带有必需的 -t iso9660 文件系统类型),挂载这个映像文件就好像它是一台设备,把它连接到文件系统树上:

mkdir /mnt/iso_image
mount -t iso9660 -o loop image.iso /mnt/iso_image

面的示例中,我们创建了一个挂载点叫做/mnt/iso_image,然后把此映像文件image.iso挂载到挂载点上。映像文件被挂载之后,可以把它当作,就好像它是一张真正的 CD-ROM 或者 DVD。当不再需要此映像文件后,记得卸载它。

清除一张可重写入的 CD-ROM

可重写入的 CD-RW 媒介在被重使用之前需要擦除或清空。为此,我们可以用 wodim 命令,指定设备名称和清空的类型。此 wodim 程序提供了几种清空类型。最小(且最快)的是 fast 类型:

wodim dev=/dev/cdrw blank=fast

写入镜像

写入一个映像文件,我们再次使用 wodim 命令,指定光盘设备名称和映像文件名:

wodim dev=/dev/cdrw image.iso

除了设备名称和映像文件之外,wodim 命令还支持非常多的选项。常见的两个选项是,-v可详细输出,和 - daodisk-at-once 模式写入光盘。如果你正在准备一张光盘为的是商业复制,那么应该使用这种模式。wodim 命令的默认模式是 track-at-once,这对于录制音乐很有用。