Author:onceday date:2022年8月8日
本文内容主要收集整理于《鸟哥的Linux私房菜》
长路漫漫,独自前行,没有终点,唯有坚持。
磁盘的分区表的格式一般有两种:主引导记录(MBR)和GUID分区表(GPT)。
磁盘目录在:\dev
下。
Linux的正统文件系统为ext2(Linux second Extend file system)。
较新的文件系统一般具有以下部分:
超级区块(superblock):记录文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码。
数据区块:实际记录文件的内容,若文件太大时,会占用多个区块。
这种类型的文件系统被称为索引式文件系统。
文件系统一般在格式化分区的时候就把inode和数据区块的大小固定了。
整个分区文件系统最前面是一个启动扇区,可以安装启动程序。
后面是区块群组(block groups),每个区块都包含一个超级区块(可能),inode以后数据区块信息。
数据区块的大小会影响文件系统支持的最大文件大小:
1KB对应16GB
2KB对应256GB
4KB对应2TB
遵循以下原则:
每个区块内最多只能放置一个文件的数据。
如果文件大于区块的大小,则一个文件会占用多个区块数量。
如果文件小于区块,则该区块的剩余容量就不能够再被使用了。
inode table包含记录以下信息:
读写属性rwx、拥有者和用户组、大小、状态改变时间
文件特性标识(flag)
文件内容真正的指向。
inode的大小是固定的,ext4为256B,而每个数据区块需要4B,因此当文件太大时,需要用到间接记录,即第一个inode指向第二个inode,然后第二个inode记录实际的区块编号。
超级区块包含信息:
数据区块与inode的总量
未使用和已使用的inode与数据区块的数量
数据区块与inode的大小
文件系统的挂载时间,写入时间等信息
是否挂载位
每个文件系统只有一个超级区块,其他区块群组内的超级区块主要是用来进行备份。
Filesystem description(文件系统描述):
区块对照表(block bitmap):
inode对照表:
dumpe2fs /dev/sda3
dumpe2fs -h /dev/sda3 #仅列出超级区块的区域内容
查看当前已加载到内核中支持的文件系统:
cat /proc/filesystems
当前linux支持的文件系统:
ls -l /lib/modules/$(uname -r)/kernel/fs
Linux统一通过名为Virtual Filesystem Switch的虚拟文件系统来抽象底层文件接口的不同。
现代Linux一般使用支持大容量的xfs文件系统来替代ext文件系统:
使用以下命令可查看xfs文件系统的信息:
xfs_info /dev/vda
以易读的方式将系统内所有文件系统全部列出来:
df -h
df -k #以Kbytes容量
df -m #以mbytes容量
df -a #包括proc在内的特殊文件系统也列出来
列出文件系统名称:
df -T
不用磁盘容量,而以inode的数量来显示:
df -i
列出所有的文件与目录容量,默认只统计目录下面的文件量:
du -a 文件/目录
du -h #以更易读的方式列出大小
只列出总量,不列出子目录的数据:
du -s 文件/目录
硬链接只是将某个目录下新增一条文件名链接到某inode号码的关联记录。
相比于符号链接,其具有更大的限制:
不能跨文件系统
不能链接到目录
删除硬链接的其中一个文件名,那么inode和区块还会保留,可以通过另外一个文件名来读取。
ln 源文件 目标文件 #创建硬链接
ln -s 源文件 目标文件 #符号链接
ln -f 源文件 目标文件 #如果目标文件存在,就将目标文件删除后再建立。
一般在系统增加一块磁盘,要经过以下步骤:
对磁盘进行划分,建立可用的硬盘分区
对该硬盘分区进行格式化,建立系统可用的文件系统
对刚建好的文件系统进行检验
将检验后的文件系统挂载到目录上
列出所有磁盘内的分区信息:
lsblk
lsblk -d #仅列出磁盘本身
lsblk -f #同时列出该磁盘内的文件系统名称
lsblk -i #使用ASCII的字符输出,不使用复杂的编码
lsblk -m #输出该设备在/dev下面的权限信息
lsblk -p #列出该设备的完整文件名
blkid
blkid -h #查看帮助信息
parted 磁盘目录 print
软件不能混合分区格式使用,不然会覆盖其他分区的格式,造成磁盘无法读取。
使用时交互式的,直接输入以下命令进入交互:
gdisk/fdisk 磁盘目录
该程序最后一步只要不写入,那么前面的操作不会对磁盘分区有任何影响。
处理一个正在使用的分区时,可能会造成严重的后果,因此务必小心。
当确定好分区情况后,需要等内核更新分区表的信息。
一种方式是重新启动,一种方式是通过partprobe命令。
partprobe -s #-s输出详细的过程信息
也可以使用fdisk/gdisk来删除分区表。
此外还可以使用parted来进行分区操作,可以在一条命令搞定分区操作。
parted /dev/vda mkpart primary fat32 36.0GB 36.5GB
primary字段还可以选为logical、Extended
36.0GB是开始地址,36.5GB是结束位置。
命令使用如下:
mkfs.xfs [-f] 设备名称 # -f可以强制格式化一个已有文件系统的分区
mkfs.ext4
mkfs.xxxx #可以用[tab][tab]来查看支持的文件系统
建议直接使用默认参数,这个需要专门学习文件系统的知识。
xfs_repair处理xfs文件系统:
xfs_repair 设备名称
xfs_repair -f 文件
xfs_repair -n #单纯检查而不修改任何内容
xfs_repair -d #单人维护模式下修复根目录,危险
被检查/恢复的文件系统不能处于挂载状态。
必须进入恢复模式下,才能修复根目录(/)
修复ext4文件系统:
fsck.ext4 [-f] 设备名称 #-f表示强行检查
挂载点是目录,这个目录是进入磁盘分区的入口:
单一文件系统不应该被重复挂载在不同的挂载点(目录)中
单一目录不应该重复挂载多个文件系统
要作为挂载点的目录,理论上应该都是空目录才行
如果挂载目录不是空目录,挂载目录后,源目录下面的东西就会自动隐藏。等到新分区被卸载之后,才会重新显示出来。
可以使用mount来设置和查看挂载信息:
mount [-l] #显示所有挂载磁盘信息,-l会额外显示Label名称
mount -a #依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来。
以下是三种挂载方式:
mount [-t 文件系统] LABEL='' 挂载点
mount [-t 文件系统] UUID='' 挂载点
mount [-t 文件系统] 设备文件名='' 挂载点
使用-o
选项还可以指定更多的自定义选项。
现在Linux发行版系统,一般不需要指定-t
选项,因为系统会自己进行测试,选择最合适的文件系统。
也可以使用mount将一个目录挂载到另外一个目录下:
mount --bind /var /data/var
可以使用umount将设备文件卸载:
umount [-fl] 设备文件名或挂载点
-f
强制卸载,可在类似网络文件系统(NFS)无法读取到的情况下
-l
立即卸载文件系统,比-f
还强
如果磁盘分区挂载在多个目录下,只能逐个使用挂载目录点卸载。
mknod设置文件的设备类参数,如设备的种类。
mknod 设备文件名 [bcp] [major] [Minor]
xfs_admin修改XFS文件系统的UUID和Label name:
xfs_admin [-lu] 设备文件名 #列出设备的label name和UUID
xfs_admin [-L] 设备文件名 #设置这个设备的Label name
xfs_admin [-U] 设备文件名 #设置这个设备的UUID
tune2fs修改ext4的label name和UUID:
tune2fs [-l] 设备文件名 #读出superblock内的数据
tune2fs [-L] 设备文件名 #修改Lable name
tune2fs [-U] 设备文件名 #修改UUID
根目录是一定要挂载的,且要先于其他挂载点(mount point)被挂载进来。
同一时间挂载点和磁盘分区只能挂载一次。
卸载时,也必须将工作目录移到挂载点之外。
#!/etc/fstab
#
# / was on /dev/sda3 during installation
UUID= xxx···xxx / ext4 errors=remount-ro 0 1
其选项可为以下参数:
async/sync,是否以异步方式运行
auto/noauto,当执行mount -a时,此文件系统是否会被主动测试挂载
rw/ro,可读写或只读的状态
exec/noexec,限制文件系统内是否可以进行执行的权限
user/nouser,是否允许用户挂载
defaults,默认具有所有权限
该文件写完以后一定要进行使用mount -a
进行测试,否则一旦出错,LInux系统将无法启动。
loop设备文件挂载的是镜像文件,可以使用dd
制作大文件,然后强行格式化,并进行挂载。
可以使用mkswap
格式化分区或者大文件,然后挂载成为交换文件。