文件系统进阶

5. 文件系统进阶

5.1 更多文件类型

Linux系统是以文件的形式来进行管理的。Linux系统主要根据文件头信息来判断文件类型,扩展名并非决定因素。

Linux文件类型常见的有:目录、普通文件、字符设备文件、块设备文件、符号链接文件等。普通文件和目录我们前面已经介绍过了,下面重点介绍一下设备文件b&c 和 链接文件l

先看一个例子:使用ls -l 查看目录详细信息,得到截图如下:

img

共显示了七列信息,从左至右依次为:权限、文件数、归属用户、归属群组、文件大小、创建日期、文件名称

其中第一组只有一个字符,代表了文件类型,可能是下面的某一个:

  • d 目录
  • -普通文件
  • l 链接文件
  • b 块设备文件
  • c 字符设备文件
  • p 管道文件
  • s 套接字文件

5.1.1 设备文件

  1. 设备文件一般存放在/dev目录下,dev是设备(device)的英文缩写

    • /dev这个目录对所有的用户都十分重要,因为在这个目录中包含了所有Linux系统中使用的外部设备。
    • 但是这里并不是放的外部设备的驱动程序,这一点和Windows操作系统不一样,它实际上是一个访问这些外部设备的端口
    • 我们可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。
    • Linux将所有设备认成是一个文件。
  2. 设备文件分为两种:

    • 块设备文件(b):一般指硬盘、软盘等设备。

      使用 ls -l 命令查看,块设备文件的第一个字符是 "b"(block),追加-F后,名字后面无变化,如下:

      在这里插入图片描述
    • 字符设备文件(c):字符终端、串口和键盘等就是字符设备。

      • 字符设备文件以字节流的方式进行访问,由字符设备驱动程序来实现这种特性,这通常要用到 open、close、read、write 等系统调用。
      • 另外,由于字符设备文件是以文件流的方式进行访问的,因此可以顺序读取,但通常不支持随机存取。
      • 使用 ls -l 命令查看,字符设备文件的第一个字符是 “c”(char)。

5.1.2 链接文件

Linux链接分两种:

  • 一种被称为硬链接(Hard Link)【默认情况下,ln命令产生硬链接。】
  • 另一种被称为符号链接(Symbolic Link)
  1. 硬连接

    硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode, Index node)。

    在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。

    硬连接的作用是:允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接,只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

    #使用命令格式:
    ln 源文件或目录  目标文件或目录
    
  2. 软连接

    另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

    #使用命令格式:
    ln -s 源文件或目录  目标文件或目录
    
  3. 区别:

    [tianjunfeng@Linux]$ touch f1   #创建一个测试文件f1
    [tianjunfeng@Linux]$ ln f1 f2   #创建f1的一个硬连接文件f2
    [tianjunfeng@Linux]$ ln -s f1 f3 #创建f1的一个符号连接文件f3
    [tianjunfeng@Linux]$ ls -li # -i参数显示文件的inode节点信息
    total 0
    9797648 -rw-r--r-- 2 tianjunfeng oinstall 0 Apr 21 08:11 f1
    9797648 -rw-r--r-- 2 tianjunfeng oinstall 0 Apr 21 08:11 f2
    9797649 lrwxrwxrwx 1 tianjunfeng oinstall 2 Apr 21 08:11 f3 -> f1
    

    从上面的结果中可以看出:

    • 硬连接文件f2与原文件f1的inode节点相同,均为9797648
    • 然而符号连接文件的inode节点不同。
    [tianjunfeng@Linux]$ echo "I am f1 file" >>f1
    [tianjunfeng@Linux]$ cat f1
    I am f1 file
    
    [tianjunfeng@Linux]$ cat f2
    I am f1 file
    
    [tianjunfeng@Linux]$ cat f3
    I am f1 file
    
    [tianjunfeng@Linux]$ rm -f f1
    
    [tianjunfeng@Linux]$ cat f2
    I am f1 file
    [tianjunfeng@Linux]$ cat f3
    cat: f3: No such file or directory
    

    通过上面的测试可以看出:

    • 当删除原始文件f1后,硬连接f2不受影响,
    • 但是符号连接f3文件无效。

