1. 磁盘分区
硬盘逻辑上被划分成块、磁道、磁柱和分区
- 块:是盘片上寻址(访问)的最小单位,一个块可以存储一定字节的数据
- 磁道:是一系列头尾相连的块租场的圆圈
- 磁柱:是由一叠磁道,由在相同半径上每个盘面的磁道所组成
虚拟机添加虚拟硬盘:
设置 —— 选择硬盘 —— 添加 —— 创建一个新的虚拟磁盘 —— 磁盘类型 SCSI —— 一直下一步即可
硬盘分区可分为主分区、拓展分区和逻辑分区,一个硬盘最多划分出 4 个主分区,一个 block 等于 8 * 512 b
每个硬盘上支持分区的数量有一点限制:
- SCSI 硬盘:最多 15 个
- IDE 硬盘:63 个
各种设备在 Linux 中的文件名:
设备 | 设备在Linux中的文件名 |
---|---|
IDE 硬盘 | /dev/hd[a-d] |
SCSI 硬盘 | /dev/sd[a-p] |
U 盘 | /dev/sd[a-p] 与 SCSI 硬盘一样 |
CDROM | /dev/sr0 |
[root@hj ~]# ls /dev/sd # tab 键
sda sda1 sda2 sda3 sda4 sda5 sdb
[root@hj ~]# fdisk -l /dev/sdb # 查看硬盘 sdb
Disk /dev/sdb: 21.5 GB, 21474836480 bytes # 硬盘名、硬盘大小
255 heads, 63 sectors/track, 2610 cylinders # 磁头、扇区、柱面
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes # 扇区大小(逻辑/物理都是 512 b)
I/O size (minimum/optimal): 512 bytes / 512 bytes # 读/取(最小/优化)
Disk identifier: 0x00000000
1.1 fdisk 命令
管理磁盘分区
语法:
fdisk [磁盘名称]
参数 | 作用 |
---|---|
m | 查看全部可用的参数 |
n | 添加新的分区 |
d | 删除某个分区信息 |
l | 列出所有可用的分区类型 |
t | 改变某个分区的类型 |
p | 查看分区信息 |
w | 保存并退出 |
q | 不保存直接退出 |
示例:
首先输入命令 fdisk /dev/sdb
,尝试管理硬盘 sdb,看到提示信息,提示输入 m 获得帮助:
[root@hj ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x2707982c.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
输入 n 创建一个新的分区,系统会提示你是输入 p 创建主分区,还是 e 创建拓展分区,这里输入 p 来创建一个主分区:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
在输入 p 确定创建一个主分区后,系统要求确定分区编号(范围 1 ~ 4),以及扇区的大小,在这里直接输入大小即可(如 + 5G):
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +5G
创建分区成功后,输入 p 查看分区,输入 w 保存退出:
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x98527a04
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
1.2 partprobe 命令
重新初始化内存中内核的分区表(手动将分区信息同步到内核,建议输入两次),最后输入 partprobe 更新分区列表:
[root@hj ~]# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (设备或资源忙). As a result, it may not reflect all of your changes until after reboot.
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
Error: 无效的分区表 - /dev/sr0 出现递归分区。
[root@hj ~]# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (设备或资源忙). As a result, it may not reflect all of your changes until after reboot.
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
Error: 无效的分区表 - /dev/sr0 出现递归分区。
分区类型
Device Boot Start End Blocks Id System
/dev/sdb1 1 654 5253223+ 83 Linux
/dev/sdb2 655 1308 5253255 83 Linux
/dev/sdb3 1309 1962 5253255 83 Linux
/dev/sdb4 1963 2610 5205060 5 Extended
/dev/sdb5 1963 2094 1060258+ 83 Linux
/dev/sdb6 2095 2356 2104483+ 83 Linux
主分区加拓展分区最多四个分区,拓展分区不能写入数据,只能包含逻辑分区,后面的逻辑分区是在拓展分区上拓展的。
- 主分区:最多只能有 4 个分区
- 拓展分区:
- 最多只能有1个
- 主分区加拓展分区最多有4个
- 不能写入数据,只能包含逻辑分区
- 逻辑分区
总结:创建分区流程:fdisk /dev/sdx —— 创建分区(n)—— 分区类型(p/n) —— 分区编号(1 ~ 4)—— 分区大小(+xG)—— 保存退出(w)—— 更新分区列表(partprobe)
2. 格式化与挂载分区
上述创建硬盘分区后,还不能立即使用,还需要创建文件系统,即格式化
格式化就是将分区中的硬盘空间划分成大小相等的一些数据块(Block),以及设定这个分区中多少个 i 节点可以使用等。
文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构,即在磁盘上组织文件的方法,常见的文件系统类型:
文件系统类型 | 说明 | 系统 |
---|---|---|
ext2 | Linux 系统中标准的文件系统 | Linux |
ext3 | 一种日志式文件系统 | Linux |
ext4 | 一种针对 ext3 系统的扩展日志式文件系统 | Linux |
lvm | 逻辑盘卷管理 | Linux |
iso9660 | 目前唯一的通用的光盘文件系统 | Linux/Winows |
NTFS | Windows 上的一种文件系统 | Windows |
2.1 mkfs 命令
mkfs(make filesystem)格式化磁盘,拓展分区不能格式化
语法:
mkfs.文件系统 分区
mkfs.ext4 /dev/sdb1
2.2 mount 命令
mount 命令将存储设备与挂载点进行关联(即将磁盘上的分区与挂载点直接的映射)
挂载是分配盘符的过程,挂载点相当于盘符,具体步骤如下:
首先创建一个挂载设备的挂载点目录,然后使用 mount 命令将存储设备与挂载点进行关联
mount 磁盘分区 挂载点目录
mount /dev/sdb1 /sdb1 # 把磁盘 sdb 的第一个分区挂载到 /sdb1 目录下
示例:
[root@hj ~]# mkdir /sdb/sdb1 # 创建一个挂载目录
[root@hj ~]# mount /dev/sdb1 /sdb/sdb1 # 将 sdb1 挂载到 /sdb/sdb1
2.3 df 命令
查看挂载状态和硬盘使用量信息
语法:
df
-a # 显示所有磁盘
-h # 单位转换,也可用于查看硬盘/分区使用情况
-T # 查看已挂载的的分区和文件系统类型
-i # 查看 i 结点
mount # 也可以使用 mount 命令查看具体的挂载参数
[root@hj ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 24G 3.8G 19G 17% /
tmpfs 1002M 80K 1002M 1% /dev/shm
/dev/sda1 477M 39M 413M 9% /boot
/dev/sda3 1.9G 3.1M 1.8G 1% /home
/dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.8_Final
/dev/sdb1 4.9G 11M 4.6G 1% /sdb/sdb1
/dev/sdb2 4.9G 11M 4.6G 1% /sdb/sdb2
/dev/sdb3 4.9G 11M 4.6G 1% /sdb/sdb3
/dev/sdb5 988M 1.3M 935M 1% /sdb/sdb5
/dev/sdb6 2.0G 3.1M 1.9G 1% /sdb/sdb6
2.4 du 命令
du 命令用于查看文件数据占用量
语法:
du [选项] [文件]
du -sh /newFS/ # 查看 newFS目录下所有文件的大小
du -sh /* # 查看根目录下所有一级目录分别占用空间大小
2.5 总结
磁盘从分区,到最后能使用总共分为四步,其步骤如下:
- 创建分区:
fdisk /dev/sdb
- 更新分区表:
partprobe
- 格式化制作文件系统:
mkfs.ext4 /dev/sdb{1..3}
- 挂载:
mount /dev/sdb1 /sdb/sdb1
3. 文件系统的挂载与卸载
ext2/3/4 是日志文件系统,其过程是在写入文件内容时,首先写入到日志中,再由日志存储到硬盘中,这样有利于后期的查看设备运行情况。
ext 文件系统的缺点是仅适用于存储量比较小的情况,对现在的大量数据情况并不适用,目前比较流行且适用海量数据的文件系统是 xfs
3.1 挂载
挂载是指讲一个设备(通常指存储设备)挂接到一个已存在的目录上,挂载命令 mount
同一个分区可以挂载到几个目录下,即可以有几个挂载点,原分区下的文件删除新建修改,挂载目录下的文件也将被修改
# 几个挂载点
mount /dev/sdb1 /test1
mount /dev/sdb1 /test2
mount /dev/sdb1 /test3
3.2 卸载
umount 命令实现文件系统的卸载
语法:
umount 挂载点(目录)
-l # 强制卸载
umount /test1
首先将 sdb1 挂载到 /spt,然后新建一个文件 ddd,再卸载 /spt/,再查看 /spt 目录会发现目录下的文件 ddd 消失了,造成这种情况的原因是:
目录只是相当于一个水管,是连接挂载设备与挂载目录的 水管,如上面的例子,当卸载掉 /spt/ 目录后,再新建文件到其目录下,因为已经卸载掉 /spt 目录与挂载设备 sdb1 的映射,所有文件被存储到 /spt 目录的上一级目录根目录的挂载设备上,即 sda5。
再将 /spt 与 sdb1 挂载,查看 /spt ,发现 ddd 又出现了。
这也叫造成了 ddd 被存储到 sdb1中,a.txt 被存储到 sda5 中(关于根目录的挂载设备是哪个,可以使用 df -T查看)
[root@hj ~]# mkdir /spt
[root@hj ~]# mount /dev/sdb1 /spt/
[root@hj ~]# mkdir /spt/ddd
[root@hj ~]# ls /spt/
ddd lost+found
[root@hj ~]# umount /spt/
[root@hj ~]# touch /spt/a.txt
[root@hj ~]# ls /spt/
a.txt
[root@hj ~]# mount /dev/sdb1 /spt/
[root@hj ~]# ls /spt/
ddd lost+found
3.3 挂载后重启失效问题
使用 mount 命令挂载分区后重启就会失效,因为这个挂载是临时的,需要修改配置文件 /etc/fstab
,在最下方添加挂载分区信息:
vim /etc/fstab
/dev/sdb1 /sdb/sdb1 ext4 defaults 0 0 # 分别为挂载设备 挂载点 文件系统类型 等
4. 磁盘用满的两种情况
4.1i 节点
每个文件在创建的时候,都会有一个 i 节点,里面存储了文件的一些基本信息(如权限信息、创建日期、大小等),这些信息被称为 —— 元数据。
inode ,i 节点是一个数据结构,存储普通文件、目录或其他文件的基本信息(如权限信息、创建日期、大小等)即元数据。
查看一个文件的 i 节点号:
[root@hj tmp]# ls -i test/1.txt
403954 test/1.txt # i 节点号
查看目录 i 结点号:
ls -di test/ # 查看目录的 i 的号
查看分区的 i 节点使用情况:
[root@hj tmp]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 1550400 103540 1446860 7% /
tmpfs 256285 5 256280 1% /dev/shm
/dev/sda1 128016 39 127977 1% /boot
/dev/sda3 128000 30 127970 1% /home
/dev/sr0 0 0 0 - /media/CentOS_6.8_Final
/dev/sdb1 328656 12 328644 1% /sdb/sdb1
/dev/sdb2 328656 11 328645 1% /sdb/sdb2
/dev/sdb3 328656 11 328645 1% /sdb/sdb3
/dev/sdb5 66384 11 66373 1% /sdb/sdb5
/dev/sdb6 131648 11 131637 1% /sdb/sdb6 # 总共可以存储131648 个 i 节点,也就是 131648 个文件
4.2 磁盘存满的两种情况
磁盘用满有两种情况:
- 磁盘空间未满,但是文件数目超出了限制,即 i 节点不够用
- 磁盘空间满
个人电脑很少出现 i 节点满情况,服务器上比较多,主要是日志文件(access.log);当日志很大时就需要日志切割:
mv access.log access.log1 # 日志切割
长此以往,本地硬盘空间逐渐增大,就需要备份原来的日志文件,备份日志文件需要注意的是,首先要打包日志文件,再进行备份,以免出现 i 结点不够的情况。
5. 文件系统
[root@hj tmp]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 24G 3.8G 19G 17% /
tmpfs 1002M 80K 1002M 1% /dev/shm
/dev/sda1 477M 39M 413M 9% /boot
/dev/sda3 1.9G 3.1M 1.8G 1% /home
/dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.8_Final
/dev/sdb1 4.9G 11M 4.6G 1% /sdb/sdb1
/dev/sdb2 4.9G 11M 4.6G 1% /sdb/sdb2
/dev/sdb3 4.9G 11M 4.6G 1% /sdb/sdb3
/dev/sdb5 988M 1.3M 935M 1% /sdb/sdb5
/dev/sdb6 2.0G 3.1M 1.9G 1% /sdb/sdb6
查看上面的分区容量使用情况发现,分区还未使用便已经有一定空间被使用(如/dev/sdb6 被使用 3.1M),这些被使用的空间存储的是 文件系统信息
对每个分区来说,最小的存储单位 block,一个 block = 8 * 512 b = 4 K
文件创建过程:
- super block:监控 i 节点状态(活跃、忙碌),同时也要分配 i 节点
- inode block:inode 号,元数据
- directory block:目录块,存储文件名和对应的 i 节点
当文件被创建时,首先找到的是其根目录的 i 结点,再通过指针找到 directory block 中的文件 i 节点,如果没有则新建,新建好之后再把数据存储到相应位置。
删除文件操作:
将文件的 i 节点通过 super block 标记为 free(活跃状态)
5.1 ln 命令
ln 命令用于创建链接文件,其语法如下:
ln [选项] 源文件 链接文件
选项:
- -s:创建软链接(不带 s 则默认创建硬链接)
- -f:强制创建文件或目录的链接
- -i:覆盖前先询问
- -v:显示创建链接的过程
5.1 软链接(symbolic link)
ln -s 源文件 链接文件 # 软链接
示例:
[root@hj ~]# ln -s /a/source.txt /b/des.txt
[root@hj ~]# ll /b/des.txt
lrwxrwxrwx. 1 root root 13 10月 20 22:11 /b/des.txt -> /a/source.txt # l 表示为软链接
[root@hj ~]# ls -i /a/source.txt # i 节点不同
1308106 /a/source.txt
[root@hj ~]# ls -i /b/des.txt
1308107 /b/des.txt
特点:
- 相当于 Windows 上的快捷方式
- 删除链接文件,源文件无影响
- 删除源文件,链接文件失效
- 修改源文件\链接文件,内容都将会改变
- i 节点不同
- 软链接可以跨分区(因为它指向的是文件而非 inode,每个分区相同文件名是可以存在的
5.2 硬链接(hard link)
- i 节点相同
- ln 源路径 目标路径
- 删除链接文件,源文件无影响
- 删除源文件,链接文件无影响
- 修改源文件\链接文件,内容都将改变
- 硬链接不a可以跨分区,因为它指向的 inode 号,而不是 文件本身
- 【.】是当前目录的硬链接,【..】是上一级目录的硬链接
ln 源文件 链接文件