当前位置: 首页 > news >正文

鸟哥的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:1

chmod 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 首字符)

主要特点 / 用途

常见示例

​普通文件​

-

存储普通数据,如文本、程序代码、二进制可执行文件等

.bashrccat命令文件

​目录文件​

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​

基础命令(单用户模式可用)

lscpbash

​/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​

存放​​所有用户​​都需要使用的​​基础命令​​(二进制文件),这些命令在单用户维护模式时也可能需要用到。

lscpcatbash

​/etc​

存放​​系统和应用程序的配置文件​​,一般为文本文件。这是系统管理员最常打交道的目录之一。

/etc/passwd(用户账户信息),/etc/hostname(主机名)

​/home​

​普通用户的主目录​​所在地。每个用户通常在此拥有一个以自己用户名命名的子目录,用于存放个人文件、邮件、配置等。

/home/alice/home/bob

​/root​

​系统管理员(root 用户)的主目录​​。注意它不在 /home下,以便在 /home独立分区或无法挂载时,root 用户仍能登录进行系统维护。

root 用户的个人配置和文件

​/usr​

存放​​用户安装的应用程序和只读共享资源​​,结构类似根目录,但不是系统启动所必需。

  ↳ /usr/bin

绝大多数​​用户命令​​的可执行文件。

pythonvim

  ↳ /usr/lib

应用程序所需的​​共享库文件​​。

  ↳ /usr/local

​系统管理员手动编译安装的软件​​通常放在这里,以避免与包管理器安装的软件冲突。

  ↳ /usr/share

​架构无关的共享数据​​,如文档、字体、图标等。

​/var​

存放​​经常变化(Variable)的数据​​,如日志、缓存、邮件等。

  ↳ /var/log

​系统和应用程序的日志文件​​,是排查问题的重要依据。

syslogauth.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
当你在终端输入命令(如 lspython)时,系统会按照 $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)​

读取文件内容(如 catless)

-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

​底层步骤​​:

  1. 在根目录/中找到home的Inode号(挂载点,权限rx)

  2. 读取home的Inode,获取数据块位置

  3. home的数据块中找到user的Inode号

  4. 读取user的Inode,获取数据块位置(权限rx)

  5. user的数据块中找到test.txt的Inode号

  6. 读取test.txt的Inode,获取文件权限和大小

  7. 根据Inode中的数据块指针,读取文件内容


7.1.5        ext4文件的存取与日志式文件系统的功能
Ext4文件系统通过其​​日志功能(Journaling)​​ 和​​先进的存取机制​​,在保证数据可靠性的同时,显著提升了性能。

特性分类

核心机制

主要特点 / 受益

​数据存取优化​

​Extents(区段)​

将连续的数据块作为一个整体管理,极大减少元数据开销,提升大文件读写效率。

​多块分配器​

一次性分配多个数据块,减少分配次数,改善写入性能。

​延迟分配​

数据在内存中整合后再决定磁盘位置,优化分配布局,减少碎片。

​日志模式​

data=journal

日志记录文件和元数据的所有更改,安全性最高,但性能开销最大。

data=ordered(默认)​

仅日志记录元数据更改,但保证数据先于元数据写入磁盘,安全与性能的平衡点。

data=writeback

仅日志记录元数据更改,且不保证数据写入顺序,性能最高,但安全性最低。

​可靠性保障​

​日志校验和​

检测日志本身的损坏,增强恢复过程的可靠性。

​快速文件系统检查(fsck)​

跳过未使用的inode,使系统崩溃后的检查恢复速度大幅提升。


7.1.6        Linux文件系统的运行



挂载点  一定是目录,该目录为进入文件系统的入口

1. 虚拟文件系统(VFS)​

VFS 是内核提供的​​抽象层​​,为所有文件系统提供统一接口。