5.2 磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题。

Linux磁盘管理常用三个命令为 df、du 和 fdisk。

  • df :列出文件系统的整体磁盘使用量
  • du:检查磁盘空间使用量

5.2.1 df

df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

#语法:
df [-ahikHTm] [目录或文件名]

选项与参数:

  • -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统
  • -k :以 KBytes 的容量显示各文件系统;
  • -m :以 MBytes 的容量显示各文件系统;
  • -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
  • -H :以 M=1000K 取代 M=1024K 的进位方式;
  • -T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
  • -i :不用硬盘容量,而以 inode 的数量来显示

示例:

# 将系统内所有的文件系统列出来!
# 在 Linux 底下如果 df 没有加任何选项
# 那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来!
[root@kuangshen /]# df
Filesystem 	1K-blocks 	Used 	Available 	Use% 	Mounted on
devtmpfs 	889100 		0 		889100 		0% 		/dev
tmpfs 		899460 		704 	898756 		1% 		/dev/shm
tmpfs 		899460 		496 	898964 		1% 		/run
tmpfs 		899460 		0 		899460 		0% 		/sys/fs/cgroup
/dev/vda1 	41152812 	6586736 32662368 	17% 	/
tmpfs 		179896 		0 		179896 		0% 		/run/user/0

# 将容量结果以易读的容量格式显示出来
[root@kuangshen /]# df -h
Filesystem 	Size 	Used 	Avail 	Use% 	Mounted on
devtmpfs 	869M 	0 		869M 	0% 		/dev
tmpfs 		879M 	708K 	878M 	1% 			/dev/shm
tmpfs 		879M 	496K 	878M 	1% 		/run
tmpfs 		879M 	0 		879M 	0% 		/sys/fs/cgroup
/dev/vda1 	40G 	6.3G 	32G 	17% 	/
tmpfs 		176M 	0 		176M 	0% 		/run/user/0

# 将系统内的所有特殊文件格式及名称都列出来
[root@kuangshen /]# df -aT
Filesystem 	Type 	1K-blocks 	Used 	Available 	Use% 	Mounted on
sysfs 		sysfs 		0 		0 			0 		- 		/sys
proc 		proc 		0 		0 			0 		- 		/proc
devtmpfs 	devtmpfs 	889100 	0 		889100 		0% 		/dev
securityfs 	securityfs 	0 		0 		0 			- 		/sys/kernel/security
tmpfs 		tmpfs 		899460 			708 		898752 		1% 		/dev/shm
devpts 		devpts 		0 		0 		0 			- 		/dev/pts
tmpfs 		tmpfs 		899460 	496 	898964 		1% 		/run
tmpfs 		tmpfs 		899460 	0 		899460 		0% 		/sys/fs/cgroup
cgroup 		cgroup 		0 		0 		0 			- 		/sys/fs/cgroup/systemd
pstore 		pstore 		0 		0 		0 			- 		/sys/fs/pstore
cgroup 		cgroup 		0 		0 		0 			- 		/sys/fs/cgroup/freezer
cgroup 		cgroup 		0 		0 		0 			- 		/sys/fs/cgroup/cpuset
...

# 将 /etc 底下的可用的磁盘容量以易读的容量格式显示
[root@kuangshen /]# df -h /etc
Filesystem 	Size 	Used 	Avail 	Use% 	Mounted on
/dev/vda1 	40G 	6.3G 	32G 	17% 	/

5.2.2 du

Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的

  • 与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据
#语法:
du [-ahskm] 文件或目录名称

#可以用通配符 * 来代表每个目录。

选项与参数:

  • -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
  • -h :以人们较易读的容量格式 (G/M) 显示;
  • -s :列出总量而已,而不列出每个各别的目录占用容量;
  • -S :不包括子目录下的总计,与 -s 有点差别。
  • -k :以 KBytes 列出容量显示;
  • -m :以 MBytes 列出容量显示;
