Linux 文件系统基本管理
Linux 文件系统基本管理
识别文件系统和设备
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 命令
查看块设备使用情况
结果说明:
- NAME :块设备名。
- MAJ:MIN :主要(MAJ)和次要(MIN)设备号。
- RM :指明设备是否是可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
- SIZE :本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
- RO :该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
- TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
- MOUNTPOINT :本栏指出设备挂载的挂载点。
df 命令
查看文件系统使用情况。
[root@server ~ 15:06:12]# df -h |grep -v tmpfs
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 3.9G 47G 8% /
/dev/sda1 1014M 174M 841M 18% /boot
/dev/mapper/centos-home 146G 39M 146G 1% /home
[root@server ~ 15:06:28]# dd if=/dev/zero of=/usr/share/doc/dhclient-4.2.5/bigfile-4G bs=1M count=4096
记录了4096+0 的读入
记录了4096+0 的写出
4294967296字节(4.3 GB)已复制,15.7705 秒,272 MB/秒
[root@server ~ 15:30:23]# du -sk /* | sort -n#du 命令#查看目录和文件占用磁盘空间大小。
#查找根文件系统中哪个文件占用了大量空间。
[root@server ~ 15:39:11]# du -sk /usr/share/doc/dhclient-4.2.5/* | sort -n
4 /usr/share/doc/dhclient-4.2.5/dhclient6.conf.example
4 /usr/share/doc/dhclient-4.2.5/dhclient.conf.example
4 /usr/share/doc/dhclient-4.2.5/README.dhclient.d
4194304 /usr/share/doc/dhclient-4.2.5/bigfile-4G
[root@server ~ 15:39:32]# du -sk /usr/share/doc/dhclient-4.2.5/bigfile-4G/* | sort -n
du: 无法访问"/usr/share/doc/dhclient-4.2.5/bigfile-4G/*": 不是目录
[root@server ~ 15:39:49]# rm -f /usr/share/doc/dhclient-4.2.5/bigfile-4G
挂在和卸载文件系统
挂载文件系统
当需要适用文件系统的时候,通过mount命令挂载。
选项说明:
- -t vfstype,指明文件系统类型。
- -o options,指明挂载选项。
- device,指明要挂载的具有文件系统的设备,可以通过UUID=<uuid>、<device>、LABEL=<label>、PARTLABEL=<label>、PARTUUID=<uuid>等方式指明。例如,/dev/sdb,UUID=“f20547b2-df53-46e5-b526-a8744be26231” 。
- mountpoint,指明挂载点位置。
环境准备
#虚拟机添加一块硬盘/dev/sdb
[root@server ~ 15:41:30]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part ├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]└─centos-home 253:2 0 145.1G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 4.4G 0 rom
[root@server ~ 15:55:27]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=6553600 blks= sectsz=512 attr=2, projid32bit=1= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=26214400, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=12800, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@server ~ 15:57:08]# mkdir /data
[root@server ~ 15:57:17]# blkid
/dev/sr0: UUID="2022-07-26-15-09-17-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/sda1: UUID="e3a37c81-8ca2-4a41-90f6-0faf9a0eabf6" TYPE="xfs"
/dev/sda2: UUID="8xhET2-W85B-kLOd-4033-KP8r-MzaC-T7iY6I" TYPE="LVM2_member"
/dev/mapper/centos-root: UUID="7301bfef-5d2f-47c3-8b6a-4183150dcadc" TYPE="xfs"
/dev/mapper/centos-swap: UUID="5375244e-b52a-4c9c-829a-1e50026f5cda" TYPE="swap"
/dev/mapper/centos-home: UUID="d4a5174b-553d-40cf-b919-1f42877cc8d1" TYPE="xfs"
/dev/sdb: UUID="a08bc690-a813-451f-933c-91c75f2b3af1" TYPE="xfs"
[root@server ~ 15:57:24]# blkid /dev/sdb
/dev/sdb: UUID="a08bc690-a813-451f-933c-91c75f2b3af1" TYPE="xfs"
[root@server ~ 15:57:40]# mount /dev/sdb /data
[root@server ~ 15:57:53]# df -h /data
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb 100G 33M 100G 1% /data
卸载文件系统
当文件系统不使用的时候,通过 umount 命令卸载。
umount命令语法:
[root@server ~ 15:58:09]# umount /dev/sdb
[root@server ~ 16:26:21]# df -h /data
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 3.9G 47G 8% /
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@centos7 ~]# lsof /data
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1508 root cwd DIR 8,17 156 64 /data
查找系统中文件
locate
locate 命令根据文件名及其路径,在 mlocate 数据库中查找文件,并返回结果。数据库中存放文件和文件路径信息。
常规用户查找时,返回的结果仅包含用户有读取权限的目录树中匹配项。
查找文件前,需要root用户手动执行updatedb命令更新mlocate数据库。
常用选项:
- -b, --basename
- -i, --ignore-case
- -c, --count
- -r, --regexp
#查找文件前,需要root用户手动执行updatedb命令更新mlocate数据库。
[root@server ~ 17:17:59]# updatedb[root@server ~ 17:18:05]# yum install -y httpd
已加载插件:fastestmirror, langpacks
Determining fastest mirrors* base: mirrors.aliyun.com# 安装后,未跟新数据库,所以检索不到
[root@centos7 ~]# locate httpd.conf# 更新后查找
[root@server ~ 17:20:18]# locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf
[root@server ~ 17:20:19]# locate -b httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf
[root@server ~ 17:20:32]# locate -i PASSWD
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd[root@server ~ 17:21:54]# locate -i -c PASSWD
139[root@server ~ 17:22:03]# locate -r 'httpd.*conf'
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.modules.d
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/conf.d/README
find
find 命令在本地文件系统中执行实时查找文件。使用find命令的用户对文件夹必须有读取和执行权限。
- path,是查询路径,如果没有指定文件夹,将会查找当前目录及子目录。
- expression,是查询条件表达式。
- action,是找到文件后采取的动作。
根据文件 name 查找
[root@server ~ 17:24:42]# touch /etc/PASSWD
[root@server ~ 17:26:08]# find /etc/ -iname passwd
/etc/pam.d/passwd
/etc/passwd
/etc/PASSWD[root@server ~ 17:23:37]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd
[root@server ~ 17:23:52]# find /etc/ -name '*passwd*'
/etc/pam.d/passwd
/etc/passwd
/etc/security/opasswd
/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@server ~ 17:27:03]# find / -user yy
/dev/pts/0
/home/yy
/home/yy/.mozilla
/home/yy/.mozilla/extensions
/home/yy/.mozilla/plugins[root@server ~ 17:28:01]# find / -uid 1000
-group、-gid,属于特定组
[root@server ~ 17:28:01]# grep wheel /etc/group
wheel:x:10:
[root@server ~ 17:28:58]# find / -group wheel
[root@server ~ 17:30:08]# find / -gid 10-nouser,不属于任何用户;-nogroup,不属于任何组
[root@server ~ 17:30:33]# find / -nouser -o -nogroup
根据文件 perm 查找
# 准备文件
[root@server ~ 17:31:20]# mkdir lab
[root@server ~ 18:52:17]# cd lab
[root@server lab 18:52:21]# touch file-{1..3}
[root@server lab 18:52:38]# ls -l file*
-rw-r--r--. 1 root root 0 7月 31 18:52 file-1
-rw-r--r--. 1 root root 0 7月 31 18:52 file-2
-rw-r--r--. 1 root root 0 7月 31 18:52 file-3
[root@server lab 18:52:49]# chmod 764 file-1**-perm mode**,查找文件权限为mode的文件。
[root@server lab 18:53:22]# find -perm 764 | xargs ls -l
-rwxrw-r--. 1 root root 0 7月 31 18:52 ./file-1**-perm -mode**,例如:mode为764,则ugo必须同时满足的最小权限:user至少为7、group至少为6、other为4。
[root@server lab 18:53:46]# chmod 777 file-1
[root@server lab 18:54:43]# chmod 764 file-2
[root@server lab 18:54:54]# chmod 760 file-3
[root@server lab 18:55:05]# find . -perm -764 | xargs ls -l
-rwxrwxrwx. 1 root root 0 7月 31 18:52 ./file-1
-rwxrw-r--. 1 root root 0 7月 31 18:52 ./file-2
[root@server lab 18:55:34]# find / -perm -6000 2>/dev/null | xargs ls -l
-rwsr-sr-x. 1 abrt abrt 15344 10月 2 2020 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache**-perm /mode**,例如mode为764,则ugo只要有一个满足即可:user至少为7、group至少为6、other至少为4。
[root@server lab 18:59:29]# chmod a=- file-1
[root@server lab 19:00:24]# chmod uo=-,g=rwx file-2
[root@server lab 19:00:46]# chmod ug=-,o=r file-3
[root@server lab 19:01:03]# find . name 'file-*' -perm /764 |xargs ls -l
find: ‘name’: 没有那个文件或目录
find: ‘file-*’: 没有那个文件或目录
----rwx---. 1 root root 0 7月 31 18:52 ./file-2
-------r--. 1 root root 0 7月 31 18:52 ./file-3.:
总用量 0
----------. 1 root root 0 7月 31 18:52 file-1
----rwx---. 1 root root 0 7月 31 18:52 file-2
-------r--. 1 root root 0 7月 31 18:52 file-3# 查找系统中具有特殊权限的文件:suid、sgid、sticky
[root@server lab 19:01:47]# find / -perm /7000
/dev/mqueue
/dev/shm
/home/yy/.cache/gnome-control-center
find: ‘/proc/7902/task/7902/fd/5’: 没有那个文件或目录
find: ‘/proc/7902/task/7902/fdinfo/5’: 没有那个文件或目录
find: ‘/proc/7902/fd/6’: 没有那个文件或目录
# 查找系统中具有特殊权限的文件:suid或者sgid
[root@server lab 19:02:18]# find / -perm /6000
-readable -writable -executable,文件具有可读、可写、可执行。
根据文件 size 查找
单位 c(字节)、k(KiB)、M(MiB)、G(GiB)
# 大小等于10M
[root@server lab 19:03:12]# find -size 10M
# 大小大于10k
[root@server lab 19:05:44]# find -size +10k
根据文件 time 查找
- -amin, -cmin, -mmin 单位1分钟。
- -atime, -ctime, -mtime 单位24小时。
- -newer file,比file新的文件。
[root@server lab 19:08:29]# find -amin 10
[root@server lab 19:10:34]# find -amin +10
.
./file-1
./file-2
./file-3
[root@server lab 19:10:39]# find -amin -10
逻辑与: expr1 -a expr2 或者 expr1 expr2
[root@server ~ 19:15:28]# find . -name 'file-*' -perm /764
./lab/file-2
./lab/file-3逻辑或:expr1 -o expr2
[root@server ~ 19:15:50]# find / -nouser -o -nogroupfind: ‘/proc/8714/task/8714/fd/5’: 没有那个文件或目录
find: ‘/proc/8714/task/8714/fdinfo/5’: 没有那个文件或目录
find: ‘/proc/8714/fd/6’: 没有那个文件或目录
find: ‘/proc/8714/fdinfo/6’: 没有那个文件或目录
[root@server ~ 19:16:25]#
[root@server ~ 19:16:25]# find / -perm /7000
/dev/mqueue
/dev/shm
/home/yy/.cache/gnome-control-center
逻辑非:! expr
[root@server ~ 19:16:36]# find / ! -size -200M 2>/dev/null
/proc/kcore
/proc/8770/task/8770/fd/5
/proc/8770/task/8770/fdinfo/5
/proc/8770/fd/6
/proc/8770/fdinfo/6
-delete,查出找到的文件。
[root@server ~ 19:17:16]# find / -name PASSWD -delete
[root@server ~ 19:17:47]# find / -name PASSWD
-exec command ;,找到文件后,执行相应的command
[root@server ~ 19:17:53]# find /etc/ -name passwd -exec echo haha \;
haha
haha
-exec command {} ;,找到文件后,可以在命令中对文件操作
[root@server ~ 19:19:45]# find / -inum 67160130
/etc/fstab
# 将inode为67160130的所有文件复制到当前目录
[root@server ~ 19:21:11]# mkdir findfiles
[root@server ~ 19:21:18]# find / -inum 67160130 -exec cp -a {} ./findfiles \;
[root@server ~ 19:21:24]# ls findfiles/fstab
findfiles/fstab