[Linux] Linux文件系统基本管理

目录

识别文件系统和设备

[Linux 中设备](#Linux 中设备)

[Linux 文件系统](#Linux 文件系统)

查看设备和文件系统

lsblk命令

df命令

du命令

案例:查看根文件系统中哪个文件占用了最大空间

环境准备

查找过程

挂载和卸载文件系统

环境准备

挂载文件系统

卸载文件系统

卸载失败处理

[lsof 命令](#lsof 命令)

[fuser 命令](#fuser 命令)

[案例:Linux 挂载 NTFS 格式U盘](#案例:Linux 挂载 NTFS 格式U盘)

[案例:Linux 挂载 exfat 格式U盘](#案例:Linux 挂载 exfat 格式U盘)

[案例:构建基于 ISO 文件的yum仓库](#案例:构建基于 ISO 文件的yum仓库)

查找系统中文件

locate

find

[根据文件 name 查找](#根据文件 name 查找)

[根据文件 type 查找](#根据文件 type 查找)

[根据文件 owner 查找](#根据文件 owner 查找)

[根据文件 perm 查找](#根据文件 perm 查找)

[根据文件 size 查找](#根据文件 size 查找)

[根据文件 time 查找](#根据文件 time 查找)

[根据文件硬链接数和 inum 查找](#根据文件硬链接数和 inum 查找)

多条件表达式

action


识别文件系统和设备

Linux 中设备

在Linux中,对存储设备的访问由特殊类型文件-块设备(block)提供。挂载块设备前,必须先使用文件系统对其进行格式化。

块设备文件与其他的设备文件一起存储在/dev目录中。设备文件是由操作系统自动创建的。

常见的不同类型接口块设备:

  • 接口:SATA/SAS/USB/SCSI,名称:/dev/sda、/dev/sdb ...

  • 接口:virtio-blk,虚拟机磁盘,名称:/dev/vda、/dev/vdb ...

  • 接口:NVMe SSD,名称:/dev/nvme0n1、/dev/nvme1n1...

  • 接口:SD/MMC/eMMC,名称:/dev/mmcblk0,/dev/mmcblk1 ...

通常,不会将整个存储设备格式化为一个文件系统中,而是将硬盘驱动器划分为多个逻辑存储单元, 这些单元称为分区。各种分区使用不同的文件系统进行格式化或用于不同的用途。 例如,一个分区可以包含用户目录,而另一个分区可以包含系统数据和日志。 如果用户用数据填充主目录分区,则系统分区可能仍然有可用空间。

  • /dev/sda第一个分区为/dev/sda1,第二个分区为/dev/sda2,以此类推。

  • /dev/nvme0n1p1,/dev/nvme0n1p2

  • /dev/vda1,/dev/vda2

  • /dev/xvda1,/dev/xvda2

Linux 文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。

Linux服务器上的文件是按文件系统层次结构访问的。

管理文件系统需要:

  • 确定存储设备的空间使用情况以及文件系统层次结构中受影响的目录。

  • 存储设备发生故障,而您需要知道哪些文件系统存在风险。

要让文件系统的内容在文件系统层次结构中可用,必须将它挂载到一个空目录上,该目录被称为挂载点

查看设备和文件系统

lsblk命令

查看块设备使用情况

复制代码
lsblk
  • NAME:块设备名。

  • MAJ:MIN:主要(MAJ)和次要(MIN)设备号。

  • RM:指明设备是否是可移动设备。注意,在本例中设备sdb和srO的RM值等于1,这说明他们是可移动设备。

  • SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小298.1GB,而1K表明该设备大小为1KB。

  • RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。

  • TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,Sda和sdb是磁盘,而sr0是只读存储(rom)。

  • MOUNTPOINT:本栏指出设备挂载的挂载点。

df命令

查看文件系统使用情况

复制代码
df
复制代码
df -hT
#-h:友好显示单位。-T:显示文件系统类型

查看单个文件系统

复制代码
df -hT /boot

查看文件或目录存储在哪个设备

复制代码
df /tmp

du命令

查看目录和文件占用磁盘空间大小

复制代码
#查看/boot目录及其子目录占用空间
du /boot
复制代码
#只查看/boot目录占用大小
du -s /boot
#-h:人性化方式显示size

案例:查看根文件系统中哪个文件占用了最大空间

环境准备

创建一个大小为4GB的文件,用0填充该文件

复制代码
dd if=/dev/zero of=/usr/share/doc/bigfille-4G bs=1M count=4096
查找过程
复制代码
du -sk /* | sort -n

一个个目录查下去

复制代码
du -sk /usr/* | sort -n
复制代码
du -sk /usr/* | sort -n
du -sk /usr/share/* | sort -n
du -sk /usr/share/doc/* | sort -n

方法二:

复制代码
find / -size +100M 2>/dev/null

挂载和卸载文件系统

环境准备
复制代码
# 虚拟机添加一块硬盘/dev/sdb
[root@rocky8 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk 

# 格式化文件系统
[root@rocky8 ~]# mkfs.xfs /dev/sdb 
meta-data=/dev/sdb              isize=512    agcount=4, agsize=1310656 blks
        =                       sectsz=512   attr=2, projid32bit=1
        =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242624, imaxpct=25
        =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
        =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
挂载文件系统

当需要适用文件系统的时候,通过mount命令挂载。

mount 命令语法:

复制代码
mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint

选项说明:

  • -t vfstype,指明文件系统类型。

  • -o options,指明挂载选项。

  • device,指明要挂载的具有文件系统的设备,可以通过UUID=、、LABEL=、PARTLABEL=、PARTUUID=等方式指明。例如,/dev/sdb,UUID="f20547b2-df53-46e5-b526-a8744be26231" 。

  • mountpoint,指明挂载点位置。

    创建挂载点

    [root@rocky8 ~]# mkdir /data

    显示系统中所有文件系统

    [root@rocky8 ~]# blkid

    显示系统中特定文件系统

    [root@rocky8 ~]# blkid /dev/sdb
    /dev/sdb: UUID="f20547b2-df53-46e5-b526-a8744be26231" TYPE="xfs"

    挂载设备并验证

    [root@rocky8 ~]# mount /dev/sdb /data

    或者

    [root@rocky8 ~]# mount UUID="f20547b2-df53-46e5-b526-a8744be26231" /data

    验证

    [root@rocky8 ~]# df -h /data
    Filesystem     Size Used Avail Use% Mounted on
    /dev/sdb       20G   33M   20G   1% /data

    创建文件测试

    [root@rocky8 ~]# touch /data/file-{00..09}
    [root@rocky8 ~]# ls /data
    file-00 file-02 file-04 file-06 file-08
    file-01 file-03 file-05 file-07 file-09

查看系统当前所有挂载,可以看到挂载的详细信息。

复制代码
[root@rocky8 ~]# mount
......
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
......
# 括号中属性,是文件系统当前支持的功能。

[root@rocky8 ~]# mount |grep ^/dev
/dev/mapper/rl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
卸载文件系统

当文件系统不使用的时候,通过 umount 命令卸载。

umount命令语法:

复制代码
umount device | dir

可以通过指定设备或者挂载点,卸载文件系统。

示例:

复制代码
[root@rocky8 ~]# umount /dev/sdb
# 或者
[root@rocky8 ~]# umount /data
[root@rocky8 ~]# df -h /data
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/rl-root   50G  4.3G   46G   9% /
卸载失败处理
复制代码
[root@rocky8 ~]# mount /dev/sdb /data
[root@rocky8 ~]# cd /data
[root@rocky8 data]# ls
file-00  file-02  file-04  file-06  file-08
file-01  file-03  file-05  file-07  file-09

# 提示挂载点正在忙碌
[root@rocky8 data]# umount /dev/sdb
umount: /data: target is busy.
       (In some cases useful info about processes that use
        the device is found by lsof(8) or fuser(1))
lsof 命令

lsof,list open files,用于查看系统打开的文件。

lsof 命令语法:

复制代码
lsof [options] [names]

常用选项:

  • -i ,查看打开的 Internet 文件。例如 -i @10.1.8.20:22-i :80

  • -p pid,根据进程PID查找特定进程打开的文件。

  • -u uid,根据用户 uid查找特定用户打开的文件。

  • names,是文件或者文件系统设备。

    新开窗口查看哪个进程在使用挂载点

    [root@rocky8 ~]# lsof /data
    COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    bash    1508 root cwd   DIR   8,17      156   64 /data

fuser 命令

fuser,用于识别进程打开的文件。

fuser 命令语法:

复制代码
fuser [-fMuvw] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...

常用选项:

  • -k,杀死这些正在访问这些文件的进程。除非使用-signal修改信号,否则将发送SIGKILL信号。

  • -signal,指定发送的信号(signal 使用特定信号替换),缺省信号SIGKILL。

  • -i,交互模式杀死进程。

  • -l,列出所有已知的信号名称。

  • -m,列出文件系统被哪些程序使用。

  • -n,空间,选择不同的名字空间,可是file,udp,tcp。默认是file,也就是文件。

  • -4,仅查询IPV4套接字

  • -6,仅查询IPV6套接字。

  • -u,指定用户名。

    新开窗口查看哪个进程在使用挂载点

    [root@rocky8 ~]# fuser -m /data
    /data:               1508c

终止进程,再次卸载

复制代码
# 返回家目录,再次卸载
[root@rocky8 data]# cd 
[root@rocky8 ~]# umount /data
案例:Linux 挂载 NTFS 格式U盘

思路:默认情况下 Linux不识别NTFS格式文件系统,需要安装相应的模块进行识别。

  1. 安装 epel 仓库

  2. 安装 ntfs-3g (该软件包由epel仓库提供)

  3. 挂载

案例:Linux 挂载 exfat 格式U盘

思路:默认情况下 Linux 不识别 exfat 格式文件系统,需要安装相应的模块进行识别。

复制代码
# 安装软件
dnf install -y git pkg-config fuse-devel gcc make autoconf automake
git clone https://github.com/relan/exfat.git
cd exfat
autoreconf --install
./configure
make && make install

mount.exfat-fuse /dev/spec /mnt/exfat
案例:构建基于 ISO 文件的yum仓库

思路:

  1. 挂载 ISO 文件

  2. 创建仓库指向 ISO 文件中仓库

  3. 测试

    1. 挂载 ISO 文件

    [root@rocky8 ~]# mkdir /dvd
    [root@rocky8 ~]# mount /dev/sr0 /dvd
    mount: /dvd: WARNING: device write-protected, mounted read-only.

    2. 创建仓库指向 ISO 文件中仓库

    备份

    [root@rocky8 ~]# mkdir /etc/yum.repos.d/old
    [root@rocky8 ~]# mv /etc/yum.repos.d/*repo /etc/yum.repos.d/old

    [root@rocky8 ~]# cat << 'EOF' > /etc/yum.repos.d/dvd.repo
    [BaseOS]
    name=rocky 8 BaseOS from dvd
    baseurl=file:///dvd/BaseOS
    enable=1
    gpgcheck=0

    [AppStream]
    name=rocky 8 AppStream from dvd
    baseurl=file:///dvd/AppStream
    enable=1
    gpgcheck=0
    EOF

    3. 测试

    [root@rocky8 ~]# dnf repolist
    repo id                                   repo name
    AppStream                                 rocky 8 AppStream from dvd
    BaseOS                                   rocky 8 BaseOS from dvd
    [root@rocky8 ~]# dnf clean all
    35 files removed
    [root@rocky8 ~]# dnf makecache
    rocky 8 AppStream from dvd                      192 MB/s | 9.1 MB     00:00    
    rocky 8 BaseOS from dvd                         163 MB/s | 2.7 MB     00:00    
    Metadata cache created.

    安装软件包

    [root@rocky8 ~]# dnf install -y httpd

查找系统中文件

locate

locate 命令根据文件名及其路径,在 mlocate 数据库中查找文件,并返回结果。数据库中存放文件和文件路径信息。

常规用户查找时,返回的结果仅包含用户有读取权限的目录树中匹配项。

查找文件前,需要root用户手动执行updatedb命令更新mlocate数据库。

复制代码
[root@rocky8 ~]# updatedb

locate命令语法:

复制代码
locate [OPTION]... [PATTERN]...

常用选项:

  • -b, --basename

  • -i, --ignore-case

  • -c, --count

  • -r, --regexp

示例:

复制代码
[root@rocky8 ~]# yum install -y httpd
# 安装后,未跟新数据库,所以检索不到
[root@rocky8 ~]# locate httpd.conf

# 更新后查找
[root@rocky8 ~]# updatedb
[root@rocky8 ~]# locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf

# -b选项 查找
[root@rocky8 ~]# locate -b httpd

# 扩展
[root@rocky8 ~]# basename /usr/share/doc
doc
[root@rocky8 ~]# dirname /usr/share/doc
/usr/share

# -i选项 忽略大小写
[root@rocky8 ~]# locate PASSWD
/etc/PASSWD
[root@rocky8 ~]# locate -i PASSWD

# -c选项 返回找到的数量
[root@rocky8 ~]# locate -b -c PASSWD
34

# -r选项 正则表达式匹配查找
[root@rocky8 ~]# locate -r 'http.*conf'
find

find 命令在本地文件系统中执行实时查找文件。使用find命令的用户对文件夹必须有读取和执行权限。

语法:

复制代码
find [path] [expression] [action]
  • path,是查询路径,如果没有指定文件夹,将会查找当前目录及子目录。

  • expression,是查询条件表达式。

  • action,是找到文件后采取的动作。

根据文件 name 查找
复制代码
[root@rocky8 ~]# touch /etc/PASSWD

[root@rocky8 ~]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd

[root@rocky8 ~]# find /etc/ -name '*passwd*'
/etc/security/opasswd
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-

[root@rocky8 ~]# find /etc/ -iname passwd
/etc/pam.d/passwd
/etc/passwd
/etc/PASSWD
根据文件 type 查找

-type 根据文件类型查找,支持文件类型:

  • b,block (buffered) special。

  • c,character (unbuffered) special。

  • d,directory。

  • p,named pipe (FIFO)。

  • f,regular file。

  • l,symbolic link。

  • s,socket。

根据文件 owner 查找
  • -user、-uid,属于特定用户。

    [root@rocky8 ~]# id demisse
    uid=1000(demisse) gid=1000(demisse) groups=1000(demisse)
    [root@rocky8 ~]# find / -user demisse
    [root@rocky8 ~]# find / -uid 1000

  • -group、-gid,属于特定组

    [root@rocky8 ~]# grep wheel /etc/group
    wheel:x:10:
    [root@rocky8 ~]# find / -group wheel
    [root@rocky8 ~]# find / -gid 10

  • -nouser,不属于任何用户;-nogroup,不属于任何组

    查找系统中不属于任何用户或者不属于任何组的文件

    [root@rocky8 ~]# find / -nouser -o -nogroup

根据文件 perm 查找
复制代码
# 准备文件
[root@rocky8 ~]# mkdir lab
[root@rocky8 ~]# cd lab
[root@rocky8 lab]# touch file-{1..3}
[root@rocky8 lab]# ls -l file*
-rwxr--r--. 1 root root 0 Dec 24 20:28 file-1
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-2
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-3
  • -perm mode,查找文件权限为mode的文件。

    [root@rocky8 lab]# chmod 764 file-1

    查找文件权限为764的文件

    [root@rocky8 lab]# find -perm 764 | xargs ls -l
    -rwxrw-r--. 1 root root 0 Dec 24 20:28 ./file-1

  • -perm -mode,例如:mode为764,则ugo必须同时满足的最小权限:user至少为7、group至少为6、other为4。

    [root@rocky8 lab]# chmod 777 file-1
    [root@rocky8 lab]# chmod 764 file-2
    [root@rocky8 lab]# chmod 760 file-3
    [root@rocky8 lab]# find . -perm -764 | xargs ls -l
    -rwxrwxrwx. 1 root root 0 Dec 24 20:28 ./file-1
    -rwxrw-r--. 1 root root 0 Dec 24 20:28 ./file-2

    0作为通配符,表示不匹配对应权限位。

    查找系统中具有suid权限的文件

    [root@rocky8 lab]# find / -perm -4000

    查找系统中同时具有特殊权限的文件:suid和sgid

    [root@rocky8 lab]# find / -perm -6000 2>/dev/null |xargs ls -l
    -rwsr-sr-x. 1 abrt abrt 15344 Oct  2  2020 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

  • -perm /mode,例如mode为764,则ugo只要有一个满足即可:user至少为7、group至少为6、other至少为4。

    [root@rocky8 lab]# chmod a=- file-1
    [root@rocky8 lab]# chmod uo=-,g=rwx file-2
    [root@rocky8 lab]# chmod ug=-,o=r file-3

    [root@rocky8 lab]# find . -name 'file-*' -perm /764| xargs ls -l
    ----rwx---. 1 root root 0 Dec 24 20:28 ./file-2
    -------r--. 1 root root 0 Dec 24 20:28 ./file-3

    查找系统中具有特殊权限的文件:suid、sgid、sticky

    [root@rocky8 lab]# find / -perm /7000

    查找系统中具有特殊权限的文件:suid或者sgid

    [root@rocky8 lab]# find / -perm /6000

  • -readable -writable -executable,文件具有可读、可写、可执行。

根据文件 size 查找

单位 c(字节)、k(KiB)、M(MiB)、G(GiB)

复制代码
# 大小等于10M
[root@rocky8 ~]# find -size 10M

# 大小大于10G
[root@rocky8 ~]# find -size +10G

# 大小小于10k
[root@rocky8 ~]# find -size -10k

# 大小等于1M
[root@rocky8 ~]# find -size 1M
# 注意:size会取整为1个单位,所以find -size 1M结果包含小于1M的文件。
# 可以使用1024k取代1M
[root@rocky8 ~]# find -size 1024k
根据文件 time 查找
  • -amin, -cmin, -mmin 单位1分钟。

  • -atime, -ctime, -mtime 单位24小时。

  • -newer file,比file新的文件。

    10分钟前(正好10分钟)

    [root@rocky8 ~]# find -amin 10

    10分钟以前(大于10分钟)

    [root@rocky8 ~]# find -amin +10

    10分钟以内(小于10分钟)

    [root@rocky8 ~]# find -amin -10

根据文件硬链接数和 inum 查找
复制代码
# 硬链接数等于、大于、小于3的文件
[root@rocky8 ~]# find -links 3
[root@rocky8 ~]# find -links +3
[root@rocky8 ~]# find -links -3

# inode为67160130的文件
[root@rocky8 ~]# ls -i /etc/fstab
67160130 /etc/fstab
[root@rocky8 ~]# find / -inum 67160130| xargs ls -i
67160130 /etc/fstab
多条件表达式
  • 逻辑与: expr1 -a expr2 或者 expr1 expr2

    [root@rocky8 lab]# find . -name 'file-*' -perm /764

  • 逻辑或:expr1 -o expr2

    查找系统中不属于任何用户或者不属于任何组的文件

    [root@rocky8 ~]# find / -nouser -o -nogroup

    例如

    [root@rocky8 ~]# find / -perm /7000

    等效与

    [root@rocky8 ~]# find / -perm -4000 -o -perm -2000 -o -perm -1000

  • 逻辑非:! expr

    [root@rocky8 ~]# find / ! -size -200M 2>/dev/null
    /proc/kcore
    /proc/59432/task/59432/fd/5
    /proc/59432/task/59432/fdinfo/5
    /proc/59432/fd/6
    /proc/59432/fdinfo/6
    [root@rocky8 ~]# ls -lh /proc/kcore
    -r--------. 1 root root 128T Dec 24 22:00 /proc/kcore

action
  • -delete,查出找到的文件。

    [root@rocky8 ~]# find / -name PASSWD
    /etc/PASSWD

    [root@rocky8 ~]# find / -name PASSWD -delete
    [root@rocky8 ~]# find / -name PASSWD

  • -ls ,相当于 ls -dils 查看找到的文件。

    [root@rocky8 ~]# find /etc/ -name passwd
    /etc/pam.d/passwd
    /etc/passwd

    [root@rocky8 ~]# find /etc/ -name passwd -ls
    67584593    4 -rw-r--r--   1 root     root          188 Apr  1  2020 /etc/pam.d/passwd
    69030856    4 -rw-r--r--   1 root     root         2315 Dec 24 19:59 /etc/passwd

  • -exec command \;,找到文件后,执行相应的command。

    [root@rocky8 ~]# find /etc/ -name passwd -exec echo haha ;
    haha
    haha

  • -exec command {} \;,找到文件后,可以在命令中对文件操作。

    [root@rocky8 ~]# find / -inum 67160130
    /etc/fstab

    将inode为67160130的所有文件复制到当前目录

    [root@rocky8 ~]# mkdir findfiles
    [root@rocky8 ~]# find / -inum 67160130 -exec cp -a {} ./findfiles ;
    [root@rocky8 ~]# ls findfiles/fstab
    fstab

相关推荐
2401_8884230917 分钟前
Linux软件编程-线程(2)
linux
共享家95271 小时前
linux-数据链路层
linux·网络·macos
BAOYUCompany2 小时前
暴雨服务器:以定制化满足算力需求多样化
运维·服务器
小米里的大麦3 小时前
025 理解文件系统
linux
青岛佰优联创新科技有限公司3 小时前
移动板房的网络化建设
服务器·人工智能·云计算·智慧城市
打不了嗝 ᥬ᭄4 小时前
Linux 信号
linux·开发语言·c++·算法
禁默4 小时前
进程替换:从 “改头换面” 到程序加载的底层逻辑
linux·运维·服务器
gameatp4 小时前
从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)
linux·服务器·windows
一匹电信狗4 小时前
【C++】异常详解(万字解读)
服务器·c++·算法·leetcode·小程序·stl·visual studio