目前文件系统以volume形式管理,不使用裸盘
本文只记录以前没见过、用得少的知识点,不是完整知识点记录
重点:5-16.4,17-20,22,24

第0章~第1章 计算机硬件常识、系统介绍

查看核心版本uname -r

第2章 主机规划

常见装置等文件名

设备 文件名
硬盘/U盘 /dev/sd[a-p]
IDE硬盘 /dev/hd[a-d](旧系统限定)
EMMC/SD卡 /dev/mmcblk[0-7]
虚拟硬盘 /dev/vd[a-p]
软盘 /dev/fd[0-7]
磁带机 /dev/ht0 (IDE 界面)
/dev/st0 (SATA/SCSI 界面)
/dev/tape (当前磁带)
虚拟I/O界面 /dev/cd[a-p](虚拟机中)
打印机 /dev/lp[0-2] (25 针打印机)
/dev/usb/lp[0-15] (USB 界面)
鼠标 /dev/input/mouse[0-15] (通用)
/dev/psaux (PS/2 界面)
/dev/mouse (当前鼠标)
CDROM/DVDROM /dev/scd[0-1] (通用)
/dev/sr[0-1] (通用,CentOS 较常见)
/dev/cdrom (当前 CDROM)

MBR与GPT

在机械硬盘上,分区使得数据集中,有利于提高数据读取速度与效能

MBR

MBR下第一个扇区默认大小为512bytes,其中446bytes为boot数据,64bytes为分区表(64bytes最多只能有四组记录区)

MBR中,sda[1-4]保留给Primary和Extended使用,逻辑分区槽从5号开始
extended分区只能有一个,每组分区大小为16bytes,单分区容量上限2.2T

GPT

LBA0为MBR相容区块
LBA2~LBA33,每个LBA可以记录4笔分区数据。每笔记录使用128bytes,其中64bytes记录开始/结束扇区号,最大容量2^64*512bytes=8ZB

UEFI下,/boot目录一般为/dev/sda3以后的号码

第3章 安装CentOS

尝试1

本地环境:M1 Max的MacBook Pro上使用VMware Fusion Tech Preview安装

基础配置
4核CPU,2GRAM,40G NVME SSD

CentOS-Stream-8-aarch64-20220719安装失败,原因如下:

CentOS 7 or 8 will not boot on the Tech Preview because their kernels are built with a 64KB page size that Apple Silicon hardware does not support. RHEL 7 and 8 suffer from the same issue.

RHEL 9 changed the page size on ARM architectures to 4KB. CentOS 9 Stream made the same change. They both will boot ( well they did before the recent round of kernel releases that cause pretty much all Linux distros to not boot on the TP – that’s another story altogether)

改安装CentOS-Stream-9-latest-aarch64-dvd1.iso

依然有引导问题,放弃尝试在M1上安装,改用旧intel机器物理机安装

https://forums.centos.org/viewtopic.php?t=78771

尝试2

物理机安装,目标系统:RHEL-8.2、CentOS8 Stream,配置:

硬件 配置
CPU i5-3230M 2C4T @2.6GHz
RAM 8 GB DDR3-1600
SSD 240 GB SATA
GPU1 HD Graphics 4000
GPU2 GeForce 710M

强制gpt安装

安装 CentOS8 时按方向键选择 Install CentOS Linux 8 然后在“e”编辑选择项;

在第二行 linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS-Stream-9-BaseOS-arrch64 ro 后空格加入 inst.gpt 如下图;然后按Ctrl-x继续进行安装即可;

硬盘分区

使用手动分区,最终方案如下

/home 100GiB LVM,rhel/cs卷组
/boot/efi 50MiB sda1 对应centOS7的bios boot
/boot 1024MiB sda2
/ 50GiB LVM,rhel卷组 root分区,鸟哥上空间分配比/home还大,存疑
swap 8GiB LVM,rhel卷组 8G内存配8Gswap

第4章 初登录

启动X windowstartx

查看语系支持:locale

修改语系(简中)临时变量,:

LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8

日历小工具:cal

计算器小工具:bcscale=number设置小数点位数

帮助文档路径:/usr/share/doc

第5章 文件权限与文件结构

/etc/passwd只记录root用户的相关信息,个人用户信息在/etc/shadow下,group信息在/etc/group

文件权限第一个字符的含义:

字符 含义
d 目录
文件
l link file
b 存储设备
c 串行端口设备,“一次性读取”,不能截断输出,如书吧
s 数据接口,用于(网络上)数据承接
p FIFO文件

对文件的w权限不具备删除/重命名权限,需要对目录将有w权限才行

目录的x权限代表用户能否进入该目录

文件名最大为255bytes

Filesystem Hierarchy Standard

shareable(可分享给其他系统挂载使用) unshareable(自己机器上运行的文件或与程序有关的socket文件)
static(不会经常变动的文件) /usr/opt /etc/boot
variable(经常改变的 数据) /var/mail /var/run

FHS的定义:

  • /(root,根目录):与开机系统有关
  • usr(unix software resource):与软件安装/执行有关
  • /var:与系统运行过程有关

/根目录

FHS建议:根目录所在分区越小越好,降低发生问题的概率

必须存在的目录
目录 文件内容
/bin 单人维护模式下还能够被操作的指令。可以被root和一般账号使用。如catchmodchowndatemvmkdircpbash
/boot 核心文件、开机配置文件等。kernel常用名为vmlinuz,使用grub2开机管理程序时还会存在/boot/grub2目录
/dev 接口/设备文件目录,如/dev/tty/dev/sd*
/etc 主要配置文件。文件属性一般设置为root可读写,其他用户只读。FHS不建议在此目录放置可执行文件。/etc/opt(必要)下放置/opt中软件的相关配置文件。/etc/X11(建议)下放置与X Window相关配置文件,如xorg.conf/etc/sgml/etc/xml(建议)下分别放置与SGML和XML格式相关配置文件
/lib 开机时会用到的函数库和/bin/sbin下会调用的函数库。/lib/modules(必要)下放驱动程序
/media 用于挂载可移除设备
/mnt /media,主要用于暂时挂载
/opt 用于安装第三方软件等,早期版本中一般放置在/usr/local目录
/run 早期版本要求开机后产生的信息存放在/var/run下,新版本改为/run下。该目录可以用内存仿真提高性能
/sbin 放置开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。 至于某些服务器软件程序,一般则放置到/usr/sbin/中。而本机自行安装的软件所产生的系统执行文件(system binary), 则放置到/usr/local/sbin/中。 如fdiskfsckifconfig
/srv 一些网络服务启动之后,这些服务所需要取用的数据目录,如/srv/www/
/tmp 暂时放置文件的目录。FHS建议在开机时清除/tmp
/usr 第二层FHS设定,见后文
/var 主要放置变动性数据,第二层FHS设定,见后文
建议存在的目录
目录 文件内容
/home 存放用户的家目录,~表示当前用户的家目录,~username表示拥护username的家目录
/lib<qual> 放置与/lib不同格式的库,如lib64
/root root用户的家目录
其他重要目录
目录 文件内容
/lost+found 标准的 ext2/ext3/ext4 文件系统格式的一个目录,当文件系统发生错误时, 将一些遗失的片段放置到这个目录下。xfs格式的文件系统不存在该目录
/proc 虚拟文件系统(virtual filesystem),存放数据在内存中。重要的文件例如:/proc/cpuinfo/proc/dma/proc/interrupts/proc/ioports/proc/net/*
/sys 虚拟的文件系统,主要记录核心与系统硬件信息较相关的信息。 包括目前已加载的核心模块与核心侦测到的硬件装置信息等等。

/usr目录

Unix系统软件资源放置目录。FHS建议所有软件开发者, 应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。

必须存在的目录
目录 文件内容
/usr/bin/ 存放所有一般用户能够使用的指令。/bin目录链接到此目录。FHS要求在此目录下不再有子目录
/usr/lib /lib/lib链接到此目录
/usr/local 管理员在本机自行安装自己下载的软件,建议安装到此目录,便于管理。该目录下也具有binetcincludelib等子目录
/usr/sbin /sbin/sbin链接到此目录
/usr/share 主要存放制度的数据文件,放置的数据几乎是不分硬件架构均可读取的数据。常见子目录有:帮助文件/usr/share/man、软件说明/usr/share/doc、时区文件/usr/share/zoneinfo
建议存在的目录
目录 文件内容
/usr/games/ 游戏想数据
/usr/include/ 头文件存放目录
/usr/libexec/ 不常用的执行文件,如大部分X Window的操作指令
/usr/lib<qual>/ /lib<qual>/lib<qual>链接到此目录
/usr/src/ 源码存放目录,核心源码建议放置在/usr/src/linux/

/var目录

/usr 在安装时会占用较大硬盘的目录,/var 则在系统运作后才会渐渐占用硬盘容量。/var 目录主要针对常态性变动的文件,包括缓存(cache)、登录日志(log file)以及某些软件运行所产生的文件, 如lock file、run file、 MySQL 数据库文件等。

常见子目录
目录 文件内容
/var/cache/ 缓存目录
/var/lib/ 程序运行时使用的数据文件放置目录,如/var/lib/mysql/
/var/lock/ 设备锁目录
/var/log/ 日志文件,如/var/log/messages/var/log/wtmp(记录登入信息)
/var/mail/ 电子邮箱目录,也有链接到/var/spool/mail/
/var/run/ PID放置目录,链接到/run
/var/spool/ 队列(等待其他程序使用)的数据。通常使用后删除。如/var/spool/mail/中放置系统收到的新邮件,用户收到后删除。定时任务存放到/var/spool/cron

第6章 文件与目录管理

  • pwd -P选项可显示真实路径而非链接路径
  • mkdir -m选项可指定目录权限
  • PATH中先被找到的指令先执行
  • 为安全起见,不建议将.加入PATH

文件管理

ls参数说明

-a:全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
-A:全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录
-d:仅列出目录本身,而不是列出目录内的文件数据(常用)
-f:直接列出结果,而不进行排序 (ls 预设会以档名排序!)
-F:根据文件、目录等信息,给予附加数据结构,例如:*:代表可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h:将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i:列出 inode 号码,inode 的意义下一章将会介绍;
-l:长数据串行出,包含文件的属性与权限等等数据;(常用)
-n:列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到!)
-r:将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R:连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
-S:以文件容量大小排序,而不是用档名排序;
-t:依时间排序,而不是用档名。
--color=never:不要依据文件特性给予颜色显示;
--color=always :显示颜色
--color=auto:让系统自行依据设定来判断是否给予颜色
--full-time:以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)而非内容变更时间 (modification time)

cp参数说明

-a:相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用);如果操作者权限不足,即使加上`-a`也无法完整复制权限
-d:若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身(默认是复制文件本身);
-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i:若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l:进行硬式连结(hard link)的连结档建立,而非复制文件本身;
-p:连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r:递归持续复制,用于目录的复制行为;(常用)
-s:复制成为符号链接文件 (symbolic link),亦即『快捷方式』文件;
-u:destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。

rm参数说明

-f:就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
-i:互动模式,在删除前会询问使用者是否动作
-r:递归删除.

mv参数说明

-f:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i:若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u:若目标文件已经存在,且 source 比较新,才会更新 (update)
  • basename:显示文件名
  • dirname:显示目录名

文件查阅

  • cat:由第一行开始显示文件内容
  • tac 从最后一行开始显示,是 cat 的倒写
  • nl 显示的时候,顺道输出行号
  • more 一页一页的显示文件内容
  • less :与 more 类似,但是可以往前翻页
  • head :只看头几行
  • tail :只看后几行

cattac参数说明

-A:相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b:列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E:将结尾的断行字符 $ 显示出来;
-n:打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T:将 [tab] 按键以 ^I 显示出来;
-v:列出一些看不出来的特殊字符

nl参数说明

-b:指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);

-n:列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;

-w:行号字段的占用的字符数。

more用法说明

  • Space:后翻一页
  • Enter:后翻一行
  • /:搜索后面输入的字符串,按n搜索下一处
  • :f:显示文件名与行号
  • q:退出
  • bCtrl-b:回翻,仅对文件有效,不适用于pipe

less用法说明

  • SpacePagedown:后翻一页
  • Pageup:前翻一页
  • /:向后搜索字符串
  • ?:向钱搜索字符串
  • n:重复前一个搜索
  • N:反向重复前一个搜索
  • g:移动到第一行
  • G:移动到最后一行
  • q:退出

head用法

-n:后方数字代表显示的行数,当数字前加负号表示不显示最后xx行

tail用法

-n:后方数字代表显示的行数,当数字前加正号表示显示xx行(含)以后的数据
-f:持续监测

od用法

-t:后面可以接各种『类型 (TYPE)』的输出,例如:
    a:利用默认的字符来输出;
    c:使用 ASCII 字符来输出
    d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes ;
    f[size] :利用浮点数(floating)来输出数据,每个数占用 size bytes ;
    o[size] :利用八进制(octal)来输出数据,每个整数占用 size bytes ;
    x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ;

[size]除了使用数字,还可以使用:
    C:sizeof(char)
    S:sizeof(short)
    I:sizeof(int)
    f/F:sizeof(float)
    D:sizeof(double)
    L:sizeof(long double)

常见用法:od -t oCc:以 8 进位列出目标与 ASCII 的对照

Linux文件的时间参数

  • modification time (mtime):最后修改时间,ls -l显示时间时的默认值
  • status time (ctime):文件状态(如权限、属性)修改时间
  • access time (atime):文件最后读取时间

使用--time=atime--time=ctime修改显示的时间类型

touch修改时间参数
touch [-acdmt] filename
-a:仅修订 access time;
-c:仅修改文件的时间,若该文件不存在则不建立新文件;
-d:后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m:仅修改 mtime ;
-t:后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

默认权限与隐藏权限

ext2/3/4文件系统下,可以使用chattrlsattr查看隐藏属性。xfs下只有部分支持。

777-umask=默认权限
文件再去掉x权限

隐藏属性

chattr修改隐藏属性
chattr [-RV] [+-=][ASacdistu] filename

A:存取此文件(或目录)时,atime 不变,降低IO负载
S:文件的修改会同步写入磁盘
a:root用户设定,当文件只能增加数据,不能删除和修改
c:文件将自动压缩再存储,在读取的时候将会自动解压缩
d:当 dump 程序被执行的时候,设定 d 属性将可使该文件(或目录)不会被 dump 备份
i:root用户设定,禁止删除、重命名,修改和设置链接
s:删除该文件时从硬盘上彻底删除
u:删除该文件时数据继续保存在磁盘上

xfs 文件系统仅支援 AadiS ,不支持csu
lsattr显示隐藏属性
lsattr [-adR] filename
-a :显示隐藏文件;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来!

特殊权限

权限 有效范围 作用
SUID 二进制程序 执行过程中拥有相应owner权限
SGID 二进制程序
目录
执行过程中拥有相应group权限
SBIT 目录 该目录下建立的文件和目录只有创建者和root用户可以删除(rmmv

设定方式:在权限数字前加1位数字,SUID、SGID、SBIT分别为421,eg:chmod 4755 filename

当数字user/group/others赋予了SUID/SGID/SBIT权限而其本身不具备x权限时,s/t权限为空,会变成S/T。

file命令

返回文件类型:ASCII、data、或binary
对二进制文件,可显示文件的SUID权限、兼容的架构、内核、动态库等情况。

文件搜索

命令 用法说明
which 搜索环境变量PATH下的命令,后接的应为完整名称,
只搜索PATH中的命令,不含bash内建命令,如history
whereis 在几个主要目录下搜索,可搜索几个主要目录(用whereis -l查询)。
locate 搜索已建立的数据库/var/lib/mlocate中的数据。该数据库在CentOS下每天更新一次
find 全盘搜索,资源消耗大

which参数说明

-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

whereis参数说明

-l:可以列出 whereis 会去查询的几个主要目录而已
-b:只找 binary 格式的文件
-m:只找在说明文件 manual 路径下的文件
-s:只找 source 来源文件
-u:搜寻不在上述三个项目当中的其他特殊文件

locate参数说明

-i:忽略大小写的差异;
-c:不输出档名,仅计算找到的文件数量
-l:仅输出几行的意思,例如输出五行则是 -l 5
-S:输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r:后面可接正规表示法的显示方式

updatedb命令可根据/etc/updatedb.conf的设定搜索硬盘并更新/var/lib/mlocate内的数据库文件

find参数说明

find [PATH] [option] [action]
  1. 时间相关选项:-atime、-ctime、-mtime,eg:
-mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名
-newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
  1. 与使用者或组名有关的参数:
-uid n :n 为数字,这个数字是用户的账号 ID,亦即 UID ,这个 UID 是记录在/etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。
-gid n :n 为数字,这个数字是组名的 ID,亦即 GID,这个 GID 记录在/etc/group,相关的介绍我们会第四篇说明~
-user name :name 为使用者账号名称喔!例如 dmtsai
-group name:name 为组名喔,例如 users ;
-nouser:寻找文件的拥有者不存在 /etc/passwd 的人!
-nogroup:寻找文件的拥有群组不存在于 /etc/group 的文件!
  1. 与文件权限及名称有关的参数:
-name filename:搜寻文件名为 filename 的文件;
-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB还要大的文件,就是『 -size +50k 』
-type TYPE:搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 装置文件 (b, c),目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。
-perm mode:搜寻文件权限『刚好等于』 mode 的文件,这个 mode 为类似 chmod的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
-perm -mode :搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说,要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
-perm /mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说,我们搜寻-rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------也会被列出来,因为他有 -rw.... 的属性存在!

find [PATH] [option] [action] -exec COMMAND {} \;会将find找到的结果放置到{}中执行

第7章 Linux文件系统

区块

三种不同的区块与作用:

  • superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
  • inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
  • block:实际记录文件的内容,若文件太大时,会占用多个 block 。

每个 inode 与 block 都有编号,而每个文件都会占用一个 inode ,inode 内则有文件数据放置的 block 号码

ext2中,文件系统划分出多个block group,每个block有独立的inode/block/superblock

inode职在索引式文件系统(indexed allocation)中才有,非索引式文件系统不存在inode,每个block号记录在前一个block中。

block

block大小 1KB 2KB 4KB
单个文件上限 16GB 256GB 2TB
最大文件系统总容量 2TB 8TB 16TB
  • 除非格式化(或利用resize2fs等命令变更文件系统dax),inode与block不会再变动
  • 每个block最多只能放置一个文件的数据
  • 文件大小大于block则占用多个block

目录的block记录的这个目录下的文件名和文件名占用的inode号

inode table

inode记录文件的:

  • rwx、SUID等权限信息
  • owner/group
  • 容量
  • ctime、atime、mtime
  • 内容指向(pointer)

inode特点:

  • 大小固定,ext2为128bytes,ext4与xfs可设定为256bytes
  • 每个文件只占用一个inode,文件系统能够建立文件数量与inode的数量关系
  • 系统读取文件事需要先找到inode并判断权限,然后才读取block

superblock

记录整个文件系统相关信息,一般为1024bytes,包括:

  • block与inode的总量
  • block与inode的使用与未使用量
  • block与inode的大小
  • filesystem的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等相关信息
  • 一个valid bit,文件系统被挂载时为0,未被挂载为1

对block group,除了第一个block group,后续的block group不一定含有superblock,如果有,则为第一个block group内superblock的备份,可以进行superblock的救援。

Filesystem Description

用于描述每个block group开始与结束的block号,说明每个区段的block号,能通过dumpe2fs观察

block bitmap

记录block使用与未使用情况

inode bitmap

记录inode使用与未使用情况

dumpe2fs

blkid可以查看目前系统有被格式化的设备

dumpe2fs [-bh] 装置文件
-b :列出保留为坏轨的部分
-h :仅列出 superblock 的数据,不会列出其他的区段内容!

日志式文件系统 (Journaling filesystem)

相比ext2意外断电后需要扫描整个文件系统进行比对,ext3、ext4等日志式文件系统在filesystem规划一个区块用于存放日志,文件的写入过程:

  1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;

  2. 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;

  3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。

文件系统的运作

异步处理 (asynchronously):系统加载一个文件到内存后,未被修改时设定为clean,被修改后设定为dirty,系统会不定时的将内存中设定为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。

若不正常关机(如断电、宕机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新启动后可能会花 很多时间在进行磁盘检验,甚至可能导致文件系统的损毁

挂载

将文件系统与目录树结合的动作成为挂载

挂载点相同的情况下,若inode号相同,则说明文件内容相同

默认挂载目录/etc/fstab

VFS (Virtual Filesystem Switch)

Linux常见的支持的文件系统:

  • 传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等
  • 日志式文件系统: ext3 /ext4 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS / ZFS
  • 网络文件系统: NFS / SMBFS

查看系统支持的文件系统:

ls -l /lib/modules/$(uname -r)/kernel/fs

查看已加载到内存中支持的文件系统:

cat /proc/filesystems

Linux通过VFS的核心功能去读取 filesystem

XFS

CentOS7开始默认文件系统替换为了XFS,目的是解决ext文件系统格式化慢点问题,(ext文件系统需要预先规划出所有的 inode/block/meta data)。同时,虚拟磁盘的来源一般为单个巨型文件,XFS的巨型文件效能更佳。

XFS分为资料区 (data section)、文件系统活动登录区 (log section)以及实时运作区(realtime section)

df -T /可以查看挂载点/下的文件系统的 superblock 纪录

xfs_info 挂载点|装置文件名可以查看该挂载点/装置的superblock相关内容

data section

data section与ext文件系统类似,包括 inode/data block/superblock 等数据,与ext家族的block group 类似,也划分为了多个储存区群组(allocation groups),每个储存区群组都包含了 (1)整个文件系 统的 superblock、 (2)剩余空间的管理机制、 (3)inode 的分配与追踪。此外,inode 与 block 都是系统需要用到时动态分配

xfs 的 block 与 inode 有多种不同的容量可供设定,block容量可在512bytes~64K调整。(Linux下,受内存pagesize容量限制,最高支持到4K),inode可在256bytes~2M调整。

log section

纪录文件系统的变化,类似日志区。xfs下,可指定外部磁盘如SSD作为log section

realtime section

新建文件时,xfs先在这个区段里面找一个到数个的 extent 区块临时放置文件,分配完毕后,再写入到 data section 的 inode 与 block 去!

extent区块的大小在格式化时确定,4K~1M之间,一般非RAID阵列为64K,RAID下建议设定为与条带深度(stripe)相同。

[root@study ~]# xfs_info /dev/vda2
1  meta-data=/dev/vda2         isize=256    agcount=4, agsize=65536 blks
2           =                  sectsz=512   attr=2, projid32bit=1
3           =                  crc=0        finobt=0
4  data     =                  bsize=4096   blocks=262144, imaxpct=25
5           =                  sunit=0      swidth=0 blks
6  naming   =version 2         bsize=4096   ascii-ci=0 ftype=0
7  log      =internal          bsize=4096   blocks=2560, version=2
8           =                  sectsz=512   sunit=0 blks, lazy-count=1
9  realtime =none              extsz=4096   blocks=0, rtextents=0
  • 第 1 行里面的 isize 指的是 inode 的容量,每个有 256bytes 这么大。至于 agcount 则是前面谈到的储存 区群组 (allocation group) 的个数,共有 4 个, agsize 则是指每个储存区群组具有 65536 个 block 。配合第 4 行的 block 设定为 4K,因此整个文件系统的容量应该就是 4655364K 这么大!
  • 第 2 行里面 sectsz 指的是逻辑扇区 (sector) 的容量设定为 512bytes 这么大的意思。
  • 第 4 行里面的 bsize 指的是 block 的容量,每个 block 为 4K 的意思,共有 262144 个 block 在这个文件系统内。
  • 第 5 行里面的 sunit 与 swidth 与磁盘阵列的 stripe 相关性较高。这部份我们底下格式化的时候会举一个例子来说明。
  • 第 7 行里面的 internal 指的是这个登录区的位置在文件系统内,而不是外部设备的意思。且占用了 4K * 2560 个 block,总共约 10M 的容量。
  • 第 9 行里面的 realtime 区域,里面的 extent 容量为 4K。不过目前没有使用。

文件系统操作

df [-ahikHTm] [目录或文件名]:列出文件系统的整体磁盘使用量;读取的范围主要是在 Superblock 内的信息

df 后面加上目录或者是文件时, df会自动的分析该目录或文件所在的 partition ,并将该 partition 的容量显示出来

-a:列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k:以 KBytes 的容量显示各文件系统;
-m:以 MBytes 的容量显示各文件系统;
-h:以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H:以 M=1000K 取代 M=1024K 的进位方式;
-T:连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;
-i:不用磁盘容量,而以 inode 的数量来显示

/proc等挂载在内存中的分区,因为没有占用磁盘空间,所以占用为0

du [ahskm] 文件或目录名称:评估文件系统的磁盘使用量(常用于估算目录占用容量)

du会直接到文件系统内搜索所有的文件数据,耗时会比df

-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已;
-h:以人们较易读的容量格式 (G/M) 显示;
-s:列出总量而已,而不列出每个各别的目录占用容量;
-S:不包括子目录下的总计,与 -s 有点差别;
-k:以 KBytes 列出容量显示;
-m:以 MBytes 列出容量显示;

硬链接

文件名记录inode号➝实际内容

硬链接:在某目录下另建一个文件名指向该内容,一般来说不会改变inode数量

  1. 不能跨文件系统
  2. 不能指向目录

软连接

建立一个文件指向链接的文件名

ln [-sf] 来源文件 目标文件

选项与参数:
-s:如果不加任何参数就进行连结,那就是 hard link,至于 -s 就是 symbolic link
-f:如果 目标文件存在时,就主动的将目标文件直接移除后再建立!

磁盘操作

  • lsblk [-dfimpt] [device]:列出系统上的所有磁盘列表
-d:仅列出磁盘本身,并不会列出该磁盘的分区数据
-f:同时列出该磁盘内的文件系统名称(UUID)
-i:使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m:同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
-p:列出该装置的完整文件名!而不是仅列出最后的名字而已。
-t:列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
  • blkid:列出装置的 UUID (全局单一标识符 (universally unique identifier))等参数

  • parted device_name print:列出磁盘的分区表类型与分区信息

磁盘分区

gdisk/fdisk 设备名:分别用于GPT与MBR分区,具体使用按?根据提示操作即可,最后使用q退出或者使用’w’保存并退出。

#gdisk
b	back up GPT data to a file
c	change a partition's name
d	delete a partition
i	show detailed information on a partition
l	list known partition types
n	add a new partition
o	create a new empty GUID partition table (GPT)
p	print the partition table
q	quit without saving changes
r	recovery and transformation options (experts only)
s	sort partitions
t	change a partition's type code
v	verify disk
w	write table to disk and exit
x	extra functionality (experts only)
?	print this menu
#fdisk
  GPT
   M   进入 保护/混合 MBR

  常规
   d   删除分区
   F   列出未分区的空闲区
   l   列出已知分区类型
   n   添加新分区
   p   打印分区表
   t   更改分区类型
   v   检查分区表
   i   打印某个分区的相关信息

  杂项
   m   打印此菜单
   x   更多功能(仅限专业人员)

  脚本
   I   从 sfdisk 脚本文件加载磁盘布局
   O   将磁盘布局转储为 sfdisk 脚本文件

  保存并退出
   w   将分区表写入磁盘并退出
   q   退出而不保存更改

  新建空磁盘标签
   g   新建一份 GPT 分区表
   G   新建一份空 GPT (IRIX) 分区表
   o   新建一份的空 DOS 分区表
   s   新建一份空 Sun 分区表

文件系统ID可在gdisk下按L查看:

0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE          
3000 ONIE boot             3001 ONIE config           3900 Plan 9              
4100 PowerPC PReP boot     4200 Windows LDM data      4201 Windows LDM metadata
4202 Windows Storage Spac  7501 IBM GPFS              7f00 ChromeOS kernel     
7f01 ChromeOS root         7f02 ChromeOS reserved     8200 Linux swap          
8300 Linux filesystem      8301 Linux reserved        8302 Linux /home         
8303 Linux x86 root (/)    8304 Linux x86-64 root (/  8305 Linux ARM64 root (/)
8306 Linux /srv            8307 Linux ARM32 root (/)  8400 Intel Rapid Start   
8e00 Linux LVM             a000 Android bootloader    a001 Android bootloader 2
a002 Android boot          a003 Android recovery      a004 Android misc        
a005 Android metadata      a006 Android system        a007 Android cache       
a008 Android data          a009 Android persistent    a00a Android factory     
a00b Android fastboot/ter  a00c Android OEM           a500 FreeBSD disklabel   
a501 FreeBSD boot          a502 FreeBSD swap          a503 FreeBSD UFS         
a504 FreeBSD ZFS           a505 FreeBSD Vinum/RAID    a580 Midnight BSD data   
a581 Midnight BSD boot     a582 Midnight BSD swap     a583 Midnight BSD UFS    
a584 Midnight BSD ZFS      a585 Midnight BSD Vinum    a600 OpenBSD disklabel   
a800 Apple UFS             a901 NetBSD swap           a902 NetBSD FFS          
a903 NetBSD LFS            a904 NetBSD concatenated   a905 NetBSD encrypted    
a906 NetBSD RAID           ab00 Recovery HD           af00 Apple HFS/HFS+      
af01 Apple RAID            af02 Apple RAID offline    af03 Apple label         
af04 AppleTV recovery      af05 Apple Core Storage    af06 Apple SoftRAID Statu
af07 Apple SoftRAID Scrat  af08 Apple SoftRAID Volum  af09 Apple SoftRAID Cache
b300 QNX6 Power-Safe       bc00 Acronis Secure Zone   be00 Solaris boot        
bf00 Solaris root          bf01 Solaris /usr & Mac Z  bf02 Solaris swap        
bf03 Solaris backup        bf04 Solaris /var          bf05 Solaris /home       
bf06 Solaris alternate se  bf07 Solaris Reserved 1    bf08 Solaris Reserved 2  
bf09 Solaris Reserved 3    bf0a Solaris Reserved 4    bf0b Solaris Reserved 5  
c001 HP-UX data            c002 HP-UX service         e100 ONIE boot           
e101 ONIE config           ea00 Freedesktop $BOOT     eb00 Haiku BFS           
ed00 Sony system partitio  ed01 Lenovo system partit  ef00 EFI System          
ef01 MBR partition scheme  ef02 BIOS boot partition   f800 Ceph OSD            
f801 Ceph dm-crypt OSD     f802 Ceph journal          f803 Ceph dm-crypt journa
f804 Ceph disk in creatio  f805 Ceph dm-crypt disk i  fb00 VMWare VMFS         
fb01 VMWare reserved       fc00 VMWare kcore crash p  fd00 Linux RAID  

分区完成后使用partprobe [-s]命令更新分区表(参数s输出信息)

磁盘格式化

创建xfs文件系统使用mkfs.xfs [-bdilLfr] 分区名:

关于单位:底下只要谈到『数值』时,没有加单位则为 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 。

作者 Assaultcore

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注