# 只列出当前目录下的所有文件夹容量(包括隐藏文件夹):
# 直接输入 du 没有加任何选项时,则 du 会分析当前所在目录的文件与目录所占用的硬盘空间。
[root@kuangshen home]# du
16 ./redis
8 ./www/.oracle_jre_usage # 包括隐藏文件的目录
24 ./www
48 . # 这个目录(.)所占用的总量

# 将文件的容量也列出来
[root@kuangshen home]# du -a
4 ./redis/.bash_profile
4 ./redis/.bash_logout
....中间省略....
4 ./kuangstudy.txt # 有文件的列表了
48 .

# 检查根目录底下每个目录所占用的容量
[root@kuangshen home]# du -sm /*
0 /bin
146 /boot
#.....中间省略....
0 /proc
#.....中间省略....
1 /tmp
3026 /usr # 系统初期最大就是他了啦!
513 /var
2666 /www

5.2.3 磁盘挂载与卸除

Linux 的磁盘挂载使用 mount 命令,卸载使用 umount 命令。

  1. 磁盘挂载

    #语法:
    mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n] 装置文件名 挂载点
    
    #示例:
    # 将 /dev/hdc6 挂载到 /mnt/hdc6 上面!
    [root@www ~]# mkdir /mnt/hdc6
    [root@www ~]# mount /dev/hdc6 /mnt/hdc6
    [root@www ~]# df
    Filesystem 	1K-blocks 	Used 	Available 	Use% 	Mounted on
    /dev/hdc6 	1976312 	42072 	1833836 	3% 		/mnt/hdc6
    
  2. 卸载

    #语法:
    umount [-fn] 装置文件名或挂载点
    
    #选项与参数:
    #	-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
    #	-n :不升级 /etc/mtab 情况下卸除。
    
    #示例:
    [root@www ~]# umount /dev/hdc6
    

5.3 挂载文件系统

linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。这里所说的“按一定方式”就是指的挂载。

  • 将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。
  • 把该子目录称为挂载点。
  • 注意两点:
    • 挂载点必须是一个目录
    • 一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。对于其他操作系统建立的文件系统的挂载也是这样。

5.3.1 mount命令

挂载时使用mount命令,格式如下:

mount [-参数]  [设备名称]   [挂载点]

其中常用的参数有:

  • -t 指定设备的文件系统类型,常见的有:
    • minix linux最早使用的文件系统
    • ext2 linux目前常用的文件系统
    • msdos MS-DOS的fat,就是fat16
    • vfat windows98常用的fat32
    • nfs 网络文件系统
    • iso9660 CD-ROM光盘标准文件系统
    • ntfs windows NT 2000的文件系统
    • hpfs OS/2文件系统
    • auto 自动检测文件系统
  • -o 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。常用的有
    • codepage=XXX 代码页
    • iocharset=XXX 字符集
    • ro 以只读方式挂载
    • rw 以读写方式挂载
    • nouser 使一般用户无法挂载
    • user 可以让一般用户挂载设备

5.3.2 建立挂载

提醒一下,mount命令没有建立挂载点的功能,因此你应该确保执行mount命令时,挂载点已经存在。

(1) 如何查询挂载点

  1. 查看磁盘信息:

    fdisk -l
    
    image-20240616140638505

    可以看出:

    • /dev/sda已经分区:/dev/sda下面有/dev/sda1 /dev/sda2,已经分区
    • /dev/sdb还没分区:而/dev/sdb是没有的,就是我们操作的目标
  2. 磁盘分区:分区有主分区,扩展分区,逻辑分区

     fdisk  磁盘
     #例如:
     fdisk  /dev/sdb
    
    image-20240616140811814

    上图的大概意思是这样的:

    • n:添加一个分区
    • P:主分区
    • 两个回车指是开始和结束的磁盘扇区大小;
    • w:写入磁盘

    我们再次查看磁盘,刚刚创建的分区:【注意:此时磁盘虽然已经分区,但是还没有文件系统,磁盘依然不能用】

    image-20240616140909794
  3. 查看系统磁盘格式

    df -hT
    
    image-20240616141030934
  4. 格式化磁盘分区:可以选择 ext3 或者 ext4 的系统格式,也可以选择根目录同样的磁盘文件格式xfs

     mkfs.磁盘格式  -f 分区位置
     #例如:
     mkfs.xfs /dev/sdb1
    

