硬盘及分区
个人计算机的硬盘常用的有IDE接口和SATA接口,每条IDE排线可以链接两个设备,称为主设备(Master)和从设备(Slave).
以提供两个IDE接口的设备为例,链接到IDE1(primary)的主设备的设备文件名/dev/hda,从设备为/dev/hdb; 链接到IDE2(secondary)的主设备为/dev/hdc,从设备为/dev/hdd
因为SATA/USB/SCSI接口硬盘都是由SCSI模块驱动的,所以它们的设备文件名为/dev/sda至/dev/sdp.
这种接口的设备没有固定顺序,Linux内核根据检测到设备的顺序来决定文件名. 一般USB接口设备开机完成后才被识别,所以编号一般较靠后.
硬盘上最小的单位是扇区(512bytes),采用MBR分区的磁盘中其中第一个扇区存储464Bytes的主引导记录(Master Boot Record,MBR)和分区表(partition table).
分区表记录整块硬盘的分区状态,有64bytes,这64bytes分为四组记录区,每组记录区记录了该区段起始与结束的柱面号码.也就是说分区最小的单位为柱面,分区的核心操作就是对分区表进行设置.
硬盘默认的分区表仅能写入四组分区信息,这四组分区被称为主分区(Primary)或扩展分区(Extended).
使用扩展分区的目的是利用额外的扇区来记录分区信息, 通过扩展分区的分区表分割的分区被称为逻辑分区(Logical Partition),它们的范围必须在扩展分区内.
由于操作系统的限制,扩展分区只能有一个; 逻辑分区的数量因操作系统而不同,在Linux操作系统下IDE硬盘最多有59个逻辑分区,SATA硬盘最多有11个逻辑分区.
能够被格式化和访问的分区为主分区与逻辑分区,扩展分区无法格式化.
在硬盘hda上的分区设备文件名为/dev/hda1,/dev/hda2……因为编号1~4保留给主分区或扩展分区使用,所以逻辑分区的编号从5号开始;如果主分区或扩展分区的数目不足4个相应编号将会空缺,逻辑分区的编号仍然从5开始.
Ext文件系统
Linux下标准的文件系统为Ext(Linux Extended File System),包括早期的Ext2,增加了日志功能的Ext3和最新的Ext4文件系统.
Linux的文件信息包括文件权限属性以及实际的数据内容,文件系统通常会将这两部分数据存储于不同的块.
Ext文件系统包括三种块,data block块存储实际的数据内容,inode块存储文件属性以及存储文件内容的data block编号. 每个inode或data block都有自己的编号,一个文件占据一个inode号码但是可以使用多个data block.
此外还有Super Block来记录文件系统的整体信息,包括inode/block总量,使用量以及文件系统格式等信息.
像Ext这样通过索引区(inode)记录数据区位置来进行访问的文件系统称为索引式文件系统。而在Wiindows下常用的FAT文件系统没有inode这种索引存在,数据块的位置记录在上一个数据块中形成链表式的结构.
这种文件系统通常需要磁盘转很多圈才能读取完整的文件。FAT文件系统需要碎片整理的原因是因为数据块过于分散,文件读取性能下降需要将数据块集中在一起便于读取.
文件系统的inode和data block大小是相对固定的,除非格式化等操作可以重新设定。Ext2文件系统以块组(Block Group)的方式进行管理,每个块组都有自己superblock/inode/block系统.
文件系统最前面还有一个启动扇区,它可以安装引导程序而不覆盖硬盘中唯一的MBR,从而实现多重引导.
Ext2文件系统的data block块大小有1KB,2KB,4KB三种,每个block只能存储一个文件的数据。如果数据小于block的容量那么磁盘空间就被浪费了,这也是为什么有些时候文件大小和占用的大小不一致的原因.
如果存储的小文件比较多(像服务器上的一堆日志)那么使用较小的block可以节约磁盘空间,而存储大文件较多时(比如我们的PC)使用较大的block可以减少使用的block数提高访问效率.
Ext2文件系统中一个inode大小为128Bytes,存储了文件的权限,所有者/用户组,ctime,atime,mtime以及data block的编号。每个blocks占4Bytes,128Bytes的inode中除去记录其他信息的空间实际只能记录12个block编号.
当存储大文件时这是远远不够的,Ext采用间接指向的方法,即利用inode直接指向的一个data block记录下一级data block号码。如果仍不够Ext2允许使用双间接和三间接,在1KB的blocks下最大支持约16GB的单个最大文件(2KB以上会受到Ext2限制不便于计算).
Superblock用于记录文件系统的整体信息大小为1KB,包括inode/block总量和使用量,block与inode的大小,挂载时间,磁盘检查时间等信息。
superblock中包含vaildbit值,0表示未被挂载1表示已被挂载。每个block group都可能含有superblock,实际上它们都是第一个superblock的备份.
superblock中包含块对照表(block bitmap)和inode对照表(inode bitmap),记录block和inode是否被使用的信息。此外还有记录每个block group起始和结尾号码的信息.dumpe2fs
命令可以查看superblock相关信息.
读写磁盘的速度相对较慢,为了提高效率Linux采用异步读写的方式。文件被读入内存后,若内容未被更改则被记为clean更改后变成dirty. 每隔一段时间系统会将dirty的数据写入内存,或者使用sync命令强制写入. 为了加快运行速度,系统也会将一些常用文件写入内存.
当系统关机前也会执行sync命令,但是当因断电等问题导致异常关机时系统可能会来不及将数据完全写入。这时重启计算机后将花费很多时间进行磁盘检验(由e2fsck执行),甚至导致文件系统损坏.
磁盘检查需要对整个文件系统进行, 耗时较长,为了解决这一问题日志文件系统(Journaling File System)开始兴起.
Ext3文件系统引入了日志功能,在写入数据前会首先在日志中记录某文件准备写入,在写入结束后将记录写入操作完成.
如果这一过程意外中止,重启后就可以通过日志知道是那个文件在什么步骤出错而不必检查整个系统.
此外,日志功能还让磁头移动更高效提高了读取性能。Ext3文件系统向下兼容Ext2,升级文件系统不需要备份和重新格式化操作
挂载磁盘
磁盘挂载是指将文件系统连接到目录树中,挂载点必须是目录,并将此目录作为访问磁盘文件系统的接口.
挂载点必须是目录,最好是空目录。当文件系统被挂载到某个目录上之后,挂载点原有的子目录和文件都会被隐藏,只有当文件系统被卸载后这些文件才会重新出现.
单一文件系统不应该挂载在不同的目录中,同一个目录不应该挂载多个文件系统.
mount [-al] [-t 文件系统] [-L Label] [-o 额外选项] [-n] 设备文件名 挂载点
选项:
-a
依据配置文件/etc/fstab将所有未挂载的文件系统挂载-l
只输入mount回显示当前挂载的信息,加上-l选项则显示Label(类似Win下的卷标,是一个表示文件系统的独有的字符串)。-t
指定欲挂载的文件系统类型,包括ext2, ext3, ext4, vfat……在无此选项的情况下将自动选择文件系统。-n
默认情况下Linux会将实际挂载情况写入/etc/mtab中以便于其它程序的运行,使用该选项则阻止自动写入。在单用户维护模式下常使用该选项。-L
设定该文件系统的Label-o
额外选项:ro,rw:只读(read only),读写(read write )
sync,async:同步写盘,异步写盘
auto,noauto:允许/禁止以【mount -a】自动挂载
dev,nodev:允许/禁止在该文件系统上创建设备文件
suid,nosuid:允许/禁止此文件系统包含suid/sgid文件权限
exec,noexec: 允许/禁止此文件系统包含二进制可执行文件
user,nouser: 允许/禁止非root用户挂载此文件系统
remount:重新挂载,常用于系统崩溃或更改了设置时
defaults:默认值: rw,async, auto, dev, suid, exec, nouser
fstab
/etc/fstab配置文件用于管理设备:
设备标识: 可以采用设备文件名
/dev/sda1
, 卷标LABEL=D
, 通用唯一标识符UUID=7AFE..
挂载点
文件系统: ext2/3/4, ntfs, fat32...
挂载选项: 同
mount -o
dump选项: 设置是否让备份程序dump备份文件系统,0为忽略,1为备份,如果上次用dump备份,将显示备份至今的天数
fsck选项: fsck检查文件系统的顺序, 0就表示不检查,有且只有
/
为1,其它的分区只能从2开始,当数字相同则同时检查.
系统启动时将会按照fstab挂载设置为auto的磁盘, 可以添加设置来配置自动挂载:
UUID=10YA9TB2FA039ADE /media/finley/G ntfs defaults 0 0
查看文件系统状况
df
df [ -ahkm] [file]
选项:
-a
列出所有文件和目录容量
-h
以便于人类阅读的方式显示容量
-k
/-m
以KB / MB的格式显示容量
du
du [ -ahkm] [file]
df从superblock中读取文件系统信息,即使df命令后面加了目录或文件作为参数显示的仍是其所在文件系统的信息.
du命令显示参数指定的目录或文件的具体信息(而非其所在文件系统),其选项的含义与df相同.
df命令因为需要具体的分析文件或目录信息而非df那样读取信息,所以du命令的执行需要一些时间.
dump2fs
dumpe2fs [-bfhV] [-o ] [file]
dumpe2fs用于列出ext(2/3/4)文件系统的信息(dump ext2/3/4 file system).
选项:
-b
列出坏道-f
强制输出信息,即使dumpe2fs无法识别文件系统的某些特性标记,这时的信息是不可靠的。-h
仅列出superblock中的信息-V
显示dumpe2fs的版本并退出。-o
额外选项:- superblock=编号 已用
- blocksize=大小 已用
blkid
blkid [dev]
查看块设备信息, 常用来查看uuid.
不指定设备文件的情况下显示/dev
下的所有设备信息.
建立链接文件
在ext文件系统中,数据文件实际上是一个inode,inode中存储了文件权限、时间等属性以及datablock的位置, 而文件名仅仅是访问inode的接口.
一个文件名最多对应一个inode号码,而一个inode却可以通过多个文件名来访问. 多个文件名共用一个inode来访问同一个文件的链接方式称为硬链接(hard link).
这两个文件名除了名称与路径不同外完全等价,其文件的权限、时间和内容完全相同; 通过一个文件名对文件进行任何形式的更改另一个文件名也会有相同的更改.
将其中任何文件名删除(rm),剩下的文件名均可以正常访问文件(事实上即使把所有文件名都删除文件数据都还在只是无法访问,静待被当作垃圾删除).
硬链接不能跨文件系统,不能建立目录的硬链接(因为要建立所有子目录和文件的链接过于复杂). ls -l
命令第2列显示的数字即为文件inode号码上硬链接的数目
符号链接(Symbolic Link,软链接)可以类比windows下的快捷方式. 符号链接是一个独立的文件,拥有自己的inode、权限和文件内容, 将原来的文件删除后符号链接就会失效.
注意建立符号链接时, 相对路径是相对于目标文件而非创建时工作目录, 所以源地址最好使用绝对路径.
ln [-sf] [src] [dest]
选项:
-s
建立符号链接,若无此选项则默认建立硬链接-f
若目标文件存在则将其覆盖
磁盘分区
fdisk -l [dev]
显示分区信息,当省略设备文件名时打印所有可以找到的设备分区
fdisk 设备文件名
fdisk是一个强大的分区软件,使用上述命令进入fdisk的命令行界面。在fdisk命令行下,m命令将显示所有可用命令.
在硬盘及分区一节中我们介绍了MBR分区的特点, MBR分区最大支持2T的存储设备, 显然在未来很难满足需要.
全局唯一标识分区表(GUID Partition Table, GPT)是新一代解决方案, 现在基本被大多数操作系统支持.
gdisk -l [dev]
命令可以进行GPT分区, 不过更方便的选择可能是GParted工具.