硬盘主要由圆形的盘片、机械臂和机械臂上的磁头、主轴马达组成。
盘片上数据的存储:
扇区为最小的物理存储单位,每个扇区为512bytes;
扇区组成的圆称为柱面,柱面是分区的最小单位;
第一个扇区存放硬盘的主引导记录(MBR)及分区表(partition table),其中MBR占446bytes,分区表占64bytes。
由于分区占只有64字节,所以只能记录4条分区记录,这4条分区记录称为主分区和扩展分区,扩展分区还可以再次划分为逻辑分区,可以被格式化并记录数据的只有主分分和逻辑分区。
一个可被挂载的数据称为文件系统。
文件系统将文件的权限与属性保存在inode中,一个文件占用一个inode,实际的数据保存在data block块中。
inode会记录文件所占有用的block的号码。
每个block只能放置一个文件的数据,而一个文件可以占用多个block。
每个文件系统还会有一个超级块(super block)用于记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量、以及文件系统的格式与相关信息。
可以使用命令dumpe2fs来查看super block的信息
inode中并不保存文件的文件名,文件名放置在目录的block中。
根目录的inode号为2。
1.链接文件
在Linux下有两种链接文件:硬链接和符号链接(软链接)。
硬链接:不同文件指向同一个inode,所有硬链接到同一个inode的文件,它们的内容是共享的,即修改其中一个文件的内容,其它硬链接的文件内容也会更改。硬链接有以下特性:
1)只能对文件创建,不能应用于目录;
如果对目录创建硬链接,那么对于目录下的所有文件都要创建对应的硬链接,在文件较多的情况下则会使得情况变得相当复杂,所以不充许对目录进行硬链接。
2)不能跨文件系统;
inode号码是在文件系统中的super block中维护的,不同的文件系统不保证提供相同的inode号码,所以不同文件系统之间无法创硬链接。
3)创建硬链接会增加被硬链接的次数;
在文件属性中会看到链接次数被增加。
4)增加inode引用计数;
同一个inode被链接了新的文件,引用计数会增加。
符号链接:类似于window中的快捷方式。符号链接文件会占用新的inode,所以被符号链接的文件移动或删除的话,符号链接文件也即失效。理解了硬链接的特性后,就不难理解符号链接的特性了:
1、可以应用于目录;
2、可以跨文件系统;
3、不会增加被链接文件的链接次数;
4、其大小为指定的路径所包含的字符个数;
5、不会增加inode引用计数。
创建链接文件
格式:ln [-sf] 源文件 目标文件
-s:创建符号链接,如果不加任何参数则是创建硬链接;
-f:如果目标文件存在,就将目标文件删除后再创建;
创建硬链接
创建前我们先来看下inode的占用情况,df -i可以查看文件系统的inode使用情况;
创建硬链接后,两个文件的硬链接数都是2;
输入内容到文件hard_link中,可以看到两个文件同时增加了大小;
将link文件改名后,hard_link文件依然可以访问;
再来查看一下inode占用情况,并没有发生变化。
创建软链接
创建软链接后文件link的链接数并没有增加
访问symbol_link文件可以看到link文件的内容。
使用ls命令的-i参数可以看到文件所占用的inode号码;
可以看到硬链接与原文件的inode号码相同,而符号链接则使用了新的inode号码。
下面的输出中符号链接的大小为4,其实它表示符号链接所指向的文件名的字符数,link为4个字符,所以它的大小为4。
看下inode的使用情况,在上面创建硬链接时inode使用数量为125630,创建符号链接后变成了125631,可见符号链接会占用inode。
将文件link改名后,符号链接已经找不到原文件而出错了。
另外,一个inode可以被引用多次,其有计数器;在引用次数降为0之前,不会被标记为未占用inode.
文件被删除,inode被标记为空闲,此inode指向的磁盘地块被标记为空闲。
如果inode被引用多次,且此次删除未使得其引用计数降低为0的话,这意味着文件未被删除,仅删除了一个访问路径。
文件复制:创建一个新文件,是原文件中数据在新文件指向磁盘块中写一次的过程。
文件移动:
在同一分区移动: 移动文件仅是改变了文件访问路径。
跨分区移动:在新分区创建文件,把数据复制过去,删除原分区数据。
2.du和df命令
du命令:用于显示文件和目录的容量。
-a:列出所有的文件与目录容量;
-s:列出整个目录的容量;
-h:以人类易读的方式显示;
-k:以KB显示容量;
-m:以MB显示容量。
下面举例来说明:
显示/etc目录的容量;
以易读方式显示;
显示/etc目录中每一个文件的大小;
df命令:列出文件系统的使用情况。
-a:列出所有的文件系统;
-k:以KB显示容量;
-m:以MB显示容量;
-h:以人类易读方式显示容量;
-H:以M=1000K替代M=1024的进位方式;
-T:显示文件系统的分区格式;
-i:显示inode数量。
下面举例说明:
列出所有文件系统;
以易读方式显示容量;
显示文件系统的格式;
以易读方式显示inode数量;
在Linux中设备文件都是用文件来表示的,如下图所示:
b:以块为单位,随机访问的设备,比如硬盘;
c:以字符为单位,线性设备,比如键盘。
上图中的以逗号分隔的两个数字,分别表示主设备号和次设备号。
主设备号:(major number)
标识设备类型;
次设备号:(minor number)
标识同一种类型中不同设备。
创建设备文件
mknod命令
格式:mknod -m mode 设备文件名 [bc] [Major] [Minor]
-m mode:设置设备的权限为mode;
b:设置块设备;
c:设置字符设备;
Major:主设备代码;
Minor:次设备代码。
例如:创建一个设备testdev,代码为10,5的字符设备,并设置权限为644;
1.硬盘组成回顾
磁盘的前512Bytes存放MBR(主引导记录),其中:
446Bytes:bootloader;
64Bytes:分区表,每16Bytes标记一个分区;
2Bytes:5A,MBR有效性标记。
分区是按照柱面来划分的,一个柱面只能属于一个分区。
2.查看系统上的磁盘及分区信息
1)/proc/partitions文件
查看目前系统上的分区信息
2)/proc/filesystem文件
查看系统支持的文件系统
3)fdisk命令
3.创建分区
使用fdisk命令来创建分区
格式:fdisk [-l] 设备名称
-l:显示所有磁盘及分区的内容。
例如:将磁盘/dev/sdb划分两个主分区分别为2G和512M。
新建一个2G的主分区
以上是建立分区的过程,那么这些操作命令是什么意思呢,我们可以通过帮助信息来查询,如:
可以输入m来获取帮助信息;
比较常用的选项:
p:显示磁盘分区表;
n:新建分区;
d:删除分区;
t:修改分区的系统ID;
w:保存并退出;
q:不保存退出。
下面接着来创建另外一个分区:
分区建好之后,系统并不能马上识别出来,这时使用两种方法使用分区生效:
1)重启系统
2)使用partx -a命令
练习:删除分区/dev/sdb2
4.创建文件系统
1)Linux的文件系统的类型:
ext(2,3,4),xfs,ffs,ufs,reiserfs,jfs,vfat(fat 32),ntfs
交换文件系统:swap
网络文件系统:nfs,smbfs(cifs)
分布式文件系统:ceph
光盘文件系统:iso9660
2)创建文件系统
mkfs -t 文件系统类型 设备文件名
-t:系统可以支持的文件系统类型
例如:分区/dev/sdb1格式化为ext4文件系统
上面的命令使用的是默认的选项,格式化完成后可以看到文件系统的卷标、block、inode等信息;我们也可以通过命令参数来自定义这些选项。
-b:设置block大小;
-i:设置每个inode大小;
-L:设置卷标;
使用mke2fs命令可以格式化文件系统
mke2fs [-t 文件系统类型][-b block大小] [-i inode大小] [-L 卷标] 设备文件名
-i #:每#个字节给创建一个inode,此字节数不应该小于块大小
-N #:直接指定可用的inode数;
-m #:指定预留空间占整个分区空间的百分比,默认为5;
-O:指定分区特性
5.挂载文件系统
挂载文件系统就是将额外的分区与根文件系统上的某目录建立关联关系;将文件系统挂载到某一目录时,目录中的原有文件将会被隐藏。
挂载点:文件系统的访问入口,也就是文件系统被挂载到的目录。
使用mount命令来挂载文件系统
格式:mount [-t 文件系统] [-L Lable名] [-o 挂载选项] 设备文件名 挂载点
不带任何参数:显示目前已经挂载的文件系统的信息;
-t:指定挂载文件系统的文件类型;
-L:使用Lable名进行挂载;
-o:可以接一些挂载选项,如:
async:异步I/O,数据写操作先于内存完成,而后再根据某种策略同步至持久设备中 sync:同步I/O
atime/noatime:文件和目录被访问时是否更新最近一次的访问时间戳;
auto/noauto:设备是否支持mount的-a选项自动挂载;
dirtime/nodirtime:目录被访问时是否更新最近一次访问的时间;
dev/nodev:是否支持在此设备上使用设备文件;
exec/noexec:是否允许执行此设备上的二进制文件;
suid/nosuid:是否支持在此设备的文件上使用suid;
remount:重新挂载,通常用于不卸载的情况下重新指定挂载选项;
ro:只读;
rw:读写;
user/nouser:是否允许普通用户挂载此文件设备;
acl:在此设备上支持使用facl,默认不支持;
例1:将上面创建的/dev/sdb1分区挂载到/mnt/sdb1目录;
mount命令可以不带任何参数,将文件系统挂载到目录上。
例2:文件系统挂载默认是不挂载acl选项的,将文件系统重新挂载并添加acl功能选项;
通过tune2fs命令来查看挂载选项为(none);
使用-o选项将/dev/sdb1重新挂载,并使用mount命令来查看挂载选项;
但是这种方式不能使设置永久生效,默认挂载选项依然是空;
可以通过tune2fs命令来添加默认挂载选项
6.卸载文件系统
使用umount命令来卸载文件系统
umount 设备文件名或挂载点
例3:卸载/dev/sdb1文件系统
有时候文件系统会因为正在使用而无法被卸载,此时可以使用fuser命令来查看正在使用文件系统的用户,还可以直接将占用用户踢掉,然后卸载文件系统。
使用umount卸载/dev/sdb1无法完成;
查看哪些用户正在使用/dev/sdb1;
将用户user5使用的进程杀掉,卸载成功;
7.交换分区(swap)
交换分区是指用于当物理内存不足时充当内存的分区空间。
1)创建交换分区
使用fdisk命令来创建交换分区,下面在/dev/sdb磁盘上创建交换分区;
按照前面的方法创建一个512M的分区,但需要改变分区的类型,使用t命令来修改分区类型,使用L来查看各种分区类型所对应的代码,swap对应82;
使用p查看分区结果,并且保存退出。
使用mkswap命令来格式化swap分区;
使用free命令来查看一下当前的swap空间;
-m:表示使用MB来表示空间大小;
加载新的swap空间到系统中;
使用swapon命令来加载swap空间;使用swapon -s命令也可以查看swapon的使用情况;
2)关闭交换分区
使用swapoff命令来关闭交换分区
使用mount手动挂载的文件系统在系统重启后就会消失,需要反复进行挂载,我们可以将需要挂载的文件系统写入/etc/fstab文件,实现开机自动挂载文件系统。
先来看一下/etc/fstab文件的格式;
文件中对应的项目含义如下:
挂载设备 挂载点 文件格式 挂载选项 转储频率 自检次序
挂载设备:可以是设备文件、卷标、UUID;
挂载点:文件系统挂载到的目录;
挂载选项:挂载选项可以有多个,彼此间使用逗号分隔;
转储频率:
0:从不转储
1:每天转储
2:每隔一天
自检次序:
0:不自检,额外创建的文件系统都无须自动自检
1:首先自检,通常只有根文件系统需要首先自检
2:次级自检,不同的设备可以使用同一个自检次序
例如:实现/dev/sdb1分区开机自动挂载到/mnt/sdb1目录中,并且要求支持acl;
使用命令mount -a来测试能否挂载成功;
先卸载/dev/sdb1,再进行挂载测试。
1.磁盘检验:fsck
因进程意外中止或系统崩溃等情况导入写入操作非正常中止时,可能会导致文件损坏;此时,应该修复文件系统;
格式:fsck -t 文件系统 -a -r 设备名称
-t:指定文件系统类型,可省略,系统可以自动判断其分类型;
-a:自动修复错误;
-r:交互式修改错误;
e2fsck:专用于修复ext系列文件系统
-y:对问题自动回答为yes;
-f:强制进行检测。
2.显示块设备属性
blkid 文件系统
3.查看超级块信息
tune2fs -l 设备文件
dumpe2fs -h 设备文件
4.修改卷标
e2label 设备文件 卷标
tune2fs -L 卷标 设备文件
5.tune2fs命令常用参数
-j:ext2升级为ext3;
-L LABEL:修改卷标;
-m #:修改预留空间百分比,默认为5;
-O [^]FEATURE:启用指定特性,特性前加”^”表示关闭此种特性;
-o:设置默认挂载选项。