(2) 如何建立挂载点

  1. 创建挂载目录

    mkdir /opt/data
    
    mount 分区位置 需要挂载目录
    #例如:
    mount /dev/sdb1  /opt/data
    
  2. 查看挂载:

    image-20240616141315126
  3. 设置开机自动挂载

    #编辑文件/etc/fstab
    vim /etc/fstab
    
    #在最后一行添加如下代码,注意xfs换成你自己格式化的格式
    #分区位置  挂载目录 磁盘格式  defaults 0 1
    /dev/sdb1 	/opt/data 	xfs 	defaults 0 1
    
  4. 卸载已挂载的硬盘

    umount /挂载得目录
    

5.3.3 自动挂载

每次开机时,Linux自动将需要挂载的挂载上了,在/etc目录下有个fstab文件,它里面列出了linux开机时自动挂载的文件系统的列表。

在/etc/fstab文件里:

  • 第一列是挂载的文件系统的设备名,
  • 第二列是挂载点,
  • 第三列是挂载的文件系统类型,
  • 第四列是挂载的选项,选项间用逗号分隔。
#/etc/fstab文件例子如下:
/dev/hda2   /     		ext3   	defaults 1 1
/dev/hda1   /boot 		ext3   	defaults 1 2

none 		/dev/pts 	devpts 	gid=5,mode=620 0 0
none 		/proc 		proc 	defaults 0 0
none 		/dev/shm 	tmpfs 	defaults 0 0

/dev/hda3 	swap 		swap 	defaults 0 0
/dev/cdrom 	/mnt/cdrom 	iso9660 noauto,codepage=936,iocharset=gb2312 /dev/fd0 /mnt/floppy auto 	noauto,owner,kudzu 0 0

参数defaults实际上包含了一组默认参数:

  • rw 以可读写模式挂载
  • suid 开启用户ID和群组ID设置位
  • dev 可解读文件系统上的字符或区块设备
  • exec 可执行二进制文件
  • auto 自动挂载
  • nouser 使一般用户无法挂载
  • async 以非同步方式执行文件系统的输入输出操作

5.4 查找定位文件

我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索。

  • which 查看可执行文件的位置
  • whereis 查看文件的位置
  • locate 配合数据库查看文件位置
  • find 实际搜寻硬盘查询文件名称

5.4.1 which命令

which是:通过 PATH环境变量到该路径内查找可执行文件

  • 基本的功能是寻找可执行文件
#语法: 
which 可执行文件名称

#例如: 
[root@redhat ~]# which passwd
/usr/bin/passwd 

5.4.2 whereis

#语法: 
whereis [-bmsu] 文件或者目录名称

参数说明:

  • -b : 只找二进制文件
  • -m: 只找在说明文件manual路径下的文件
  • -s : 只找source源文件
  • -u : 没有说明文档的文件

例如:

#将和passwd文件相关的文件都查找出来
[root@redhat ~]# whereis passwd 
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

#只将二进制文件查找出来 
[root@redhat ~]# whereis -b passwd 
passwd: /usr/bin/passwd /etc/passwd

5.4.3 locate

#语法: 
locate 文件或者目录名称 

#例如: 
[root@redhat ~]# locate passwd 
/lib/security/pam_unix_passwd.so
/lib/security/pam_passwdqc.so
/usr/include/rpcsvc/yppasswd.x
/usr/include/rpcsvc/yppasswd.h
…………

sudo updatedb

5.4.4 find

#语法: 
find 路径参数 

参数说明:

  • -atime n :将n*24小时内存取过的的文件列出来
  • -ctime n :将n*24小时内改变、新增的文件或者目录列出来
  • -mtime n :将n*24小时内修改过的文件或者目录列出来
  • -newer file :把比file还要新的文件列出来
  • -gid n :寻找群组ID为n的文件
  • -group name :寻找群组名称为name的文件
  • -uid n :寻找拥有者ID为n的文件
  • -user name :寻找用户者名称为name的文件
  • -name file :寻找文件名为file的文件(可以使用通配符)

