一、linux系统中一切都是文件
linux系统中一切文件都是 从根目录(/)开始的,并按照 文件系统层次标准(FHS)采用倒树状结构来存放文件、定义常见目录用途。
linux中文件和目录是严格区分大小写的。
1、常见的目录名称以及相应内容
目录名称 | 应放置文件得内容 |
---|---|
/boot | 系统启动文件,如内核和启动菜单 |
/dev | 设备文件,系统中的硬件设备 |
/etc | 系统配置文件和启动脚本 |
/root | 管理员的个人主目录 |
/home | 用户的个人主目录 |
/bin | 基本用户命令 |
/sbin | 系统管理命令,供管理员使用 |
/lib | 系统共享库,供/bin和/sbin命令使用 |
/opt | 第三方软件包 |
/tmp | 临时文件目录,所有用户均可访问 |
/usr/local | 本地安装的软件和应用程序 |
/usr/sbin | 系统管理员使用的非基本管理命令 |
/var | 动态数据如日志文件和临时文件 |
/lost+found | 文件系统恢复区,存放丢失的文件碎片 |
2、常见的硬件设备及其文件名称
物理设备的命名规则:系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件名字猜出大致的属性及分区信息等;另外它会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。
硬件设备 | 应放置文件得内容 |
---|---|
/IDE设备 | /dev/hd[a-d] |
NVMe设备 | /dev/nvme[0-23] |
SCSI/SATA/U盘 | /dev/sd[a-z] |
virtio设备 | /dev/vd[a-z] |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
磁带机 | /dev/st0或/dev/ht0 |
系统采用a~z代表26块不同的磁盘(默认从a开始分配),而且硬盘的分区编号也很有讲究:
主分区或扩展分区编号从1开始,到4结束
逻辑分区从编号5开始。
磁盘设备是有大量的扇区组成的,每个扇区容量为512字节。其中第一个扇区保存着主引导记录与分区表信息。第一个扇区的主引导记录占用446字节,分区占用64字节,结束符占用2字节;其中分区表中每记录一个分区信息需要16字节,因此最多只有4个分区,这4个分区就是4个主分区。为了解决分区个数不够的问题,奖第一个扇区分区表中16字节(原本写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针—一个指向另外一个分区的指针。这样一来,用户一般会选择使用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于4个)的需求。
3、文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。
linux系统支持数十种文件系统,常见的文件系统如下:
Ext2:
最早追溯到1993年,是linux第一个商业级文件系统,基本沿袭了unix文件系统设计标准。但由于不包含日志读写功能,数据丢失的可能性很大,顶多建议用于SD存储卡或U盘。
EXT3:
是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来,再进行实际操作,以便在发生异常宕机后能回溯追踪到被中断的部分。不能100%保证丢失。
EXT4:
EXT3的改进版,RHEL6系统默认的文件管理系统,支持的存储容量高达1EB(1,073,741,824GB),无限多创建子目录。能够批量分配block(块),极大提高读写效率
XFS:
是一种高性能的日志文件系统,RHEL7/8默认的文件管理系统。在发生意外宕机后,快速恢复可能被破坏的文件,强大的日志功能花费极低的计算和存储性能。支持的最大存储容量为18EB。
在拿到一块新的硬盘存储设备后,先分区,再格式化文件系统,最后挂载使用。硬盘的分区操作取决于您的需求和硬盘大小;也可以选择不进行分区,但是必须对硬盘进行格式化处理。
linux 系统中有super block(硬件地图),里边记录整个文件系统信息。每个文件的权限与属性记录在inode中,且占用一个独立的inode表格(表格默认大小为128字节),记录的信息包括:访问权限,所有者与所属组、大小、创建或内容修改时间、最后一次访问时间、修改时间、特殊权限、真实数据地址。
文件实际内容保存在block块中(大小一般是1KB、2KB或4KB),一个inode的默认大小仅为128字节,记录一个block则消耗4字节。当文件的inode被写满后,Linux系统会自动分配出一个block,专门用于像inode那样记录其他block块的信息,这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了。
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个虚拟文件系统(Virtual File System,VFS)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
4、挂载硬件设备
mount命令用于挂载文件系统,格式为“mount文件系统 挂载目录”。挂载是在使用硬件设备前所执行的最后一步操作。只需使用mount命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了。
mount命令中的参数以及作用
使用-t来指定文件系统的类型
使用-a挂载所有在/etc/fstab中定义的文件系统
UUID(Universally Unique Identifier,通用唯一识别码)是一串用于标识每块独立硬盘的字符串,具有唯一性及稳定性,特别适合用来挂载网络设备。
blkid命令用于显示设备的属性信息,英文全称为“block id”,语法格式为“blkid [设备名]”
[root@linuxprobe ~]# blkid
/dev/sdb1: UUID="2db66eb4-d9c1-4522-8fab-ac074cd3ea0b" TYPE="xfs" PARTUUID="eb23857a-01"
[root@linuxprobe ~]# mount UUID=2db66eb4-d9c1-4522-8fab-ac074cd3ea0b /backup
永久挂载,把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检” 写入到/etc/fstab文件中,在使用mount -a参数进行自动挂载。
df命令用于查看已挂载的磁盘空间使用情况,英文全称为“disk free”,语法格式为“df -h”。
umount命令用于卸载设备或文件系统,英文全称为“un mount”,语法格式为“umount [设备文件/挂载目录]”。
lsblk命令用于查看已挂载的磁盘的空间使用情况,英文全称为“list block id”。
5、添加交换分区
交换(SWAP)分区是一种通过在硬盘中预先划分一定的空间,然后把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。通俗来讲就是让硬盘帮内存分担压力。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
分区时需要修改分区的类型,选择t,82(Linux swap)
mkswap命令用于对新设备进行交换分区格式化,英文全称为“make swap”,语法格式为“mkswap设备名称”。
[root@linuxprobe ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
no label, UUID=45a4047c-49bf-4c88-9b99-f6ac93908485
swapon命令用于激活新的交换分区设备,英文全称为“swap on”,语法格式为“swapon设备名称”。
使用swapon命令把准备好的SWAP硬盘设备正式挂载到系统中,使用free -m命令查看交换分区的大小变化(由2047MB增加到7167MB):
[root@linuxprobe ~]# free -m
total used free shared buff/cache available
Mem: 1966 1391 105 12 469 384
Swap: 2047 9 2038
[root@linuxprobe ~]# swapon /dev/sdb2
[root@linuxprobe ~]# free -m
total used free shared buff/cache available
Mem: 1966 1395 101 12 469 380
Swap: 7167 9 7158
保存在配置文件中
[root@linuxprobe ~]# vim /etc/fstab
/dev/sdb2 swap swap defaults 0 0
6、磁盘容量配额
root管理员使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用quota技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota技术还有软限制和硬限制的功能。
软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
RHEL 8系统中已经安装了quota磁盘容量配额服务程序包,却默认没有开启。需要手动编辑配置文件并重启一次系统,让系统中的启动目录(/boot)能够支持quota磁盘配额技术。
[root@linuxprobe ~]# vim /etc/fstab
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults,**uquota** 1 2
早期的Linux系统要想让硬盘设备支持quota磁盘容量配额服务,使用的是usrquota参数,而RHEL 7/8系统使用的则是uquota参数。在重启系统后使用mount命令查看,即可发现/boot目录已经支持quota磁盘配额技术了
[root@linuxprobe ~]# mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
xfs_quota命令用于管理设备的磁盘容量配额,语法格式为“xfs_quota [参数] 配额 文件系统”。
这是一个专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令。
-c参数用于以参数的形式设置要执行的命令;
-x参数是专家模式,让运维人员能够对quota服务进行更多复杂的配置。
接下来使用xfs_quota命令来设置用户tom对/boot目录的quota磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个。
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
[root@linuxprobe ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 114964 0 0 00 [--------]
tom 0 3072 6144 00 [--------]
soft是软限制,超过该限制后也只是将操作记录写到日志中,不对用户行为进行限制。而hard是硬限制,一旦超过系统就会马上禁止,用户再也不能创建或新占任何的硬盘容量。
edquota命令用于管理系统的磁盘配额,英文全称为“edit quota”,语法格式为“edquota [参数] 用户名”。
使用edquota命令按需修改限额的数值。其中,-u参数表示要针对哪个用户进行设置;-g参数表示要针对哪个用户组进行设置
7、VDO虚拟数据优化
VDO(Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据来优化存储空间的技术。VDO是红帽公司收购了Permabit公司后获取的新技术,并与2019-2020年前后,多次在RHEL 7.5/7.6/7.7上进行测试,最终随RHEL 8系统正式公布。
VDO技术的关键就是对硬盘内原有的数据进行删重操作,它有点类似于我们平时使用的网盘服务,在第一次正常上传文件时速度特别慢,在第二次上传相同的文件时仅作为一个数据指针,几乎可以达到“秒传”的效果,无须再多占用一份空间,也不用再漫长等待。除了删重操作,VDO技术还可以对日志和数据库进行自动压缩,进一步减少存储浪费的情况。VDO针对各种类型文件的压缩效果如表所示。
VDO技术支持本地存储和远程存储,可以作为本地文件系统、iSCSI或Ceph存储下的附加存储层使用。红帽公司在VDO介绍页面中提到,在部署虚拟机或容器时,建议采用逻辑存储与物理存储为10∶1的比例进行配置,即1TB物理存储对应10TB逻辑存储;而部署对象存储时 (例如使用Ceph)则采用逻辑存储与物理存储为3∶1的比例进行配置,即使用1TB物理存储对应3TB逻辑存储。
新添加进来的物理设备就是使用vdo命令来管理的,其中name参数代表新的设备卷的名称;device参数代表由哪块磁盘进行制作;vdoLogicalSize参数代表制作后的设备大小。依据红帽公司推荐的原则,20GB硬盘将翻成200GB的逻辑存储:
[root@linuxprobe ~]# vdo create --name=storage --device=/dev/sdc --vdoLogicalSize=200G
Creating VDO storage
Starting VDO storage
Starting compression on VDO storage
VDO instance 0 volume is ready at /dev/mapper/storage
在创建成功后,使用status参数查看新建卷的概述信息:
[root@linuxprobe ~]# vdo status --name=storage
VDO status:
Date: '2021-01-06 22:51:33+08:00'
Node: linuxprobe.com
Kernel module:
Loaded: true
Name: kvdo
Version information:
kvdo version: 6.2.0.293
Configuration:
File: /etc/vdoconf.yml
Last modified: '2021-01-06 22:49:33'
VDOs:
storage:
Acknowledgement threads: 1
Activate: enabled
Bio rotation interval: 64
Bio submission threads: 4
Block map cache size: 128M
Block map period: 16380
Block size: 4096
CPU-work threads: 2
Compression: enabled
Configured write policy: auto
Deduplication: enabled
………………省略部分输出信息………………
输出信息中包含了VDO卷创建的时间、主机名、版本、是否压缩(Compression)及是否删重(Deduplication)。
接下来,对新建卷进行格式化操作并挂载使用。
新建的VDO卷设备会被乖乖地存放在/dev/mapper目录下,并以设备名称命名,对它操作就行。另外,挂载前可以用udevadm settle命令对设备进行一次刷新操作,避免刚才的配置没有生效:
[root@linuxprobe ~]# mkfs.xfs /dev/mapper/storage
meta-data=/dev/mapper/storage isize=512 agcount=4, agsize=13107200 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=52428800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=25600, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@linuxprobe ~]# udevadm settle
[root@linuxprobe ~]# mkdir /storage
[root@linuxprobe ~]# mount /dev/mapper/storage /storage
查看设备的实际使用情况,使用vdostats命令即可。human-readable参数的作用是将存储容量自动进位,以人们更易读的方式输出(比如,显示20G而不是20971520K):
[root@linuxprobe ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/storage 20.0G 4.0G 16.0G 20% 99%
这里显示的Size是实际物理存储的空间大小(即20.0GB是硬盘的大小),如果想看逻辑存储空间,可以使用df命令进行查看:
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 969M 0 969M 0% /dev
tmpfs 984M 0 984M 0% /dev/shm
tmpfs 984M 9.6M 974M 1% /run
tmpfs 984M 0 984M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 3.9G 14G 23% /
/dev/sr0 6.7G 6.7G 0 100% /media/cdrom
/dev/sda1 1014M 152M 863M 15% /boot
tmpfs 197M 16K 197M 1% /run/user/42
tmpfs 197M 3.5M 194M 2% /run/user/0
/dev/sdb1 2.0G 47M 2.0G 3% /newFS
/dev/mapper/storage 200G 2.4G 198G 2% /storage
将设备设置成永久挂载生效,一直提供服务。
VDO设备卷在创建后会一直存在,但需要手动编辑/etc/fstab文件后才能在下一次重启后自动挂载生效,为我们所用。对于这种逻辑存储设备,其实不太建议使用/dev/mapper/storage作为设备名进行挂载。不如试试前面所说的UUID吧:
[root@linuxprobe ~]# blkid /dev/mapper/storage
/dev/mapper/storage: UUID="cd4e9f12-e16a-415c-ae76-8de069076713" TYPE="xfs"
打开/etc/fstab文件,把对应的字段填写完整。建议再加上_netdev参数,表示等系统及网络都启动后再挂载VDO设备卷,以保证万无一失。
[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 21 05:03:40 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults,uquota 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0
UUID=cd4e9f12-e16a-415c-ae76-8de069076713 /storage xfs defaults,_netdev 0 0
8、软硬方式链接
软链接(soft link):也叫符号链接(symbolic link),仅仅包含所链接文件的名称和路径,很像一个记录地址的标签。当原始文件被删除或移动后,新的链接文件也会随之失效,不能被访问。可以针对文件、目录设置软链接,跨文件系统进行链接也不是问题。从这一点来看,它与Windows系统的“快捷方式”具有一样的性质。
硬链接(hard link):可以将它理解为一个“指向原始文件block的指针”,系统会创建出一个与原来一模一样的inode信息块。所以,硬链接文件与原始文件其实是一模一样的,只是名字不同。每添加一个硬链接,该文件的inode个数就会增加1;而且只有当该文件的inode个数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件block的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,不能跨分区对目录文件进行硬链接。
ln命令用于创建文件的软硬链接,英文全称为“link”,语法格式为“ln [参数]原始文件名 链接文件名”。
ln命令的可用参数以及作用如表6-8所示。在使用ln命令时,是否添加-s参数,将创建出性质不同的两种“快捷方式”。因此如果没有扎实的理论知识和实践经验做铺垫,尽管能够成功完成实验,但永远不会明白为什么会成功。
为了更好地理解软链接、硬链接的不同性质,我们先创建出一个文件,为其创建一个软链接:
[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > old.txt
[root@linuxprobe ~]# ln -s old.txt new.txt
[root@linuxprobe ~]# cat old.txt
Welcome to linuxprobe.com
[root@linuxprobe ~]# cat new.txt
Welcome to linuxprobe.com
[root@linuxprobe ~]# ls -l old.txt
-rw-r--r-- 1 root root 26 Jan 11 00:08 old.txt
原始文件名为old,新的软链接文件名为new。删掉原始文件后,软链接文件立刻就无法读取了:
[root@linuxprobe ~]# rm -f old.txt
[root@linuxprobe ~]# cat new.txt
cat: readit.txt: No such file or directory
接下来针对原始文件old创建一个硬链接,即相当于针对原始文件的硬盘存储位置创建了一个指针。这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取了。同时可以看到创建硬链接后,原始文件的硬盘链接数量增加到了2。
[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > old.txt
[root@linuxprobe ~]# ln old.txt new.txt
[root@linuxprobe ~]# cat old.txt
Welcome to linuxprobe.com
[root@linuxprobe ~]# cat new.txt
Welcome to linuxprobe.com
[root@linuxprobe ~]# ls -l old.txt
-rw-r--r-- 2 root root 26 Jan 11 00:13 old.txt
这是一个非常有意思的现象。创建的硬链接文件竟然会让文件属性第二列的数字变成了2,这个数字表示的是文件的inode信息块的数量。相信同学们已经非常肯定地知道,即便删除了原始文件,新的文件也会一如既往地可以读取,因为只有当文件inode数量被“清零”时,才真正代表这个文件被删除了。
[root@linuxprobe ~]# rm -f old.txt
[root@linuxprobe ~]# cat new.txt
Welcome to linuxprobe.com