Linux系统中一切都是文件。在Windows操作系统中,想要找到一个文件,要依次进入该文件所在的磁盘分区(也叫盘符),然后再进入该分区下的具体目录,最终找到这个文件。但是在Linux系统中并不存在C、D、E、F等盘符,Linux系统中的一切文件都是从“根”目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存放文件,以及定义了常见目录的用途。
但是,FHS对于用户来讲只能算是一种道德上的约束,有些用户就是懒得遵守,依然会把文件到处乱放。
另外,Linux系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT均代表不同的目录,并且文件名称中不得包含斜杠(/)。
Linux系统中常见的目录名称以及相应内容
Linux中查看文件可以有绝对路径与相对路径。
绝对路径指的是从根目录(/)开始写起的文件或目录名称,
相对路径则指的是相对于当前路径的写法,就是没有从(/)根目录开始。
如:
# 绝对路径查看
[root@linuxprobe ~]# cat /etc/fstab
# 相对路径查看
[root@linuxprobe ~]# cd /etc
[root@linuxprobe etc]# cat fstab
系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。
常见的硬件设备及其文件名称
硬盘的分区编号也很有讲究:
主分区或扩展分区的编号从1开始,到4结束;
逻辑分区从编号5开始。
来分析一下/dev/sda5这个设备文件名称包含哪些信息
首先,/dev/目录中保存的应当是硬件设备文件;
其次,sd表示的是存储设备;
然后,a表示系统中同类接口中第一个被识别到的设备;
最后,5表示这个设备是一个逻辑分区。
总之,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件”。
硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表占用64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。
为解决分区个数不够的问题,可将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。即扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针,一个指向另外一个分区的指针。用户一般会选择使用(3+1)3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于4个)的需求。
扩展分区,严格地讲它不是一个实际意义的分区,而仅仅是一个指向其他分区的指针,这种指针结构将形成一个单向链表。因此扩展分区自身不能存储数据,用户需要在其指向的对应分区(称之为逻辑分区)上进行操作。
Linux系统支持数十种文件系统,而最常见的文件系统ext2,ext3,ext4,xfs。
Ext2:是Linux系统的第一个商业级文件系统,但由于不包含日志读写功能,数据丢失的可能性很大,因此大家能不用就不用,或者顶多建议用于SD存储卡或U盘。
Ext3:是一款日志文件系统,它会把整个硬盘的每个写入动作的细节都预先记录下来,然后再进行实际操作,以便在发生异常宕机后能回溯追踪到被中断的部分。Ext3能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能100%地保证资料不会丢失。
Ext4:Ext3的改进版本,作为RHEL 6系统中默认的文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block(块),从而极大地提高了读写效率。现在很多主流服务器也会使用Ext4文件系统。
XFS:是一种高性能的日志文件系统,而且是RHEL 7/8中默认的文件管理系统。它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只需花费极低的计算和存储性能。它支持的最大存储容量为18EB。
在Linux中数据是有两个部分组成,inode 和 block。
Linux只是把每个文件的权限与属性记录在inode中,而且每个文件占用一个独立的inode表格,该表格的大小默认为128字节,里面记录着一些属性相关的内容:
该文件的访问权限(read、write、execute);
该文件的所有者与所属组(owner、group);
该文件的大小(size);
该文件的创建或内容修改时间(Ctime);
该文件的最后一次访问时间(Atime);
该文件的修改时间(Mtime);
文件的特殊权限(SUID、SGID、SBIT);
该文件的真实数据地址(point)。
文件的实际内容则保存在block块中(大小一般是1KB、2KB或4KB),一个inode的默认大小仅为128字节,记录一个block则消耗4字节。当文件的inode被写满后,Linux系统会自动分配出一个block,专门用于像inode那样记录其他block块的信息,这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了。
所以,大家日常删除数据并不是删除block里面的实际内容,而是删除了Inode。
在文件的隐藏权限中chattr 参数 -s 则是彻底从硬盘删除,不可恢复(用零块填充原文件所在的硬盘区域)
Linux内核中的软件层为用户程序提供了一个虚拟文件系统(Virtual File System,VFS)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
实际文件系统在VFS下隐藏了自己的特性和细节,这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以随意使用各种命令在任何文件系统中进行各种操作了。
VFS的架构示意图
mount命令用于挂载文件系统,格式为“mount文件系统 挂载目录”。
-a 挂载所有在/etc/fstab中定义的文件系统
-t 指定文件系统的类型
# mount /dev/cdrom /media/cdrom
在工作中要挂载一块网络存储设备,该设备的名字可能会变来变去。这时推荐用UUID(Universally Unique Identifier,通用唯一识别码)进行挂载操作。UUID是一串用于标识每块独立硬盘的字符串,具有唯一性及稳定性,特别适合用来挂载网络设备。
使用blkid命令,blkid命令用于显示设备的属性信息,英文全称为“block id”,语法格式为“blkid [设备名]”。
[root@linuxprobe ~]# blkid
/dev/sda1: UUID="0f755a58-9244-490c-9d6a-19148b2bf65d" TYPE="xfs" PARTUUID="d4652570-01"
/dev/sda2: UUID="McIrea-ld7A-g3G9-cZUG-BhXJ-lpDn-YT9MVJ" TYPE="LVM2_member" PARTUUID="d4652570-02"
/dev/sr0: UUID="2019-04-04-08-40-23-00" LABEL="RHEL-8-0-0-BaseOS-x86_64" TYPE="iso9660" PTUUID="0da1aba4" PTTYPE="dos"
/dev/mapper/rhel-root: UUID="82daab81-75bc-403f-a1c8-d1a75d809704" TYPE="xfs"
/dev/mapper/rhel-swap: UUID="ca17f1cd-1660-458f-b386-6605316f6487" TYPE="swap"
[root@linuxprobe ~]#
# 用UUID进行挂载
[root@linuxprobe ~]# mount UUID=2019-04-04-08-40-23-00 /media/cdrom
这样挂载重启后就丢失了,如果想永久挂载需要写入/etc/fstab文件中。
填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”
[root@linuxprobe ~]# vim /etc/fstab
[root@linuxprobe ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Apr 2 05:02:07 2022
#
# 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 0 0
UUID=0f755a58-9244-490c-9d6a-19148b2bf65d /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/sr0 /media/cdrom iso9660 defaults 0 0
/dev/sr0 与 /dev/cdrom 是个链接
[root@linuxprobe ~]# ll /dev/cdrom
lrwxrwxrwx. 1 root root 3 Apr 23 08:07 /dev/cdrom -> sr0
[root@linuxprobe ~]#
df命令用于查看已挂载的磁盘空间使用情况,语法格式为“df -h”。
[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 153M 862M 15% /boot
tmpfs 197M 16K 197M 1% /run/user/42
tmpfs 197M 3.5M 194M 2% /run/user/0
[root@linuxprobe ~]#
umount命令用于卸载设备或文件系统,语法格式为“umount [设备文件/挂载目录]”。
[root@linuxprobe ~]# umount /media/cdrom
[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/sda1 1014M 153M 862M 15% /boot
tmpfs 197M 16K 197M 1% /run/user/42
tmpfs 197M 3.5M 194M 2% /run/user/0
[root@linuxprobe ~]#
lsblk命令用于查看已挂载的磁盘的空间使用情况,输入该命令后按回车键执行即可。
[root@linuxprobe ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 6.6G 0 rom /media/cdrom
[root@linuxprobe ~]#
fdisk命令用于新建、修改及删除磁盘的分区表信息,是一个交互式命令,语法格式为“fdisk磁盘名称”。
[root@linuxprobe ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sr0 11:0 1 6.6G 0 rom /media/cdrom
[root@linuxprobe ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xf61fd7a4.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-10485759, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-10485759, default 10485759): +1G
Created a new partition 1 of type 'Linux' and of size 1 GiB.
Command (m for help): p
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf61fd7a4
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 2099199 2097152 1G 83 Linux
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[root@linuxprobe ~]#
分区后需要进行格式化,在Linux系统中用于格式化操作的命令是mkfs。在终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果:
[root@linuxprobe ~]# mkfs
mkfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
[root@linuxprobe ~]#
进行格式化及挂载当然如果需要永久挂载,则需要写入/etc/fstab
[root@linuxprobe ~]# file /dev/sdb1
/dev/sdb1: block special (8/17)
[root@linuxprobe ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=262144, 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
[root@linuxprobe ~]# mkdir /newDisk
[root@linuxprobe ~]# mount /dev/sdb1 /newDisk
[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 153M 862M 15% /boot
tmpfs 197M 16K 197M 1% /run/user/42
tmpfs 197M 3.5M 194M 2% /run/user/0
/dev/sdb1 1014M 40M 975M 4% /newDisk
[root@linuxprobe ~]#
[root@linuxprobe ~]# echo "/dev/sdb1 /newDisk xfs defaults 0 0" >> /etc/fstab
du命令用查看分区或目录所占用的磁盘容量大小,语法格式为“du -sh目录名称”。
[root@linuxprobe ~]# du /newDisk
0 /newDisk
[root@linuxprobe ~]# cp anaconda-ks.cfg /newDisk
[root@linuxprobe ~]# du /newDisk
4 /newDisk
[root@linuxprobe ~]# du -sh /newDisk
4.0K /newDisk
[root@linuxprobe ~]#