我们已经在文件层面操纵数据,在本章我们将考虑在设备层面的数据,例如像硬盘,网络存储的物理存储或如RAID(redundant array of independent disks),LVM(Logical Volume Manager)等虚拟存储设备。
以下是用于管理存储设备的命令:
- mount —Mount a filesystem.
- umount —Unmount a filesystem.
- fdisk —Partition table manipulator.
- fsck —Check and repair a filesystem.
- fdformat —Format a floppy disk.
- mkfs —Create a filesystem.
- dd —Write block-oriented data directly to a device.
- genisoimage (mkisofs) —Create an ISO 9660 image file.
- wodim (cdrecord) —Write data to optical storage media.
- md5sum —Calculate an MD5 checksum.
装载(Mounting)与卸载(Unmounting)存储设备
Linux桌面的最新进展已经使桌面用户管理存储设备变得非常容易。在大多数情况下,我们在系统上附加一个设备,它就能正常工作。在2004年时候这项工作必须手动完成。在过去(比如2004年),这些东西都是手工完成的。在非桌面系统上(例如服务器)。这仍然是一个很大程度上由手工完成的过程,因为服务器通常有极端的存储需求和复杂的配置要求。
管理存储设备的第一步是将该设备附加到文件系统树。称为装载(mounting)的这个过程允许设备加入到操作系统中。类Unix操作系统(如Linux)维护一个单独的在多个节点上附加设备的文件系统树。这与其他操作系统(如MS-DOS ,Windows)不同,这些系统分别为不同的设备维护单独的树(如C:, D:\等)
名为 /etc/fstab 的文件列出在启动时候挂载的设备。以下为在Fedora 7系统中/etc/fstab 一个例子:
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda3 swap swap defaults 0 0
在这个文件中列出的大多数文件系统是虚拟的不在讨论范围。只需要关注前三个就够了:
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
这些是硬盘分区。 文件的每一行包含六个字段,如表15-1所示。
| Field | Contents | Description |
|---|---|---|
| 1 | Device | Traditionally, this field contains the actual name of a device file associated with the physical device,such as /dev/hda1 (the first partition of the master device on the first IDE channel). But with today’s computers, which have many devices that are hot pluggable (like USB drives), many modern Linux distributions associate a device with a text label instead. This label (which is added to the storage medium when it is formatted) is read by the operating system when the device is attached to the system. That way, no matter which device file is assigned to the actual physical device, it can still be correctly identified. |
| 2 | Mount point | The directory where the device is attached to the filesystem tree |
| 3 | Filesystem type | Linux allows many filesystem types to be mounted. Most native Linux filesystems are ext3, but many others are supported, such as FAT16 ( msdos ), FAT32 ( vfat ), NTFS ( ntfs ), CD-ROM ( iso9660 ), etc. |
| 4 | Options Filesystems can be mounted with various options. It is possible, for example, to mount filesystems as read only or to prevent any programs from being executed from them (a useful security feature for removable media). | |
| 5 | Frequency | A single number that specifies if and when a filesystem is to be backed up with the dump command |
| 6 | Order | A single number that specifies in what order filesystems should be checked with the fsck command |
查看装载的文件系统列表
mount 命令用来装载文件系统。输入此命令后面不加参数将会展示现在装载的文件系统。
[me@linuxbox ~]$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /home type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdd1 on /media/disk type vfat (rw,nosuid,nodev,noatime,
uhelper=hal,uid=500,utf8,shortname=lower)
twin4:/musicbox on /misc/musicbox type nfs4 (rw,addr=192.168.1.4)
.....
列表的格式为 device on mount_point type filesystem_type(options)。例如,第一行显示/dev/sda2 设备作为根文件系统来挂载,其类型为ext3,并且可以读写(rw)。这份列表在底部还有两项有趣的条目。倒数第二个条目显示 在读卡器挂载在/media/disk的 2 gigabyte SD 存储卡,以及最后一项在/misc/musicbox 挂载的网络驱动器。
作为开始,我们来学习CD-ROM。首先,在CD-ROM安装之前查看系统:
[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
上面列表来源于Centos 5系统,此系统使用LVM来创建它的根文件系统。与许多现代Linux 发行版本一样,此系统在插入 CD-ROM 后将会尝试自动挂载。当插入圆盘后,再次执行命令将会看到:
[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/hdc on /media/live-1.0.10-8 type iso9660 (ro,noexec,nosuid,nodev,uid=500)
上面列表相比于在插入圆盘之前的列表增加了一条条目。在列表最后一项,我们可以看到此 CD-ROM 圆盘已经在 /media/live-1.0.10-8 上挂载以及类型为 iso9660(a CD-ROM)。当自己进行此操作时,设备名称很可能会有所不同。
【注】音频 CD 与 CD-ROM 并不一样,音频CD不包含文件系统,因此无法以通常的方式安装。
现在有了CD-ROM 驱动的设备名称,接下来可以卸载这个圆盘并且将其挂载到文件系统树的其他位置。为了这个目的,我们首先要成为超级用户(使用与系统对应的命令)并且使用umount 命令来卸载。
[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]# umount /dev/hdc
下一步是创建一个新的装载点。一个装载点简单来说是位于文件系统树中一个目录。并没有什么特殊的地方。甚至不必是一个空文件夹。虽然你装载一个设备在一个非空的文件夹,在卸载该设备后你依旧可以看到以前文件夹中内容。接下来,创建一个文件夹:
[root@linuxbox ~]# mkdir /mnt/cdrom
最后,将CD-ROM装载到新的装载点。 -t 选项用来指定文件系统类型:
[root@linuxbox ~]# mount -t iso9660 /dev/hdc /mnt/cdrom
完成之后,可以通过新的装载点来检验此CD-ROM 中的内容。
[root@linuxbox ~]# cd /mnt/cdrom
[root@linuxbox cdrom]# ls
注意此时当我们试图卸载 这个CD-ROM 时会发生什么
[root@linuxbox cdrom]# umount /dev/hdc
umount: /mnt/cdrom: device is busy
这是为什么呢?原因是如果这个设备正在被用户或者进程使用,便不能卸载这个设备。在这个例子中,我们改变了我们的工作目录到了 CD-ROM 的 装载点,导致设备繁忙。我们可以简单的通过将工作目录从装载点切换到其他目录来解决这个问题:
[root@linuxbox cdrom]# cd
[root@linuxbox ~]# umount /dev/hdc
现在设备已经成功地卸载了。
卸载很重要
如果你观察free命令的输出,将会看到内存使用的统计信息,将会看到一个名称为buffers的统计信息。计算机系统被设计成尽可能的快速。其中对系统来说其中一个障碍就是缓慢的设备。打印机就是一个很好的例子,甚至最快的打印机相对于计算机的标准而言也还是非常慢。如果一台计算机不得不停止并等待打击机完成打印那么这台计算级将会非常缓慢。在计算机早期(在多任务之前),这是一个现实的问题。如果你编辑电子表格上或者文档,每次打印的时候计算机将会停止并变成不可用状态。计算机按照打印机最大接收速度发送数据到打印机,但是这将十分缓慢因为打印机打印十分缓慢。
打印机缓冲区的出现使得这个问题得到解决,打印机缓冲区是一个包含RAM 内存的设备,设置在计算机的打印机之间。设置好打印机缓存后,计算级发送数据到缓冲区,接下来数据将会快速地的存储在RAM,因此计算级可以无需等待返回处理任务。同时,缓冲区缓慢的将数据按照打印机能够接收速度发往打印机。缓冲区的思想在计算机中广泛使用使得计算级更加快速。不要让偶尔需要向慢速设备读取数据或从慢速设备写入数据的需求妨碍了系统的速度。操作系统在实际上与较慢的设备不得不进行交互之前,要存储从存储设备中读取的以及要向存储设备中写入的数据在内存中时间尽可能长。例如,在Linux系统中你将会注意到,使用时间越长,系统似乎就会填满内存。这并不意味着Linux正在使用所有的内存,这意味着Linux会利用所有可用内存来尽可能多地进行缓冲。因为写入物理设备的时间推迟到将来,缓冲区使得写入设备完成的十分快速。同时,目的地为该设备的数据填充到内存中。随着时间推移,操作系统将会写入数据到该设备。
卸载设备需要写入所有剩余的数据到该设备,因此它可以被安全的移除。如果设备没有在移除之前卸载,存在并非所有应该写入该设备的数据都已传输的可能性。在一些例子中,这些数据可能包括至关重要的目录更新,这将会导致文件系统损坏,这是计算机上可能发生的最严重的事情之一。
确定设备名称
有时候确定相似设备名称是困难的。在早期时候,这并不十分困难。一个设备总是在相同地方并且不会改变。类unix系统十分中意这一点。早在Unix开发时,早在Unix开发时,“更换磁盘驱动器”就涉及到使用铲车从计算机室中取出洗衣机大小的设备。近年来,典型的台式机硬件配置已经变得非常动态,并且Linux已经演化为比其祖先更加灵活。 在上面的示例中,我们利用了现代Linux桌面的功能来“自动”安装设备,然后根据实际情况确定名称。但是,如果我们正在管理不发生这种情况的服务器或其他环境,该怎么办? 我们如何解决呢? 首先,让我们看下系统如何命名设备。如果我们列出/dev目录(所有设备所处的位置)中内容,我们能看到这里有许多许多设备:
[me@linuxbox ~]$ ls /dev
上面命令列表的内容展示了一些设备名称模式:
Table 15-2: Linux Storage Device Names
| Pattern | Device |
|---|---|
| /dev/fd* | Floppy disk drives |
| /dev/hd* | IDE (PATA) disks on older systems. Typical motherboards contain two IDE connectors, or channels, each with a cable with two attachment points for drives. The first drive on the cable is called the master device and the second is called the slave device. The device names are ordered such that /dev/hda refers to the master device on the first channel, /dev/hdb is the slave device on the first channel; /dev/hdc, the master device on the second channel, and so on. A trailing digit indicates the partition number on the device. For example, /dev/hda1 refers to the first partition on the first hard drive on the system while /dev/hda refers to the entire drive. |
| /dev/lp* | Printers |
| /dev/sd* | SCSI disks. On recent Linux systems, the kernel treats all disk-like devices (including PATA/SATA hard disks, flash drives, and USB mass storage devices such as portable music players and digital cameras) as SCSI disks. The rest of the naming system is similar to the older /dev/hd* naming scheme described above. |
| /dev/sr* | Optical drives (CD/DVD readers and burners) |
另外,为了方便起见,我们经常看见诸如 /dev/cdrom,/dev/dvd 以及 /dev/floppy 的符号链接,这些链接指向实际的设备文件。如果系统不自动挂载可移除的设备,你可以使用下面的技术来确定连接设备时候系统如何命名此可移除的设备。首先,开始实时追踪 /var/log/messages 文件(可能会需要管理员权限)。
[me@linuxbox ~]$ sudo tail -f /var/log/messages
文件最后几行将会展示并且暂停。下一步,插入设备。在这个例子中,我们使用16MB的闪存。几乎在同时,内核会注意到此设备并调查它:
Jul 23 10:07:53 linuxbox kernel: usb 3-2: new full speed USB device using uhci_h
cd and address 2
Jul 23 10:07:53 linuxbox kernel: usb 3-2: configuration #1 chosen from 1 choice
Jul 23 10:07:53 linuxbox kernel: scsi3 : SCSI emulation for USB Mass Storage dev
ices
Jul 23 10:07:58 linuxbox kernel: scsi scan: INQUIRY result too short (5), using
36
Jul 23 10:07:58 linuxbox kernel: scsi 3:0:0:0: Direct-Access Easy Disk 1.00 PQ:
0 ANSI: 2
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte hardware secto
rs (16 MB)
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Write Protect is off
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Assuming drive cache: write t
hrough
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte hardware secto
rs (16 MB)
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Write Protect is off
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Assuming drive cache: write t
hrough
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
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: Attached scsi generic sg3 type 0
在显示暂停后,按 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。
随着知道了设备名称,我们现在可以装载闪存盘:
[me@linuxbox ~]$ sudo mkdir /mnt/flash
[me@linuxbox ~]$ sudo mount /dev/sdb1 /mnt/flash
[me@linuxbox ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 15115452 5186944 9775164 35% /
/dev/sda5 59631908 31777376 24776480 57% /home
/dev/sda1 147764 17277 122858 13% /boot
tmpfs 776808 0 776808 0% /dev/shm
/dev/sdb1 15560 0 15560 0% /mnt/flash
只要设备名称仍然物理连接到计算机并且计算机没有重新启动,设备名称就将保持不变。
创建新的文件系统
假设我们要使用Linux本机文件系统而不是现在使用的FAT32系统来重新格式化闪存驱动器。这涉及两个步骤:第一,(可选)如果现有的布局不符合我们的喜好,则创建一个新的分区布局;第二,在驱动器上创建一个新的空文件系统。
使用 fdisc 命令来操作分区
fdisk 程序使我们能够与磁盘状设备(例如硬盘驱动器以及闪存驱动)在底层进行交互。使用此工具可以在设备上编辑,删除以及创建分区。要使用我们的闪存驱动器,我们必须首先将其卸载(如果需要),然后按如下所示调用fdisk程序:
[me@linuxbox ~]$ sudo umount /dev/sdb1
[me@linuxbox ~]$ sudo fdisk /dev/sdb
【注】我们必须根据整个设备而不是分区号来指定设备。在程序启动后,我们将会看到如下提示:
Command (m for help):
输入 m 后将会出现程序菜单
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
我们要做的第一件事是检查分区的存在。通过输入 p 来打印设备的分区表:
Command (m for help): p
Disk /dev/sdb: 16 MB, 16006656 bytes
1 heads, 31 sectors/track, 1008 cylinders
Units = cylinders of 31 * 512 = 15872 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 2 1008 15608+ b W95 FAT32
在此示例中,我们看到一个具有单个分区(1)的16MB设备,该分区使用设备上1008个可用柱面中的1006个。此分区被识别为 Windows 95 FAT32 分区。某些程序将使用此标识符来限制可以对磁盘执行的操作种类,但是大多数时候改变标识符不是危险的。但是,出于演示的目的,我们将其更改为指示Linux分区。为此,我们必须首先找出用于标识Linux分区的ID。在上面选项列表,我们可以看到 b 选项用来指定现有分区。为了查看可用的分区类型列表,我们回到程序菜单中,可以看到以下选项:
l list known partition types
如果在提示符下输入l,则会显示大量可能的类型列表。在这其中我们可以看到用b选项来查看的我们现存分区的类型以及Linux类型为83。 返回菜单,看到以下选项来改变分区ID:
t change a partition's system id
我们在提示符下输入t并输入新的ID:
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 83
Changed system type of partition 1 to 83 (Linux)
这样就完成了我们需要进行的所有更改。到现在为止,该设备尚未被修改(所有更改已存储在内存中,而不是物理设备上),因此我们将写入更改的分区表到设备并退出。 为了完成更改,我们在提示中输入w:
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
[me@linuxbox ~]$
使用mkfs命令来创建新的文件系统
完成分区编辑后(虽然可能已经很轻巧),是时候在闪存驱动上创建一个新的文件系统了。我们将使用mkfs(make filesystem缩写)命令来完成这个操作,这个命令以多种形式来创建文件系统。为了在文件上创建 一个 ext3文件系统,我们使用 -t 选项来指定 ext3 系统类型,后面跟随包含我们想要格式化的设备名称:
[me@linuxbox ~]$ sudo mkfs -t ext3 /dev/sdb1
mke2fs 1.40.2 (12-Jul-2012)
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)也可以使用相同的操作流程。
测试和修复文件系统
在早些时候的关于/etc/fstab 文件的谈论中,我们看到了在每行后面一些神秘的数字。每次系统启动,它按照惯例在装载文件系统之前检查它的完整性。这由fsck(filesystem check)程序来完成。在fstab文件中每行最后一个数字指定了检查设备的顺序。在上面例子中,我们可以看到根文件系统最先检查,接下来检查 home 和 boot 文件系统。每行末尾为零的设备不执行例行检查。
除了检查文件系统的完整性以外,fsck还可以根据损坏程度来修复损坏的文件系统,并获得不同程度的复原。在类Unix的文件系统上,文件的恢复部分放置在每个文件系统根目录中的lost + found目录中。 为了检查我们的闪存驱动(首先要卸载),按照如下操作:
[me@linuxbox ~]$ sudo fsck /dev/sdb1
fsck 1.40.8 (13-Mar-2012)
e2fsck 1.40.8 (13-Mar-2012)
/dev/sdb1: clean, 11/3904 files, 1661/15608 blocks
除非出现硬件问题(例如磁盘驱动器发生故障),否则文件系统损坏很少发生。在大多数系统上,在引导时检测到文件系统损坏将导致系统停止并引导用户运行fsck,然后再继续。
格式化软盘
对于那些仍然使用足够装备软盘驱动的计算级而言,我们也可以管理那些设备。准备一张软盘来使用只需要两个步骤。首先,我们在磁盘上执行低级格式化,然后创建文件系统。为了完成格式化,我们使用dformat 程序指定软盘设备名称(通常为/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文件系统类型来获取较旧(和较小)样式的文件分配表。在磁盘准备好后,它就像其他设备一样装载到了系统。
直接在设备之间移动数据
虽然我们通常认为计算机上的数据被组织成文件,但也可以以“原始”形式考虑数据。例如,如果我们看一个磁盘驱动器,我们会看到它由大量的数据“块”组成,操作系统将其视为目录和文件。如果我们简单以大量数据块集合的方式来看待磁盘驱动,我们可以执行有用的任务,例如拷贝设备。 dd程序执行这个任务。它从一个地方拷贝数据块到另一个地方。它使用独特的语法(历史原因),如下所示:
dd if=input_file of=output_file [bs=block_size [count=blocks]]
假设有两个大小一样的usb闪存驱动,我们想要准确的拷贝第一个磁盘到第二个。如果我们将两个驱动器都连接到计算机,并且分别将它们分配给设备/ dev / sdb和/ dev / sdc,使用下面命令可以拷贝第一个设备所有内容到第二个驱动:
dd if=/dev/sdb of=/dev/sdc
或者,如果仅将第一台设备连接到计算机,我们可以将其内容复制到普通文件中,以供以后还原或复制:
dd if=/dev/sdb of=flash_drive.img
创建 CD-ROM 镜像
写入一个可记录的 CD-ROM (CD-R or CD-RW)由两步组成:第一步,构造与CD-ROM完全相同的ISO映像文件,其次,将映像文件写入CD-ROM媒介。
创建CD-ROM的镜像副本
如果要制作现有CD-ROM的ISO镜像,我们可以使用dd来读取CD-ROM所有的数据块并且复制到本地文件中。假设我们现在有一张 Ubuntu 的CD以及我们想要制作ISO文件可以日后制作更多的副本。在插入CD并且确定它的设备名称后(假设为/dev/cdrom),我们执行下面命令来生成ISO文件:
dd if=/dev/cdrom of=ubuntu.iso
这项技术对数据DVD也同样有效,但是由于音频CD没有使用文件系统因此对音频CD没有效果。对于音频CD,要查看cdrdao命令。
从文件集合创建映像
为了创建包含文件夹内容的ISO镜像,我们使用enisoimage程序。首先,创建包含我们希望所有导入到镜像中的文件的文件夹,然后执行genisoimage 命令创建镜像文件。例如,如果我们创建一个~/cd-rom-files文件夹并且以我们的CD-ROM中的文件填充,我们可以使用下面命令创建一个名为cd-rom.iso的镜像文件 :
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files
-R选项为Rock Ridge扩展添加元数据,从而允许使用长文件名和POSIX样式的文件权限。 同样,-J选项启用Joliet扩展名,该扩展名允许Windows中使用长文件名。
写入 CD-ROM 镜像
在有了镜像文件之后,我们可以将其刻录到我们的光学介质上。我们下面讨论的大多数命令都可以应用于可刻录CD-ROM和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-ROM在再利用之前需要擦除或者清空。我们可以使用wodim命令来完成此操作,为CD刻录指定CD的设备名称和执行清除类型。wodim命令允许程序有多种清除类型。其中最小限度(最快)的是fast类型:
wodim dev=/dev/cdrw blank=fast
除了设备名称和镜像文件,wodim还支持很多选项。两个常用选项是-v 表示更加详细的输出以及-dao,此命令使用 disc-at-once 模式写入磁盘。如果要准备用于商业复制的光盘,则应使用此模式。wodim的默认模式是“track-at-once”,这对于录制音乐曲目很有用。
生成校验和
对下载的ISO镜像文件的完整性校验是经常用到的。在大多数情况下,对于 发行商的 ISO 镜像 文件也会提供校验和文件。校验和是外部数学计算产生的代表目标文件的数字。如果文件内容哪怕更改了一个字节,检验和的结果将会大为不同。最常用的生成校验和的方法使用 md5sum 程序。当使用md5sum命令时,他产生独特的16进制数字:
md5sum image.iso
34e354760f9bb7fbf85c96f6a3f94ece image.iso
DVD等许多类型的媒体都需要精确计算块数。 在下面的示例中,我们检查映像文件dvd-image.iso和DVD阅读器/dev/dvd中光盘的完整性。
md5sum dvd-image.iso; dd if=/dev/dvd bs=2048 count=$(( $(stat -c "%s" dvd-image.iso) / 2048 )) | md5sum