16 Linux-文件系统管理
作者:互联网
16 Linux-文件系统管理
16.1 硬盘结构
16.1.1 硬盘的逻辑结构
每个扇区的大小事固定的,为512Byte。扇区也是磁盘的最小存贮单位。
硬盘的大小是使用“磁头数×柱面数×扇区数×每个扇区的大小”这样的公式来计算的,其中
-
磁头数(Heads)表示硬盘总共有几个磁头,也可以理解成为硬盘有几个盘面,然后乘以二;
-
柱面数(Cylinders)表示硬盘每一面盘片有几条磁道;
-
扇区数(Sectors)表示每条磁道上有几个扇区;每个扇区的大小一般是512Byte。
16.1.2 硬盘接口
IDE硬盘接口(Integrated Drive Electronics,并口,即电子集成驱动器)也称作“ATA硬盘”或“PATA硬盘”,是早期机械硬盘的主要接口,ATA133硬盘的理论速度可以达到133MB/s(此速度为理论平均值),IDE硬盘接口
SATA接口(Serial ATA,串口)是速度更高的硬盘标准,具备了更高的传输速度,并具备了更强的纠错能力。目前已经是SATA三代,理论传输速度达到600MB/s(此速度为理论平均值)
SCSI接口(Small Computer System Interface,小型计算机系统接口)广泛应用在服务器上,具有应用范围广、多任务、带宽大、CPU占用率低及支持热插拔等优点,理论传输速度达到320MB/s
16.2 文件系统
16.2.1 Linux文件系统的特性
super block(超级块):
记录整个文件系统的信息,包括block与inode的总量,已经使用的inode和block的数量,未使用的inode和block的数量,block与inode的大小,文件系统的挂载时间,最近一次的写入时间,最近一次的磁盘检验时间等。
date block(数据块,也称作block):
用来实际保存数据的(柜子的隔断),block的大小(1KB、2KB或4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化(制作柜子的时候,隔断大小就已经决定,不能更改,除非重新制作柜子)。
每个blcok只能保存一个文件的数据,要是文件数据小于一个block块,那么这个block的剩余空间不能被其他文件是要;要是文件数据大于一个block块,则占用多个block块。
Windows中磁盘碎片整理工具的原理就是把一个文件占用的多个block块尽量整理到一起,这样可以加快读写速度。
inode(i节点,柜子门上的标签):
用来记录文件的权限(r、w、x),文件的所有者和属组,文件的大小,文件的状态改变时间(ctime),文件的最近一次读取时间(atime),文件的最近一次修改时间(mtime),文件的数据真正保存的block编号。每个文件需要占用一个inode。
16.2.2 Linux常见文件系统
文件系统 | 描述 |
---|---|
ext | Linux中最早的文件系统,由于在性能和兼容性上具有很多缺陷,现在已经很少使用 |
ext2 | 是ext文件系统的升级版本,Red Hat Linux 7.2版本以前的系统默认都是ext2文件系统。于1993年发布,支持最大16TB的分区和最大2TB的文件(1TB=1024GB=1024×1024KB) |
ext3 | 是ext2文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性。支持最大16TB的分区和最大2TB的文件 |
ext4 | 是ext3文件系统的升级版。ext4 在性能、伸缩性和可靠性方面进行了大量改进。ext4的变化可以说是翻天覆地的,比如向下兼容ext3、最大1EB文件系统和16TB文件、无限数量子目录、Extents连续数据块概念、多块分配、延迟分配、持久预分配、快速FSCK、日志校验、无日志模式、在线碎片整理、inode增强、默认启用barrier等。它是CentOS 6.x的默认文件系统 |
xfs | XFS最早针对IRIX操作系统开发,是一个高性能的日志型文件系统,能够在断电以及操作系统崩溃的情况下保证文件系统数据的一致性。它是一个64位的文件系统,后来进行开源并且移植到了Linux操作系统中,目前CentOS 7.x将XFS+LVM作为默认的文件系统。据官方所称,XFS对于大文件的读写性能较好。 |
swap | swap是Linux中用于交换分区的文件系统(类似于Windows中的虚拟内存),当内存不够用时,使用交换分区暂时替代内存。一般大小为内存的2倍,但是不要超过2GB。它是Linux的必需分区 |
NFS | NFS是网络文件系统(Network File System)的缩写,是用来实现不同主机之间文件共享的一种网络服务,本地主机可以通过挂载的方式使用远程共享的资源 |
iso9660 | 光盘的标准文件系统。Linux要想使用光盘,必须支持iso9660文件系统 |
fat | Windows下的fat16文件系统,在Linux中识别为fat |
vfat | Windows下的fat32文件系统,在Linux中识别为vfat。支持最大32GB的分区和最大4GB的文件 |
NTFS | Windows下的NTFS文件系统,不过Linux默认是不能识别NTFS文件系统的,如果需要识别,则需要重新编译内核才能支持。它比fat32文件系统更加安全,速度更快,支持最大2TB的分区和最大64GB的文件 |
ufs | Sun公司的操作系统Solaris和SunOS所采用的文件系统 |
proc | Linux中基于内存的虚拟文件系统,用来管理内存存储目录/proc |
sysfs | 和proc一样,也是基于内存的虚拟文件系统,用来管理内存存储目录/sysfs |
tmpfs | 也是一种基于内存的虚拟文件系统,不过也可以使用swap交换分区 |
16.3 常用的硬盘管理命令
16.3.1 df命令
[root@localhost ~]# df –ahT
选项:
-a 显示特殊文件系统,这些文件系统几乎都是保存在内存中的。如/proc,因为是挂载在内存中,所以占用量都是0
-h 单位不再只用KB,而是换算成习惯单位
-T 多出了文件系统类型一列
示例:
[root@localhost ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 17G 34G 34% /
devtmpfs devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs tmpfs 3.8G 196K 3.8G 1% /dev/shm
tmpfs tmpfs 3.8G 402M 3.4G 11% /run
tmpfs tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/sda2 xfs 1014M 142M 873M 14% /boot
/dev/sda1 vfat 200M 12M 189M 6% /boot/efi
/dev/sdb ext4 917G 39G 832G 5% /data
/dev/mapper/centos-home xfs 53G 33M 53G 1% /home
tmpfs tmpfs 774M 0 774M 0% /run/user/0
16.3.2 du命令
[root@localhost ~]# du [选项] [目录或文件名]
选项:
-a 显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
-h 使用习惯单位显示磁盘占用量,如KB,MB或GB等
-s 统计总占用量,而不列出子目录和子文件的占用量
示例:
[root@localhost home]# du -sh
24K .
du与df的区别:du是用于统计文件大小的,统计的文件大小是准确的;df是用于统计空间大小的,统计的剩余空是准确的
lsof | grep deleted”查看被删除的文件,然后一个进程一个进程的手工kill也是可以的
16.3.3 fsck文件系统修复命令
[root@localhost ~]# fsck –y /dev/sdb1
#自动修复
16.3.4 dumpe2fs显示磁盘状态
[root@localhost ~]# dumpe2fs [磁盘]
示例:
[root@localhost ~]# dumpe2fs /dev/sdb
Filesystem volume name: <none> # 卷标名
Last mounted on: /data # 挂载点
Filesystem UUID: 49d9b3c7-7dae-44df-a25f-8998ec4db3a0
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl # 挂载参数
Filesystem state: clean # 文件系统状态,正常
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 61054976 # inode总数
Block count: 244190646 # 块总数
Reserved block count: 12209532
Free blocks: 237455710
Free inodes: 60989955
First block: 0
Block size: 4096 # 块大小
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 1024
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Tue Jun 15 10:03:27 2021
Last mount time: Thu Jun 24 17:36:23 2021
Last write time: Thu Jun 24 17:36:23 2021
Mount count: 2
Maximum mount count: -1
Last checked: Tue Jun 15 10:03:27 2021
Check interval: 0 (<none>)
Lifetime writes: 893 GB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256 # inode的大小
...
Group 0: (Blocks 0-32767) [ITABLE_ZEROED] # 第一个数据组的内容
Checksum 0x0553, unused inodes 8181
主 superblock at 0, Group descriptors at 1-117
保留的GDT块位于 118-1141
Block bitmap at 1142 (+1142), Inode bitmap at 1158 (+1158)
Inode表位于 1174-1685 (+1174)
23400 free blocks, 8182 free inodes, 1 directories, 8181个未使用的inodes
可用块数: 9367-9370, 9372-32767
可用inode数: 11-8192
...
16.3.5 stat查看文件的详细时间
[root@localhost ~]# stat [文件名]
示例:
[root@localhost ~]# stat uninstall_cluster.sh
文件:"uninstall_cluster.sh"
大小:919 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:110630885 硬链接:1
权限:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2021-06-29 09:12:42.185316283 +0800
最近更改:2021-06-29 09:12:33.638316688 +0800
最近改动:2021-06-29 09:12:39.985316387 +0800
创建时间:-
16.3.6 判断文件类型
file 文件名 判断文件类型
type 命令名 判断命令类型
16.4 fdisk命令手工分区流程介绍
16.4.1 查看系统所有硬盘及分区
[root@localhost ~]# fdisk -l
16.4.2 选择硬盘进行分区
[root@localhost ~]# fdisk 硬盘名称
fdisk交互指令说明:
命令 | 说明 |
---|---|
a | 设置可引导标记 |
b | 编辑bsd磁盘标签 |
c | 设置DOS操作系统兼容标记 |
d | 删除一个分区 |
l | 显示已知的文件系统类型。82为Linux swap分区,83为Linux分区 |
m | 显示帮助菜单 |
n | 新建分区 |
o | 建立空白DOS分区表 |
p | 显示分区列表 |
q | 不保存退出 |
s | 新建空白SUN磁盘标签 |
t | 改变一个分区的系统ID |
u | 改变显示记录单位 |
v | 验证分区表 |
w | 保存退出 |
x | 附加功能(仅专家) |
常见流程:
n→p主→1分区号→起始柱面→分区大小+100M→w
n→e扩展→2分区号→124起始柱面→1024柱面(所有剩余空间都分配给扩展分区)
n→l逻辑→不用指定分区号→124起始柱面→+100M(指定大小)→-w
有时因为系统的分区表正忙,则需要重新启动系统之后才能使新的分区表生效。
Command (m for help): w # 保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16:
Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot. # 要求重启动,才能格式化
Syncing disks.
16.4.3 强制重读所有分区文
强制重读所有分区文件,重新挂载分区文件内所有分区。这不是分区必须命令,如果没有提示重启,可以不执行,也可以重启系统
(Warning: Unable to open /dev/hdc read-write (Read-only file system). /dev/hdc has been opened read-only.光盘只读挂载,不是错误,不用紧张)
如果这个命令不存在请安装parted-2.1-18.el6.i686这个软件包
16.4.4 格式化建立文件系统
[root@localhost ~]# mkfs [选项] 分区设备文件名
选项:
-t 文件系统: 指定格式化成哪个文件系统,如ext2,ext3,ext4
示例:
[root@localhost ~]# mkfs -t ext4 /dev/sdb1
mkfs命令非常简单易用,不过是不能调整分区的默认参数的(比如块大小是4096),这些默认参数除非特殊情况,否则不需要调整,如果想要调整就需要使用mke2fs命令进行重新格式化,命令格式如下:
[root@localhost ~]# mke2fs [选项] 分区设备文件名
选项:
-t 文件系统: 指定格式化成哪个文件系统,如ext2,ext3,ext4
-b 字节: 指定block块的大小
-i 字节: 指定“字节/inode”的比例,也就是多少个字节分配一个inode
-j: 建立带有ext3日志功能的文件系统
-L 卷标名: 给文件系统设置卷标名,就不使用e2label命令设定了
示例:
[root@localhost ~]# mke2fs -t ext4 /dev/sdb2
16.4.5 建立挂载点
[root@localhost ~]# mkdir -p /data/disk1 ------ /dev/sdb1
16.4.6 挂载硬盘分区
[root@localhost ~]# mount /dev/sdb1 /data/disk1
16.4.7 查看挂载信息
[root@localhost ~]# mount
16.4.8 自动挂载
修改分区自动挂载文件
vim /etc/fstab 注意:此文件直接参与系统启动,如果修改错误,系统启动报错
-
第一列: 设备文件名
-
第二列 挂载点
-
第三列 文件系统
-
第四列 挂载选项
-
第五列 1 是否可以被备份 0不备份 1 每天备份 2不定期备份
-
第六列 2 是否检测磁盘fsck 0不检测 1启动时检测 2启动后检测
也可以使用UUID进行挂载,UUID(硬盘通用唯一识别码,可以理解为硬盘的ID)
这个字段在CentOS 5.5的系统当中是写入分区的卷标名或分区设备文件名的,现在变成了硬盘的UUID。这样做的好处是当硬盘增加了新的分区,或者分区的顺序改变,再或者内核升级后,任然能够保证分区能够正确的加载,而不至于造成启动障碍,可以使用dumpe2fs命令查看到硬盘的uuid
[root@localhost ~]# dumpe2fs /dev/sdb1
16.4.9 挂载测试
重启服务器或使用 mount -a 重新挂载所有内容,进行测试
16.5 /etc/fstab/文件修复
重启服务器后出现该错误
一般这种情况很有可能是fstab文件编写问题,导致无法正常开机,可以进入应急模式进行恢复后重启,输入root用户的密码
修改/etc/fstab文件
出现这个错误是应为没有写的权限,那么只要把/分区重新挂载下,挂载为读写权限,就可以正常修改
[root@localhost ~]# mount -o remount,rw /
再去修改/etc/fstab文件,修改完成后,即可正常启动
16.6 parted命令分区
Linux系统中有两种常见的分区表MBR分区表(主引导记录分区表)和GPT分区表(GUID分区表),其中:
-
MBR分区表:支持的最大分区是2TB(1TB=1024GB);最多支持4个主分区,或3个主分区1个扩展分区
-
GPT分区表:支持最大18EB的分区(1EB=1024PB=1024*1024TB);最多支持128个分区,其中1个系统保留分区,127个用户自定义分区
16.6.1 parted交互模式
[root@localhost ~]# parted /dev/sdb
#打算继续划分/dev/sdb硬盘
GNU Parted 2.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) ←parted的等待输入交互命令的位置
parted交互命令 | 说 明 |
---|---|
check NUMBER | 做一次简单的文件系统检测 |
cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER | 复制文件系统到另外一个分区 |
help [COMMAND] | 显示所有的命令帮助 |
mklabel,mktable LABEL-TYPE | 创建新的磁盘卷标(分区表) |
mkfs NUMBER FS-TYPE | 在分区上建立文件系统 |
mkpart PART-TYPE [FS-TYPE] START END | 创建一个分区 |
mkpartfs PART-TYPE FS-TYPE START END | 创建分区,并建立文件系统 |
move NUMBER START END | 移动分区 |
name NUMBER NAME | 给分区命名 |
print [devices|free|list,all|NUMBER] | 显示分区表,活动设备,空闲空间,所有分区 |
quit | 退出 |
rescue START END | 修复丢失的分区 |
resize NUMBER START END | 修改分区大小 |
rm NUMBER | 删除分区 |
select DEVICE | 选择需要编辑的设备 |
set NUMBER FLAG STATE | 改变分区标记 |
toggle [NUMBER [FLAG]] | 切换分区表的状态 |
unit UNIT | 设置默认的单位 |
Version | 显示版本 |
16.6.2 查看分区
(parted) print
#输入print指令
Model: VMware, VMware Virtual S (scsi) # 硬盘参数,是虚拟机
Disk /dev/sdb: 21.5GB # 硬盘大小
Sector size (logical/physical): 512B/512B # 扇区大小
Partition Table: msdos # 分区表类型,就是MBR分区表
Number Start End Size Type File system 标志
1 32.3kB 5379MB 5379MB primary
2 5379MB 21.5GB 15.1GB extended
5 5379MB 7534MB 2155MB logical ext4
6 7534MB 9689MB 2155MB logical ext4
#看到了我们使用fdisk分的区,其中1分区没有格式化,2分区是扩展分区不能格式化
使用print可以查看分区表信息,包括硬盘参数,硬盘大小,扇区大小,分区表类型和分区信息。分区信息总共七列,分别是:
-
Number:分区号
-
Start:分区起始位置,这里不再像fdisk用柱面表示,而是使用Byte更加直观
-
End:分区结束位置
-
Size:分区大小
-
Type:分区类型
-
File system:文件系统类型。我不是说parted不支持ext4文件系统吗?注意,我一直都是说parted不能直接把分区直接格式化成ext4文件系统,但是它是可以识别的。
-
标志:Flags,就是分区的标记
16.6.3 修改成GPT分区表
(parted) mklabel gpt
#修改分区表命令
警告: 正在使用 /dev/sdb 上的分区。 #由于/dev/sdb 分区已经挂载,所以有警告,注意如果强制修改,原有分区及数据会消失
忽略/Ignore/放弃/Cancel? ignore # 输入ignore 忽略报错
警告: The existing disk label on /dev/sdb will be destroyed and all data on this disk will
be lost. Do you want to continue?
是/Yes/否/No? yes # 输入yes
警告: WARNING: the kernel failed to re-read the partition table on /dev/sdb (设备或资源
忙). As a result, it may not reflect all of
your changes until after reboot. # 下次重启后,才能生效
(parted) print # 查看下分区表
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt # 分区表已经变成GPT
Number Start End Size File system Name 标志
# 所有的分区都消失了
修改了分区表,如果这块硬盘已经有分区了,那么原有分区和分区中的数据都会消失,而且需要重启系统才会生效。
转换分区表的目的是为了支持大于2TB 的分区,如果分区并没有大于2TB,那么这步是可以不执行的。
注意:一定要把/etc/fstab 文件中和原有分区的内容删除掉,才能重启动。要不系统启动就一定会报错的。
16.6.4 建立分区
因为修改过了分区表,所以/dev/sdb 中的所有数据都消失了,所以我们可以重新对这块硬盘分区了。不过建立分区时,默认文件系统就只能建立成ext2 了,命令如下:
(parted) mkpart
#输入创建分区命令,后面不要参数,全部靠交互指定
分区名称? []? disk1 # 分区名称,我起名叫disk1
文件系统类型? [ext2]? # 文件系统类型,直接回车,使用默认ext2
起始点? 1MB # 分区从1MB 开始
结束点? 5GB # 分区到5GB 结束
#分区完成
(parted) print # 查看分区
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name 标志
1 1049kB 5000MB 4999MB disk1 # 分区1 已经出现
现在的print 查看的分区,和第一次查看MBR 分区表的分区时有些不一样了,少了Type 这个字段,也就是分区类型的字段,多了Name 分区名字段。
分区类型是标识主分区、扩展分区和逻辑分区的,不过这种标识只在MBR 分区表中使用,我们现在已经变成了GPT 分区表了,所以就不再有Type 类型了。也就说折磨我们很久的主分区、扩展分区和逻辑分区的概念不再有用了。
16.6.5 建立文件系统
分区分完了,还需要进行格式化。
(parted) mkfs
#格式化命令(很奇怪也是mkfs,但是这只是parted 的交互命令)
WARNING: you are attempting to use parted to operate on (mkfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
警告: The existing file system will be destroyed and all data on the partition will be lost.
Do you want to continue?
是/Yes/否/No? yes # 警告你格式化数据会丢失,
分区编号? 1
文件系统类型? [ext2]? # 指定文件系统类型
(parted) print # 格式化完成,查看下
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name 标志
1 1049kB 5000MB 4999MB ext2 disk1 # 拥有了文件系统
16.6.6 调整分区大小
parted 命令还有一大优势,就是可以调整分区的大小(windows 中也可以实现,不过要不需要转换成动态磁盘,要不需要依赖第三方工具,如硬盘分区魔术师)。起始Linux 中LVM 和RAID 是可以支持分区调整的,不过这两种方法也可以看成是动态磁盘方法,我们在下一个章节中介绍。使用parted命令调整分区要更加简单。
注意:parted 调整已经挂载使用的分区时,是不会影响分区中的数据的,也就是说数据不会丢失。但是一定要先卸载分区,再调整分区大小,否则数据是会出现问题的。还有要调整大小的分区必须已经建立了文件系统(格式化),否则会报错
(parted) resize
分区编号? 1 # 指定要修改的分区编号
起始点? [1049kB]? 1MB # 分区起始位置
结束点? [5000MB]? 6GB # 分区结束位置
(parted) print # 查看下
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name 标志
1 1049kB 6000MB 5999MB ext2 disk1 # 分区大小改变
16.6.7 删除分区
(parted) rm
#删除分区命令
分区编号? 1 # 指定分区号
(parted) print # 查看下
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name 标志 # 分区消失
还有件事要注意,parted中所有的操作都是立即生效,没有保存生效的概念。这点和fdisk交互命令明显不同,所以所做的所有操作大家要倍加小心。
那么到底使用fdisk进行分区?还是parted命令呢?这个完全看个人习惯,我们更加习惯fdisk命令。
16.7 分配swap分区
16.7.1 分区,并修改为swap分区ID
[root@localhost ~]# fdisk /dev/sdb
# 拿/dev/sdb分区
Command (m for help): t # 修改分区的系统ID
Selected partition 1 # 只有一个分区,所以不用选择分区了
Hex code (type L to list codes): 82 改为swap的ID
Changed system type of partition 1 to 82 (Linux swap / Solaris)
16.7.2 格式化
[root@localhost ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 522076 KiB
no label, UUID=c3351dc3-f403-419a-9666-c24615e170fb
16.7.3 激活交换空间
[root@localhost ~]# swapon 分区设备文件名
示例:
[root@localhost ~]# swapon /dev/sdb1
16.7.4 开机自动挂载
加入新swap分区的相关内容,可以使用UUID来进行自动挂载
/dev/sdb1 swap swap defaults 0 0
标签:parted,16,分区,文件系统,dev,分区表,Linux,root 来源: https://www.cnblogs.com/weicunqi/p/15029831.html