例 如:

[root@redhat ~]# find / -name zgz 
/home/zgz
/home/zgz/zgz
/home/weblogic/bea/user_projects/domains/zgz
/home/tianjunfeng/product/10g/cfgtoollogs/dbca/zgz
/home/tianjunfeng/product/10g/cfgtoollogs/emca/zgz
/home/tianjunfeng/oradata/zgz

[root@redhat ~]# find / -name '*zgz*' 
/home/zgz
/home/zgz/zgz1
/home/zgz/zgzdirzgz
/home/zgz/zgz
…………
/home/weblogic/bea/user_projects/domains/zgz/zgz.log00008

区别

find

  • find是在硬盘上遍历查找,因此非常消耗硬盘的资源,而且效率也非常低。

whereis 和 locate【优先使用】

  • whereis查找的速度非常快,从数据库中查找数据。

  • linux系统会将 系统内的所有文件都记录在一个数据库文件中。

  • 但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

    sudo updatedb
    

5.5 (解)压缩文件

Linux下主要有两个命令用来压缩文件:gzip和bzip2

5.5.1 gzip命令

#格式如下:
gzip [-d#] filename

#参数说明
#	-d: 解压缩的参数
#	-#: 压缩等级,1压缩比最小,9最大,默认为6

压缩示例:

  1. 新建1.txt

    touch 1.txt
    
    img
  2. 压缩1.txt

    gzip 1.txt
    #注意,原来的的文件1.txt不见了
    
    img
  3. 读取压缩文件内容:zcat命令

    zcat filename.gz
    
    img

解压缩实例:

  1. 解压缩用到的命令:gzip -d

    # -d: 解压缩的参数
    gzip -d 2.gz
    
    img
  2. 解压缩用到的命令:gunzip

    gunzip 1.txt.gz
    #注意,同样原来的.gz文件也不见了。
    
    img

5.5.2 bzip2命令

#命令格式如下:
bzip2 [-dz] filename

#参数说明
#	-d:解压缩的参数
#	-z:压缩的参数

压缩示例:

  1. 压缩文件:

    bzip2 -z 1.txt
    
    img
  2. 查看.bz2压缩文件内容:bzcat命令

    bzcat filename.bz2
    
    img

解压缩:

bzip2 -d 1.txt.bz2
img

5.6 文件归档:tar

tar 命令主要用于对目录和文件进行归档,在实际的备份工作中通常在归档的同时也会将包文件进行压缩(需要调用前面的gzip或bzip2命令),以节省磁盘空间。使用tar命令时,选项前面的“~”号可以省略。

#命令格式如下:
tar [-zxcvfpP] filename

tar -N 'yyyy/mm/dd" /path -zcvf target.tar.gz source

选项说明:

  • -z:有gzip的属性

  • -j:有bz2的属性

  • -x:解压

  • -t:查看tarfile里面的文件

  • -c:建立一个压缩文件的指令

  • -v:压缩的过程中显示文件

  • -f:指定打包的文件名【必须存在,在f之后要立即接文件名,不能再加其他参数】

    例如:

    tar -zcfv tfile sfile   # 错误写法
    
    tar -zcvf tfile sfile   # 这才是正确的
    
  1. 压缩示例:

    • .tar和.tar.gz这两个后缀名,是良好的习惯而已,是给用户提示是否被压缩,
    • 从以上结果可以注意到,后面带-z参数的指令生成的压缩文件是要小的。
    #把文件mul压缩为mul.tar
    tar -cf mul.tar mul
    tar -zcf mul.tar.gz mul
    
    #注意,原来的dir目录仍然存在,并没有被替换掉
    

    img

  2. 解压缩示例:

    # x:解压缩 v:压缩的过程中显示文件
    tar -xvf mul.tar
    
    img
  3. 查看压缩文件:

    # z: gzip t:查看mul.tar.gz里面的文件
    tar -ztvf mul.tar.gz
    
    img
posted @ 2024-06-16 15:16  Sunflower0312  阅读(28)  评论(0)    收藏  举报