《鸟哥的Linux私房菜 基础学习篇(第三版)》 第08章 Linux磁盘与文件系统管理 笔记
2018-03-28 23:52 受匕图灵 阅读(513) 评论(0) 收藏 举报范例二:将容量结果以易读的容量格式显示出来 [root@www ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/hdc2 9.5G 3.7G 5.4G 41% / /dev/hdc3 4.8G 139M 4.4G 4% /home /dev/hdc1 99M 11M 83M 12% /boot tmpfs 363M 0 363M 0% /dev/shm # 不同于范例一,这里会以 G/M 等容量格式显示出来,比较容易看啦!Linux最传统的磁盘文件系统(filesystem)使用的是EXT2(second extended file system的缩写)。
一、硬盘组成与分区的复习
整块磁盘的组成主要有:
- 圆形的盘片(主要记录资料的部分);
- 机械手臂,与在机械手臂上的磁盘读取头(可读写盘片上的资料);
- 主轴马达,可以转动盘片,让机械手臂的读取头在盘片上读写资料。
从上面知道资料储存与读取的重点在于盘片,而盘片上的物理组成则为(假设此磁盘为单盘片):
- 扇区(Sector)为最小的物理储存单位,每个扇区为 512 bytes;
- 将扇区组成一个圆,那就是柱面(Cylinder),柱面是分区(partition)的最小单位;
- 第一个扇区最重要,里面有硬盘主引导记录(Master boot record, MBR)及分区表(partition table), 其中 MBR 占有 446 bytes,而 partition table 则占有 64 bytes。
各种介面的磁盘在Linux中的文件名称分别为:
- /dev/sd[a-p][1-15]:为SCSI, SATA, USB, Flash等接口的磁盘文件名;
- /dev/hd[a-d][1-63]:为 IDE 接口的磁盘文件名;
复习完物理组成后,现在复习磁盘分区:所谓的磁盘分区指的是告诉操作系统‘这块磁盘在此分区可以存取的区域是由 A 柱面到 B 柱面之间的块’, 如此一来操作系统就能够知道他可以在所指定的块内进行文件资料的读/写/搜寻等动作了。 也就是说,磁盘分区意即指定分区的启始与结束柱面就是了。
那么指定分区的柱面范围是记录在哪里?就是第一个扇区的分区表中。但是因为分区表仅有64bytes而已, 因此最多只能记录四条分区的记录,这四条记录称为主(primary) 分区或扩展 (extended) 分区,其中扩展分区还可以再分区出逻辑分区 (logical) , 而能被格式化的则仅有主分区与逻辑分区而已。
最后,分区的定义:
- 主分区与扩展分区最多可以有四条(硬盘的限制)
- 扩展分区最多只能有一个(操作系统的限制)
- 逻辑分区是由扩展分区持续分出来的分区;
- 能够被格式化后作为资料存取的分区为主分区与逻辑分区。扩展分区无法格式化;
- 逻辑分区的数量依操作系统而不同,在Linux系统中,IDE硬盘最多有59个逻辑分区(5号到63号), SATA硬盘则有11个逻辑分区(5号到15号)。
每种操作系统所设定的文件属性/权限并不相同, 为了存放这些文件所需的数据,因此就需要将分区槽进行格式化,以成为操作系统能够利用的『文件系统格式(filesystem)』。
一个可被挂载的数据为一个文件系统而不是一个分区。
二、文件系统特性
2.2、
- superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
- block:实际记录文件的内容,若文件太大时,会占用多个 block 。
2.3、
- 索引式文件系统(indexed allocation),如Ext2。
- FAT格式的文件系统,没有inode存在,每个 block 号码都记录在前一个 block 当中。如U盘(闪存)。
2.4、碎片整理。
文件写入的 block 太过于离散时,文件读取的效能将会变的很差,这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,以提高数据的读取效率!FAT 的文件系统需要经常的碎片整理一下,Ext2 是索引式文件系统不太需要常常进行碎片整理。
三、Linux 的 EXT2 文件系统(inode)
文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用resize2fs 等指令变更文件系统大小),否则 inode 与 block 固定后就不再变动。
文件系统高达数百 GB 时, 那么将所有的 inode 与 block 通通放置在一起将是很不智的决定,因为 inode 与 block 的数量太庞大,不容易管理。
为此之故,因此 Ext2 文件系统在格式化的时候基本上是将启动扇区分为多个区块群组 (block group) ,每个区块群组都有独立的:
- data block 资料区块
- inode table inode 表格
- Superblock 超级区块
- Filesystem Description 文件系统描述说明
- block bitmap 区块对照表
- inode bitmap inode 对照表
一般将 data block 与 inode table 称为数据存放区域, superblock、 block bitmap 与 inode bitmap区段称为 metadata (中介数据料),因为 superblock、 block bitmap 与 inode bitmap 的数据是经常变动的,每次新增、除、编辑时都可能会影响到这三个部分的数据。
在整体的规划当中,启动扇区(boot sector)放在文件系统的最前面,这个启动扇区可以安装开机管理程序。将不同的开机管理程序安装到个别的文件系统最前端,不用覆盖整颗磁盘唯一的 MBR, 这样制作出了多重引导的环境。
3.1、data block (资料区块)
- block 是用来放置文件内容数据地方。
- block 的大小与数量在格式化后就固定下来,不能够再改变,除非重新格式化。
- 每个 block 都有编号,以方便 inode 的记录。
- 每个 block 内最多只能够放置一个文件的数据。
- 承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
- 承上,如果文件小于 block ,则该 block 的剩余容量就不能够再被使用(磁盘空间会浪费)。
由于 block 大小的差异,会导致该文件系统能够支持的最大单一文件限制与最大文件系统总容量并不相同:
| Block大小 | 1KB | 2KB | 4KB |
| 最大单一文件限制 | 16GB | 256GB | 2TB |
| 最大文件系统总容量 | 2TB | 8TB | 16TB |
3.2、inode table (inode 表格)
inode 的内容主要记录文件的属性,以及该文件实际数据是放置在哪几号 block 内。基本上,inode 记录的文件数据至少有底下这些:
- 该文件的存取模式(read/write/excute);
- 该文件的拥有者与群组(owner/group);
- 该文件的容量;
- 该文件建立或状态改变的时间(ctime);
- 最近一次的读取时间(atime);
- 最近修改的时间(mtime);
- 定义文件特性的旗标(flag),如 SetUID...;
- 该文件真正内容的指向 (pointer);
inode的特色:
- inode 的数量与大小也是在格式化时就已经固定
- 每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);
- 每个文件都仅会占用一个 inode 而已;
- 承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
- 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。
通常inode的数量剩余都比block还要多。
3.3、Superblock (超级区块)
Superblock 是记录整个文件系统相关信息的地方, 没有 Superblock ,就没有这个文件系统了。
他记录的信息主要有:
- block 与 inode 的总量。
- 未使用与已使用的 inode / block 数量。
- block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128bytes 或 256bytes)。
- filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息。
- 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。
- 一般来说, superblock 的大小为 1024bytes。
一般来说一个文件系统应该仅第一个 block group 内会含有一个 superblock,但也可以将此 superblock备份到后续的 block group中,以便进行 superblock 的救援。所以除了第一个block group 内的 superblock外,其他block group 内的 superblock都是备份。
3.4、Filesystem Description (文件系统描述说明)
这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock,bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。这部份也能够用 dumpe2fs 来观察的。
3.5、block bitmap (区块对照表)
如果想要新增文件时总会用到 block 吧!那你要使用哪个 block 来记录呢?当然是选择『空的block 』来记录新文件的数据啰。 那你怎么知道哪个 block 是空的?这就得要透过 block bitmap 的辅助了。从 block bitmap 当中可以知道哪些 block 是空的,因此操作系统就能够很快速的找到可使用的空间来处置文件啰。
同样的,如果你删除某些文件时,那么那些文件原本占用的 block 号码就得要释放出来, 此时在block bitmap 当中相对应到该 block 号码的标志就得要修改成为『未使用中』啰!这就是 bitmap 的功能。
3.6、inode bitmap (inode 对照表)
这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码,至于 inode bitmap 则是记录使用与未使用的 inode 号码啰!
3.7、dumpe2fs 命令(查询 Ext 家族 superblock 信息的指令)
语法:
- dumpe2fs [-bh] 装置文件名
选项与参数:
- -b :列出保留为坏轨的部分(一般用不到吧!)
- -h :仅列出 superblock 的数据,不会列出其他的区段内容。
四、与目录树的关系
4.1、目录
在 Linux 下的文件系统建立一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中, inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; block 记录在这个目录下的文件名与该文件名占用的 inode 号码数据。
在目录底下的文件数如果太多而导致一个 block 无法容纳的下所有的档名与 inode 对照表时, Linux 会给予该目录多一个 block来继续记录相关的数据。
4.2、文件
在 Linux 下的 ext2 建立一个一般文件时, ext2 会分配一个 inode 与相对于该文件大小的block 数量给该文件。
4.3、目录树读取
实例,读取/etc/passwd文件:
| 1 | / 的 inode | 透过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block的内容(有 r 与 x) ; |
| 2 | / 的 block | 经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (33595521); |
| 3 | etc/ 的 inode | 读取 33595521 号 inode 得知 dmtsai 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容; |
| 4 | etc/ 的 block | 经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码 (36628004); |
| 5 | passwd 的 inode | 读取 36628004 号 inode 得知 dmtsai 具有 r 的权限,因此可以读取 passwd 的 block 内容; |
| 6 | passwd 的 block | 最后将该 block 内容的数据读出来。 |
4.4、新增一个文件:
1. 先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
2. 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
3. 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block指向数据;
4. 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。
五、日志文件系统 (Journaling filesystem)
文件在写入文件系统时,突然的停电、 系统核心发生错等怪事可能导致系统中断,此时会导致文件系统的metadata 内容与实际数据存放区产生不一致(Inconsistent) 。为了避免此情况发生,前辈们想到一个方式,在filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤。也就是说:
1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
2. 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;
3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。
在这样的程序当中,万一数据的纪录过程当中发生了问题,那么操作系统只要去检查日志记录区块,就可以知道哪个文件发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 检查, 这样就可以达到快速修复 filesystem 的能力了!这就是日志式文件最基础的功能。
EXT2没有日志文件系统,EXT3、EXT4有。
整个 Linux 的系统是透过一个名为 Virtual Filesystem Switch(虚拟文件系统,VFS) 的内核功能去读取传统文件系统、日志式文件系统和网络文件系统。
六、Linux 文件系统的异步处理
由第零章的内容知道, 所有的数据都得要加载到内存后 CPU 才能够对该数据进行处理。想一想,如果常常编辑一个好大的文件, 在编辑的过程中又频繁的要系统来写入到磁盘中,由于磁盘写入的速度要比内存慢很多, 因此会常常耗在等待磁盘的写入/读取上。真没效率!
为了解决这个效率的问题,因此 Linux 使用的方式是透过一个称为异步处理 (asynchronously)的方式:
当系统加载一个文件到内存后,如果该文件没有被更动过,则在内存区段的文件数据会被设定为干净(clean)的。 但如果内存中的文件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存中的文件数据会被设定为脏的 (Dirty)。此时所有的动作都还在内存中执行,并没有写入到磁盘中! 系统会不定时的将内存中设定为 Dirty 的数据写回磁盘,以保持磁盘与内存数据的一致性。
内存的速度要比磁盘快的多,将常用的文件放置到内存当中会增加系统性能!因此 Linux 系统上面文件系统与内存有非常大的关系:
- 系统会将常用的文件数据放置到主存储器的缓冲区,以加速文件系统的读/写;
- 承上,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能;
- 你可以手动使用 sync 来强迫内存中设定为 Dirty 的文件回写到磁盘中;
- 若正常关机时,关机指令会主动呼叫 sync 来将内存的数据回写入磁盘内;
- 但若不正常关机(如跳电、当机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新启动后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)。
七、挂载点的意义 (mount point)
每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被使用。 将文件系统与目录树结合的动作称为『挂载』。 重点是:挂载点一定是目录,该目录为进入该文件系统的入口。 因此并不是有任何文件系统都能使用,必须要『挂载』到目录树的某个目录后才能够使用该文件系统。
如果使用文件系统的观点来看,同一个 filesystem 的某个 inode 只会对应到一个文件内容而已(因为一个文件占用一个 inode 之故), 因此可以透过判断 inode 号码来确认不同文件名是否为相同的文件喔!
八、相关命名
1、 ls -l /lib/modules/$(uname -r)/kernel/fs 命令:查看当前Linux 支持的文件系统
2、 cat /proc/filesystems 命令:查看系统目前已加载到内存中支持的文件系统
3、 df(列出文件系统的整体磁盘使用量)
语法:
- df [-ahikHTm] [目录或文件名]
选项与参数:
- -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
- -k :以 KBytes 的容量显示各文件系统;
- -m :以 MBytes 的容量显示各文件系统;
- -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
- -H :以 M=1000K 取代 M=1024K 的进位方式;
- -T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;
- -i :不用磁盘容量,而以 inode 的数量来显示
范例一:将系统内所有的 filesystem 列出来!
root@www ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hdc2 9920624 3823112 5585444 41% /
/dev/hdc3 4956316 141376 4559108 4% /home
/dev/hdc1 101086 11126 84741 12% /boot
tmpfs 371332 0 371332 0% /dev/shm
# 在 Linux 底下如果 df 没有加任何选项,那么预设会将系统内所有的
# (不含特殊记忆体内的档案系统与 swap) 都以 1 Kbytes 的容量来列出来!
# 至于那个 /dev/shm 是与记忆体有关的挂载,先不要理他!
范例一所输出的结果讯息为:
- Filesystem:代表该文件系统是在哪个 partition ,所以列出装置名称;
- 1k-blocks:说明底下的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量;
- Used:顾名思义,就是使用掉的磁盘空间啦!
- Available:也就是剩下的磁盘空间大小;
- Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)
- Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)
范例二:将容量结果以易读的容量格式显示出来
[root@www ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 9.5G 3.7G 5.4G 41% /
/dev/hdc3 4.8G 139M 4.4G 4% /home
/dev/hdc1 99M 11M 83M 12% /boot
tmpfs 363M 0 363M 0% /dev/shm
# 不同于范例一,这里会以 G/M 等容量格式显示出来,比较容易看啦!
使用 -a 这个参数时,系统会出现 /proc 这个挂载点,但是里面的东西都是0 ,不要紧张! /proc 的东西都是 Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』的, 所以当然没有占任何的磁盘空间啰!
/dev/shm/ 目录,其实是利用内存虚拟出来的磁盘空间,通常是总物理内存的一半!
4、 du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
语法:
- du [-ahskm] 文件或目录名称
选项与参数:
- -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
- -h :以人们较易读的容量格式 (G/M) 显示;
- -s :列出总量而已,而不列出每个各别的目录占用容量;
- -S :不包括子目录下的总计,与 -s 有点差别。
- -k :以 KBytes 列出容量显示;
- -m :以 MBytes 列出容量显示;
九、ln(连接文件)
1、Hard Link (硬连接或实际连接)
使用 hard link 设置链接文件时,磁盘的空间与 inode 的数目都不会改变,hard link 只是在某个目录下的 block 多写入一个关连数据,既不增加 inode 也不耗用 block 数量。
将任何一个”文件名“删除,其实 inode 与 block 都还是存在的。
hard link 限制:
- 不能跨 Filesystem。
- 不能 link 目录。
实体链接的文件读取示意图:

实例,对文件/etc/crontab新建实际连接/root/crontab。除了文件名称其他都完全一样:
[root@www ~]# ln /etc/crontab . <==建立实体连结的指令
[root@www ~]# ll -i /etc/crontab /root/crontab
1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab
1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /root/crontab
2、Symbolic Link (符号链接,即快捷方式)
类似 Windows 的快捷方式功能,再建立一个独立的文件(或目录),这个文件(或目录)会让数据的读取指向它 link 的那个文件(或目录)的文件(或目录)名。
当来源文件被删除之后,symbolic link 的文件会“开不了”, 会一直提示"无法开启某文件"。实际上就是找不到原始"文件名"。ls命令查看文件信息时,如果符号链接的目标文件不存在,文件名部分会有特殊的颜色显示。
符号链接的文件读取示意图:

实例,对文件/etc/crontab新建实际连接/root/crontab2:
[root@www ~]# ln -s /etc/crontab crontab2
[root@www ~]# ll -i /etc/crontab /root/crontab2
1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab
654687 lrwxrwxrwx 1 root root 12 Oct 22 13:58 /root/crontab2 -> /etc/crontab
由inode 号码不同可以知道它们为两个独立存在的文件,而且连接文件的重要内容会写上目标文件的"文件名"。
因为箭头(-->)右边的文件名“/etc/crontab”总共有 12 个英文,每个英文占用 1 个 bytes ,所以连接文件大小为 12bytes。
3、ln命令
语法:
- ln [-sf] 来源文件 目标文件
选项与参数:
- -s :如果不加任何参数就进行连结,那就是 hard link,至于 -s 就是 symbolic link
- -f :如果 目标文件 存在时,就主动的将目标文件直接移除后再建立
4、关于目录的 link 数量
建立一个新的目录时, 『新的目录的 link 数为 2 ,而上层目录的 link数则会增加 1。添加Hard Link或者Symbolic Link连接都不会导致连接目录连接数发生变化。
5、练习
新增一个文件夹folder,且在folder下新增文件file,向文件file内填写任意字符。进行如下命令:
| 命令 | 结果 | 连接数变化(ls -ld 文件名) | 删除文件或文件夹后 |
| ln ./folder/ folder_h | ln: "./folder/": 不允许将硬链接指向目录 | folder文件夹的连接数未改变 | |
| ln ./folder/file file_h | 新建了文件 | file文件的连接数由1变为2 | file_h还能打开 |
| ln -s ./folder folder_s | 新建了文件夹的快捷方式 | folder文件夹的连接数未改变 | folder_s无法打开 |
| ln -s ./folder/file file_s | 新建了文件的快捷方式 | file文件的连接数未改变 | file_s无法打开 |
注意:要创建的是目录符号连接的话,源文件必须是绝对路径,不能是相对路径或无路径。否则创建出的符号连接是文件而不是文件夹,无法cd进入工作目录。
$ rm -f /usr/local/maven #删除目录符号连接。注意maven后不要加右斜线“/”,加了就是删除/home/weis/apache-maven-3.5.3文件夹中的所有文件了。
十、磁盘的分区、格式化、检验与挂载
新增一块硬盘时,会有如下动作:
1. 对磁盘进行分区,以建立可用的 partition ;
2. 对该 partition 进行格式化 (format),以建立系统可用的 filesystem;
3. 若想要仔细一点,则可对刚刚建立好的 filesystem 进行检验;
4. 在 Linux 系统上,需要建立挂载点 (亦即是目录),并将他挂载上来。
还有很多需要考虑的,例如磁盘分区槽 (partition) 需要定多大? 是否需要加入 journal 的功能?inode 与 block 的数量应该如何规划等等的问题。
1、lsblk(列出系统上的所有磁盘列表)
list block device 的缩写
语法:
- lsblk [-dfimpt] [device]
选项与参数:
- -d :仅列出磁盘本身,并不会列出该磁盘的分区数据
- -f :同时列出该磁盘内的文件系统名称
- -i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
- -m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
- -p :列出该装置的完整文件名!而不是仅列出最后的名字而已。
- -t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
显示结果中:
- NAME:就是装置的文件名啰!会省略 /dev 等前导目录!
- MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!
- RM:是否为可卸除装置 (removable device),如光盘、USB 磁盘等等
- SIZE:当然就是容量啰!
- RO:是否为只读装置的意思
- TYPE:是磁盘 (disk)、分区槽 (partition) 还是只读存储器 (rom) 等输出
- MOUTPOINT:就是前一章谈到的挂载点!
2、blkid(列出装置的 UUID 等参数)
UUID 是全局单一标识符 (universally unique identifier),Linux 会将系统内所有的装置都给予一个独一无二的标识符, 这个标识符就可以拿来作为挂载或者是使用这个装置/文件系统之用
3、parted(列出磁盘的分区表类型与分区信息)
(待补充完整)
磁盘分区
《鸟哥的Linux私房菜 基础学习篇(第三版)》的磁盘分区主要介绍fdisk 命令,第四版主要介绍gdisk 命令。
MBR 分区表请使用 fdisk 分区, GPT 分区表使用 gdisk 分区。
只要离开 gdisk 时按下『q』,那么所有的动作『都不会生效!』相反的, 按下『w』就是动作生效的意思。
gdisk 只有 root 才能执行。使用的『装置文件名』不能加上数字,因为 partition是针对『整个磁盘装置』而不是某个 partition 。所以执行『 gdisk /dev/vda1 』 就会发生错误,要使用 gdisk /dev/vda 才对!
透过 lsblk 或 blkid 先找到磁盘,再用 parted /dev/xxx print 来找出内部的分区表类型,之后才用 gdisk 或 fdisk 来操作系统。
gdisk
语法:
- gdisk 装置名称
gdisk内相关操作:
- a toggle a bootable flag
- b edit bsd disklabel
- c toggle the dos compatibility flag
- d delete a partition <==删除一个 partition
- l list known partition types
- m print this menu
- n add a new partition <==新增一个 partition
- o create a new empty DOS partition table
- p print the partition table <==在屏幕上显示分区表
- q quit without saving changes <==不储存离开 fdisk 程序
- s create a new empty Sun disklabel
- t change a partition's system id
- u change display/entry units
- v verify the partition table
- w write table to disk and exit <==将刚刚的动作写入分区表
- x extra functionality (experts only)
下半部的分区表信息主要在列出每个分区槽的个别信息项目。每个项目的意义为:
- Number:分区槽编号,1 号指的是 /dev/vda1 这样计算。
- Start (sector):每一个分区槽的开始扇区号码位置
- End (sector):每一个分区的结束扇区号码位置,与 start 之间可以算出分区槽的总容量
- Size:就是分区槽的容量了
- Code:在分区槽内的可能的文件系统类型。Linux 为 8300,swap 为 8200。不过这个项目只是一个提示而已,不见得真的代表此分区槽内的文件系统喔!
- Name:文件系统的名称等等。
fdisk
语法:
- fdisk 装置名称
Command (m for help): m <== 输入 m 后,就会看到底下这些指令介绍
Command action:
- a toggle a bootable flag
- b edit bsd disklabel
- c toggle the dos compatibility flag
- d delete a partition <==删除一个 partition
- l list known partition types
- m print this menu
- n add a new partition <==新增一个 partition
- o create a new empty DOS partition table
- p print the partition table <==在屏幕上显示分区表
- q quit without saving changes <==不储存离开 fdisk 程序
- s create a new empty Sun disklabel
- t change a partition's system id
- u change display/entry units
- v verify the partition table
- w write table to disk and exit <==将刚刚的动作写入分区表
- x extra functionality (experts only)
mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \[-r parms] 装置名称
我们常听到的『格式化』其实应该称为『建置文件系统 (make filesystem)』才对啦!所以使用的指令是 mkfs 喔!那我们要建立的其实是 xfs 文件系统, 因此使用的是 mkfs.xfs 这个指令才对。
选项与参数:
- 关于单位:底下只要谈到『数值』时,没有加单位则为 bytes 值,可以用 k,m,g,t,p (小写)等来解释比较特殊的是 s 这个单位,它指的是 sector 的『个数』喔!
- -b :后面接的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k 喔!
- -d :后面接的是重要的 data section 的相关参数值,主要的值有:
- agcount=数值 :设定需要几个储存群组的意思(AG),通常与 CPU 有关
- agsize=数值 :每个 AG 设定为多少容量的意思,通常 agcount/agsize 只选一个设定即可
- file :指的是『格式化的装置是个文件而不是个装置』的意思!(例如虚拟磁盘)
- size=数值 :data section 的容量,亦即你可以不将全部的装置容量用完的意思
- su=数值 :当有 RAID 时,那个 stripe 数值的意思,与底下的 sw 搭配使用
- sw=数值 :当有 RAID 时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)
- sunit=数值 :与 su 相当,不过单位使用的是『几个 sector(512bytes 大小)』的意思
- swidth=数值 :就是 su*sw 的数值,但是以『几个 sector(512bytes 大小)』来设定
- -f :如果装置内已经有文件系统,则需要使用这个 -f 来强制格式化才行!
- -i :与 inode 有较相关的设定,主要的设定值有:
- size=数值:最小是 256bytes 最大是 2k,一般保留 256 就足够使用了!
- internal=[0|1]:log 装置是否为内建?预设为 1 内建,如果要用外部装置,使用底下设定
- logdev=device :log 装置为后面接的那个装置上头的意思,需设定 internal=0 才可!
- size=数值:指定这块登录区的容量,通常最小得要有 512 个 block,大约 2M 以上才行!
- -L :后面接这个文件系统的标头名称 Label name 的意思!
- -r :指定 realtime section 的相关设定值,常见的有:
- extsize=数值:就是那个重要的 extent 数值,一般不须设定,但有 RAID 时,最好设定与 swidth 的数值相同较佳!最小为 4K 最大为 1G 。
mkfs.ext4
格式化为 ext4 的传统 Linux 文件系统。
格式:
- mkfs.ext4 [-b size] [-L label] 装置名称
选项与参数:
- -b :设定 block 的大小,有 1K, 2K, 4K 的容量,
- -L :后面接这个装置的标头名称。
mkfs 其他文件系统
格式化为 ext4 的传统 Linux 文件系统。
格式:
- mkfs[tab][tab]
- mkfs -t vfat /dev/vda5
xfs_repair 处理 XFS 文件系统检验
语法:
- xfs_repair [-fnd] 装置名称
选项与参数:
- -f:后面的装置其实是个文件而不是实体装置
- -n :单纯检查并不修改文件系统的任何数据 (检查而已)
- -d :通常用在单人维护模式底下,针对根目录 (/) 进行检查与修复的动作!很危险!不要随便使用
fsck.ext4 处理 EXT4 文件系统检验
fsck 是个综合指令,如果是针对 ext4 的话,建议直接使用 fsck.ext4 来检测比较妥当
语法:
- fsck.ext4 [-pf] [-b superblock] 装置名称
选项与参数:
- -p :当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。
- -f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!
- -D :针对文件系统下的目录进行优化配置。
- -b :后面接 superblock 的位置!一般来说这个选项用不到。但是如果你的 superblock 因故损毁时,透过这个参数即可利用文件系统内备份的 superblock 来尝试救援。一般来说,superblock 备份在:1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768
mkfs 格式化文件系统
make filesystem的缩写。
语法:
- mkfs [-t 文件系统格式] 设备文件名
参数:
- -t 可以接文件系统格式,例如ext3,ext2,vfat等(系统有支持才会生校)
mke2fs(指定文件系统的具体选项)
- mke2fs [-b block大小] [-i block大小] [-L 标头] [-cj] 装置
选项与参数:
- -b :可以设定每个 block 的大小,目前支援 1024, 2048, 4096 bytes 三种;
- -i :多少容量给予一个 inode 呢?
- -c :检查磁碟错误,仅下达一次 -c 时,会进行快速读取测试;
- 如果下达两次 -c -c 的话,会测试读写(read-write)。
- -L :后面可以接标头名称 (Label),这个 label 是有用的喔!e2label指令介绍会谈到。
- -j :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3。
fsck(file system check检查与修正档案系统错误)
语法:
- fsck [-t 档案系统] [-ACay] 装置名称
选项与参数:
- -t :如同 mkfs 一样,fsck 也是个综合软体而已!因此我们同样需要指定档案系统。
- 不过由于现今的 Linux 太聪明了,他会自动的透过 superblock 去分辨档案系统,
- 因此通常可以不需要这个选项的啰!请看后续的范例说明。
- -A :依据 /etc/fstab 的内容,将需要的装置扫瞄一次。/etc/fstab 于下一小节说明,
- 通常开机过程中就会执行此一指令了。
- -a :自动修复检查到的有问题的磁区,所以你不用一直按 y 啰!
- -y :与 -a 类似,但是某些 filesystem 仅支援 -y 这个参数!
- -C :可以在检验的过程当中,使用一个长条图来显示目前的进度!
EXT2/EXT3 的额外选项功能:(e2fsck 这支指令所提供)
- -f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰!
- -D :针对档案系统下的目录进行最佳化配置。
注意:通常只有身为 root 且你的档案系统有问题的时候才使用这个指令,否则在正常状况下使用此一指令, 可能会造成对系统的危害!通常使用这个指令的场合都是在系统出现极大的问题,导致你在 Linux 开机的时候得进入单人单机模式下进行维护的行为时,才必须使用此一指令!
由于 fsck 在扫瞄硬碟的时候,可能会造成部分 filesystem 的损坏,所以‘执行 fsck 时, 被检查的 partition 务必不可挂载到系统上!亦即是需要在卸载的状态喔!’
partprobe(更新 Linux 核心的分区表信息)
参数:
- -s:显示信息到屏幕上
badblocks (检查硬碟或软碟磁区有没有坏轨)
语法:
- badblocks -[svw] 装置名称
选项与参数:
- -s :在荧幕上列出进度
- -v :可以在荧幕上看到进度
- -w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有档案时
mount (挂载文件系统到Linxu系统上)
语法:
- mount -a
- mount [-l]
- mount [-t 档案系统] [-L Label名] [-o 额外选项] [-n] 装置档名 挂载点
选项与参数:
- -a :依照设定档 /etc/fstab 的资料将所有未挂载的磁碟都挂载上来
- -l :单纯的输入 mount 会显示目前挂载的资讯。加上 -l 可增列 Label 名称!
- -t :与 mkfs 的选项非常类似的,可以加上档案系统种类来指定欲挂载的类型。
- 常见的 Linux 支援类型有:ext2, ext3, vfat, reiserfs, iso9660(光碟格式),nfs, cifs, smbfs(此三种为网路档案系统类型)
- -n :在预设的情况下,系统会将实际挂载的情况即时写入 /etc/mtab 中,以利其他程式的运作。但在某些情况下(例如单人维护模式)为了避免问题,会刻意不写入。此时就得要使用这个 -n 的选项了。
- -L :系统除了利用装置档名 (例如 /dev/hdc6) 之外,还可以利用档案系统的标头名称(Label)来进行挂载。最好为你的档案系统取一个独一无二的名称吧!
- -o :后面可以接一些挂载时额外加上的参数!比方说帐号、密码、读写权限等:
- ro, rw: 挂载档案系统成为唯读(ro) 或可读写(rw)
- async, sync: 此档案系统是否使用同步写入 (sync) 或非同步 (async) 的记忆体机制,请参考档案系统运作方式。预设为 async。
- auto, noauto: 允许此 partition 被以 mount -a 自动挂载(auto)
- dev, nodev: 是否允许此 partition 上,可建立装置档案? dev 为可允许
- suid, nosuid: 是否允许此 partition 含有 suid/sgid 的档案格式?
- exec, noexec: 是否允许此 partition 上拥有可执行 binary 档案?
- user, nouser: 是否允许此 partition 让任何使用者执行 mount ?一般来说,mount 仅有 root 可以进行,但下达 user 参数,则可让一般 user 也能够对此 partition 进行 mount 。
- defaults: 预设值为:rw, suid, dev, exec, auto, nouser, and async
- remount: 重新挂载,这在系统出错,或重新更新参数时,很有用!
挂载时参考文件:
- /etc/filesystems:系统指定的测试挂载档案系统类型;
- /proc/filesystems:Linux系统已经载入的档案系统类型。
Linux 支援的档案系统之驱动程式都写在如下的目录中:
- /lib/modules/$(uname -r)/kernel/fs/
光碟机一挂载之后就无法退出光碟片了!除非你将他卸载才能够退出!
umount (将装置文件卸除)
语法:
- umount [-fn] 装置文件名或挂载点
选项与参数:
- -f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
- -l :立刻卸除文件系统,比 -f 还强!
- -n :不更新 /etc/mtab 情况下卸除。
mknod 磁盘/文件系统参数修订
语法:
- mknod 装置文件名 [bcp] [Major] [Minor]
选项与参数:
- 装置种类:
- b :设定装置名称成为一个周边储存设备文件,例如磁盘等;
- c :设定装置名称成为一个周边输入设备文件,例如鼠标/键盘等;
- p :设定装置名称成为一个 FIFO 文件;
- Major :主要装置代码;
- Minor :次要装置代码;
xfs_admin 修改 XFS 文件系统的 UUID 与 Label name
语法:
- xfs_admin [-lu] [-L label] [-U uuid] 装置文件名
选项与参数:
- -l :列出这个装置的 label name
- -u :列出这个装置的 UUID
- -L :设定这个装置的 Label name
- -U:设定这个装置的 UUID 喔!
tune2fs(修改 ext4 的 label name 与 UUID)
- tune2fs [-l] [-L Label] [-U uuid] 装置文件名
选项与参数:
- -l :类似 dumpe2fs -h 的功能~将 superblock 内的数据读出来~
- -L :修改 LABEL name
- -U :修改 UUID 啰!
开机挂载 /etc/fstab 及 /etc/mtab
要在开机的时候就将我要的文件系统都挂好,到 /etc/fstab (filesystem table)里面修改即可。
系统挂载的一些限制:
- 根目录 / 是必须挂载的,而且一定要先于其它 mount point 被挂载进来。
- 其它 mount point 必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录架构原则 (FHS)
- 所有 mount point 在同一时间之内,只能挂载一次。
- 所有 partition 在同一时间之内,只能挂载一次。
- 如若进行卸除,您必须先将工作目录移到 mount point(及其子目录) 之外。
[root@study ~]# cat /etc/fstab
# Device Mount point filesystem parameters dump fsck
/dev/mapper/centos-root / xfs defaults 0 0
UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
[装置/UUID 等] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
[装置/UUID 等]:
这个字段可以填写的数据主要有三个项目:
- 文件系统或磁盘的装置文件名,如 /dev/vda2 等
- 文件系统的 UUID 名称,如 UUID=xxx
- 文件系统的 LABEL 名称,例如 LABEL=xxx
[文件系统参数]:
| 参数 | 内容意义 |
| async/sync 异步/同步 |
设定磁盘是否以异步方式运作!预设为 async(效能较佳) |
| auto/noauto 自动/非自动 |
当下达 mount -a 时,此文件系统是否会被主动测试挂载。预设为 auto。 |
| rw/ro 可擦写/只读 |
让该分区槽以可擦写或者是只读的型态挂载上来,如果你想要分享的数据是不给用 户随意变更的, 这里也能够设定为只读。则不论在此文件系统的文件是否设定 w 权限,都无法写入喔! |
| exec/noexec 可执行/不可执行 |
限制在此文件系统内是否可以进行『执行』的工作?如果是纯粹用来储存数据的目 录, 那么可以设定为 noexec 会比较安全。不过,这个参数也不能随便使用,因为 你不知道该目录下是否默认会有执行档。 举例来说,如果你将 noexec 设定在 /var ,当某些软件将一些执行文件放置于 /var 下时,那就会产生很大的问题喔! 因此,建议这个 noexec 最多仅设定于你自定义 或分享的一般数据目录。 |
| user/nouser 允许/不允许使用者挂载 |
是否允许用户使用 mount 指令来挂载呢?一般而言,我们当然不希望一般身份的 user 能使用 mount 啰,因为太不安全了,因此这里应该要设定为 nouser 啰! |
|
suid/nosuid 具有/不具有 suid 权限 |
该文件系统是否允许 SUID 的存在?如果不是执行文件放置目录,也可以设定为 nosuid 来取消这个功能! |
|
defaults |
同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。 基本上,预设情况使用 defaults 设定即可! |
第五栏:能否被 dump 备份指令作用:
dump 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会啦!直接输入 0 就好了!
第六栏:是否以 fsck 检验扇区:
早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整 (clean)。 不过这个方式使用的主要是透过 fsck 去做的,我们现在用的 xfs 文件系统就没有办法适用,因为 xfs会自己进行检验,不需要额外进行这个动作!所以直接填 0 就好了。
dd 建立大型文件
[root@study ~]# dd if=/dev/zero of=/srv/loopdev bs=1M count=512
512+0 records in <==读入 512 笔资料
512+0 records out <==输出 512 笔数据
536870912 bytes (537 MB) copied, 12.3484 seconds, 43.5 MB/s
# 这个指令的简单意义如下:
# if 是 input file ,输入文件。那个 /dev/zero 是会一直输出 0 的装置!
# of 是 output file ,将一堆零写入到后面接的文件中。
# bs 是每个 block 大小,就像文件系统那样的 block 意义;
# count 则是总共几个 bs 的意思。所以 bs*count 就是这个文件的容量了!
好像在迭砖块一样,将 512 块,每块 1MB 的砖块堆栈成为一个大文件 (/srv/loopdev) ! 最终就会出现一个 512MB 的文件!
浙公网安备 33010602011771号