第七章 Linux磁盘与文件系统管理
第七章 Linux磁盘与文件系统管理
7.1 认识Linux文件系统
7.1.1 磁盘组成与分区的复习
- 磁盘分区表主要有两种格式,一种是限制较多的MBR分区表,一种是较新且限制较少的GPT分区表。
- MBR分区表中,第一个扇区最重要,里面有:(1)主机开机区(Master boot record,MBR)及分区表(partition table),其中MBR占有446bytes,而partition table则占有64bytes。
- GPT分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过2TB。
至于磁盘的文件名部分,基本上,所有实体磁盘的文件名都已经被模拟成/dev/sd[a-p]的格式,第一颗磁盘文件名为/dev/sda。而分割槽的档名若以第一颗磁盘为例,则为/dev/sda[1-128]。除了实体磁盘之外,虚拟机的磁盘通常为/dev/vd[a-p]的格式。若有使用到软件磁盘陈列的话,那还有/dev/md[0-128]的磁盘文件名。使用的是LVM时,档名则为/dev/VGNAME/LVNAME等格式。
7.1.2 文件系统特性
传统的磁盘与文件系统之应用中,一个分区槽就是只能够被格式化成为一个文件系统,所以我们可以说一个filesystem就是一个partition。但是由于新技术的应用,例如我们常听到的LVM与软件磁盘陈列(software raid),这些技术可以将一个分区槽格式化为多个文件系统(例如LVM),也能够将多个分区槽合成一个文件系统(LVM,RAID)!所以说,目前我们在格式化时已经不再说成针对partition来格式化了,通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区槽喔!
较新的操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如Linux操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。文件系统通常会将这两部分的数据分别存放在不同的区块,权限与属性放置到inode中,至于实际数据则放置到data block区块中。另外,还有一个超级区块(superblock)会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。
每个inode与block都有编号,至于这三个数据的意义可以简略说明如下:
- superblock:记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
- indoe:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
- block:实际记录文件的内容,若文件太大时,会占用多个block。
7.1.7 挂载点的意义(mount point)
每个filesystem都有独立的inode/block/superblock等信息,这个文件系统要能够链接到目录才能被我们使用。将文件系统与目录树结合的动作我们称为【挂载】。关于【挂载】重点是:挂载点一定是目录,该目录成为进入该文件系统的入口。
ls -lid / /boot /home
7.1.8 其他Linux支持的文件系统与VFS
虽然Linux的标准文件系统是ext2,且还有增加了日志功能的ext3/ext4,事实上,Linux还有支持很多文件系统格式的,尤其是最近这几年推出了好几种速度很快的日志式文件系统,包括SGI的XFS文件系统,可以适用更小型文件的Reiserfs文件系统,以及Windows的FAT文件系统等等,都能够被Linux所支持喔!常见的支持文件系统有:
- 传统文件系统:ext2/minix/MS-DOS/FAT(用vfat模块)/iso9660(光盘)等等;
- 日志式文件系统:ext3/ext4/ReiserFS/Windows'NTFS/IBM'sJFS/SGI'sXFS/ZFS
- 网络文件系统:ZFS/SMBFS
要想知道你的Linux支持的文件系统有哪些,可以察看底下这个目录:
ls -l /lib/modules/$(uname -r)/kernel/fs
系统目前已加载到内存中支持的文件系统则有:
cat /proc/filesystems
- Linux VFS(Virtual Filesystem Switch)
其实,整个Linux的系统都是通过一个名为Virtual Filesystem Switch的核心功能去读取filesystem的。也就是说,整个Linux认识的filesystem其实都是VFS在进行管理,我们使用者并不知道每个partition上头的filesystem是什么~VFS会主动的帮我们做好读取的动作呢~
7.2 文件系统的简单操作
7.2.1 磁盘与目录的容量
我们知道磁盘的整体数据是在superblock区块中,但是每个个别文件的容量则在inode当中记载的。那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个指令:
- df: 列出文件系统的整体磁盘使用量;
- du: 评估文件系统的磁盘使用量(常用在推估目录所占容量)
df [-ahikHTm] [目录或文件名]
选项与参数:
-a:列出所有的文件系统,包括系统特有的/proc等文件系统;
-k:以KBytes的容量显示各文件系统;
-m: 以MBbytes的容量显示各文件系统;
-h:以人们较易阅读的GBytes,MBytes,KBytes等格式自行显示;
-H:以M=1000K取代M=1024K的进位方式;
-T: 连同该partition的filesystem名称(例如xfs)也列出;
-i:不用磁盘容量,而以inode的数量来显示
du [-ahskm] 文件或目录名称
选项与参数:
-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-h:以人们较易读的容量格式(G/M)显示
-s:列出总量而已,而不列出每个各别的目录占用容量
-S:不包括子目录下的总计,与-s有点差别
-k:以KBytes列出容量显示
-m:以MBytes列出容量显示
7.2.2 实体链接与符号链接:ln
在Linux底下的连结档有两种,一种是类似Windows快捷方式功能的文件,可以让你快速的链接到目标文件(或目录);另一种则是透过文件系统的inode连结来产生新档名,而不是产生新文件!这种称为实体链接(hard link)。这两种玩意儿是完全不一样的东西呢!现在就分别来谈谈。
-
Hard Link(实体链接,硬式连结或实际连结)
ln /etc/crontab .
#建立实体链接的指令
事实上,hardlink是有限制的:- 不能跨Filesystem
- 不能link目录
-
Symbolic Link(符号链接,亦即是快捷方式)
基本上,Smybolic Link就是在建立一个独立的文件,而这个文件会让数据读取指向他link的那个文件的档名!
ln [-sf] 来源文件 目标文件
选项与参数:
-s: 如果不加任何参数就进行链接,那就是hard link,至于-s就是symbolic link
-f: 如果目标文件存在时,就主动的将目标文件直接移除后再建立!
7.3 磁盘的分区、格式化、校验与挂载
如果我们想要在系统里新增一颗磁盘时,应该有哪些动作需要做的呢:
- 对磁盘进行分区,以建立可用的partition
- 对该patition进行格式化(format),以建立系统可用的filesystem
- 若想要仔细一点,则可对刚刚建立好的filesystem进行检验
- 在Linux系统上,需要建立挂载点(亦即是目录),并将他挂载上来
7.3.1 观察磁盘分区状态
-
lsblk 列出系统上的所有磁盘列表
lsblk [-dfimpt][device] 选项与参数: -d: 仅列出磁盘本身,并不会列出该磁盘的分区数据 -f: 同时列出该磁盘内的文件系统名称 -i: 使用ASCII的线段输出,不要使用复杂的编码(在某些环境下很有用) -m: 同时输出该装置在/dev底下的权限数据(rwx的数据) -p:列出该装置的完整文件名!而不是仅列出最后的名字而已 -t: 列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
虽然lsblk已经可以使用-f来列出文件系统与装置的UUID数据,不过,鸟哥还是比较习惯直接使用blkid来找出装置的UUID喔!什么是UUID呢?UUID是全局单一标识符,Linux会将系统所有的装置都给予一个独一无二的标识符,这个标识符就可以拿来作为挂载或是使用这个装置/文件系统之用了。 blkid
-
parted 列出磁盘的分区表类型与分区信息
parted device_name print
parted /dev/vda print
7.3.2 磁盘分区:gdisk/fdisk
7.3.3 磁盘格式化(建置文件系统)
- XFS文件系统 mkfs.xfs
mkfs.xfs [-b bsize][-d parms][-i parms][-L label][-f][-r parms]装置名称
选项与参数:
关于单位:底下只要谈到【数值】时,没有加单位则为bytes值,可以用k,m,g,t,p(小写)等来解释,比较特殊的是s这个单位,它指的是sector的【个数】喔!
-b: 后面接的是block容量,可由512到64k,不过最大容量限制为Linux的4k喔!
-d: 后面接的是重要的data section的相关参数值
-f: 如果装置内已经有文件系统,则需要使用这个-f来强制格式化才行!
-i: 与inode有较相关的设定
-L:后面接的这个文件系统的标头名称Label name的意思!
-r:指定realtime section的相关设定值
-
EXT4文件系统 mkfs.ext4
mkfs.ext4 [-b size] [-L label] 装置名称 选项与参数: -b: 设定block的大小,有1K,2K,4K的容量 -L:后面接这个装置的标头名称
-
其他文件系统 mkfs
mkfs其实是个综合指令而已,当我们使用mkfs -t xfs时,它就会跑去mkfs.xfs相关的参数给我们使用!如果想要知道系统还支持哪种文件系统的格式化功能,直接按【tab】就很清楚了!
mkfs[tab][tab]
7.3.4 文件系统检查
-
xfs_repair处理XFS文件系统
当有xfs文件系统错乱才需要使用这个指令!所以,这个指令最好是不要用到啦!但有问题发生时,这个指令却又很重要...xfs_repair [-fnd] 装置名称 选项与参数: -f: 后面的装置其实是个文件而不是实体装置 -n: 单纯检查并不修改文件系统的任何数据 -d: 通常用在单人维护模式底下,针对根目录(/)进行检查与修复的动作!很危险!不要随便使用
-
fsck.ext4处理EXT4文件系统
fsck是是个综合指令,如果是针对ext4的话,建议直接使用fsck.ext4来检测比较妥当!那fsck.ext4的选项有底下几个常见的项目:fsck.ext4 [-pf][-b superblock] 装置名称 选项与参数: -p: 当文件系统在修复时,若有需要回复y的动作时,自动回复y来继续进行修复动作。 -f: 强制检查!一般来说,如果fsck没有发现任何unclean的旗标,不会主动进入细部检查的,如果你想要强制fsck进入细部检查,应得加上-f旗标啰! -D:针对文件系统下的目录进行优化配置。 -b: 后面接superblock的位置!
7.3.5 文件系统挂载与卸除
要进行挂载前,最好先确定几件事:
- 单一文件系统不应该被重复挂载在不同的挂载点中
- 单一目录不应该挂载多个文件系统
- 要作为挂载点的目录,理论上应该都是空目录才是
mount -a
mount [-l]
mount [-t 文件系统] LABEL='' 挂载点
mount [-t 文件系统] UUID='' 挂载点
mount [-t 文件系统] 装置文件名 挂载点
选项与参数:
-a: 依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
-l: 单纯的输入mount会显示目前挂载的信息。加上-l可增列Label名称!
-t: 可以加上文件系统种类来指定欲挂载的类型。
-n: 在默认的情况下,系统会将实际挂载的情况实时写入/etc/mtab中,以利其他程序的运作。但在某些情况下为了避免问题会刻意不写入,此时可用此选项
-o: 后面可以接一些挂载时额外加上的参数!比方说帐号、密码、读写权限等:
-
重新挂载根目录与挂载不特定目录
mount -o remount,rw,auto /
-
umount(将装置文件卸除)
umount [-fn] 装置文件名或挂载点 选项与参数: -f: 强制卸除!可用在类似网络文件系统(NFS)无法读取到的情况下: -l: 立刻卸除文件系统,比-f还强! -n: 不更新/etc/mtab情况下卸除。
-
xfs_admin修改XFS文件系统的UUID与Label name
如果你当初格式化的时候忘记加上标头名称,后来想要再次加入时,不需要重复格式化!直接使用这个xfs_admin即可。这个指令直接拿来处理LABEL name以及UUID即可啰!xfs_admin [-lu] [-L label] [-U uuid] 装置文件名 选项与参数: -l: 列出这个装置的label name -u: 列出这个装置的UUID -L: 设定这个装置的Label name
-
tune2fs 修改ext4的tabel name与UUID
tune2fs [-l] [-L Label] [-U uuid] 装置文件名 选项与参数: -l: 类似dumpe2fs -h的功能~将superblock内的数据读出来 -L:修改LABEL name -U: 修改UUID啰!
7.4 设定开机挂载
7.4.1 开机挂载/etc/fstab及/etc/mtab
这里先跟大家说一说系统挂载的一些限制:
- 根目录/必须挂载的,而且一定要先于其它mount point被挂载进来。
- 其它mount point必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录架构原则(FHS)
- 所有的mount point在同一时间之内,只能挂载一次
- 所有partition在同一时间之内,只能挂载一次
- 如若进行卸除,必须先将工作目录移到mount point(及其子目录)之外。
cat /etc/fstab
其实/etc/fstab就是我们使用mount指令进行挂载时,将所有的选项与参数写入到这个文件中就是了。这个文件的内容共有六个字段,这六个字段非常的重要!你【一定要背起来】才好!各个字段的总结数据与详细数据如下:
[装置/UUID等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
7.4.2 特殊装置loop挂载(映像档不刻录就挂载使用)
- 挂载光盘DVD映像文件
ll -h /tmp/CentOS-7.0-1406-x86_64-DVD.iso
mkdir /data/centos_dvd
mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd
- 建立大文件以制作loop装置文件
- 建立大型文件
dd if=/dev/zero of=/srv/loopdev bs=1M count=512
这个指令的简单意义如下:
if 是输入文件,/dev/zero是会一直输出0的装置!
of 是输出文件,将一堆零写入到后面的文件中
bs 是每个block的大小
count则是总共有几个bs的意思 - 大型文件的格式化
预设xfs是不能够格式化文件的,所以要加入特别的参数才行喔!
mkfs.xfs -f /srv/loopdev
- 挂载
mount -o loop UUID='udd97bd2-4446-48fd-9d23-a8b03ffdd533' /mnt
- 建立大型文件