无论是硬盘、网络存储等物理存储,还是独立磁盘冗余阵列(Redundant Array of Independent Disks, RAID)和逻辑卷管理(Logical Volume Manager, LVM)等虚拟存储,Linux在存储设备处理方面令人称道。
相关命令:
对于非桌面系统,在很大程度上仍要依靠手动操作,因为服务器往往有极端的存储需求和复杂的配置要求。
管理存储设备的第一就是将设备挂接(attaching)到文件系统树。这个过程称为挂载,能够使设备与操作系统交互。类UNIX系统维护着单一的文件系统树,设备挂载在不同的节点。不同于Windos,每个设备都维护独立的文件系统树。
文件/etc/fstab(文件系统表,file system table的缩写)列出了会在系统引导时挂载的各种设备(通常是盘盘分区)。其内容示例如下:
LABEL=/12 / ext4 defaults 1 1
LABEL=/home /home ext4 defaults 1 2
LABEL=/boot /boot ext4 defaults 1 2
这些代表硬盘分区。/etc/fstab文件中的每行包含6个字段,每个字段的内容不同。
/etc/fstab文件字段
字段 | 内容 | 描述 |
---|---|---|
1 | 设备 | 以前,该字段包含与物理设备关联的设备文件名,如dev/hda1(被检测到的第一个硬盘的分区。因为如今的计算机都有不少能够热插拔的设备(如USB驱动器),所以很多现代Linux发行版本采用文本标签来关联设备。该标签(存储介质被格式化后添加)可以是简单的文本或随机生成的通用唯一识别码(Universally Unique Identifier, UUID)。当设备挂载到系统时,系统会读取标签。通过这样的方式,不管实际的物理设备所分配的是哪个设备文件,都能够被准确识别 |
2 | 挂载点 | 设备被挂载在文件系统树上的位置(目录) |
3 | 文件系统类型 | Linux允许挂载多种系统文件类型。多种原生Linux文件系统采用的是第四代扩展文件系统(Fourth Extended File System, ext4)、 不过也支持包括FAT16(msdos)、FAT32(vfat)、NTFS(ntfs)、CD-ROM(ISO 9660)在内的很多其它文件系统 |
4 | 选项 | 文件系统有各种挂载选项。例如,可以将文件系统以只读形式挂载或禁止执行其中的任何程序(这对可移动设备是一个很有用的特征) |
5 | 频率 | dump命令使用该数值决定是否对该文件系统进行备份以及多久备份一次 |
6 | 顺序 | fsck命令使用该数值决定文件系统的检查顺序 |
mount命令可用于挂载文件系统。如果不加任何参数,可以显示当前已挂载的文件系统列表:
mount #显示当前已挂载的文件系统列表
mount -t filesystem_type device mount_point #将mount_point挂载到device其文件系统为filesystem_type
umont device #卸载device的文件系统
例如:
[me@linuxbox ~]$ mount
/dev/sda2 on / type ext4 (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/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作为根文件系统挂载,文件系统类型为ext4,挂载形式为可读取和可写入(选项rw)。列表底部有两行值得注意。倒数第二行显示一个2GB的SD内存卡被挂载到/meida/disk,最后一行显示一个网络驱动器被挂载到/misc/musicbox。
所谓挂载点就是文件系统树中的一个目录,没什么特别之处。该目录甚至可以不是空的,但如果你将设备挂载到非空目录,在卸载设备之前,无法查看此目录内容。
有时很难确定设备名称。在过去,设备始终固定在同一位置不动。类UNIX系统喜欢这种方式。如见典型桌面硬件配置变化不定,而Linux也通过不断的完善,变得比""前辈们"灵活了许多。如果管理的是服务器,那该怎么办?
系统是如何命名设备的。列出/dev目录下的内容,会看到大量设备。
[me@linuxbox ~]$ ls /dev
可以从输出结果总结出一些设备命名模式。
Linux存储设备模式
模式 | 设备 |
---|---|
/dev/fd* | 软盘驱动器 |
/dev/hd* | 旧系统中的IDE(PATA)磁盘。典型的主板上有两个IDE接口或通道,每条接口线缆上有两个驱动器插口。线缆第一个驱动器称为主设备(master device),第二个驱动器称为从设备(slave device)。设备命名规则:/dev/hda代表第一个通道上的主设备,/dev/hdb代表第一一个通道的从设备;/dev/hdc代表第二个通道上的主设备。 |
/dev/lp* | 打印机 |
/dev/sd* | SCSI磁盘。在现代Linux系统中,内核将所有类似于磁盘的设备(包括PATA/SATA硬盘、闪存驱动器、便携音乐播放器及数码相机等USB大容量存储设备)都被视为SCSI磁盘。其余的命名规则与先前描述的/dev/hd*的规则类似 |
/dev/sr* | 光驱(CD/DVD播放器和刻录机) |
窍门 ali -f /var/log/messages命令是用来对系统操作进行接近实时监测的好办法。
闪存驱动器当前采用FAT32文件系统,使用Linux原生文件系统将其格式化,就涉及两个步骤。
有一些程序(命令行和图形界面)允许与类磁盘设备直接进行底层面的交互,fdisk就是其中之一。利用这种程序,可以编辑、创建驱动器分区。为了处理闪存驱动器,我们必须先将器卸载,然后使用fdisk程序:
[me@linuxbox ~]$ sudo umount /dev/sdb1
[me@linuxbox ~]$ sudo fdisk /dev/sdb
注意,我们必须指定整个设备,不能仅指定分区号。程序启动后,我们会看到下列提示符:
Command (m for help):
输入m,显示程序菜单:
Command action
A toggle a bottable 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)
Command (m for help):
Command (m for help):p
Disk /dev/sdb: 16 MB, 160006656 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
可以看到这个16MB的设备有一个分区,占用了设备可用的1008个柱面中的1006个。该分区被识别为Windows95 FAT32分区。有些程序会使用此标识限制能够执行的磁盘操作类型,不过大多数时候改不改变改标识并不重要。
为了查看可用分区类型的列表,浏览程序菜单,其中包含下列菜单项:
l list known partition types
返回菜单,找到修改分区ID的菜单项:
t change a partition’s system 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)
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(创建文件系统, make filesystem),该命令能够创建各种格式的文件系统。要想创建ext4,只需使用-t选项指定ext4类型,然后指定待格式化分名称:
[me@linuxbox ~]$ sudo mkfs -t ext4 /dev/sdb1
mke2fs 2.23.2 (12-Jul-2011)
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 susperblocks and filesystem accounting information : done
This filesystem will be auto matically checked every 34 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
[me@linuxbox ~]$
mkfs命令会输出大量信息。若要将分区重新格式化为原来的FAT32文件系统,则指定vfat作为文件系统类型:
[me@linuxbox ~]$ sudo mkfs -t vfat /dev/sdb1
只要系统添加了额外的存储设备就可进行分区和格式化。
系统每次启动时,在挂载文件系统之前都会例行检查文件系统的完整性。这是由fsck(文件系统检查, filesystem check)完成的。fstab文件每个条目末尾的数字对应设备检查优先级。
除了检查文件的完整性,fsck还能修复损坏的文件系统,修复程度取决于受损量。对于类UNIX系统,已修复的文件会存放在各个文件系统根目录下的lost+found目录下。
fsck device
检查闪存驱动器(先将其卸载):
[me@linuxbox ~]$ fsck /dev/sdb1
fsck 1.40.8 (13-Mar-2016)
e2fsck 1.40.8 (13-Mar-2016)
/dev/sdb1: clean, 11/3904 files, 1661/15608 blocks
现如今,除了出现了硬件问题,否则文件系统很少会损坏。在大多数系统中,如果引导阶段检测到文件系统损坏,系统会停下来,指导用户允许fsck。
通常计算机中的数据都是以文件的形式存储的,但也不妨碍以原始形式考量数据。以磁盘驱动为例,它包含了大量被系统视为目录或文件的数据"块"。将磁盘驱动器当作数据块的大集合,就可以执行诸如复制等实用任务。
dd命令就可以完成这种任务:
dd if=input_file of=output_file [bs=block_size [count=blocks]]
警告 dd命令的功能非常强大。尽管其名称取自"“data definition”(数据定义),但有时候也被称为"destory disk"(摧毁磁盘),因为用户经常会不小心错用if或of说明,在按Enter键之前,一定要检查if和of说明。
假设有两个大小一样的USB闪存驱动器,其设备名称分别为/dev/sdb和/dev/sdc,将第一个驱动器中的内容全部复制到第二个驱动器。命令如下:
dd if=dev/sdb of=/dev/sdc
若只有一个闪存驱动器,其设备名称为/dev/sdb,将第一个驱动器内容复制成一个普通文件。命令如下:
dd if=dev/sdb of=flash_drive.img
向CD(CD-RW)写入数据需要两步:
可以使用dd命令读取该CD-ROM的所有数据块并将其复制为本地文件。假设有一张Ubuntu CD,其设备名称为/dev/cdrom,制作ISO映像文件,执行下列命令:
dd if=/dev/cdrom of=ubuntu.iso
genisoimage命令可用于创建包含目录内容的ISO映像文件。先创建一个目录,其中包含ISO映像文件内容,然后执行genisoimage命令,创建ISO映像文件。例如,创一个名为~/cd-rom-files的目录,其中包含了CD-ROM要用到的所有文件,可以使用如下命令创建ISO映像文件cd-rom.iso:
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files
-R用于添加启用Rock Ridge扩展(Rock Ridge extensions)的元数据,允许使用长文件名和POSIX风格的文件权限。-J选项用于启用Joliet扩展,允许使用Windows长文件名。
创建好ISO映像文件之后,就可以写入CD-ROM的ISO镜像文件了。
有一个技巧,可以像挂载光盘那样直接挂载硬盘中的用的ISO映像文件。使用mount命令-o loop选项(以及用于指定文件系统类型的-t iso9660),将ISO映像文件当作设备挂载到文件系统树:
mkdir /mnt/iso_image
mount -t iso9660 -o loop.iso /mnt/iso_image
检查下载的ISO映像文件的完整性往往是有必要的。ISO映像文件方会提供一个校验和文件。校验和是通过一系列复杂难懂的数学运算得到的一串数字,代表目标文件内容。生成校验和的常见方法是使用md5sum命令,该命令会产生一个唯一的十六进制数:
md5sum image.iso
34e354760f9bb7fdf85c96f6a3f94ece image.iso
下载好ISO映像文件后,应该使用md5sum命令得出其校验和,与发行方提供的校验和进行对比。
校验和除了用来检查文件的完整性,还可以使用md5sum来核实刚刻录好的光盘。首先计算ISO校验和,然后计算光盘校验和。以整盘刻录模式制作的CD-R和CD-RW可以使用这种方式检查:
md5sum /dev/cdrom
34e354760f9bb7fdf85c96f6a3f94ece /dev/cdrom
检查ISO映像文件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
可刻录CD在重新刻录之前需要擦除或清空。可以使用wodim命令,指定刻录机的设备名称和要执行的擦除操作类型。wodim命令提供了多种擦除类型,其中最基本的(也是较快的)是fast类型。
wodim dev=/dev/cdrw blank=fast
wodim命令还可用于刻录映像文件,需指定设备名称和映像文件名:
wodim dev=/dev/cdrw image.iso
除了设备名称和映像文件名,wodim命令还支持不少选项。其中两个常见选项是-v和-dao,前者用于输出详细信息,后者表示整盘刻录(disc-at-once)模式,该模式适用于光盘商业化生产。wodim命令默认采用轨道刻录(track-at-once)模式,适用于制作音乐曲目。