开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
前言
在前面章节中,我们已经从文件级别看了操作数据。在这章里,我们将从设备级别来考虑数据。
Linux 有着令人惊奇的能力来处理存储设备,不管是物理设备,比如说硬盘,还是网络设备,或者是虚拟存储设备,像 RAID(独立磁盘冗余阵列) 和 LVM(逻辑卷管理器)。
然而,这不是一本关于系统管理的书籍,我们不会试图深入地覆盖整个主题。
我们将努力做的就是介绍一些概念和用来管理存储设备的重要命令。
我们将会使用 USB 闪存,CD-RW 光盘(因为系统配备了 CD-ROM 烧写器)和一张软盘
我们将看看以下命令:
-
mount –挂载一个文件系统
-
umount –卸载一个文件系统
-
fsck –检查和修复一个文件系统
-
fdisk –分区表控制器
-
mkfs –创建文件系统
-
fdformat –格式化一张软盘
-
dd —把面向块的数据直接写入设备
-
genisoimage (mkisofs) –创建一个 ISO 9660 的映像文件
-
wodim (cdrecord) –把数据写入光存储媒介
-
md5sum –计算 MD5 检验码
一、存储媒介
1.1 挂载(mount命令)和卸载存储设备(umount命令)
Linux 桌面系统的最新发展已经使存储设备管理对于桌面用户来说极其容易。
大多数情况下,我们只要把设备连接到系统中,它就能工作。
在过去(比如说,2004 年),这个工作必须手动完成。在非桌面系统中(例如,服务器中),这仍然是一个主要地手动过程,因为服务器经常有极端的存储需求和复杂的配置要求。
管理存储设备的第一步是把设备连接到文件系统树中。 这个过程叫做挂载,允许设备参与到操作系统中。
回想一下第三章,类似于 Unix 的操作系统,像 Linux,维护单一文件系统树,设备连接到各个结点上。
这与其它操作系统形成对照,比如说 MS-DOS 和 Windows 系统中,每个设备(例如 C:\,D:\,等)保持着单独的文件系统树。
有一个叫做/etc/fstab的文件可以列出系统启动时要挂载的设备(典型地,硬盘分区)。
下面是来自于 Fedora 7 系统的/etc/fstab 文件实例:
在这个实例中所列出的大多数文件系统是虚拟的,并不适用于我们的讨论。
就我们的目的而言,前三个是我们感兴趣的:
这些是硬盘分区。每行由六个字段组成,如下所示:
1.2 查看挂载的文件系统列表(mount)
这个 mount 命令被用来挂载文件系统。
执行这个不带参数的命令,将会显示一系列当前挂载的文件系统:
这个列表的格式是:
设备 on 挂载点 type 文件系统类型(可选的)。
例如,第一行所示设备/dev/sda2 作为根文件系统被挂载,文件系统类型是 ext3,并且可读可写(这个“rw”选项)。
在这个列表的底部有两个有趣的条目。
倒数第二行显示了在读卡器中的一张 2G 的 SD 内存卡,挂载到了/media/disk 上。最后一行是一个网络设备,挂载到了/misc/musicbox 上。
1.3 确定设备名称 (ls /dev)
在一些自动挂载设备的环境下,我们如何查清楚设备名呢?
首先,让我们看一下系统怎样来命名设备。如果我们列出目录/dev(所有设备的住所)的内容,我们会看到许许多多的设备:
[me@linuxbox ~]$ ls /dev
另外,我们经常看到符号链接比如说/dev/cdrom,/dev/dvd 和/dev/flfloppy,它们指向实际的设备文件,提供这些链接是为了方便使用。
如果你工作的系统不能自动挂载可移动的设备,你可以使用下面的技巧来决定当可移动设备连接后,它是怎样被命名的。
首先,启动一个实时查看文件/var/log/messages (你可能需要超级用户权限):
[me@linuxbox ~]$ sudo tail -f /var/log/messages
这个文件的最后几行会被显示,然后停止。
下一步,插入这个可移动的设备。
尝试插入一个闪存时,内核瞬间就会发现它,并且会打印一些日志。
显示再次停止之后,输入 Ctrl-c,重新得到提示符。输出结果的有趣部分是一再提及“[sdb]”,这正好符和我们期望的 SCSI 磁盘设备名称。
Jul 23 10:07:59 linuxbox kernel: sdb: sdb1
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI
removable disk
这告诉我们这个设备名称是/dev/sdb 指整个设备,/dev/sdb1 是这个设备的第一分区。正如我们所看到的,使用 Linux 系统充满了有趣的监测工作。
小贴士:使用这个 tail -f /var/log/messages 技巧是一个很不错的方法,可以实时观察系统的一举一动。
既然知道了设备名称,我们就可以挂载这个闪存驱动器了:
这个设备名称会保持不变只要设备与计算机保持连接并且计算机不会重新启动。
1.4 创建新的文件系统
假若我们想要用 Linux 本地文件系统来重新格式化这个闪存驱动器,而不是它现用的FAT32 系统。
这涉及到两个步骤:
- 可选的 创建一个新的分区布局若已存在的分区不是我们喜欢的。
- 在这个闪存上创建一个新的空的文件系统。
注意!在下面的练习中,我们将要格式化一个闪存驱动器。
拿一个不包含有用数据的驱动器作为实验品,因为它将会被擦除!再次,请确定你指定了正确的系统设备名称。未能注意此警告可能导致你格式化(即擦除)错误的驱动器!
1.5 用 fdisk 命令操作分区
这个 fdisk 程序允许我们直接在底层与类似磁盘的设备(比如说硬盘驱动器和闪存驱动器)进行交互。使用这个工具可以在设备上编辑,删除,和创建分区。
1.6 用 mkfs 命令创建一个新的文件系统
完成了分区编辑工作(它或许是轻量级的),是时候在我们的闪存驱动器上创建一个新的文件系统了。
为此,我们会使用 mkfs(“make fifile system” 的简写),它能创建各种格式的文件系统。
在此设备上创建一个 ext3 文件系统,我们使用 “-t” 选项来指定这个 “ext3” 系统类型,随后是我们要格式化的设备分区名称:
[me@linuxbox ~]$ sudo mkfs -t ext3 /dev/sdb1
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
3904 inodes, 15608 blocks
780 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=15990784
2 block groups
8192 blocks per group, 8192 fragments per group
1952 inodes per group
Superblock backups stored on blocks:
8193
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[me@linuxbox ~]$
当 ext3 被选为文件系统类型时,这个程序会显示许多信息。若把这个设备重新格式化为它最初的 FAT32 文件系统,指定 “vfat” 作为文件系统类型:
[me@linuxbox ~]$ sudo mkfs -t vfat /dev/sdb1
任何时候添加额外的存储设备到系统中时,都可以使用这个分区和格式化的过程。虽然我们只以一个小小的闪存驱动器为例,同样的操作可以被应用到内部硬盘和其它可移动的存储设备上像 USB 硬盘驱动器。
1.7 测试和修复文件系统
在之前讨论文件/etc/fstab 时,我们会在每行的末尾看到一些神秘的数字。每次系统启动
时,在挂载系统之前,都会按照惯例检查文件系统的完整性。这个任务由 fsck 程序(是”fifilesystem check” 的简写)完成。每个 fstab 项中的最后一个数字指定了设备的检查顺序。在上面的实例中,我们看到首先检查根文件系统,然后是 home 和 boot 文件系统。若最后一个数字是零则相应设备不会被检查。
除了检查文件系统的完整性之外,fsck 还能修复受损的文件系统,其成功度依赖于损坏的数量。在类似于 Unix 的文件系统中,文件恢复的部分被放置于 lost+found 目录里面,位于每个文件系统的根目录下面。检查我们的闪存驱动器(首先应该卸载),我们能执行下面的操作:
[me@linuxbox ~]$ sudo fsck /dev/sdb1
fsck 1.40.8 (13-Mar-2008)
e2fsck 1.40.8 (13-Mar-2008)
/dev/sdb1: clean, 11/3904 files, 1661/15608 blocks
什么是 fsck?
Unix 文化中,“fsck” 这个单词往往会被用来代替一个流行的词,“fsck”和这个词共享了三个字母。
这个尤其适用,因为你可能会说出上文提到的词,若你发现自己处于这种境况下,被强制来运行 fsck 命令时。
1.8 格式化软盘
对于那些还在使用配备了软盘驱动器的计算机的用户,我们也能管理这些设备。
准备一张可用的空白软盘要分两个步骤。首先,对这张软盘执行低级格式化,然后创建一个文件系统。
为了完成格式化,我们使用 fdformat 程序,同时指定软盘设备名称(通常为/dev/fd0):
[me@linuxbox ~]$ sudo fdformat /dev/fd0
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done
接下来,通过 mkfs 命令,给这个软盘创建一个 FAT 文件系统:
[me@linuxbox ~]$ sudo mkfs -t msdos /dev/fd0
注意我们使用这个“msdos”文件系统类型来得到旧(小的)风格的文件分配表。当一个软磁盘被准备好之后,则可能像其它设备一样挂载它。
1.9 直接把数据移入/出设备
虽然我们通常认为计算机中的数据以文件形式来组织数据,也可以“原始的”形式来考虑数据。
如果我们看一下磁盘驱动器,例如,我们看到它由大量的数据“块”组成,而操作系统却把这些数据块看作目录和文件。然而,如果把磁盘驱动器简单地看成一个数据块大集合,我们就能执行有用的任务,如克隆设备。
这个 dd 程序能执行此任务。它可以把数据块从一个地方复制到另一个地方。它使用独特的语法(由于历史原因),经常它被这样使用
dd if=input_file of=output_file [bs=block_size [count=blocks]]
比方说我们有两个相同容量的 USB 闪存驱动器,并且要精确地把第一个驱动器(中的内容)复制给第二个。
如果连接两个设备到计算机上,它们各自被分配到设备/dev/sdb 和/dev/sdc 上,这样我们就能通过下面的命令把第一个驱动器中的所有数据复制到第二个驱动器中。
1.10 创建 CD-ROM 映像
创建一个 CD-ROM 的映像拷贝
从文件集合中创建一个映像
1.11 写入 CD-ROM 镜像
直接挂载一个 ISO 镜像
清除一张可重写入的 CD-ROM
写入镜像
1.12 补充
通常验证一下我们已经下载的 iso 映像文件的完整性很有用处。
在大多数情况下,iso 映像文件的贡献者也会提供一个 checksum 文件。一个 checksum 是一个神奇的数学运算的计算结果,这个数学计算会产生一个能表示目标文件内容的数字。
如果目标文件的内容即使更改一个二进制位,checksum 的结果将会非常不一样。
生成 checksum 数字的最常见方法是使用md5sum 程序。
当你使用 md5sum 程序的时候,它会产生一个独一无二的十六进制数字:
当你下载完映像文件之后,你应该对映像文件执行 md5sum 命令,然后把运行结果与发行
商提供的 md5sum 数值作比较。
除了检查下载文件的完整性之外,我们也可以使用 md5sum 程序验证新写入的光学存储介质。为此,首先我们计算映像文件的 checksum 数值,然后计算此光学存储介质的 checksum 数值。这种验证光学介质的技巧是限定只对光学存储介质中包含映像文件的部分计算 checksum数值。通过确定映像文件所包含的 2048 个字节块的数目(光学存储介质总是以 2048 个字节块的方式写入)并从存储介质中读取那么多的字节块,我们就可以完成操作。某些类型的存储介质,并不需要这样做。
一个以 disk-at-once 模式写入的 CD-R,可以用下面的方式检验:
许多存储介质类型,如 DVD 需要精确地计算字节块的数目。在下面的例子中,我们检验了映像文件 dvd-image.iso 以及 DVD 光驱中磁盘/dev/dvd 文件的完整性。你能弄明白这是怎么回事吗?
总结
主要本章如何挂载/卸载一个USB/CD,并且重置为指定格式。
(未完待完善。)