鸟哥的linux私房菜_linux磁盘与文件系统管理

鸟哥的linux私房菜_linux磁盘与文件系统管理

8 . linux磁盘与文件系统管理


8.1认识EXT2系统


8.1.2文件系统的特性


super block : 记录此文件系统的整体信息,包括inode block的总量,使用量、剩余量、以及文件系统的格式以及相关信息等;


inode: 记录文件的属性,一个文件占用一个inode,同时记录此文件数据所在的block号码;inode并不记录文件名,记录在block中


block : 实际记录文件的内容,若文件太大时,会占用多个block;




这种数据存取的方法我们称为索引式文件系统(indexed allocation)


8.1.3 linux的ext2 文件系统


子主题 1


data block 资料区块)


是什么


data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。 不过要注意的是,由于 block 大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。


 Ext2 文件系统的 block 基本限制如下:


1 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
2 每个 block 内最多只能够放置一个文件的数据;
3 承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
4 承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。


inode table (inode  表格)


inode 记录的文件数据


1 该文件的存取模式(read/write/excute);
2 该文件的拥有者与群组(owner/group);
3 该文件的容量;
4 该文件建立或状态改变的时间(ctime);
5 最近一次的读取时间(atime);
6 最近修改的时间(mtime);
7 定义文件特性的旗标(flag),如 SetUID...;
8 该文件真正内容的指向 (pointer);


inode特色


1 每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);
2 每个文件都仅会占用一个 inode 而已;
3 承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
4 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。


Superblock ( 超级区块)


是什么


superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。


Superblock记录的信息主要有:


1 block 与 inode 的总量;
2 未使用与已使用的 inode / block 数量;
3 block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128bytes 或 256bytes);
4 filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;
5 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。


Filesystem Description ( 文件系统描述说明)


是什么


这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock,bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。


block bitmap ( 区块对照表)


inode bitmap (inode  对照表)


dumpe2fs :


是什么


:  查询 Ext  家族 superblock 


语法


[[email protected] ~]#  dumpe2fs [-bh]  装置文件名
选项与参数:
-b :列出保留为坏轨的部分(一般用不到吧!?)
-h :仅列出 superblock 的数据,不会列出其他的区段内容!


范例


范例:鸟哥的一块 1GB ext4 文件系统内容
[[email protected] ~]#  blkid <==这个指令可以叫出目前系统有被格式化的装置
www.linuxidc.com
/dev/vda1: LABEL="myboot" UUID="ce4dbf1b-2b3d-4973-8234-73768e8fd659" TYPE="xfs"
....(中间省略)....
Inode size: 256 # inode 的容量大小!已经是 256 了喔!
....(底下省略)....
# 由于数据量非常的庞大,因此鸟哥将一些信息省略输出了!上表与你的屏幕会有点差异。
# 前半部在秀出 supberblock 的内容,包括标头名称(Label)以及 inode/block 的相关信息
# 后面则是每个 block group 的个别信息了!您可以看到各区段数据所在的号码!
# 也就是说,基本上所有的数据还是与 block 的号码有关就是了!很重要!


8.1.4与目录树的关系


目录


ext2一个目录会分配一个inode与至少一块block 给该目录。inode记录了目录属性等相关信息,而block则记录了该目录下的文件名与该文件名占用的inode号码等数据;


文件:


ext2会给文件分配一个inode和相对于该文件大小的block数量;


目录树读取


tips


inode 本身并不记录文件名,文件名的记录是在目录的 block 当中。因此当我们要读取
某个文件时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取文件的 inode 号码,最终才会读到正确的文件的 block 内的数据。


文件系统的大小与磁盘的读取性能


8.1.5 ext2/etx3文件的访问日志与日志文件的系统功能


8.1.6 linux文件系统的操作


8.1.7挂载点(mount point )的意义


是什么


每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』


8.1.8其他linux的文件系统与vfs


8.1.9 XFS  文件系统简介


是什么


CentOS 7 开始,预设的文件系统已经由原本的 EXT4 变成了 XFS 文件系统了!


8.2文件系统的简单操作


8.2.1磁盘与目录的内容:df、du


df:列出文件系统整体磁盘使用量


