设备类别:
块(block):随机访问,数据交换单位为“块”
字符(character):线性,数据交换单位为字符
设备文件:FHS(LSB)
/dev/: 设备 #[主设备号],#[次设备号]
设备文件,关联至设备的驱动程序
设备号:
major:主设备号,区别设备类别,用于标明所需驱动程序
minor:次设备号,用于表示同一种类别的不同设备号
mknod命令:
mknod[OPTION]... NAME TYPE [MAJOR MINOR]
-m, --mode=MODE设置r,w,x权限
例 mknod ./testdev c 100 1
c:字符设备 100:主设备号 1:次设备号
磁盘设备文件:
每一种接口决定了一种线缆的使用方式,和一种传输协议。
IDE接口(ATA):并行, 133MB/s
两个IDE控制器:每个控制器可通过线缆接入两块磁盘,一主一从;
/dev/hd[a-z][#] 例/dev/hda1
/dev/hda,/dev/hdb,
/dev/hdc,/dev/hdd
SCSI接口: 并行,Small Computer System Interface
例如:UltraSCSI 320,320MB/s
SATA接口:串行,SerialATA,
例如:SATA3接口:6Gpbs
USB接口:串行
SAS接口:SCSI的串行接口
设备文件:/dev/sd[a-z][#]
[a-z]:标记设备
[#]:磁盘分区
磁盘的组成:
磁盘主要是由盘片、机械手臂、磁头和主轴马达,而数据的写入其实是在盘片上的。盘片上又可以细分出扇区与柱面两种单位,512bytes组成一个扇区。
整块磁盘的第一扇区记录着MBR(master bootrecord 512bytes)只能引导单块硬盘小于2T的硬盘,大于2T的用GPT:
446bytes:主引导分区,BootLoader,一个程序,启动操作系统
64bytes:分区表,记录整块硬盘的分区状态,16bytes标示一个分区,所以一个计算机只能有4个主分区[4个主分区:3主,1扩展-->n逻辑分区]
2bytes:用来标示MBR是否有效
分区标识方式:
主分区[p]或扩展分区[e]:1-4
逻辑分区:5+
fdisk命令:
1、查看已经识别的磁盘设备:
fdisk -l /dev/[hs]d[a-z]
fdisk -l
2、管理分区
fdisk DEVICE
fdisk提供了一个交互式接口来管理分区,它有许多子命令,分别用于不同的管理功能;所有的操作均在内存中完成,没有直接同步到磁盘;
常用命令:
p: 显示现有分区表;
n: 创建新分区
d: 删除现有分区
t: 修改分区ID
l: 查看支持哪些分区ID
w: 保存退出
q: 不保存退出
m: 显示帮助信息
查看内核是否已经识别新建分区:
# cat /proc/partitions
通知内核强制重读分区表[对于一个已经存在的磁盘,在上面创建分区,内核是不会直接识别的]:
CentOS 5: partprobe /dev/DEVICE
CentOS 6: partx, kpartx
partx -a /dev/DEVICE
例:partx -a /dev/sda
kpartx -af /dev/DEVICE
例:kpartx -af /dev/sda
注意:成功读取分区,可能需要命令重复执行2次或以上;
文件系统:
一个可被挂载的数据为一个文件系统而不是一个分区
文件系统通常会将这两部分的数据分别存放在不同的块,权限和属性放置到inode中,实际参数放在data bolck中。另外,还有一个superbolck,会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。
super block:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息;
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block;
block:实际记录文件的内容,若文件太大是,会占用多个block
注意:文件系统一开始就将inode与block规划好了除非重新格式化(或者用resize2fs等命令更改文件系统大小),否则inode与block是固定不变的
文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装引导转载程序
一个块组的6个主要内容:
data block:1. 在ext文件系统中所支持的block大小有1KB,2KB,4KB三种;
2. 每个block内最多只能放置一个文件的数据;若文件大于block的大小,则文件会占用多个block数量;若文件小于block的大小,则该block的剩余空间就不能再被使用了(磁盘空间会浪费);
3. 原则上,block的大小和数量在格式化完就不能够在改变了;
inodetable(inode表格): 1.该文件的访问格式(r,w,x)
2.该文件的属主属组
3. 该文件的大小
4. 该文件创建或状态改变的时间(ctime)
5. 该文件最近一次读取时间(atime)
6. 该文件最近一次修改时间(mtime)
7. 定义文件特性的标志(flag),例SUID等
8. 该文件真正内容的指向
inode的特点:
1. 每个inode大小均固定为128bytes
2. 每个文件都只会占用一个inode,所以文件系统上能创建的文件个数与inode的数量有关
3. 系统读取文件是需要先找到inode,并分析inode所记录的权限和用户是否符合,若符合才能开始实际读取block的内容
4. 一个inode只有12个直接、一个间接、一个双间接与一个三间接记录区
5.inode不记录文件名,文件名的记录在目录block中
super block: 是记录整个文件系统相关信息
1.block和indoe的总量
2.未使用与已使用的inode和block数量
3. block与inode的大小(block为1K,2K,4K,inode为128bytes)
4. 文件系统的挂载时间、最近一次写入数据的时间、最近一次检测磁盘(fsck)的时间等文件系统的相关信息
4. 一个validbit数值,若此文件系统已被挂载,则valid bit为0,反之为1
5. 一般super block的大小为1024bytes
6. 每个block group都有可能含有super block。第一个block group是会含有super block,但后续的block group也有可能含有super block,主要是用于作为第一个blockgroup的备份
block bitmap(块位图): 可以知道哪些block是空的
inode bitmap(inode位图): 可以知道哪些inode是未使用的,哪些是使用的
查找/var/logs/messages的过程:
1.根的inode --> 根目录对应的磁盘块 --> var对应的inode编号 --> 查inode table, 找到编号对应的inode --> var目录的磁盘块 -->logs 的inode编号--> 查inode table, 找到logs目录的inode --> logs目录的磁盘块 --> 找到messages文件名对应的inode编号 -->查inode表,找到messages的inode编号对应的inode --> messages的磁盘块
2.先查/ inode-> /目录block中对应的var的inode->根据查到的/var inode去查/var/目录 block中对应的logs inode->根据查到的/var/logs的inode去查 /var/logs目录block中messagesinode->根据查到的messages inode去查block发现时文件->读取数据[中间省略了inode的权限判断]
可以归纳为inode->block->inode->block->…->block读取数据
目录:
创建一个目录时,文件系统会分配一个inode和至少一个block给该目录。其中inode记录该目录的相关权限与属性,并记录分配到的block的号码;而block则是记录在这个目录下的文件名和该文件名对应的inode。
链接文件:访问同一个文件数据不同路径
硬链接:不同目录的两个文件路径指向了同一个inode;
创建方法:
# cp -l SRC DEST
# ln SRC DEST
特性:
(1) 目录不支持硬链接;
(2) 硬链接不能跨文件系统;
(3)硬链接文件与原文件是指向同一个inode,创建硬链接文件会增加inode的引用计数;
使用hard line设置连接文件时,磁盘的空间与inode的数目都不会改变,只是在某个目录下的block多写了一个关联数据。
符号链接:链接文件是一个完全独立的新文件,但其指向了原文件的文件路径;
特性:
(1) 符号链接文件与原文件是两个各自独立文件;
(2) 目录可以创建符号链接;
(3) 可以跨文件系统;
(4) 删除链接不影响原文件;但删除原文件,符号链接指向的文件路径将不复存在,因此,此时链接文件将变成失效的链接;
其大小并非真正原文件大小,而是指向的原文件的文件路径字符串所包含的字节数;
创建方法:
ln -s SRC DEST
VFS: Virtual FileSystem虚拟文件系统
整个Linux的系统都是通过VFS的内核功能去读取文件
Linux文件系统:ext2,ext3, ext4, reiserfs, xfs, btrfs
光驱:iso9660
网络文件系统:nfs, cifs
集群文件系统:gfs2, ocfs2
分布式文件系统:ceph
windows文件系统:ntfs,vfat
伪文件系统: tmpfs, hugepagefs, proc, sysfs
Unix的文件系统:FFS,UFS, JFS
交换文件系统:swap
日志型文件系统[ext3,ext4]和非日志型文件系统[ext2]的区别:
日志型写入步骤:1.预备,当系统要写入文件时,会先在日志记录块中记录某个文件准备要写入的信息
2.实际写入,开始写入文件的权限和步骤;开始更新meta data[中间数据]的数据
3. 结束,完成数据与metadata的更新后,在日志记录块中完成该文件的记录
非日志写入步骤:1. 先确定用户对于欲添加文件的目录是否有w和x权限,若有的话才能添加
2.根据inode bitmap 找到没有使用的inode号码,并将新文件的权限/属性写入
3.根据block bitmap 找到没有使用的block号码,并将实际数据写入block中,且更新inode的block指向数据
4.将刚才写入的inode与block数据同步更新inode bitmap与block bitmap,并更新superblock的内容
当中途断电等因素导致系统中断时,会出现数据的不一致状态,这时非日志文件系统需要进行一致性检查,很费时间。而日志文件系统,只需要去检查日志记录块就可以知道那个文件发生了问题,不必去针对整块文件系统去检查。
创建ext系列文件系统命令:mke2fs
mke2fs [OPTION]... /dev/DEVICE
-t {ext2|ext3|ext4}:指明要创建的文件系统类型
mkfs-t ext4 = mkfs.ext4 = mke2fs -t ext4
-b {1024|2048|4096}:其上限由page frame决定
-L LABEL:指定要使用的卷标[使用时,LABEL='MYLABELNAME']
-j: 相当于使用-text3
mkfs.ext3= mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i #: 指明inode与字节的比率[不加% ],;即,每多少字节给创建一个inode;
-N #: 直接指明给此文件系统创建多少个inode
-m #:指定预留空间的百分比[只有root能用,不用%];默认为5;
-O [^]FEATURE:可以用来指明这个文件系统额外可以具有的属性,具体可以查看man手册
例:-o has_journa 启用日志属性
-o ^has_journa 不启用日志属性
创建文件系统
mkfs.ext2, mkfs.ext3, mkfs.xfs ...
e2label: 调整卷标
查看:e2label /dev/DEVICE
设定卷标:e2label /dev/DEVICE LABEL
tune2fs:查看或修改ext系列文件系统的某些属性
查看超级块中的数据信息:如UUID:全局惟一标识符
tune2fs-l /dev/DEVICE
例 tune2fs -l /dev/sda5
修改指定文件系统的属性:
-j:ext2 --> ext3
-L LABEL: 修改卷标;
-m #: 调整预留空间的百分比;
-O [^]FEATURE: 开启或关闭某种特性
-o [^]mount_options: 开启或关闭某种默认挂载选项
-o acl开启acl
-o ^acl关闭acl
dumpe2fs命令:显示ext系列文件系统属性信息
dumpe2fs[-h] /dev/DEVICE
例dumpe2fs -h/dev/sda5
blickid命令:可以查看文件类型
文件系统检测:
因进程意外中止或系统崩溃等原因导致写入操作非正常终止时,可能会导致文件损坏;此时,应该修改修复文件系统;
注意:应该离线进行[文件系统不应该处于挂载状态,先卸载]
检测文件系统
fsck.ext2, fsck.ext3, fsck.ext4, fsck.xfs ...
fsck:文件系统检查命令
-tFSTYPE
fsck-t FSTYPE = fsck.FSTYPE
例fsck -t ext4 修复即删除不一致文件
-a:自动修复所有错误[慎用]
-r: 交互式修复错误
ext系列文件系统的专用工具:
e2fsck
-y: 对所有问题自动回复为yes;
-f: 即使文件系统处于clean状态,也要强制进行检测;
Windows无法识别Linux上专用的文件系统,因此,有存储设备需要两种系统之间交叉使用时,应该使用windows支持的文件系统:
#mkfs -t vfat /dev/DEVICE
swap文件系统:
Linux上交换空间必须使用独立的磁盘分区;
fdisk/dev/DEVICE
t命令调整其ID为82;
创建交换分区文件系统:mkswap命令
mkswap [-L LABEL] /dev/DEVICE
free命令:显示当前系统内存的空闲和使用状况,即查看内存使用状况
-m以MB为单位
-g 以G为单位
启动交换分区:
swapon [OPTION] [DEVICE]
-a: 启用/etc/fstab文件中定义的所有交换分区
例 swapon /dev/sda6[注意sda6是事先fdisk为swap的]
禁用交换分区:
swapoffDEVICE
例 swapoff /dev/sda6
挂载:
注意:1.在Linux系统上,所有的文件系统必须通过根文件系统的某个分支来访问;
2.单一文件系统不应该被重复挂载在不同的挂载点(目录)中
3.单一目录不应重复挂载多个文件系统
4.作为挂载点的目录理论上应该都是空白目录,不然原来目录下的文件会被隐藏
根文件系统:根是一切文件系统的访问入口,根关联到的分区,有一定的要求:FHS
除了根,其余所有的其它文件系统如果想要被访问,都只能够通过“关联”至根文件系统上的某个目录来实现;这种操作即所谓的“挂载”,也即mount;相反动作,即卸载,命令为umount
挂载点:mount_point,即用于作为另一个文件系统访问入口的目录;
mount命令:
mountDEVICE MOUNT_POINT
挂载点
1、事先存在;
2、应该使用别的进程未使用的目录;
3、挂载点下原有的文件将被隐藏;
mount:将显示当前系统已经挂载的所有文件系统的相关信息;
mount[OPTION]... [-t FSTYPE] [-o OPTION] [DEVICE] MOUNT_POINT
命令选项:
-r: 只读挂载
-w: read and write,读写挂载
-t FSTYPE: 被挂载的设备上的文件系统类型;可省略,此时mount会自动使用blkid命令来判断之;
-L LABEL: 以卷标的方式指定要挂载的设备,因此,此时DEVICE必须省;
-U UUID:以UUID的方式指定要挂载的设备,因此,此时DEVICE必须省;
-a: 自动挂载所有的支持自动挂载的设备(/etc/fstab文件中定义的支持自动挂载的设备);
-n: 默认情况下,设备挂载与否的改变结果会被保存于/etc/mtab中一份;-n选项用于变动时不更新此文件
示例:
#mount -U dea669ee-e769-46d9-86a8-88925a10278b /data/mydata
-o OPTION,挂载选项[多个时用,隔开 例: -o noatime,exce,acl]:
async:异步写入
sync:同步写入,即使用同步I/O;
atime/noatime:文件或目录在被访问时是否更新其访问时间戳;
diratime/nodiratime:目录在文中时是否更新其访问时间戳;
auto/noauto:设备是否支持mount命令使用-a选项时自动挂载;
dev/nodev:此设备上是否创建设备文件;
exec/noexec:是否允许执行此文件系统上的程序文件;
suid/nosuid:是否支持此设备上的文件上使用suid权限;
remount: 重新挂载;
acl: 支持使用facl;
#mount -o acl
# tune2fs -o acl /dev/DEVICE:打开acl为默认挂载选项;
ro: 只读
rw: 读写
user/nouser: 是否允许普通挂载此文件系统
所有挂载选项均未指明时,其默认为:
defaults
Usedefault options: rw, suid, dev, exec, auto, nouser, async, and relatime.
另外一个使用技巧:
将某目录绑定至指定目录下,作为临时访问入口;
mount--bind 源目录 目标目录
查看所有已经挂载设备的方法:
#mount
#cat /etc/mtab
#cat /proc/mounts
umount命令:
umount DEVICE
umount MOUNT_POINT
例:umount /dev/sda5
umount /data/mydata
注意:正在被某进程访问的设备是不可以被卸载的;查看被什么进程所占用:
#lsof MOUNT_POINT
#fuser -v MOUNT_POINT
# fuser -km MOUNT_POINT: 终止正访问挂载点的进程;
df命令:列出文件系统的整体磁盘使用量
df[OPTION]... [FILE]...
-l: 仅显示本地文件系统的相关系统;
-h: 单位换算;
-i: 显示inode的使用情况而非磁盘块的;
-T:连同该分区文件系统的名称(例ext4)也列出
du命令:评估文件系统的磁盘使用量(常用于评估文件、目录所占容量)
du 文件或目录名
-s: 统计整个目录及内部所有文件总体大小;
-h:human-readable
du -sh /* 查看/下目录的大小
文件系统相关的配置文件: /etc/fstab
定义开机可自动挂载的文件系统,每行一个:
6个字段:
(1) 挂载的设备:
设备文件
LABEL
UUID
伪文件系统:如sysfs, proc, tmpfs等
(2) 挂载点
swap的挂载点仍为swap
(3) 文件系统类型
(4) 挂载选项
defaults表示使用默认挂载选项;
多个挂载选项间使用逗号分隔;如defaults,acl,noatime
(5) 转储频率[多久备份一次],只有一下三种,一般不备份:
0:从不备份
1: 每天备份
2: 每隔一天备份
(6) 自检次序[大多不自检,可以开机手动自检,mount命令]
0:不自检
1:首先自检,通常只有根文件系统可首先自检
2:次级自检,
...
mount -a 会自动读取/etc/fstab文件,并自动挂载
例:开机挂载/dev/sda5到/data/mydata并开启acl,禁止程序自动运行,且不更新文件的访问时间戳