Linux磁盘及文件系统管理详解
计算机基础知识:
冯.诺依曼体系结构构成的计算机,必有的五大基本组成部件:
冯.诺依曼计算机体系结构图
运算器:用于完成各种算术运算、逻辑运算和数据传送等数据加工处理;
控制器:用于控制程序的执行,是计算机的大脑。
运算器和控制器组成计算机的中央处理器(CPU)。控制器根据存放在存储器中的指令序列(程序)进行工作,并由一个程序计数器控制指令的执行。控制器具有判断能力,能根据计算结果选择不同的工作流程;
存储器:用于记忆程序和数据,例如:内存。程序和数据以二进制代码形式不加区别地存放在存储器中,存放位置由地址确定;
输入设备:用于将数据或程序输入到计算机中,例如:鼠标、键盘;
输出设备:将数据或程序的处理结果展示给用户,例如:显示器、打印机;
北桥芯片:主要负责控制AGP显卡、内存与CPU之间的数据交换;
南桥芯片:主要负责软驱、硬盘、键盘以及附加卡的数据交换。(南桥芯片相对于北桥芯片数据处理量不算大,南桥芯片通过汇总的方式将数据传到北桥芯片,北桥芯片才是主芯片)。
设备类型:南桥芯片主要连接一些I/O设备,决定主板上的功能,主板上的各种接口(USB、串口),PCI总线(内存、声卡),IDE(硬盘、光驱),以及主板上的其他芯片(RAID、网卡)都归南桥芯片控制,属于低速总线控制器。
Note:服务器的最重要的两大I/O是网卡和磁盘;
那么南桥芯片是如何来识别这些设备的呢?设备类型又有哪些?
I/O端口:就是一种地址,用于标示对应的I/O设备,I/O端口范围:0——65536;
(1) 设备类型(宏观上分类):
字符设备,character:以字符为单位进行顺序访问的设备,例如键盘。
块设备,block:以块为单位,能够进行随机访问的设备,例如硬盘;
(2) 设备具体的分类(比如磁盘,CPU,内存等,我们需要对这些设备进行标识)
设备文件定义:关联至一个驱动程序,进而能够与之对应硬件设备进行交互。
(3) 设备文件的标识:
主设备号:标识的是设备的类型。
次设备号:同一类设备中不同设备的标识。(例如都是磁盘,要跟上具体编号1、2…)
[root@localhost ~]# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Aug 23 17:01/dev/sda brw-rw---- 1 root disk 8, 1 Aug 23 09:01/dev/sda1 brw-rw---- 1 root disk 8, 2 Aug 23 17:01/dev/sda2 主,次磁盘结构:
磁盘结构图给出了一个磁盘驱动器两个主要的移动部件:一个是磁盘组合(diskassembly),另一个是磁头组合(head assembly)。磁盘组合由一个或多个圆盘(platter)组成;它们围绕一根中心主轴旋转。圆盘的上表面和下表面涂覆了一层磁性材料,二进制位被存储在这些磁性材料上。其中,0和1在磁材料中表现为不同的模式。
1、 盘面:硬盘的每一个盘片都有两个盘面(Side),即上、下盘面,一般每个盘面都会利用,都可以存储数据,成为有效盘片,也有极个别的硬盘盘面数为单数;
2、 磁道:磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道(Track)。磁道从外向内从0开始顺序编号。磁盘的每一个盘面有300~1024个磁道,新式大容量硬盘每面的磁道数更多;磁道是硬盘厂商在硬盘出厂时已划分好的;
3、 扇区:sector,磁盘是固定角速度的设备;每秒转动的角度,即每段圆弧叫做一个扇区。扇区从“1”开始编号,每个扇区中的数据作为一个单元同时读出或写入,从逻辑层面上将已经进行了低级格式化了,单位为512字节。第0个扇区存放的是磁盘的分区信息;即MBR:Master Boot Record,主引导记录;
512byte:
bootloader,加载器,445bytes;
每16个bytes引导一个分区;
最后2个字节被填充了两个5A,作为MBR有效性标记;
4、 柱面:所有盘面上的同一位置的磁道构成一个圆柱,通常称做柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。(分区是按照柱面进行分区的)
linux中的磁盘:Linux中的磁盘是以设备文件的形式展现出来的,这也正好体现了Linux一切皆文件的哲学思想;
(1) 设备文件的名称:
即linux磁盘设备文件的访问标识:/dev/[s|h]d[a-z][1,2…]
[s|h]:磁盘设备接口类型;
[a-z]:磁盘编号。
[1,2…]:分区标号,1-4标号:主分区和扩展分区的编号,5以上的编号为逻辑分区编号。如:sda1,代表SCSI接口类型的第一块磁盘的第一个主分区;
Note:特性:对于Linux系统而言,每个分区都是可以独立访问的设备;
(2) 磁盘接口类型:
IDE接口(ATA):并行接口(理解为:两个IDE控制器:每个控制器可通过线缆接入两块磁盘,主/从,即master/slave模式)这类接口传输速率133MB/s。linux中标识为/dev/hd[a-z][1,2…].
SCSI:Small Computer System Interface,小型计算机接口;
USB接口:串行接口,3.0接口的传输速率为480MB/s。Linux中标识为/dev/sd[a-z][1,2…]
SAS接口:串行接口,也称为序列式SCSI,它由并行SCSI物理存储接口演化而来,序列方式能提供更快速的通信传输速度及更简易的配置。此外SAS支持与序列式ATA(SATA)设备兼容。它的传输速率是6Gbps。Linux中标识为/dev/sd[a-z][1,2…]
新磁盘需要经过哪些操作才能使用呢?
三个步骤:1、磁盘分区;2、格式化(创建文件系统);3、挂载;
磁盘管理工具fdisk(分区):fdisk提供了一个交互式接口来管理分区,它有许多子命令,用于磁盘额分区的管理,所有编辑操作,都是在内存中完成的。没有直接同步到磁盘,保存退出后才能完成磁盘的同步。
# fdisk –l 显示所有的磁盘设备的详细信息;
#fdisk –l [DEVICE_NAME]显示指定的设备的详细信息。
子命令的作用:
Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibilityflag d delete a partition,#删除一个分区; l list known partition types,#列出已知的所有分区类型; m print this menu,#显示帮助信息; n add a new partition,#创建一个新分区; o create a new empty DOSpartition table p print the partition table,#打印分区表,列出现有的分区信息; q quit without saving changes,#不保存分区信息退出; s create a new empty Sundisklabel t change a partition‘s system id,#修改分区的systemis(16进制的数字) u change display/entry units v verify the partition table w write table to disk and exit,#保存分区信息并退出; x extra functionality (expertsonly) Command (m for help): #m显示帮助信息;
Note:在子命令模式中,想删除当前的字符,按Ctrl+Backspace组合键才能删除;
查看内核中的分区情况:
cat/proc/partitions 内核是否真正读取了分区表;
[root@localhost ~]# cat /proc/partitions major minor #blocks name 8 0 125829120 sda 8 1 204800 sda1 8 2 62914560 sda2 253 0 20971520 dm-0 253 1 2097152 dm-1文件系统的创建(格式化):
磁盘分区后,我们接下来就是格式化,也就是文件系统的创建,那么什么是文件系统呢?
(1) 文件系统的定义:管理存储空间中,存储大量文件时,实现按名存储的一种机制(按块进行存取,一个块=2个扇区的大小)。
文件系统的结构:
每一个文件都是由元数据和数据组成,文件系统通常会将这两部分的数据分别存放在不同的块,权限和属性放置到inode中,实际参数存放在data block中。
另外还有一个superblock(超级块),会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。
对上图的解析:
一个分区可以理解为由一个BootBlock和N多个块组(Block Group)构成的;
Boot Block:块是预留的,用来引导系统分区的。它是被MBR中的Boot Loader调用的。
Super Block:存储整个文件系统的详细信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息;块组0上必须有Super Block,其他的组可以有也可以没有,最好是在其他的块组中有Super Block,用于备份;
GDT:块组的描述符,描述该组存放的是什么数据;
Block Bitmap(块位图):可以知道哪些block是空的;
Inode Bitmap(Inode位图):可以知道哪些inode是未使用的;
Inode Table:存放inode条目;
inode属性:
该文件的访问权限(r,w,x)
该文件的属主属组
该文件的大小
该文件创建或状态改变的时间(ctime);
该文件最近一次读取时间(atime)
该文件最近一次修改时间(mtime)
定义文件特性的标志(flag),例如SUID等;
该文件真正内容的指向(记录此文件的数据所在的block)
inode的特性:
每个inode大小均固定为128bytes
每个文件都只会占用一个inode,所以文件系统上能创建的文件个数与inode数量有关;
inode不记录文件名,文件名的记录在目录block中;
系统读取文件时需要先找到inode,并分析inode所记录的权限和用户是否符合,若符合才能开始实际读取block的内容;
Data Block:实际记录文件的内容,若文件太大时,会占用多个block。
问题1、在linux中要创建一个文件test.txt文件,需要经过哪几个步骤?
(1) 首先是通过超级块来明确一下,那个块组有空间能存储文件;
(2) 确定块组之后,在inode表中查找空闲的inode条目,由0标记为1;
(3) 通过块位图,查找空闲的block;
(4) 在inode条目中添加空闲block块的指向,在空的block中创建test.txt;
问题2、在linux中要查找/tmp/aa/bb文件的过程?
Answer:先查 / 的inode ---> 查 / 目录block中对应tmp的inode ---> 根据查到的/tmp的inode去查/tmp/目录block中对应aa的inode ---> 根据查到的/tmp/aa的inode去查/tmpaa目录block中对应的bb的inode ---> 根据查到的/tmp/aa/bb的inode去查block发现是文件 ---> 读取数据;
(2) 常用的文件系统类型:
centos 7系列,默认使用的是xfs系列
centos 6系列,默认使用的是ext4系列
centos 5系列,默认使用的是ext3系列
centos 4系列,默认使用的是ext2系列
iso9660 光盘文件系统
nfs 网络文件系统
gfs2 集群文件系统(redhat研发)
mogilefs、hdfs 两者属于分布式文件系统
swap 交换分区格式(注意:swap分区不是把它当作内存来使用,而是内存中的数据交换到swap分区,即swap交换分区拿出部分空间来存储内存中不常用的空间数据,以此来腾出更多的内存空间).
(3) 文件系统管理分为两部分:
文件系统内核模块(普通的文件系统类型ext2\3\4)可以做如下理解:
[root@localhost ~]# cd/lib/modules/2.6.32-504.el6.x86_64/kernel/fs/ [root@localhost fs]# pwd /lib/modules/2.6.32-504.el6.x86_64/kernel/fs [root@localhost fs]# ls autofs4 cifs dlm ext2 fat gfs2 jffs2 nfs nls udf btrfs configfs ecryptfs ext3 fscache jbd lockd nfs_common squashfs xfs cachefiles cramfs exportfs ext4 fuse jbd2 mbcache.ko nfsd ubifs [root@localhost fs]#
/lib/modules/2.6.32-504.el6.x86_64/kernel/fs 文件系统的内核模块的存放目录,只有这里的文件系统类型才能进行格式化;
文件系统管理工具:
Note:VFS虚拟文件系统(磨平了不同文件系统之间的差异,调用的时候直接访问VFS文件系统)
(4) 文件系统管理工具:
mkfs:mkfs只是一个调用的功能,实际是这些应用程序的使用(mkfs.ext2 mkfs.ext4 mkfs.msdos mkfs.cramfs mkfs.ext3 mkfs.ext4dev mkfs.vfat)
mkfs–t 文件系统类型 分区名
mke2fs:mke2fs专门用来格式化ext系列文件系统的命令;
mke2fs[OPTION] 分区名
-t 用于指定文件系统类型{ext2|3|4}
-b指定块的大小 {1024|2048|4096},块的概念:多少个扇区封装成一个单元;
-L‘LABEL’设定卷标名;
-j 相当于:-t ext3
mkfs.ext3 == mkfs –t ext3 == mke2fs –j == mke2fs –text3
-i # 为数据中间中的每多少(#)个字节创建一个inode。(2T硬盘,每个都是几k的小文件,根据文件的大概大小来创建相应的inode条目)
-N# 指定数据区有多少个inode;
-m# 指定为管理预留空间占主空间的百分比;
-OFEATURE[,….] 启用指定特性;
-O^FEATURE 关闭指定特性;
[root@localhost ~]# mke2fs -t ext4 -b 4096-L juanming -N 30000 -m 8 /dev/sda3 mke2fs 1.41.12 (17-May-2010) Filesystem label=juanming————#卷标名为:juanming OS type: Linux Block size=4096 (log=2)——————#块的卷大小为4096字节 Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 30176 inodes, 1313064 blocks——————#inode条目为30176,块条目数为1313064; 105045 blocks (8.00%) reserved for thesuper user First data block=0 Maximum filesystem blocks=1346371584 41 block groups——————————————#25个块组 32768 blocks per group, 32768 fragments pergroup————————#每个块组中block总数 736 inodes per group————————#每个块组的inode条目数; Superblock backups stored on blocks: 32768,98304, 163840, 229376, 294912, 819200, 884736 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystemaccounting information: done This filesystem will be automaticallychecked every 36 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
tune2fs:tune2fs重新设定ext系列文件系统中可调参数;
tune2fs [OPTION] 分区名
-l查看指定文件系统(分区)的超级块详细信息;
-L重新指定卷标名;
-m# 调整管理员预留空间的百分比;
-u指定文件系统的UUID;
[root@localhost ~]# e2label /dev/sda3 juanming [root@localhost ~]# tune2fs -L JuanMing1/dev/sda3 tune2fs 1.41.12 (17-May-2010) [root@localhost ~]# e2label /dev/sda3 JuanMing1
mkswap: mkswap用于交换分区的格式化;
mkswap [OPTION] 分区名
-L卷标名
-UUUID
swapon:挂载交换分区;
swapoff:卸载交换分区;
free:查看内存的使用情况:
-m按M为单位;
-g 按G为单位;
#free–m
blkid : 块设备信息显示工具 UUID也是一种引用;
-L卷标名 设备名
-UUUID 设备名
e2label分区名 :查看分区的卷标名;
dumpe2fs: 文件系统的超级块信息查看工具;
dumpe2fs –h 只显示超级块头部信息;
[root@localhost ~]# dumpe2fs -h /dev/sda3 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: JuanMing1 #卷标名 Last mounted on: <not available> Filesystem UUID: 40206534-232b-4061-9205-e13e06db9d08 Filesystem magic number: 0xEF53 Filesystem revision #: 1(dynamic) Filesystem features: has_journal ext_attr resize_inodedir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bgdir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: (none) Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux #文件系统类型 Inode count: 30176 #总inode数目 Block count: 1313064 #总block数目 Reserved block count: 105045 Free blocks: 1275746 #空闲的block Free inodes: 30165 #空闲的inode First block: 0 Block size: 4096 #块的大小单位4096字节 Fragment size: 4096 Reserved GDT blocks: 320 Blocks per group: 32768 #每个块组中的block Fragments per group: 32768 Inodes per group: 736 #每个块组中的inode Inode blocks per group: 46 #每个块组中的inode block Flex block group size: 16 Filesystem created: Tue Aug 25 03:12:36 2015 #文件系统创建的时间; Last mount time: n/a Last write time: Tue Aug 25 03:46:56 2015 #tune2fs –l 也可以查看超级块的详细信息; Mount count: 0 Maximum mount count: 36 Last checked: Tue Aug 25 03:12:36 2015 Check interval: 15552000 (6 months) Next check after: Sun Feb 21 03:12:36 2016 Lifetime writes: 137 MB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 256
文件系统挂载:
挂载定义:将额外的文件系统与根文件系统建立关联关系。使得其作为此额外文件系统的访问入口的过程;
挂载操作时注意:
在linux系统上,所有的文件系统必须通过根文件系统的某个分支来访问;
单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
单一目录不应重复挂载多个文件系统;
作为挂载点的目录理论上都是空白目录,不然原来目录下的文件会被隐藏;直到卸载
挂载点注意:
事先存在;
应该使用别的进程未使用的目录;
挂载点下原有的文件将被隐藏;
mount :挂载命令;
mount [选项] 设备挂载点
mount查看/etc/mtab已经挂载的条目;
-t 指定文件系统类型(CentOS6才能智能识别文件系统类型)
-r 只读挂载
-w 读写挂载
-a 挂载/etc/fstab下的所有条目进行挂载;
-n 挂载时不更新/etc/mtab文件;
-B == --bind
mount –B 原目录 目标目录, 关联目录(把目标目录关联到原目录)
umount 目标目录 , 取消关联(通常用于版本更新),例如:
[root@localhost ~]# mkdir /root/test1 #新建目录 [root@localhost ~]# mount --bind/tmp/test1/ /root/test1/ #关联目录 [root@localhost ~]# ls /root/test1/ -l 查看目标目录 total 52 -rw-r--r-- 1 root root 0 Aug 22 15:28 End -rw-r--r-- 1 root root 0 Aug 22 14:25 error.out -rw-r--r-- 1 root root 80 Aug 22 14:20 error.txt -rw-r--r-- 1 root root 52 Aug 22 14:32 file.out -rw-r--r-- 1 root root 46 Aug 22 14:45 hello.txt -rw-r--r-- 1 root root 20 Aug 22 14:11 result.txt -rwxr-xr-x 1 root root 162 Aug 22 17:37 spaceline.sh -rwxr-xr-x 1 root root 30 Aug 22 15:41 test.sh [root@localhost ~]# umount /root/test1/ #取消关联 [root@localhost ~]# ls -l /root/test1/ #再次查看目标目录 total 0
-o 参数选项 [多个使用,隔开例:-o sync,exec,nouser] -o 里面还有参数
async:异步模式,使用异步模式数据的修改先于内存中完成,根据某种策略定期同步至磁盘,实现永久存储。
sync:同步模式,直接将数据的修改同步至磁盘
auto:支持mount -a 这个选项实现自动挂载
noauto:不支持mount -a 不能实现自动挂载
noexec:不允许此设备上的二进制程序执行(一般设为不允许) exec:允许此设备上的二进制程序执行
user:允许普通用户挂载设备
nouser:不允许普通用户挂载设备
unmount:卸载命令
umount [设备|挂载点] 可以是设备名|卷标名|UUID
fuser:查看有哪些进程正在使用挂载点
fuser -v 挂载点
[root@localhost ~]# mount /dev/cdrom /media mount: block device /dev/sr0 is write-protected, mounting read-only [root@localhost ~]# cd /media/ [root@localhost media]# ls autorun.inf debian firmware g2ldr.mbr isolinux md5sum.txt setup.exe win32-loader.ini boot dists g2ldr install live pool tools [root@localhost media]# umount /dev/cdrom umount: /media: device is busy. 因为user当前正在目标目录下工作,故无法卸载; (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) |
fuser -km 强行终止正在使用的挂载点的进程(直接杀掉进程)
[root@localhost ~]# umount /media umount: /media: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) [root@localhost ~]# fuser -v /media #查看哪些进程占用/media USER PID ACCESS COMMAND /media: root 11777 ..c.. bash [root@localhost ~]# fuser -km /media/ #强制结束使用挂载点的进程,现象是直接关闭用户所连接的虚拟终端 /media/: 11777c [root@localhost ~]# umount /media/ [root@localhost ~]# cat /proc/mounts | grepmedia 卸载成功 [root@localhost ~]#
与挂载相关的配置文件:
/etc/fstab: 主要用于系统启动时挂载设备;
/etc/mtab:存储了已经挂载的条目;
/proc/mounts:内核中识别的所有挂载条目;
/etc/fstab开机自动挂载的配置文件:
9/dev/mapper/vg0-root / ext4 defaults 1 1 10UUID=f3d57e47-8685-4e88-b809-f2a4726dc491 /boot ext4 defaults 1 2 11/dev/mapper/vg0-usr /usr ext4 defaults 1 2 12/dev/mapper/vg0-var /var ext4 defaults 1 2 13/dev/mapper/vg0-swap swap swap defaults 0 0 14tmpfs /dev/shm tmpfs defaults 0 0 15devpts /dev/pts devpts gid=5,mode=620 0 0 16sysfs /sys sysfs defaults 0 0 17proc /proc proc defaults 0 0
/etc/fstab配置文件内容解析:
第一列:要挂载的设备名(设备文件、卷标、UUID这三种引用方式);
第二列:挂载点
第三列:文件系统类型;
第四列:挂载选项;
第五列:转储频率
0:从不备份;
1:每日备份;
2:每隔一日备份;
第六列:自检次序;
0:不自检;
1:首先自检,通常直被/使用;
2:/自检之后自检;
Note:这里面的default选项,既然是挂载选项,直接查看挂载命令mount的帮助
[root@localhost ~]# whatis mount [root@localhost ~]# man 8 mount defaults Use default options: rw, suid, dev, exec, auto, nouser, async, and relatime.
1、文件的硬链接:指向同一个inode的多个不同的文件路径 他们指向同一组磁盘块
2、文件的字符链接(软连接):符号链接有自己的inode,但是此inode没有指向数据块,而是指向数据
原文件的访问路径(即一些字符串)
硬链接的特性:
Ⅰ硬连接不能跨文件系统
Ⅱ不能对目录进行硬链接
Ⅲ创建硬链接会增加文件的硬连接数。
软连接的特性:
Ⅰ符号连接可以跨文件系统
Ⅱ可以对目录进行软连接
Ⅲ不会增加硬连接数,
Ⅳ删除原文件,会损坏符号连接文件。
3、ln创建连接文件的命令
ln [选项] 原文件目标文件 (默认创建硬连接文件)
-s 指明创建软链接文件;
-v 显示详细信息;
du:查看某目录树占用空间的情况;
du [选项] 目录
-s 指列出目录的总和,不列出子目录的大小
-h 单位换算:转换成人能识别的单位
[root@localhost home]# du -h kalaguiyin/ #查看目录下各个文件占用空间的情况; 4.0Kkalaguiyin/test/tmp/b/shell 4.0Kkalaguiyin/.gnome2 212K kalaguiyin/network-scripts/network-scripts 216K kalaguiyin/network-scripts 664K kalaguiyin/ [root@localhost home]# du -sh kalaguiyin/ #仅查看目录占用空间的总和; 664K kalaguiyin/ df [] [] -h -i inode
[root@localhost home]# df -h /dev/sda1 Filesystem Size Used Avail Use% Mounted on /dev/sda1 190M 33M 148M 18% /boot [root@localhost home]# df -ih /dev/sda1 Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 50K 39 50K 1% /boot
e2fsck [选项] 文件系统(分区)
-y 所有问题自动默认为yes;
本文出自 “佧拉贵银's Blog” 博客,请务必保留此出处http://kalaguiyin.blog.51cto.com/4831716/1689554
原文地址:http://kalaguiyin.blog.51cto.com/4831716/1689554