目錄
識別文件系統和設備
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