课程内容:
1、linux文件系统基础概念
2、设备文件及磁盘分区
3、文件系统的管理与挂载
4、文件系统的管理与挂载
一、linux文件系统基础概念
1、磁盘的结构(磁盘disk、盘面quotation、磁道track、扇区sector(存储单位)、磁头head、柱面cylinder,每个盘面有2个磁头)
block(磁盘块是扇区的2的N次方倍,如扇区是512byte,那么块大小为1k 2k 4k 等)
一个块只能属于一个文件,如果文件很大,要占用很多块,因此一个文件可以包含很多块。
2、存储空间分2部分:数据区和元数据区(stat命令查看文件元数据 文件名 时间 属主 权限,
对应的数据存储在哪些磁盘块上)目录是一个路径映射符。
index node:索引区域中每个文件云数据条件
每个iNode都有其编号:ls -i 可以查看文件iNode编号,每个iNode指向常见类型的文件(f,d)指向磁盘数据区中的某个或某些个磁盘块;目录文件数据区存储的是(此目录的)文件名,以及对应的iNode编号,根(/)是自引用位置,系统启动默认找到的/
3、格式化:创建文件系统
4、bitmap:位图索引 存储数据时扫描iNode索引、块索引找到未使用的iNode和块来存放。
因为inode编号太多查找该inode是否使用比较消耗资源,为了更快的查找到未使用的inode会对inode做索引这叫bitmap(位图索引)inode位图,相对应的块也会做block bitmap(块位图),所以元数据区中存放了(inode、ionde bitmap、block bitmap),数据存储方式:每次会拿8个未使用的磁盘块用来存储,如果只用了一个会把未使用的块还回去不够时在取8个未使用磁盘块,评估磁盘性能时会有2种评估模型(随机io和连续io:磁盘读写数据是靠机械手臂完成,如果数据是连续存储将会提高读写速度,乱序将影响读写性能)
5、为了方便管理把块分为块组,每个块组都有独立的数据区和元数据区,块组的元数据信息和块组之间运行都由超级块(super block)进行协调,并且在多个块组中会有超级块备份,tune2fs可以查看分区的超级块信息 例:tune2fs -l /dev/sda1,还可以通过dumpe2fs查看分区中块组信息 例:dumpe2fs /dev/sda1 加上-h也可以查看超级块信息
6、链接文件:
硬链接: 两个文件指向同一个iNode,一个文件称为另一个文件的硬链接。
软链接:当一个文件指向另一个文件的路径(或字符串)时,这个文件称另一个文件的软连接
软链接的大小为文件名字符数长度。一个iNode可以被引用多次,其计数器在引用次数降为0之前是不会被标记为未用的
6.1、创建链接:
ln [-sv] SRC DEST :-s 表示软连接,-v:显示创建过程
硬链接:
eg: #cp /etc/rc.d/rc.sysinit /tmp
#ll -h
#ln rc.sysinit rc.hardlink iNode 计数器变成2
# ls -li 发现2个文件Inode 相同,说明指向同一个文件,因此为硬链接。
如果把rc.sysinit 删除掉,只是iNode计数器减一,rc.hardlink 依然能访问,
修改任何一个文件,另一个文件也被修改。
硬链接特性:
1、不能对目录创建硬链接 2、硬链接不能跨分区 3、创建硬链接增加iNode计数
软链接:
eg:# ln -sv rc.hardlink rc.softlink
# rc.softlink----->rc.hardlink
#ln -sv /tmp/rc.hardlink /tmp/rc.soft2
#rc.soft2--->rc.hardlink
删除rc.hardlink ,链接错误,cp任意文件重名名为rc.hardlink,链接正常显示。
软(符号)链接特性:
1、可以对目录创建链接 2、不受分区限制 3、创建软链接不增加iNode计数
6.2、文件改变
文件被删除:意味着iNode被标记为空闲,此iNode指向磁盘块被标记为空闲。
如果iNode被引用多次,且此次删除未使得其引用计数降低为0的话,说明文件仅删除了一个访问路径,
文件被复制:创建一个新文件,并把原文件的数据指向磁盘块中再写一次的过程。
文件被移动:
1、同一个分区移动:改变了文件的访问路径,原文件不变,iNode不变。
2、不同分区移动:在新分区创建文件,把数据复制过去,删除原分区数据。
二、linux文件系统类型
ext(2、3、4)、xfs、ffs、ufs、feiserfs 、jfs (注:ext2不支持日志文件)
swap:交换文件系统
网络文件系统:nfs ,smbfs(cifs)
分布式文件系统:ceph
光盘文件系统:iso9660
btrfs,
2.1 linux的磁盘管理
linux哲学思想,一切皆文件。
设备文件:特殊文见,只有iNode没有数据,关联至一个驱动程序进而跟对应的硬件设备打交道。通常在/Dev目录下(b块设备,c线性设备),在设备元数据中都有其设备号(主设备号:用于标记设备类型;次设备号:用于标记同一类设备的不同设备;此设备名称由ICANN制定。
创建设备文件:mknod [option]…name tpye [major minor]
如:mknod -m 664 /dev/testdev b 120 0 删除:rm -rf /dev/testdev
磁盘设备文件:
/dev/hd: 并口 IDE 133M/B
/dev/sd: 串口 USB、SATA3 6Gbps/8、SCSI(并行10000转 15000转)、SAS
/dev/sd[a-z]
分区:数字表示 /dev/sda1 /dev/sha2
分区编号:主+扩展:1--4 逻辑分区:5开始 查看磁盘信息:fdisk -l
三 磁盘分区
磁盘使用过程: 磁盘-->创建分区-->创建文件系统(格式化)-->挂载
传统的MBR(Master Boot Record)分区方式,有一个局限:无法支持超过2TB的硬盘的分区(或单个分区超过2TB),而GPT的分区表很好了解决了传统MBR无法逾越2TB的限制。但是在Linux系统中,传统的fdisk命令无法支持GPT分区方式,parted是更强大的分区工具,它的操作都是实时的,也就是说你执行了一个分区的命令,他就实实在在地分区了,而不是像fdisk那样,需要执行w命令写入所做的修改, 所以进行parted的测试千万注意不能在生产环境中.
硬盘分区:磁道(track)扇区(sector)柱面(cylinder)分区是根据柱面划分的,磁盘的盘面有许多磁道,每个磁道是由多个扇区组成,每个扇区有512个字节;0磁道0扇区被称为MBR(master boot record)主引导记录,负责引导操作系统(os)启动
MBR 512Bytes的组成:(446bytes:程序bootloader、64bytes:分区表、每16bytes标记一个分区,一共4个主分区、2bytes:SA,BMR有效性标记)
创建磁盘分区:
查看磁盘分区:fdisk -l [device]…… 如:fdisk -l /dev/sda、fdisk -l | grep "^/dev/sda*"
创建分区:fdisk 【device】 如:fdisk /dev/sda
交互式界面,有许多子命令:m 帮助
p:print 显示磁盘分区表
n:new 新建分区
d:delete 删除分区
l:查看所有systemID
t:修改分区的系统ID
w:保存并退出,q:不保存退出
注意:分区完成后,查看分区信息:cat /proc/partitions 发现sda3 sda5未被内核识别,因此不能格式化分区,挂载等操作,所以让内核重读磁盘信息(如重启)。对于已经有分区处于使用状态的磁盘不能重启,新建分区后需要让内核重读其分区表:Centos5: partprobe [device] ,Centos6:partx或者kpartx [device]来识别,centos6许多次交替操作2条命令方可生效。如下:
kpartx -l /dev/sda -l列出分区信息 ,cat /proc/partitions
kpartx -af /dev/sda -a添加 -f强制 再来一次 partx -a /dev/sda 再cat 即可出现列表
ls /dev/sda* 查看分区列表。
分区创建工具:sfdisk和parted
练习:写一个脚本:
1、提示输入一个对其执行分区的新硬件设备文件
2、提醒用户接下来的操作销毁所有的数据,你继续吗?Y继续,其他字符退出
3、对磁盘新建分区主分区1:大小512M,主分区2:大小2G
4、创建完成后显示结果:
四、创建文件系统 (file system)
1、创建文件系统(格式化):
格式化分2步(厂家出厂进行低级格式化、用户需要高级格式化)
mkfs:make file system -t FSTPYPE [DEVICE]
mkfs -t FSTYPE = mkfs.fstype 如:mkfs -t ext4 = mkfs.ext4
而 mkfs -t xfs /dev/sda5 提示错误说明该系统没有装载xfs文件系统。
注意:centos 6.5
linux 内核是模块化的,这些模块支持动态装载和卸载:文件系统可能会被直接打包进内核,也可以被编译成内核模块。 lsmod 查看系统文件。
如果期望将某分区格式化成某特定文件系统,通常需要一个与之对应的在用户空间可使用的命令行工具来实现。如 mkfs -t xfs /dev/sda5 提示错误,这是需要安装xfs文件系统,
yum -y install xfsprogs ,安装完成后,再mkfs -t xfs /dev/sda5就没问题了。
<1> 文件系统的日志功能:journal
ext2:无日志功能
ext3,ext4,xfs:日志功能 (带日志功能的存储原理:
1、在日志区写入元数据信息 2、写入数据 3、将日志区元数据信息移到元数据区)
<2> mke2fs(ext系列的文件系统有专门的创建文件系统的工具,不建议使用mkfs)
常用选项: -b {1024|2048|4096} 指定块大小
-t {ext2|ext3|ext4} 指定分区格式
-L LABEL 指定卷标
-j 相当于 -t ext3
-i n :每多少个字节给创建一个iNode,此字节数不应该小于块大小
-N n:直接指定可用的iNode数
-m n:指定预留空间占整个分区空间的百分比,默认是5%
<3> 查看超级块信息:
#tune2fs -l DEVICE
#dumpe2fs -h DEVICE ,dumpe2fs device(查看超级块组信息)
2、修改分区属性:tune2fs
blkid:查看指定设备块的信息 如,blkid /dev/sda5
e2label:查看或设定卷标 格式:e2label DEVICE [LABEL]
注意:块大小无法调整
-j :ext2---->ext3
-L LABEL:修改卷标
-m #:修改预留空间百分比
-O [^]FEATURE :启用指定特性;特性前加^,表示关闭特性
-o [^]mount-options:开启或关闭指定的挂载选项
3、文件系统修复
因进程意外终止或者系统崩溃等情况导致写入操作非正常中止时,可能会导致文件系统损坏,此时应该修复文件系统(注意:必须离线修复也就是先卸载文件系统)
fsck
-t fstype 指定文件类型 如:fsck -t ext3 -a /dev/sda3
-a 自动修复错误
-r 交互式修复错误
e2fsck:ext系列文件系统的专用工具(-y :yes ;-f :force 强制进行检查)
补充:Windows不能识别linux的文件系统,所以U盘不能格式成ext系列,U盘一般为FAT32
格式化FAT32 (mkfs -t vfat)
4、交换分区 swap
缓解物理内存资源不够的情况:
创建交换分区 :fdisk /dev/sda ,给磁盘分出一个(1到2倍内存大小)空间将ID改成82,用mkswap 创建交换分区
mkswap [-L LABEL] DEVICE 如:mkswap -L SWAP1 /dev/sda7
五、关于挂载
文件系统挂载:默认只有管理员才有权限挂载
将额外的分区与根文件系统上的某目录建立关联关系的过程,目录中的原有文件会被隐藏。
挂载点:另一个文件系统的访问入口
<1> 挂载:mount DEVICE MOUNT_POINT 固定挂载点:/mnt,/media
mount [option]…[-t fstype][-o option] 设备 挂载点 (挂载点:事先存在、空闲目录)
常用挂载选项: -t fstype 指定挂载文件系统类型
-r 只读挂载
-w read and write 读写挂载
-L LABEL 以卷标方式指定设备,mount -L LABEL 挂载点
-U UUID 以UUID的方式指定设备 mount UUID='某uuid号'或 -U UUID
-a 自动挂载所有(/etc/fstab文件中定义)的支持自动挂载的设备
-n:挂载时,不更新/etc/mtab文件
-o option
async:异步I/O,数据写操作先于内存完成,而后再根据某种策略更新至持久设备中
sync:同步I/O
atime/noatime:文件和目录被访问时是更新最近一次的访问时间戳。
auto/noauto:设备是否支持mount的-a选项自动挂载
diratime/nodiratime:目录被访问时是最近一次的访问的时间戳
dev/nodev: 是否支持在此设备上使用设备;
exec/noexec: 是否允许执行此设备上的二进制程序文件
suid/nosuid: 是否支持在此设备的文件上使用suid
remount: 重新挂载,通常用于不卸载的情况下重新指定挂载选项
ro: 只读
rw: 读写
user/nouser: 是否允许普通挂载此文件设备
acl: 在此设备是支持使用facl,默认不支持;
例如:以指定挂载后支持acl为例:
方法1:
mount -o acl DEVICE MOUNT_POINT
方法2:
tune2fs -o acl DEVICE
为设备设定默认挂载选项
查看所有已挂载的设备:
#mount
#cat /proc/mounts(系统内核识别)
#cat /etc/mtab (调用mount命令)
<2>卸载:umount device 或者 umount mount_point ,挂载点没有被进程访问时才能卸载。
查看哪些进程正在访问挂载的设备:
fuser -v 挂载点
中止正在此挂载点的进程:
fuser -km 挂载点
df: disk free
-h: human-readable
-i: 显示inode的使用信息而非默认的磁盘空间使用信息
du: disk usage (-s ; -h)
练习:创建一个20G的分区,块大小为2048,预留百分比为3,卷标为MYDATA,要求挂载后支持acl,使用UUID的方式挂载至/mydata目录;
使用重新挂载的功能,让其不支持dev功能;
七、交换分区:mkswap
free: 查看内存及交换分区的使用信息
启用交换分区 swapon [DEVICE] -a: all, 启用所有交换分区 -p #: 指定此交换设备的优先级
禁用交换分区 swapoff [DEVICE] -a: 禁用所有 例如: swapoff /dev/sda2
自动挂载的设备的配置文件:/etc/fstab6 字段说明如下:
设备名称: 设备挂载点: 文件系统: 挂载选项: 转储频率(0:从不转储1: 每天转储2: 每隔一天)
: 自检次序(0:不自检,额外创建的文件系统都无须自动自检 1:首先自检,通常只有根文件系统需要首先自检 2:次级自检,不同的设备可以使用同一个自检次序 3~9)
挂载选项可以有多个,彼此间使用逗号分隔;
本文出自 “liwenjia'blog” 博客,谢绝转载!