一、硬盘结构
- 硬盘的逻辑结构
每个扇区的大小是固定的,为512Byte。扇区也是磁盘的最小存贮单位
硬盘的大小是使用“磁头数X柱面数X扇区数X每个扇区的大小”这样的公式来计算的。其中磁头数(Heads)表示硬盘总共有几个磁头,也可以理解成为硬盘有几个盘面,然后乘以二;柱面数(Cylinders)表示硬盘每个面盘片有几条磁道;扇区数(Sectors)表示每条磁道上有几个扇区;每个扇区的大小一般是512Byte。
- 硬盘接口
- IDE 硬盘接口(Integrated Drive Electronics,并口,即电子集成驱动器)也称作“ATA 硬盘”或“PATA 硬盘”,是早起机械硬盘的主要接口,ATA133硬盘的理论速度可以达到133MB/s(此速度为理论平均值),IDE硬盘接口
- SATA接口(Serial ATA,串口)是速度更高的硬盘标准,具备了更高的传输速度,并具备了更强的纠错能力。目前已经是SATA三代,理论传输速度达到600MB/s(此速度为理论平均值)
- SCSI接口(Small Computer System Interface,小型计算机系统接口)广泛应用在服务器上,具有应用范围广、多任务、带宽大、CPU占用率低及支持热插拔等优点,理论传输速度达到320MB/s
二、文件系统
- Linux文件系统的特性:
- super block(超级块):记录整个文件系统的信息,包括 block 与 inode 的总量,已经使用的 inode 和 block 的数量,未使用的 inode 和 block 的数量, block 与 inode 的大小,文件系统的挂载时间,最近一次的写入时间,最近一次的磁盘检验时间等
- date block (数据块,也称作block):用来实际保存数据的(柜子的隔断),block的大小(1KB、2KB或4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化(制作柜子的时候,隔断大小就已经决定,不能更改,除非重新制作柜子)。每个block只能保存一个文件的数据,要是文件数据小于一个 block 块,那么这个 block的剩余空间不能被其他文件使用;要是文件数据大于一个block块,则占用多个block块。Windows中磁盘碎片整理工具的原理就是把一个文件占用的多个block块尽量整理到一起,这样可以加快读写速度。
- inode (i节点,柜子门上的标签):用来记录文件的权限(r、w、x),文件的所有这和属组,文件的大小,文件的状态改变时间(ctime),文件的最近一次读取时间(atime),文件的最近一次修改时间(mtime),文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。
- Linux常见文件系统
文件系统 | 描述 |
---|---|
ext | Linux中最早的文件系统,由于在性能和兼容性上具有很多缺陷,现在已经很少使用 |
ext2 | 是 ext2 文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性。支持最大16TB的分区和最大2TB的文件 |
ext4 | 是ext3文件系统的升级版。ext4在性能、伸缩性和可靠性方面进行了大量改进。ext4的变化可以说是翻天覆地的,比如向下兼容 ext3、最大1EB文件系统和 16TB文件、无限数量子目录、Extents连续数据块概念、多块分配、延迟分配、持久预分配、快速FSCK、日志校验、无日志模式、在线碎片整理、inode增强、默认启用barrier等。它是CentOS6.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交换分区 |
三、常用的硬盘管理命令
- df 命令
[root@localhost ~]# df -ahT
#-a 显示特殊文件系统,这些文件系统几乎都是保存在内存中的。如/proc,因为是挂载在内存中,所以占用量都是0
#-h 单位不再只用KB,而是换算成习惯单位
#-T 多出了文件系统类型一列
- du 命令
[root@localhost ~]# du [选项] [目录或文件名]
选项:
-a:显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
-h:使用习惯单位显示磁盘占用量,如KB,MB或GB等
-s:统计总占用量,而不列出子目录和子文件的占用量
du 与 df 的区别:du 是用于统计文件大小的,统计的文件大小是准确的;df 是用于统计空间大小的,统计的剩余空间是准确的
lsof | grep deleted" 查看被删除的文件,然后一个进程一个进程的手工 kill 也是可以的
- fsck 文件系统修复命令
[root@localhost ~]# fsck -y /dev/sdb1
#自动修复
- 显示磁盘状态 dumpe2fs
[root@localhost ~]# dumpe2fs /dev/sda3
#该命令只能查询ext系统文件
- 查看文件的详细时间
stat 文件名 查看文件的详细时间
[root@localhost ~]# stat test/
File: ‘test/’
#文件名
Size: 53 Blocks: 0 IO Block: 4096 directory
#文件大小 占用块 系统分区块大小
Device: 803h/2051d Inode: 35514438 Links: 2
#存放文件的设备 inode 号 硬链接数
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
权限 属主 属组
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-09-15 06:42:39.255075568 -0700 #访问时间
Modify: 2020-09-10 08:22:11.542226916 -0700 #数据修改时间
Change: 2020-09-10 08:22:11.542226916 -0700 #状态修改时间
Birth: -
- 判断文件类型
file 文件名 判断文件类型
type 命令名 判断命令类型
四、fdisk 命令手工分区
- fdisk -l
查看系统所有硬盘及分区 - fdisk /dev/sdb 进行磁盘分区(分区还没有分区号)
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 分区号----1 起始柱面-----分区大小+100M-----w
n—e 扩展—2分区号—124 起始柱面----1024 柱面(所有剩余空间都分配给扩展分区)
n—1 逻辑—不指定分区号—124起始柱面----+100M(指定大小)-----w
有时因为系统的分区表正忙,则需要重新启动系统之后才能使新的分区表生效
Command (m for help):w
...省略...
WARNING:Re-reading the partition table failed with error 16:
Device or resource busy
The kernel still users the old table
The new table will be used at the next reboot #要求重启动,才能格式化
Syncing disks
- partprobe 强制重读所有分区文件,重新挂载分区文件内所有分区。这不是分区必须命令,如果没有提示重启,可以不执行,也可以重启系统
(Warning:Unable to open /dev/hdc read-write (Read-only file system). /dev/hdc has been opened read-only.
光盘只读挂载,不是错误,不用紧张)
如果这个命令不存在请安装 parted-2.1-18.e16.i686 这个软件包
- 格式化 建立文件系统 ( ext3 是 Linux 默认文件系统)
mkfs -f ext4 /dev/sdb1
mkfs -t ext4 /dev/sdb5
mkfs.xfs /dev/sdb1 -f #这是格式化建立文件系统为 xfs 格式
mkfs 命令非常简单易用,不过是不能调整分区的默认参数的(比如块大小是 4096),这些默认参数除非特殊情况,否则不需要调整,如果想要调整就需要使用 mke2fs 命令进行重新格式化,命令格式如下:
[root@localhost ~]# mke2fs [选项] 分区设备文件名
选项:
-t 文件系统:指定格式化成哪个文件系统,如ext2,ext3,ext4
-b 字节: 指定 block 块的大小
-i 字节: 指定“字节/inode”的比例,也就是多少个字节分配一个inode
-j: 建立带有ext3日志功能的文件系统
-L 卷标名: 给文件系统设置卷标名,就不使用 e2label 命令设定了
- 建立挂载点
mkdir /disk1-------------------/dev/sdb1 把 sdb1 打算挂载到 /disk
mkdir /disk5-------------------/dev/sdb5
- 挂载
mount /dev/sdb1 /disk1
mount /dev/sdb5 /disk5
- 查看
mount 查看所有已经挂载的分区和光盘
fdisk -l 查看系统分区
df 查看分区占用百分比
- 自动挂载
修改分区自动挂载文件
vi /etc/fstab
注意:此文件直接参与系统启动,如果修改错误,系统启动报错
/dev/sdb1 /disk1 ext3 defaults 1 2
第一列:设备文件名
第二例:挂载点
第三列:文件系统
第四列:挂载选项
第五列: 1 是否可以被备份 0不备份 1每天备份 2不定期备份
第六列: 2 是否检测磁盘 fsck 0不检测 1启动检测 2启动后检测
也可以使用 UUID 进行挂载,UUID (硬盘通用唯一识别码,可以理解为硬盘的ID)
- 这个字段在 CentOS 5.5 的系统当中是写入分区的卷标名或分区设备文件名的,现在变成了硬盘的 UUID 。这样做的好处是当硬盘增加了新的分区,或者分区的顺序改变,再或者内核升级后,任然能够保证分区能够正确的加载,而不至于造成启动障碍
- 那么每个分区的 UUID 到底是什么呢?我们讲过的 dumpe2fs 命令是可以查看到的,命令如下:
[root@localhost ~]# dumpe2fs /dev/sdb5
或
[root@localhost ~]# ls -l /dev/disk/by-uuid/
- 重启测试
或 mount -a 重新挂载所有内容,用它进行测试
五、/etc/fstab/文件修复
我们重新启动系统吧,报错,如图所示:
上图提示输入 root 密码后,再把根分区改成读写权限
[root@localhost ~]# mount -o remount,rw /
再将自动挂载分区中/etc/fstab 写错的分区改回来即可
六、parted 命令分区
我们Linux 系统中有两种常见的分区表 MBR 分区表(主引导记录分区表)和GPT分区表(GUID 分区表),其中:
- MBR 分区表:支持的最大分区是 2TB(1TB=1024GB);最多支持 4 个主分区,或3个主分区1个扩展分区
- GPT分区表:支持最大18EB的分区(1EB=1024PB=1024*1024TB);最大支持 128 个分区,其中 1 个系统保留分区,127个用户自定义分区
不过 parted 命令也有点小问题,就是命令自身分区的时候只能格式化成 ext2 文件系统,不支持 etx3 文件系统,那就更不用说 ext4 文件系统了(截止到 CentOS 6.8还是这样,这里只是指不能用 parted 命令把分区格式化成 ext4 文件系统,但是 parted 命令还是可以识别 ext4 文件系统的)。不过这没有太多的影响,因为我们可以先分区再用 mkfs 进行格式化
1)parted 交互模式
[root@localhost ~]# parted /dev/sdb
#打算继续划分 /dev/sdb 硬盘
GNU Parted 3.1
Using /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] | 显示所有的命令帮助 |
mkbel,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 |
quit | 退出 |
rescue START END | 修复丢失的分区 |
rm NUMBER | 删除分区 |
select DEVICE | 选择需要编辑的设备 |
set NUMBER FLAG STATE | 改变分区标记 |
toggle [NUMBER [FLAG]] | 切换分区表的状态 |
unit UNIT | 设置默认的单位 |
Version | 显示版本 |
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分区表
Disk Flags:
Number Start End Size Type File system Flags 标志
1 1049kB 2149MB 2147MB primary xfs
2 2149MB 21.5GB 19.3GB extended
5 2150MB 4297MB 2147MB logical xfs
#看到了我们使用 fdisk 分的区,其中1 分区没有格式化2分区是扩展分区不能格式化
使用print可以查看分区表信息,包括硬盘参数,硬盘大小,扇区大小,分区表类型和分区信息。分区信息总共七列,分别是
- Number:分区号
- Start:分区起始位置,这里不再像fdisk 用柱面表示,而是使用 Byte 更加直观
- End:分区结束位置
- Size:分区大小
- Type:分区类型
- File system:文件系统类型。不是说 parted 不支持 ext4以上文件系统吗?虽然 parted 不能直接把分区格式化成 ext4,但是它是可以识别的
- 标志:Flags,就是分区的标记
- 修改成 GPT 分区表
(parted) mklabel gpt
#修改分区表命令
Warning: Partition(s) on /dev/sdb are being used. #由于/dev/sdb分区已经挂载,所以有警告
#注意如果强制修改,原有分区及数据会消失
Ignore/Cancel? Ignore #输入 Ignore 忽略报错
Warning: 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
Error: Partition(s) 1, 5 on /dev/sdb have been written, but we have been unable to inform the kernel of the change, probably because
it/they are in use. As a result, the old partition(s) will remain in use. You should reboot now before making further changes.
#下次重启后,才能生效
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt #分区表已经变成GPT
Disk Flags:
Number Start End Size File system Name Flags 标志
#所有的分区都消失了
修改了分区表,如果这块硬盘已经有分区了,那么原有分区和分区中的数据都会消失,而且需要重启系统才会生效
还有我们转换分区表的目的是为了支持大于 2 TB的分区,如果分区并没有大于 2 TB,那么这步是可以不执行的
注意:一定要把 /etc/fstab 文件中和原有分区的内容删除掉,才能重启动。要不系统启动就一定会报错的
- 建立分区
因为修改过了分区表,所以 /dev/sdb 中的所有数据都消失了,所以我们可以重新对这块硬盘分区。不过建立分区时,默认文件系统就只能建立 ext2 了,命令如下:
(parted) mkpart
#输入创建分区命令,后面不要参数,全部靠交互指定
Partition name? []? diskl #分区名称,我起名叫 disk1
File system type? [ext2]? #文件系统类型,直接回车,使用默认 ext2
Start? 1MB #分区从1MB开始
End? 5GB #分区到 5GB 结束
(parted) print #查看下
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 5000MB 4999MB xfs disk1 #分区1已经出现
不知道大家注意到了吗?我们现在的print 查看的分区,和第一次查看 MBR 分区表的分区时有些不一样了,少了 Type 这个字段,也就是分区类型的字段,多了 Name 分区名字段。分区类型是标识主分区、扩展分区和逻辑分区的,不过这种标识只在 MBR 分区表中使用,我们现在已经变成了GPT分区表了,所以不再有 Type 类型了。也就说折磨我们很久的主分区、扩展分区和逻辑分区的概念不再有用了
- 建立文件系统
分区分完了,我们还需要格式化。不过我们已经知道如果使用 parted 交互命令格式化的话,只能格式化成 ext2 文件系统。我们这里是要演示下 parted 命令的格式化方法,所以就格式化成 ext2 吧,命令如下:
(parted) mkfs
- 调整分区大小
parted 命令还有一大优势,就是可以调整分区的大小(Windows中也可以实现,不过要不需要转换成动态磁盘,要不需要依赖第三方工具,如硬盘分区魔术师)。其实Linux 中 LVM 和 RAID 是可以支持分区调整的,不过这两种方法也可以看成是动态磁盘方法骂我们在下一个章节中介绍。使用 parted 命令调整分区要更加简单
注意:parted 调整已经挂载使用的分区时,是不会影响分区中的数据的,也就是说数据不会丢失。但是一定要先卸载分区,再调整大小,否则数据是会出现问题的。还有调整大小的分区必须已经建立了文件系统(格式化),否则会报错
命令如下:
(parted) resize
- 删除分区
(parted) rm
#删除分区命令
还有件事要注意,parted 中所有的操作都是立即生效,没有保存生效的概念。这点和 fdisk 交互命令明显不同,所以所做的所有操作大家要加倍小心
那么到底使用 fdisk 进行分区?还是 parted 命令呢?这个完全看个人习惯,我们更加习惯 fdisk 命令
七、分配 swap 分区
- 分区,并修改为 swap 分区 ID
[root@localhost ~]# fdisk /dev/sdb
#拿/dev/sdb 分区
Command (m for help): t #修改分区的系统 ID
Partition number (1,2,5, default 5): 1 #只有一个分区,所以不用选择分区了
Hex code (type L to list all codes): 82 #改为 swap 的 ID
Changed type of partition 'Linux' to 'Linux swap / Solaris'
- 格式化
[root@localhost ~]# mkswap /dev/sdb1
mkswap: /dev/sdb1: warning: wiping old xfs signature.
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=b39e6d35-1481-498f-96de-cda472bd0646
- 使用 swap 分区
在使用 swap 分区之前,我们先来说说 free 命令,命令如下:
[root@localhost ~]# free -h
total used free shared buff/cache available
#总内存 #被使用 #剩余 # #缓冲 #缓存
Mem: 976M 648M 67M 6.2M 260M 131M
Swap: 2.0G 1.3M 2.0G
[root@localhost ~]# swapon 分区设备文件名
例:
[root@localhost ~]# swapon /dev/sdb1
让swap 分区开机之后自动挂载
/dev/sdb1 swap swap defaults 0 0
#加入新的 swap 分区的相关内容,我这里是直接使用的分区的设备文件名,大家当然也可以使用UUID号