>df [-ahikHTM] 目录或文件名
-a:列出所有文件系统,包括系统特有的/proc等文件系统
-k:以kb容量显示文件系统
-m:以MB的容量显示各文件系统
重要
-h:以人们容易阅读的GB、MB、KB来显示文件系统
-H:以M=100k来替代M=1024K进位方式
-T:连同该分区的文件系统名称(例如ext3)也列出;
重要
-i:不用硬盘容量,而以inode的数据来显示


输出结果:
Filesystem :代表该文件系统是在哪个分区,所以列出了设备名称
1k-block:说明下面的数字单位时1KB。可以利用-h或-m来改变容量
Used:使用掉的磁盘空间
available:剩下的磁盘空间大小
Use%:磁盘的使用率。超过90%时要注意下。
mountedon:磁盘的挂载的目录所在(挂载点)


du:评估文件系统整体磁盘使用量


>du [-ahskm] 文件或者目录名称
-a:列出所有目录和文件的容量,默认只统计目录下面的文件容量
-h:以人们容易阅读的方式列出容量
-s:列出总容量,而不列出每个各别的目录占用容量
-S:不包括子目录下总计;
-k:以KB列出容量
-m:以MB列出容量


与df不同ds会直接到文件系统内查找所有文件数据,所以会需要一段时间;默认情况下输出的大小是以kB计算的


8.2.2连接文件:ln


语法;
> ln [-sf] 源文件 目标文件
-s: 如果没有加任何参数 默认是hard link ,s就是symbolic link;
-f:如果目标文件存在时,就将目标文件删除,再创建


hard link 硬连接 或实际连接


子主题 2


多个文件名对应到一个inode号码 。例:两个不同的文件名都链接到一个相同的inode号码;


symbolic link符号连接(也即快捷方式)


子主题 2


基本上symbolic link 就是创建一个独立的文件,而这个文件指向他连接的那个文件;可以与windows的快捷方式划等号


连接数量


8.3磁盘的分区、格式化、检验与挂载


如果我们想要在系统中增加一个硬盘,应该要有哪些动作要做呢;
1.对磁盘进行分区,以新建可用的分区
2.对该分区进行格式化(format),以创建系统可用的文件系统
3.若想要仔细一点,则可以对刚建好的文件系统进行检验
4.在linux 系统上,需要创建挂载点(也即是目录),并将它挂载上来


磁盘分区:fdisk


fdisk [-l] 设备名称
-l:输出后面接的设备所有的分区内容,若仅有fdisk -l 时,则会把整个系统内能够找到的设备分区全部列出来


例子:
>df / 
#找出磁盘文件名
> fdisk /dev/hds
#进入到fdisk 命令界面


进入fisk后的几个常用操作


删除磁盘分区
1 fdisk  /dev/hdc  #进入fdisk页面
2.p  #先看下分区的信息,假设要删除 /dev/hdc1
3. d #这时会要你选择一个要删除的分区,就选1
4 w(or)q #完成


新增磁盘分区


磁盘格式化


mkfs [-t 文件系统格式] 设备文件名
-t:可以接文件系统格式 例如:ext2 ext3 vfat等(系统有支持的才会生效)


例如:将上一个小节中产生的 /dev/hdc6 设置为ext3格式
>mkfs -t ext3 /dev/hdc6


命令2:
mke2fs [-b block大小]  [-i block大小] [-L 卷标]  [-cj] 设备
-b:可以设置每个block的大小,目前支持1024 2048 4096 bytes三种
-i:每个inode的容量
-c:检查磁盘错误,仅下达一次时候会进行快速读取测试,下达两次的时候 -c -c 会测试读写 
-L:后面接券名称 (lable),这个lable 是有用的 ,e2lable介绍时谈
-j:默认是ext2 ,-j改成ext3


磁盘检验:fsck,badblock


fsck (file system check):
>fsck [-t 文件类型] [-aCay] 设备名称
-t:指定文件系统,不过现在linux 很智能,能自动判断系统类型,该参数不经常用
-a:自动修复检查到有问题的扇区
-A:依据 /etc/fstab 的内容,将需要的设备扫描一次。通常开机就会执行此命令
-y:与 a类似,但是某些文件系统仅支持-y这个参数
-C:可以在检查过程当中 使用直方图来显示目前的进度;


badblocks [-svw] 设备名称
-s:在屏幕上列出进度
-v:可以在屏幕上看到进度
-w:使用写入的方式进行测试,建议不要使用此参数,尤其已经有文件存在时


磁盘挂载与卸载


挂载