​作用​​:

  • 为应用程序提供一致的 API(openreadwriteclose

  • 屏蔽不同文件系统的实现差异

  • 管理文件系统挂载点

​示例​​:同样的 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: 等于 RAM

​Swap 文件​

文件形式的虚拟内存

同上(分区替代方案)

完整创建流程(分区方案)

步骤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

最佳实践检查清单

  1. [ ] 使用 fallocate或 dd创建文件

  2. [ ] 设置权限为 600(chmod 600)

  3. [ ] 使用 mkswap正确格式化

  4. [ ] 通过 swapon测试启用

  5. [ ] 添加到 /etc/fstab实现开机挂载

  6. [ ] 根据硬件调整 swappiness

  7. [ ] 监控 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命令
gzip filename.txt       # 压缩,生成 filename.txt.gz,默认不保留原文件
gunzip filename.txt.gz  # 解压
        bzip2/bunzip2命令
bzip2 -k filename.txt    # 压缩,生成 filename.txt.bz2,-k 选项保留原文件
bunzip2 filename.txt.bz2 # 解压
        xz/unxz命令
xz -k filename.txt       # 压缩,生成 filename.txt.xz,-k 选项保留原文件
unxz filename.txt.xz      # 解压
        ​​打包与解包目录(使用tar)​
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包内的文件列表
zcat filename.gz        # 查看.gz文件内容
bzcat filename.bz2      # 查看.bz2文件内容
tar -tzf archive.tar.gz # 列出.tar.gz包内的文件列表
dd命令    
被称为"磁盘毁灭者"(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

低级复制

基础参数​

​参数​

​含义​

​示例​

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块开始)

​场景1:全盘克隆(迁移系统)
# 克隆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
场景2:创建可启动USB​
# 写入ISO到U盘(/dev/sdc为U盘)
dd if=ubuntu.iso of=/dev/sdc bs=4M status=progress oflag=direct && sync
场景3:恢复MBR引导扇区​
# 备份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
场景4:磁盘擦除(安全销毁)
# 快速擦除(填充零)
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 核心功能与模式​

​模式​

​选项​

​功能​

​经典应用场景​

​输出模式​

-o

创建归档

备份系统文件

​输入模式​

-i

提取归档

恢复备份

​传递模式​

-p

复制文件

目录树迁移

​列表模式​

-t

查看内容

验证归档完整性

1. 创建归档 (cpio -o)​
# 打包当前目录所有文件
find . -depth -print | cpio -ov > archive.cpio# 打包指定文件列表
ls file1.txt dir/ | cpio -ov > backup.cpio

参数解析​​:

  • -o:输出模式(创建归档)

  • -v:显示处理文件

  • -depth:确保先处理子目录再父目录(避免权限问题)

​2. 提取归档 (cpio -i)​
# 完全提取
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)

http://www.dtcms.com/a/451186.html

相关文章:

  • 广元做网站的公司建材团购网站建设方案
  • 做网站所需的知识技能家装用什么软件设计
  • 网站建设营销怎么做网站建设属于广告费吗
  • 2025-10-06 Python不基础 16——__slots__
  • 光通信|矢量光的全双工复用通信
  • 胡恩全10.6作业
  • 青岛免费网站建站模板行政审批局政务服务网站建设情况
  • 网站建设实例大制作做暖网站
  • 小程序怎么制作网站专业建站公司的业务内容
  • 杭州住房和城乡建设部网站佛山新网站制作公司
  • 照片书哪个网站做的好wordpress 模版定制
  • 个人网站图片加载慢出售全国精准客户电话号码
  • 哪个老师设计的数字化转型培训方案更专业
  • 广州网站优化软件周末游做的好的网站
  • phpcms wap网站搭建网站建设 外文文献
  • Linux - 进程 #概念 #操作 #进程状态 #进程优先级 #进程切换 #竞争、独立、并行、并发
  • 沈阳企业自助建站齐齐哈尔建设局网站
  • 美颜秘籍网站建设网站建设公司广告词
  • 太仓市住房和城乡建设局规网站高端网站设计地址
  • 网站模版更新公告北京南站核酸检测地点
  • 网站建设业务提成哪里购买网站空间好
  • 行业网站开发程序洛阳市新区建设投资有限公司网站
  • 温州网站优化排名十档行情免费网站
  • 济南建网站最好的智能手机网站开发
  • 网站定制公司哪家好暴雪被谁收购了
  • wordpress开放多站点办网站租服务器
  • GESP2025年9月认证C++二级( 第三部分编程题(1)优美的数字)
  • 永兴县网站建设蒙牛网站是谁做的
  • react学习——react-redux
  • 国内ui设计公司seo入门视频