鸟哥的Linux私房菜:第二部分Linux文件目录与磁盘格式总结1
一.第5章:Linux的文件权限与目录配置
5..1 用户与用户组
文件拥有者users: 对文件拥有完全控制权,可修改权限及归属组
用户组group: 组成员共享文件权限,适用于团队协作
其他人others: 非所有者且非组成员,权限需要严格限制
5.2 Linux文件权限概念5.2.1 Linux文件属性
文件类型权限 链接数 文件拥有者 文件所属组 文件大小 文件最后修改时间 文件名
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg
第一栏代表文件的类型与权限,第一个字符代表这个文件是目录,文件或链接文件
d是目录,-是文件,|是连接文件,b是设备文件里面的可供存储的周边设备(可按块随机读写的设备), c是为设备文件里面的串行端口设备(键盘,鼠标,一次性读取设备),
rwx可读可写可执行,第一组rwx是文件拥有者的权限,第二组rwx是群组的权限,第三组rwx是其他人权限
第二栏表示有多少文件名链接到此inode
第三栏表示这个文件(或目录)的拥有者账号第四栏表示这个文件的用户组
第五栏表示这个文件的容量大小,byte
第六栏为这个文件的创建日期或是最近修改日期
第七栏为这个文件名 文件名多一个点.代表是隐藏文件
5.2.2 如何修改文件属性与权限
1. chgrp命令 修改文件用户组 -R递归chgrp users initial-setup-ks.cfg #文件的用户组修改为users
2. chown命令 修改文件拥有者 -R递归chown bin initial-setup-ks.cfg #将文件的拥有者修改为bin这个账号
chown root:root initial-seyup_ks.cfg #将文件的拥有者与用户组修改为root
3. chmod命令 修改权限 -R递归
数字类型修改文件权限 r:4 w:2 x:1chmod 777 .bashrc #将.bashrc文件所有权限都启用
符号类型修改文件权限ugoa +加入 -移除 =设置
chmod u=rwx,go=rx .bashrc #文件拥有者rwx,用户组和其他人rx权限
chmod a+w .bashrc #文件拥有者,用户组,其他人都有w权限
chmod a-x .bashrc #文件拥有者,用户组,其他人都没有x权限
5.2.3目录与文件权限意义
权限
文件(File)文件夹
目录(Directory)可分类抽屉
r
读取内容(
cat
)列出文件名(
ls
)w
修改内容(
vim
)增删/重命名文件(需
x
权限配合)x
执行程序(
./script.sh
)进入目录(
cd
)关键区别:目录的w权限需要搭配x生效
5.2.4 Linux文件种类与扩展名
文件种类
文件类型
标识符 (ls -l 首字符)
主要特点 / 用途
常见示例
普通文件
-
存储普通数据,如文本、程序代码、二进制可执行文件等
.bashrc
,cat
命令文件目录文件
d
包含其他文件和目录的索引,用于构建文件系统的树形结构
/home
,/etc
符号链接文件
l
类似Windows的快捷方式,记录目标文件的路径(软链接)
/etc/init.d -> rc.d/init.d
字符设备文件
c
提供串行、按字符流访问的接口,如键盘、终端
/dev/tty
,/dev/zero
块设备文件
b
提供随机、按数据块访问的接口,如硬盘、U盘
/dev/sda
,/dev/sdb
套接字文件
s
数据接口文件,用于进程间网络通信或本机进程间通信
存在于
/run
或/tmp
目录下管道文件
p
数据输送文件,先进先出(FIFO),用于非网络连接的进程间数据单向传输
可由
mkfifo
命令创建扩展名
.sh
:通常表示Shell脚本文件。
.tar.gz
,.zip
:表示打包或压缩文件。
.c
,.py
:表示C语言或Python语言的源代码文件。
.conf
:通常表示配置文件5.3 Linux目录配置
5.3.1 Linux目录配置的依据-FHS
FHS
1.root根目录(/) 与启动系统有关,最小化原则:分区宜小,仅存放必要目录(如/bin
、/etc
),避免与应用程序混存
目录
用途
示例
/bin
基础命令(单用户模式可用)
ls
,cp
,bash
/etc
系统配置文件
/etc/passwd
,/etc/fstab
/boot
内核与开机文件
vmlinuz
, GRUB配置/dev
设备文件
/dev/sda
(硬盘),/dev/tty
(终端)2./usr:软件资源目录,与软件安装/执行有关
存放只读静态数据(如安装的软件):
/usr/bin
:用户命令(如python
)
/usr/local
:手动安装的第三方软件(推荐路径)
/usr/share
:架构无关数据(如文档man)
3.
/var:动态数据目录,与系统运行过程有关存储运行时产生的变动数据:
/var/log
:日志文件(/var/log/messages
)
/var/lib
:程序数据库(MySQL数据存于/var/lib/mysql
)
/var/cache
:应用程序缓存
5.3.2 目录树:起始点是根目录/
目录路径
主要用途与说明
典型内容示例
/bin
存放所有用户都需要使用的基础命令(二进制文件),这些命令在单用户维护模式时也可能需要用到。
ls
,cp
,cat
,bash
/etc
存放系统和应用程序的配置文件,一般为文本文件。这是系统管理员最常打交道的目录之一。
/etc/passwd
(用户账户信息),/etc/hostname
(主机名)/home
普通用户的主目录所在地。每个用户通常在此拥有一个以自己用户名命名的子目录,用于存放个人文件、邮件、配置等。
/home/alice
,/home/bob
/root
系统管理员(root 用户)的主目录。注意它不在
/home
下,以便在/home
独立分区或无法挂载时,root 用户仍能登录进行系统维护。root 用户的个人配置和文件
/usr
存放用户安装的应用程序和只读共享资源,结构类似根目录,但不是系统启动所必需。
↳ /usr/bin
绝大多数用户命令的可执行文件。
python
,vim
↳ /usr/lib
应用程序所需的共享库文件。
↳ /usr/local
系统管理员手动编译安装的软件通常放在这里,以避免与包管理器安装的软件冲突。
↳ /usr/share
架构无关的共享数据,如文档、字体、图标等。
/var
存放经常变化(Variable)的数据,如日志、缓存、邮件等。
↳ /var/log
系统和应用程序的日志文件,是排查问题的重要依据。
syslog
,auth.log
↳ /var/cache
应用程序的缓存数据。
/tmp
供所有用户存放临时文件。系统重启后,此目录下的文件通常会被清理。
/dev
包含设备文件。在 Linux 中,硬件设备(如硬盘、终端)都被抽象为文件,通过此目录进行访问。
/dev/sda
(第一块硬盘),/dev/tty
(终端)/proc
一个虚拟文件系统,它不占用磁盘空间,而是作为内核和进程信息的接口存在于内存中。
/proc/cpuinfo
(CPU信息),/proc/meminfo
(内存信息)/opt
用于安装附加的或第三方的可选软件包。这些软件通常将所有文件集中在自己的子目录下。
/opt/google/chrome/
/mnt, /media
用于挂载其他文件系统的目录。
/media
通常用于自动挂载可移动设备(如U盘),而/mnt
用于临时手动挂载。
5.3.3 绝对路径与相对路径
绝对路径:路径以根目录/开始的,(如/usr/share/doc
)
相对路径:其他都是,不由 / 写起
. 代表当前目录./
.. 代表上一层目录../
二.第6章:Linux文件与目录管理
6.1 目录与路径绝对路径:路径以根目录/开始的,(如
/usr/share/doc
)
相对路径:其他都是,不由 / 写起tab键补全
6.1.2 目录的相关操作
1. cd命令 切换当前工作目录
cd #切换到当前用户的家目录cd ~ #切换到当前用户的家目录cd .. #切换到上一级目录cd - #切换到上一个工作目录cd /var/spool/mail #绝对路径写法cd ../postfix #相对路径写法
2. pwd 显示当前目录的绝对路径
pwd #单纯显示出目前的工作目录pwd -P #显示非链接文件的本身的目录名
3. mkdir 创建新目录
mkdir test #建立一名为test的新目录mkdir -p test1/test2/test3/test4 #-p 建立多层目录mkdir -m 711 test2 #建立权限为rwx--x--x的目录
4. rmdir 删除空目录
rmdir test #删除空目录rmdir -p test1/test2/test3/test4 #将test1/test2/test3/test4一次性删除rm -r test #将test全部删除
6.1.3 关于执行文件路径的变量: $PATH
当你在终端输入命令(如ls
、python
)时,系统会按照$PATH
中定义的目录顺序逐个查找该命令对应的可执行文件。找到第一个匹配项即执行,否则报错command not found
echo 显示,打印
6.2 文件与目录管理6.2.1 文件与目录的查看:ls
test* 这个代表包含test名字的所有文件ls -l #以长格式展示文件属性(权限,所有者,大小,修改时间)ls -a #显示包括隐藏文件的所有内容,.开头的文件为隐藏文件ls -lh #与-l组合使用,h将字节转换为KB/MB/GBls -lt #t按修改时间ls -ltr #r反序ls -lSh #S按文件大小,从大到小ls -lShr #r从小到大ls -F #在文件名后添加标识符ls -lah #显示所有文件(包含隐藏文件)+详细列表+人性化大小ls -l *.txt #只显示.txt文件ls -d */ #d只显示目录ls -l | grep '.sh' #结合管道过滤脚本文件ls -i #第一列为inode号,排查硬链接
6.2.2 复制,删除与移动:cp,rm,mv
1. cp命令 复制 文件/目录
cp file.txt ~/bsckup #复制file.txt到backup目录cp file.txt ~/backup/new.txt #复制后重命名为new.txtcp -r projext/ ~/archive/ #复制整个project目录到archive,r目录复制到目录cp -i ~/.bashec /tmp/bashrc #i覆盖前提示确认(防止误覆盖)cp -a /var/log/wtmp wtmp_2 #a将文件的所有信息都一起复制过来cp -s bashrc bashrc_slink #复制的bashrc建立一个符号链接文件cp -l bashrc bashrc_hlink #复制的bashrc建立一个硬链接cp -u ~/.bashrc /tmp/bashrc #在目标文件与源文件由差异时,才会复制,用于备份的工作中cp -d bashrc_slink bashrc_slink_2 #复制链接文件的属性cp ~/.bashrc ~/.bash_history /tmp #将多个文件复制到同一个目录
2. rm 删除或目录
rm old_file.log #删除文件rm -r tmp_dir/ #递归删除目录及内容rm -f locked_file #强制删除rm -ri project/ #i交互式删除,逐文件确认删除rm -i bashrc* #通配符*,代表任意字符rm ./-aaa- #删除-开头的文件
3. mv 移动或重命名
mv report.doc ~/Documents/ #移动文件到Documentsmv oldname.txt newname.txt #同一目录重命名mv photo.jpg ~/images/avatar.png #移动并重命名mv old_dir/ new_location/ #目录整体移动
6.2.3 获取路径文件名与目录名称
1. basename
basename /etc/sysconfig/network #取到最后的文件名network
2.dirname
dirname /etc/sysconfig/network #取到目录名/etc/sysconfig
6.3 文件内容查看6.3.1 直接查看文件内容
cat 直接查看文件内容,快速显示小文件
cat /etc/issue #查看文件内容cat -n /etc/hosts #显示文件内容并带行号cat -A /etc/man_db.conf #A完整显示内容,包括特殊字符
tac 倒叙直接查看文件内容
tac /var/log/syslog #从最后一行开始显示(最新日志在前)
nl 添加行号打印
nl /etc/issue #列出内容nl -b a -n rz /etc/issue #ba空行也显示, nrz 行号右方显示,加0nl -b a -n rz -w 3 /etx/issue #w3补0的个数为3
6.3.2 可翻页查看
1. more 仅向下翻页(淘汰)more +50 large_file.log #从第50行开始查看
空格键:向下翻一页
Enter:向下翻一页
/字符串:向下查找整个字符串关键词
:f 立刻显示出文件名以及目录显示的行数
q: 离开
2. less 强大分页查看器(推荐)less -N /var/log/auth.log #带行号查看日志
空格键:向下翻一页
pagedown:向下翻一页f
pageup:向上翻一页b
/字符串: 向下查找字符串
?字符串: 向上查找字符串
n: 重复查找
N:反向重复查找
g:前进到第一行
G:后退到最后一行
q:退出
6.3.3 数据截取1. head 查看文件头部
head -n 20 access.log #显示前20行
2. tail 查看文件尾部
tail -f /var/log/nginx/access.log #实时追踪新日志(调试必备) 持续刷新tail -n 100 -f app.log #显示最后100行并且实时更新
6.3.4 非纯文本文件: od
用于查看和分析非纯文本文件(如二进制文件、特殊格式文件)的核心工具。它通过将文件内容转换为可读格式(八进制、十六进制、ASCII 等)od -t c /usr/bin/passwd #内容以ASCII显示od -t x1 -N 16 #N显示前16字节 x十六进制 1,1字节单位进行显示od -t d4 -t f4 -v data.bin #每行显示一个结构与体4字节整数以及4字节浮点数 v全部显示
echo 将指定的文本或变量内容输出到终端或文件。简单来说,它是一个“打印”工具
6.3.5 修改文件时间或创建新文件:touch
时间类型
触发条件
touch
控制选项典型应用场景
Access Time (atime)
读取文件内容(如
cat
,less
)
-a
审计文件访问记录
Modify Time (mtime)
文件内容被修改
-m
最常用! 备份系统依据
Change Time (ctime)
文件元数据变更(权限、所有者等)
❌ 不可控
系统自动更新
ls -l --time=atime /etc/man_db.conf; ls -l --time=ctime /etc/man_db.conf #查mtime,atime,ctimedate; ls -l bashrc; ls -l --time=atime bashrc; ls -l --time=ctime bashrc #查mtime,atime,ctimetouch -c non_exist.txt #文件不存在不创建,存在时不更新时间戳touch -t 202310051830.30 report.log #2023-10-05 18:30:30更改时间touch -d "2023-10-05 18:30:30" report.log #2023-10-05 18:30:30更改时间touch -d "2 days ago" bashrc #更改时间为2天前
6.4 文件与目录的默认权限与隐藏权限6.4.1 文件默认权限:umask umask 值定义需要屏蔽的权限(减法逻辑)
umask #输出0022 umask -S #输出u=rwx, g=rx, o=rxumask077 #生成权限077
6.4.2 文件隐藏属性
1. chattr 配置文件隐藏属性chattr +i /etc/passwd #禁止所有修改chattr -i /etc/passwd #解锁文件chattr +a /var/log/auth.log #只能增加数据,不能修改数据chattr +aiS attrtest #S写入磁盘
2. lsattr 显示文件隐藏属性
lsattr /etc/passwd #查看文件隐藏属性
6.4.3 文件特殊权限: SUID,SGID,SBIT
符号
数字
作用对象
核心功能
典型应用
SUID
s
(所有者执行位)
4
(千位)文件
执行时继承文件所有者权限
/usr/bin/passwd
SGID
s
(所属组执行位)
2
(千位)文件/目录
文件:继承所属组权限
目录:新建文件继承目录组
/usr/bin/locate
团队共享目录SBIT
t
(其他人执行位)
1
(千位)目录
仅文件所有者可删除文件
/tmp
临时目录chmod 4755 file.h #-rwsr-xr-x 文件 文件拥有者chmod 2770 /team.dir #drwxrws--- 目录 用户组chmod 1777 /temp #drwxrwxrwt 目录 其他人chmod u+s file.sh #添加SUIDchmod g+s /team_dir #添加SGIDchmod o+t /tmp #添加SBIT
若目录无
x
权限,SGID 失效(ls -l
显示大写的S
而非s
)
6.4.4 观察文件类型:file命令file mystery_data #查文件类型
6.5 命令与文件的查找
6.5.1 脚本文件的查找
1.基于PARH环境变量搜索 which命令 查找执行文件alias #命令别名which prthon3 #查找python3解释器路径
2.基于PARH环境变量搜索 whereis命令 查找文件
whereis bash #查找bash及其手册位置whereis -a passwd #只找二进制格式的文件whereis -m passwd #只找man里面的文件
3. locate/updatedb命令
locate: 根据/var/lib/mlocate内的数据库记录,找出用户输入关键词的文件名updatedb: 根据/etc/updatedb.conf的设置去查找系统硬盘内的文件,并更新/var/lib/mlocate内的数据库文件
locate -l 5 passwd #找出系统中所有与passwd相关的文件名,只要列出5个locate -S #列出locaate查询所使用的数据库文件之文件名和各数据数量
4. find命令
find . -type f -name "*.sh" #type f查找当前目录下所有 .sh后缀的脚本find /opt -type f -name "*.py" -user root #查找/opt目录中属性主为root的脚本find ~/scripts -type f -perm /u=x,g=x,o=x #查找有执行权限的脚本 -permfind / -mtime 0 #过去24小时没有修改的文件find /var -mtime -4 #4天内修改的文件find /var -time +4 #超过4天修改的文件find /etc -newer /etc/passwd #在etc目录下文件日期比/etc/passwd新find / -name "passwd" #找出文件名包含了passwd的文件find /run -type s #找出/run目录下文件类型为socket的文件find / -perm /7000 #找出文件当中含有SGID,SUID,SBIT属性find / -size +1M #找出系统中大于1MB的文件find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; #额外操作将找到的文件打印到屏幕上 -exec和\;一样的
三.第7章:Linux磁盘与文件系统管理
7.1 认识Linux文件系统
7.1.1 磁盘组成与分区的复习
一、物理组成
一块硬盘(HDD)或固态硬盘(SSD)在物理上主要由以下部件构成:
部件
机械硬盘(HDD)
固态硬盘(SSD)
说明
盘片
一个或多个磁性盘片,数据存储于此。
无
类似一张光盘,数据记录在盘片表面的磁性介质上。
磁头
每个盘片对应一个读写磁头,在盘片上移动读写数据。
无
类似唱片机的唱针,但非接触式。
主轴马达
驱动盘片高速旋转(如 7200 RPM)。
无
转速越高,读写速度通常越快。
闪存芯片
无
NAND Flash 闪存芯片,是数据的存储介质。
相当于HDD的盘片,但无需机械运动。
控制芯片
磁盘控制器,管理数据读写、缓存等。
主控芯片,功能更复杂,包括磨损均衡、垃圾回收等。
磁盘的“大脑”。
缓存
一块高速DRAM内存,作为数据中转站。
同样有DRAM缓存(部分低端型号可能无缓存)。
提升读写效率。
在 Linux 中,这些物理磁盘设备被抽象为文件,保存在
/dev/
目录下
二、逻辑组成(磁盘分区)
一块物理磁盘在逻辑上可以被划分为多个独立的区域,称为分区
管理分区需要分区表,它就像一张磁盘的“地图”,记录了每个分区的起始和结束位置。主要有两种格式
特性
MBR
GPT
全称
主引导记录
GUID 分区表
支持磁盘容量
< 2TB
极大(目前近乎无限制)
分区数量
最多4个主分区,或3个主分区+1个扩展分区(内含多个逻辑分区)
理论上无限制(Linux 内核通常限制为 256)
安全性
分区信息只有一份,易损坏
有备份,更安全可靠
引导方式
通过 BIOS
通过 UEFI
标识
在 Linux 中仍显示为
/dev/sda1
等在 Linux 中显示为
/dev/sda1
,也可通过/dev/disk/by-partuuid/
访问分区命名规则(以
/dev/sda
为例):
主分区或扩展分区:
/dev/sda1
,/dev/sda2
,/dev/sda3
,/dev/sda4
逻辑分区(在扩展分区内):从
/dev/sda5
开始编号
7.1.2 文件系统特性
1. 引导块
位置:文件系统最开始的区域
作用:存储启动引导程序(如GRUB)
特点:只有根文件系统的引导块会被使用
大小:通常为1个块(如4KB)
2. 超级块
作用:文件系统的"身份证",记录全局信息
存储内容:
文件系统类型(ext4、XFS等)
总块数、空闲块数
Inode总数、空闲Inode数
块大小(如4KB)
挂载时间、最后写入时间
3. Inode表(索引节点表)
作用:存储文件的元数据(不是文件名和文件内容!)
每个Inode包含:
文件权限(rwx)
文件所有者(UID/GID)
文件大小
时间戳(创建、修改、访问时间)
链接计数
数据块指针(指向存储文件内容的磁盘块)
4. 块位图
作用:跟踪数据块的使用情况
原理:每个位代表一个数据块,
1
=已使用,0
=空闲优势:快速查找空闲块,避免遍历整个磁盘
5. Inode位图
作用:跟踪Inode的使用情况
原理:每个位代表一个Inode,
1
=已使用,0
=空闲6. 数据块
作用:实际存储文件内容的区域
类型:
常规块:存储普通文件数据
目录块:存储目录项(文件名 → Inode映射)
7.1.3 Linux的ext2文件系统(inode)
我用的是ext4文件系统
使用 dumpe2fs命令 查询ext系列超级区块信息的命令blkid命令 显示出目前系统被格式化的设备
blkid #显示目前系统被格式化的设备dumPe2fs /dev/sda #查询ext里面超级区块信息
7.1.4 与目录树的关系
1.目录:文件系统会分配一个inode与至少一个区块给目录,ls -il
2.文件:inode只有12个直接指向,假设每个指针和块大小均为4KB
直接指针:可管理 12 * 4KB = 48KB 的文件。
间接指针:一个间接指针块可存储 4KB / 4字节 = 1024 个指针,可管理 1024 * 4KB = 4MB。
双间接指针:可管理 1024 * 1024 * 4KB = 4GB。
三间接指针:可管理 1024 * 1024 * 1024 * 4KB = 4TB。
3.目录树的读取
读取文件
/home/user/test.txt
底层步骤:
在根目录
/
中找到home
的Inode号(挂载点,权限rx)读取
home
的Inode,获取数据块位置在
home
的数据块中找到user
的Inode号读取
user
的Inode,获取数据块位置(权限rx)在
user
的数据块中找到test.txt
的Inode号读取
test.txt
的Inode,获取文件权限和大小根据Inode中的数据块指针,读取文件内容
7.1.5 ext4文件的存取与日志式文件系统的功能
Ext4文件系统通过其日志功能(Journaling) 和先进的存取机制,在保证数据可靠性的同时,显著提升了性能。
特性分类
核心机制
主要特点 / 受益
数据存取优化
Extents(区段)
将连续的数据块作为一个整体管理,极大减少元数据开销,提升大文件读写效率。
多块分配器
一次性分配多个数据块,减少分配次数,改善写入性能。
延迟分配
数据在内存中整合后再决定磁盘位置,优化分配布局,减少碎片。
日志模式
data=journal
日志记录文件和元数据的所有更改,安全性最高,但性能开销最大。
data=ordered
(默认)仅日志记录元数据更改,但保证数据先于元数据写入磁盘,安全与性能的平衡点。
data=writeback
仅日志记录元数据更改,且不保证数据写入顺序,性能最高,但安全性最低。
可靠性保障
日志校验和
检测日志本身的损坏,增强恢复过程的可靠性。
快速文件系统检查(fsck)
跳过未使用的inode,使系统崩溃后的检查恢复速度大幅提升。
7.1.6 Linux文件系统的运行
挂载点 一定是目录,该目录为进入文件系统的入口
1. 虚拟文件系统(VFS)
VFS 是内核提供的抽象层,为所有文件系统提供统一接口。
作用:
为应用程序提供一致的 API(
open
,read
,write
,close
)屏蔽不同文件系统的实现差异
管理文件系统挂载点
示例:同样的
read()
调用可以操作 ext4、XFS、NTFS 等不同文件系统2. 页缓存(Page Cache)
这是文件系统性能的核心优化机制
缓存策略:
读缓存:磁盘数据读入内存,后续读取直接命中缓存
写缓存:写入操作先到缓存,延迟写入磁盘(可配置同步策略)
3. 脏页回写机制
脏页:已被修改但未写入磁盘的缓存页。
回写线程:由内核线程(如
pdflush
)定期将脏页写入磁盘4. I/O 调度器
负责优化磁盘访问顺序,减少磁头寻道时间。
7.2 文件系统的简单操作7.2.1 磁盘与目录的容量
1. df命令 查看磁盘分区使用情况df #显示文件系统的磁盘空间使用情况df -h #人性化显示df -i #查看inode使用情况df -h /home #查看特定挂载点df -aT #将系统内的所有特殊文件格式及名称都列出来
2. du 查看目录/文件磁盘使用
du -sh #查看当前目录总大小du -sh /var/log #查看指定目录大小du -sb #查看当前目录总大小 1byte为单位
7.2.2 硬链接与符号链接:ln命令
特性
硬链接 (Hard Link) ln
符号链接 (Symbolic Link) ln -s
本质
同一文件的多个目录入口
指向目标路径的快捷方式文件
inode
与原始文件共享相同 inode
独立 inode(存储目标路径)
跨文件系统
❌ 不支持
✅ 支持
链接目录
❌ 不允许(除特殊权限)
✅ 允许
原始文件删除后
链接仍有效(减少链接计数)
链接失效("断链")
文件类型
普通文件
特殊文件(
l
类型)查看命令
ls -i
显示相同 inode
ls -l
显示->
指向路径存储空间
不额外占用空间(仅目录项)
占用独立空间(存储路径字符串)
ln /etc/crontab . #硬链接ln -s /etc/crontab crontab2 #软链接,符号链接,类似快捷方式
7.3 磁盘的分区,格式化,检验与挂载7.3.1 观察磁盘分区情况
lsblk命令 列出系统上所有磁盘列表
blkid命令 列出设备的UUID等参数parted命令 列出磁盘的分区表类型与分区信息
7.3.2 磁盘分区 我用的是MBR分区 使用fdisk命令sudo fdisk /dev/sdbCommand (m for help): n # 新建分区 Partition type: p (primary) # 主分区 Partition number: 1 # 分区号 First sector: 回车默认 # 起始扇区 Last sector: +20G # 分配20GB空间Command (m for help): t # 修改分区类型 Partition number: 1 Hex code: 83 (Linux文件系统) # 83=Linux, 8e=LVM, 82=SwapCommand (m for help): w # 保存并退出
7.3.3 磁盘格式化(创建文件系统)
ext4文件系统 mkfs.ext4
7.3.4 文件系统检验ext4文件系统 fsck.ext4
7.3.5 文件系统挂载与卸载
挂载:将存储设备接入目录树 mount命令 临时(重启生效)常用挂载选项:
选项
作用
适用场景
noatime
不更新访问时间
SSD优化/高IO负载
nodiratime
不更新目录访问时间
同上
discard
启用TRIM(SSD)
固态硬盘维护
ro
/rw
只读/读写
安全防护/数据保护
nosuid
禁用SUID权限
增强安全性
noexec
禁止执行程序
安全隔离区
# 创建挂载点目录 sudo mkdir /mnt/data# 挂载设备到目录 sudo mount /dev/sdb1 /mnt/data# 验证挂载 df -hT | grep sdb1#明确指定文件系统(避免自动检测失败) mount -t ext4 /dev/sdb1 /mnt/data#常用挂载选项组合 mount -o noatime,nodiratime,discard /dev/sdb1 /mnt/data#只读挂载(安全扫描场景) mount -o ro /dev/sdc1 /mnt/backup
2. 卸载 umount命令
#卸载指定设备 umount /dev/sdb1#通过挂载点卸载 umount /mnt/data
7.3.6 磁盘/文件系统参数自定义
mknod命令 创建设备特殊文件#创建字符设备 按字节流传输数据(键盘,串口) 主设备号 次设备号 mknod /dev/my_char_dev c 240 0#创建块设备 按数据块传输(硬盘,USB驱动器) mknod /dev/my_block_dev b 8 1#命名管道 进程间通信(无需设备号) mknod my_pipe p
tun3fs命令 调整 ext2/ext3/ext4 文件系统参数
功能类别
常用选项
作用
适用场景
查看信息
-l
显示超级块信息
诊断文件系统状态
卷标管理
-L
设置/修改卷标
标识磁盘用途
保留空间
-m
调整root保留空间比例
防止普通用户占满磁盘
挂载控制
-c
-i
设置最大挂载次数/检查间隔
自动触发
fsck
日志管理
-J
调整日志大小/位置
优化数据库性能
功能开关
-O
启用/禁用文件系统特性
启用元数据校验等高级功能
时间参数
-T
更新最后检查时间
绕过强制
fsck
7.4 设置启动挂载7.4.1 启动挂载/etc/fstab及/etc/mtab
# 设备标识 挂载点 文件系统 挂载选项 dump备份 fsck顺序 UUID=xxxxxx /data ext4 defaults 0 2 /dev/sdb1 /backup xfs noatime 0 1 192.168.1.100:/share /nfs nfs rw,hard 0 0
字段
含义
示例
注意事项
1. 设备标识
磁盘分区标识
UUID=xxxx
/dev/sda1
LABEL=DATA
推荐 UUID(避免设备名变动)
2. 挂载点
挂载目录路径
/mnt/data
目录必须提前创建
3. 文件系统
分区格式
ext4
xfs
ntfs
nfs
必须与实际一致
4. 挂载选项
控制挂载行为
defaults
noatime,discard
多选项用逗号分隔
5. dump备份
备份标记
0
=不备份1
=备份通常设为
0
6. fsck顺序
启动检查顺序
0
=不检查1
=根分区优先2
=次级检查非ext文件系统设为
0
7.4.2 特殊设备loop挂载(镜像文件不可刻录就挂载使用)
,Loop 设备挂载是一种强大的虚拟化技术,允许将文件(如 ISO/VHD/IMG)直接挂载为磁盘,无需刻录到物理介质
工作流程:文件 → 映射为虚拟磁盘 → 挂载文件系统 → 访问内容# 创建挂载点 sudo mkdir /mnt/iso# 挂载 ISO sudo mount -o loop ubuntu-22.04.iso /mnt/iso# 验证 ls /mnt/iso # 查看内容
7.5 内存交换分区(swap)之创建7.5.1 使用物理分区创建内存交换分区
Swap 分区是物理内存(RAM)的扩展,当 RAM 不足时,系统会将不常用的内存页移动到 Swap 空间
术语
说明
推荐大小
物理内存 (RAM)
主内存,高速但有限
-
Swap 分区
磁盘上的虚拟内存空间
RAM ≤ 4GB: 2倍 RAM
RAM > 4GB: 等于 RAMSwap 文件
文件形式的虚拟内存
同上(分区替代方案)
完整创建流程(分区方案)
步骤1:准备分区
# 1. 查看磁盘分区 sudo fdisk -l# 2. 创建新分区(以 /dev/sdb 为例) sudo fdisk /dev/sdb
fdisk 操作:
n # 新建分区
p # 主分区
分区号: 回车默认
起始扇区: 回车默认
结束扇区: +8G # 创建8GB分区
t # 更改分区类型
选择分区号: 1
Hex代码: 82 # Linux swap类型
w # 保存退出
步骤2:格式化Swap分区# 格式化分区为 Swap sudo mkswap /dev/sdb1# 输出示例: Setting up swapspace version 1, size = 8 GiB (8589930496 bytes) no label, UUID=fd5b356a-1d5a-4a3e-8c1e-0b0a8d7c9f1b
步骤3:启用Swap
# 临时启用 sudo swapon /dev/sdb1# 验证 free -h # 输出:total used free shared buff/cache available Mem: 7.7Gi 1.2Gi 5.8Gi 10Mi 0.7Gi 6.2Gi Swap: 8.0Gi 0B 8.0Gi # 新增的Swap
步骤4:永久配置(开机自动启用)
# 获取分区UUID sudo blkid /dev/sdb1 # 输出:/dev/sdb1: UUID="fd5b356a-..." TYPE="swap"# 编辑fstab sudo nano /etc/fstab
步骤5:验证永久配置
# 禁用当前Swap sudo swapoff /dev/sdb1# 测试fstab配置 sudo swapon -a# 再次检查 free -h
7.5.2 使用文件创建内存交换文件
完整创建流程步骤1:创建Swap文件
# 创建 4GB Swap 文件(根据需求调整大小) sudo fallocate -l 4G /swapfile# 替代方法(如果 fallocate 不可用) sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
步骤2:设置权限
# 确保只有 root 可读写 sudo chmod 600 /swapfile
步骤3:格式化Swap
# 标记为 Swap 空间 sudo mkswap /swapfile# 输出示例: Setting up swapspace version 1, size = 4 GiB (4294963200 bytes) no label, UUID=fd5b356a-1d5a-4a3e-8c1e-0b0a8d7c9f1b
步骤4:启用Swap
# 激活 Swap 文件 sudo swapon /swapfile# 验证 free -h # 输出应显示新增 Swap:total used free shared buff/cache available Mem: 7.7Gi 1.2Gi 5.8Gi 10Mi 0.7Gi 6.2Gi Swap: 4.0Gi 0B 4.0Gi
步骤5:永久配置(开机自动启用)
# 编辑 fstab sudo nano /etc/fstab# 添加一行 /swapfile none swap sw 0 0
最佳实践检查清单
[ ] 使用
fallocate
或dd
创建文件[ ] 设置权限为
600
(chmod 600
)[ ] 使用
mkswap
正确格式化[ ] 通过
swapon
测试启用[ ] 添加到
/etc/fstab
实现开机挂载[ ] 根据硬件调整
swappiness
值[ ] 监控 Swap 使用情况 (
free -h
)
7.6 文件系统的特殊观察之创建7.6.1 磁盘空间之浪费问题
浪费原因
🧠 核心原理
常用解决命令
簇大小不当
文件系统按“簇”分配空间。1字节文件也占整个簇,余下空间他人无法使用。
mkfs.ext4 -b 4096 /dev/sdX1
(格式化时指定较小块大小)临时文件堆积
程序非正常退出或系统异常关机,导致临时文件(
.tmp
,~GRB*
)未被自动清除。
sudo rm -rf /tmp/*
(清理/tmp目录)find /var/tmp -type f -atime +7 -delete
(删除7天未访问的文件)磁盘碎片化
文件被分散存储在不连续的簇中,磁头寻道时间增加,且碎片本身占用空间。
针对ext4文件系统,常用
e4defrag
分区规划不合理
单个分区过大,导致簇大小相应变大,存小文件时空间浪费更显著。
使用LVM动态调整分区大小
隐藏系统文件
休眠文件(
hiberfil.sys
)、系统还原点、虚拟内存文件(swapfile
)等占用巨大空间。
sudo swapoff /swapfile && sudo rm /swapfile
(禁用并删除交换文件)sudo systemctl disable hibernation
(禁用休眠)日志文件失控
系统及应用日志(
/var/log/
)若未配置轮转策略,会无限增长。
sudo logrotate -f /etc/logrotate.conf
(强制日志轮转)sudo truncate -s 0 /var/log/some-large-log.log
(清空大日志文件)💾 理解空间分配原理
文件系统存储文件时,最小的分配单位是“簇”(在Linux中常称为“块”)。每个文件至少占用一个簇,即使它远小于簇的大小。例如,一个1KB的文件在4KB簇的文件系统中只占用1个簇,浪费3KB;但在64KB簇的系统里,会直接浪费63KB。现代文件系统(如ext4、XFS)会尝试将小文件的数据直接存储在inode中(内联数据),从而避免块分配开销。
🔍 查找磁盘空间去向
当发现空间不足时,别急着删文件,先搞清楚空间被谁占用了。
使用
df
和du
:快速查看磁盘总体使用情况。df -h
看每个挂载点的使用率;du -sh /*
查看根目录下各文件夹大小。推荐工具
ncdu
:一个强大的交互式磁盘分析工具。安装后执行ncdu /
,它会扫描并显示目录大小排序,直观找出“大户”。查找特定大文件:
find / -type f -size +100M
查找大于100MB的文件。🛠️ 优化与预防策略
解决空间浪费问题,预防比清理更重要。
合理规划分区与文件系统:为不同用途的数据选择合适的分区大小和文件系统。对于存放大规模小文件的场景,格式化时可指定较小的块大小(如
mkfs.ext4 -b 2048
)。考虑使用XFS文件系统,它在处理大文件和扩展性方面表现优异。配置日志轮转:确保
/etc/logrotate.conf
配置合理,控制日志文件大小和保存周期,避免日志膨胀。使用LVM动态管理:采用LVM管理磁盘,可以动态调整分区大小,灵活性远超传统固定分区。
定期清理:将清理工作加入日程,使用
find
命令或tmpwatch
等工具定期清理特定目录的缓存和临时文件。⚠️ 清理时的注意事项
清理磁盘时务必小心,避免误删重要数据。
谨慎操作:
rm -rf
命令一旦执行无法撤销。删除前可用ls
命令确认要删除的文件列表。备份重要数据:清理系统目录或日志前,最好先备份重要数据。
了解文件作用:不确定作用的文件不要轻易删除,先查询其用途
7.6.2 利用GNU的parted进行分区操作
支持 GPT 分区表和实时生效操作,比传统
fdisk
更强大
四.第八章:文件与文件系统的压缩
单一文件的压缩与解压
工具名称
常见扩展名
压缩比
速度
关键特性
gzip
.gz
中等
快
应用广泛,解压后不保留原文件
bzip2
.bz2
高
慢
比gzip压缩比高15%-25%,支持用
-k
保留原文件xz
.xz
最高
最慢
提供最佳的压缩率,支持用
-k
保留原文件tar
.tar
,.tar.gz
,.tar.xz
等-
-
打包工具,可将多个文件/目录合并,再调用其他工具压缩
zip
.zip
中等
中等
跨平台兼容性好,适合与Windows/macOS交换数据
gzip/gunzip命令bzip2/bunzip2命令gzip filename.txt # 压缩,生成 filename.txt.gz,默认不保留原文件 gunzip filename.txt.gz # 解压
xz/unxz命令bzip2 -k filename.txt # 压缩,生成 filename.txt.bz2,-k 选项保留原文件 bunzip2 filename.txt.bz2 # 解压
打包与解包目录(使用tar)xz -k filename.txt # 压缩,生成 filename.txt.xz,-k 选项保留原文件 unxz filename.txt.xz # 解压
tar
命令本身用于将多个文件或目录“打包”成一个单一文件(称为tarball),它通常与压缩工具联动,使用不同的参数来调用相应的压缩算法
打包并压缩tar -czvf archive.tar.gz /path/to/directory # 使用gzip压缩 (.tar.gz) tar -cjvf archive.tar.bz2 /path/to/directory # 使用bzip2压缩 (.tar.bz2) tar -cJvf archive.tar.xz /path/to/directory # 使用xz压缩 (.tar.xz)
-c
创建归档,-z
调用gzip,-j
调用bzip2,-J
调用xz,-v
显示过程,-f
指定文件名
解包并解压tar -czvf archive.tar.gz /path/to/directory # 使用gzip压缩 (.tar.gz) tar -cjvf archive.tar.bz2 /path/to/directory # 使用bzip2压缩 (.tar.bz2) tar -cJvf archive.tar.xz /path/to/directory # 使用xz压缩 (.tar.xz)
-x
解包,-C
可指定解压目标目录
查看压缩包内容:无需解压即可查看压缩文本文件的内容或tar包内的文件列表dd命令zcat filename.gz # 查看.gz文件内容 bzcat filename.bz2 # 查看.bz2文件内容 tar -tzf archive.tar.gz # 列出.tar.gz包内的文件列表
被称为"磁盘毁灭者"(Disk Destroyer)或"数据复制器"(Data Duplicator)。它直接操作原始字节流,绕过文件系统层,是系统管理员和恢复专家的核心工具
功能类别
命令示例
应用场景
磁盘克隆
dd if=/dev/sda of=/dev/sdb bs=4M status=progress
全盘备份/迁移
创建映像
dd if=/dev/sdc of=disk.img bs=1M conv=noerror,sync
取证备份
恢复映像
dd if=backup.img of=/dev/sdd bs=4M
系统部署
MBR操作
dd if=mbr.bak of=/dev/sda bs=512 count=1
引导修复
数据擦除
dd if=/dev/zero of=/dev/sdb bs=1M status=progress
安全销毁
文件操作
dd if=file.txt of=copy.txt bs=4096
低级复制
基础参数
场景1:全盘克隆(迁移系统)
参数
含义
示例
if=
输入文件(Input File)
if=/dev/sda
of=
输出文件(Output File)
of=backup.img
bs=
块大小(Block Size)
bs=4M
(4MB/块)
count=
复制块数
count=1000
(复制1000块)
skip=
跳过输入块
skip=1
(跳过第1块)
seek=
跳过输出块
seek=1
(从输出第2块开始)场景2:创建可启动USB# 克隆sda到sdb(需目标磁盘≥源盘) dd if=/dev/sda of=/dev/sdb bs=4M status=progress conv=noerror,sync# 压缩克隆(节省空间) dd if=/dev/sda bs=4M | gzip -c > sda.img.gz
场景3:恢复MBR引导扇区# 写入ISO到U盘(/dev/sdc为U盘) dd if=ubuntu.iso of=/dev/sdc bs=4M status=progress oflag=direct && sync
场景4:磁盘擦除(安全销毁)# 备份MBR(前512字节) dd if=/dev/sda of=mbr.bak bs=512 count=1# 恢复MBR dd if=mbr.bak of=/dev/sda bs=512 count=1
# 快速擦除(填充零) dd if=/dev/zero of=/dev/sdb bs=1M status=progress# 安全擦除(3次覆盖) dd if=/dev/urandom of=/dev/sdb bs=1M status=progress # 第一次 dd if=/dev/urandom of=/dev/sdb bs=1M status=progress # 第二次 dd if=/dev/zero of=/dev/sdb bs=1M status=progress # 第三次
场景5:文件切割与合并
永远在按下回车前确认# 分割大文件(每部分1GB) dd if=large_file.iso of=part_aa bs=1G count=1 dd if=large_file.iso of=part_ab bs=1G skip=1 count=1# 合并文件 cat part_* > restored.iso # 或使用dd dd if=part_aa of=restored.iso bs=1G dd if=part_ab of=restored.iso bs=1G seek=1
of=
参数!
cpio命令 处理特殊文件、精确文件选择和管道操作方面比tar
更灵活cpio 核心功能与模式
1. 创建归档 (cpio -o)
模式
选项
功能
经典应用场景
输出模式
-o
创建归档
备份系统文件
输入模式
-i
提取归档
恢复备份
传递模式
-p
复制文件
目录树迁移
列表模式
-t
查看内容
验证归档完整性
# 打包当前目录所有文件 find . -depth -print | cpio -ov > archive.cpio# 打包指定文件列表 ls file1.txt dir/ | cpio -ov > backup.cpio
参数解析:
2. 提取归档 (cpio -i)
-o
:输出模式(创建归档)
-v
:显示处理文件
-depth
:确保先处理子目录再父目录(避免权限问题)# 完全提取 cpio -iv < archive.cpio# 选择性提取 cpio -iv "*.txt" < archive.cpio # 仅txt文件 cpio -idv < archive.cpio # 自动创建目录
关键选项:
-i
:输入模式(提取)
-d
:自动创建目录
-u
:无条件覆盖
-m
:保留文件修改时间3. 目录复制 (cpio -p)
# 复制目录结构(保留属性) find source_dir -print | cpio -pdvm dest_dir
优势:比
cp -a
更精细的文件选择控制4. 查看归档内容 (cpio -t)
cpio -t < archive.cpio | less # 分页查看 cpio -tv < archive.cpio # 详细列表(类似ls -l)