语法:
>mount [-a] [-l] [-L lable名] [-t 文件系统] [-o 额外参数]


-a:依照配置文件 /etc/fatab的数据 将所有未挂载的磁盘都挂载上来。
-l:单纯输入mount 会显示目前挂载的信息,加上-l可增label 列名称
-t:与mkfs的参数非常类似的,可以加上文件系统种类来指定欲挂载的类型
-n:默认情况下系统会将实际挂载情况实时写入/etc/mtab中,以利于其他程序运行,但是在某些情况下(例如单用户维护模式)为了避免问题,会刻意不写入,这时候可以使用-n这个参数
-L:系统除了利用设备文件名(例如/dev/hedc6)之外,还可以利用文件系统的卷标名(lable)来进行挂载,最好为你的文件系统起一个独一无二的卷标名
-o:后面接一些挂载时额外加上的参数,
ro、rw:挂载的文件系统成为只读,或者可读写;
async、sync:此文件系统是否使用同步写入(sync),或者异步写入(async)的内存机制,参考文件系统的运行方式。默认为异步;
auto、noauto:允许此分区被mount -a自动挂载;
Dev、nodev:是否允许此分区上创建设备文件;
suid、nosuid:是否允许分区含有suid/sgid的文件格式;
exec、noexec:是否允许分区用户可执行binary文件;
user、nouser:是否允许此分区上让任何用户执行mount?一般来说mount只有root用户可以执行,但是下达user参数,则让一般 用户也能够对分区进行mount
defaults:默认值为 rw、suid、dev、exec、auto、nouser、and async;
remount:重新挂载,这是在系统出错。或者重新更新参数时,很有用;


挂载ext2/ext3 文件系统
例如
用默认的方式,将创建的、/dev/hdc6 挂载到/mnt/hdc6
>mkdir /mnt/hdc6
>mount /dev/hdc6 /mnt/hdc6
>df #查看


例2 :查看当前已挂载的文件系统,包含文件系统的lable名
>mount -l


挂载CD或DVD光盘


格式化与挂载软盘


挂载U盘


重新挂载目录与挂载不特定目录


使用lable上进行挂载
 利用文件系统的卷标名来挂载
>mount -L "vbird" /mnt/hdc6


卸载umount


语法:
>umount  [-fn] 设备文件名或者挂载点
-f:强制下载,
-n:不更新 /etc/mtab 的情况下卸载


列子
>umount /dev/hdc6


磁盘参数修改


mknod


设备都是由文件来代表,文件是通过文件的major和minor数值 来代表设备
major 设备主码,minor设备码


语法
>mknod 设备文件名 [bcp] [Major] [Minor]
-b 设置设备成为一个外部存储的设备文件,例如硬盘
-c:设置设备成为一个外部输入的设备,如键盘鼠标
-p:设置设备名称成为一个FIFO


例如: mkno /dev/hdc2 b 20 10;
major 和minor有意义,不要随便修改


e2lable


我们在介绍mkfs 命令时谈到了设备设备文件系统的卷标,例如windows c磁 d盘会有个名称,那就是卷标


语法 修改lable
>e2lable 设备名称 新的lable名称
例如
>e2lable /dev/hdc2 “labeltest” 


tune2fs


语法
tune2fs [-jlL] 设备名称
-l:类似dumpe2fs -h的功能,将superblock 内的数据读出来
-L:类似e2label 的功能 可以修改系统 label
-j:将ext2的文件系统 转换为ext3;


此命令有很多方法。更多参数 参考man


hdparm


8.4设置开机挂载


8.4.1开机挂载/etc/fstab及/etc/mtab


如何开机的时候就将文件系统挂载好,可以直接编辑/etc/fstab;
限制:
1 根目录/是必须挂载的,而且一定要先于其他mount point 挂载进来
2. 其他挂载点必须为已新建的目录,可任意指定,但一定要遵守必需的系统架构目录规则
3.所有挂载点在同一时间内 只能挂载一次
4.所有分区在同一时间内 只能挂载一次
5 如果进行卸载,你需要将目录移到挂载点的外边


8.4.2特殊设备loop挂载(镜像文件不刻录就挂载使用)


8.5内存交换空间(swap)的构建


使用物理分区构建swap


使用文件构建swap


swap在使用上的限制


8.6文件系统的特殊查看与操作


boot sector和super bolck的关系


磁盘空间浪费问题


利用GNU的parted进行分区行为