目录
识别文件系统和设备
Linux 中设备
Linux 文件系统
查看设备和文件系统
lsblk命令
df命令
du命令
案例:查看根文件系统中哪个文件占用了最大空间
环境准备
查找过程
挂载和卸载文件系统
环境准备
挂载文件系统
卸载文件系统
卸载失败处理
lsof 命令
fuser 命令
案例:Linux 挂载 NTFS 格式U盘
案例:Linux 挂载 exfat 格式U盘
案例:构建基于 ISO 文件的yum仓库
查找系统中文件
locate
find
根据文件 name 查找
根据文件 type 查找
根据文件 owner 查找
根据文件 perm 查找
根据文件 size 查找
根据文件 time 查找
根据文件硬链接数和 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 usethe 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格式文件系统,需要安装相应的模块进行识别。
-
安装 epel 仓库
-
安装 ntfs-3g (该软件包由epel仓库提供)
-
挂载
案例: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 installmount.exfat-fuse /dev/spec /mnt/exfat
案例:构建基于 ISO 文件的yum仓库
思路:
-
挂载 ISO 文件
-
创建仓库指向 ISO 文件中仓库
-
测试
# 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