文件系统进阶
5. 文件系统进阶
5.1 更多文件类型
Linux系统是以文件的形式来进行管理的。Linux系统主要根据文件头信息来判断文件类型,扩展名并非决定因素。
Linux文件类型常见的有:目录、普通文件、字符设备文件、块设备文件、符号链接文件等。普通文件和目录我们前面已经介绍过了,下面重点介绍一下设备文件b&c 和 链接文件l。
先看一个例子:使用ls -l 查看目录详细信息,得到截图如下:
共显示了七列信息,从左至右依次为:权限、文件数、归属用户、归属群组、文件大小、创建日期、文件名称
其中第一组只有一个字符,代表了文件类型,可能是下面的某一个:
d目录-普通文件l链接文件b块设备文件c字符设备文件p管道文件s套接字文件
5.1.1 设备文件
-
设备文件一般存放在/dev目录下,dev是设备(device)的英文缩写
- /dev这个目录对所有的用户都十分重要,因为在这个目录中包含了所有Linux系统中使用的外部设备。
- 但是这里并
不是放的外部设备的驱动程序,这一点和Windows操作系统不一样,它实际上是一个访问这些外部设备的端口。 - 我们可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。
- Linux将所有设备认成是一个文件。
-
设备文件分为两种:
-
块设备文件(b):一般指硬盘、软盘等设备。
使用 ls -l 命令查看,块设备文件的第一个字符是 "b"(block),追加-F后,名字后面无变化,如下:
-
字符设备文件(c):字符终端、串口和键盘等就是字符设备。
- 字符设备文件以字节流的方式进行访问,由字符设备驱动程序来实现这种特性,这通常要用到 open、close、read、write 等系统调用。
- 另外,由于字符设备文件是以文件流的方式进行访问的,因此可以
顺序读取,但通常不支持随机存取。 - 使用 ls -l 命令查看,字符设备文件的第一个字符是 “c”(char)。
-
5.1.2 链接文件
Linux链接分两种:
- 一种被称为硬链接(Hard Link)【默认情况下,ln命令产生硬链接。】
- 另一种被称为符号链接(Symbolic Link)
-
硬连接
硬连接指通过
索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode, Index node)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。
硬连接的作用是:允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接,只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
#使用命令格式: ln 源文件或目录 目标文件或目录 -
软连接
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
#使用命令格式: ln -s 源文件或目录 目标文件或目录 -
区别:
[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 命令。
-
磁盘挂载
#语法: 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 -
卸载
#语法: 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) 如何查询挂载点
-
查看磁盘信息:
fdisk -l
可以看出:
- /dev/sda已经分区:/dev/sda下面有/dev/sda1 /dev/sda2,已经分区
- /dev/sdb还没分区:而/dev/sdb是没有的,就是我们操作的目标
-
磁盘分区:分区有主分区,扩展分区,逻辑分区
fdisk 磁盘 #例如: fdisk /dev/sdb
上图的大概意思是这样的:
- n:添加一个分区
- P:主分区
- 两个回车指是开始和结束的磁盘扇区大小;
- w:写入磁盘
我们再次查看磁盘,刚刚创建的分区:【注意:此时磁盘虽然已经分区,但是还没有文件系统,磁盘依然不能用】
-
查看系统磁盘格式
df -hT
-
格式化磁盘分区:可以选择 ext3 或者 ext4 的系统格式,也可以选择根目录同样的磁盘文件格式xfs
mkfs.磁盘格式 -f 分区位置 #例如: mkfs.xfs /dev/sdb1
(2) 如何建立挂载点
-
创建挂载目录
mkdir /opt/data mount 分区位置 需要挂载目录 #例如: mount /dev/sdb1 /opt/data -
查看挂载:
-
设置开机自动挂载
#编辑文件/etc/fstab vim /etc/fstab #在最后一行添加如下代码,注意xfs换成你自己格式化的格式 #分区位置 挂载目录 磁盘格式 defaults 0 1 /dev/sdb1 /opt/data xfs defaults 0 1 -
卸载已挂载的硬盘
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.txt
touch 1.txt
-
压缩1.txt
gzip 1.txt #注意,原来的的文件1.txt不见了
-
读取压缩文件内容:
zcat命令zcat filename.gz
解压缩实例:
-
解压缩用到的命令:
gzip -d# -d: 解压缩的参数 gzip -d 2.gz
-
解压缩用到的命令:
gunzipgunzip 1.txt.gz #注意,同样原来的.gz文件也不见了。
5.5.2 bzip2命令
#命令格式如下:
bzip2 [-dz] filename
#参数说明
# -d:解压缩的参数
# -z:压缩的参数
压缩示例:
-
压缩文件:
bzip2 -z 1.txt
-
查看.bz2压缩文件内容:
bzcat命令bzcat filename.bz2
解压缩:
bzip2 -d 1.txt.bz2
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 # 这才是正确的
-
压缩示例:
- .tar和.tar.gz这两个后缀名,是良好的习惯而已,是给用户提示是否被压缩,
- 从以上结果可以注意到,后面带-z参数的指令生成的压缩文件是要小的。
#把文件mul压缩为mul.tar tar -cf mul.tar mul tar -zcf mul.tar.gz mul #注意,原来的dir目录仍然存在,并没有被替换掉
-
解压缩示例:
# x:解压缩 v:压缩的过程中显示文件 tar -xvf mul.tar
-
查看压缩文件:
# z: gzip t:查看mul.tar.gz里面的文件 tar -ztvf mul.tar.gz
浙公网安备 33010602011771号