# 磁盘管理 ## df命令 `df`命令用于显示指定磁盘分区上的文件系统的磁盘空间使用情况。可以用来查看磁盘空间使用情况。 ### 语法 $ df [-选项] ``` [root@lwz ~]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs tmpfs 2.0G 201M 1.8G 11% /run tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/mapper/centos-root ext4 41G 2.3G 37G 6% / /dev/xvda1 ext4 190M 108M 69M 62% /boot tmpfs tmpfs 394M 0 394M 0% /run/user/0 ``` ### 选项 - `-i`:查看inodes状态; 如已使用100%,即使磁盘还有空间也会提示磁盘空间已满。 - `-T`:显示文件系统类型; - `-h`:以GB、MB、KB为单位,提高信息的可读性; - `-m`:以MB为单位。不常用,一般用`-h`; ## du命令 `du`命令也是查看使用空间的,但是与`df`命令不同的是,`du`命令是对文件和目录磁盘使用的空间的查看,而不是文件系统磁盘使用空间的查看。 ### 语法 $ du [-选项] 文件或目录 ``` [root@lwz ~]# du -h /etc/shadow 4.0K /etc/shadow ``` ### 选项 - `-a`:显示目录中所有文件大小; - `-h`:以GB、MB、KB为单位,提高信息的可读性; - `-s`:显示目录中所有文件大小的总和。 ## 磁盘分区fdisk `fdisk`磁盘分区和查看磁盘分区状态信息; 只能划分小于2T的分区。 ### 语法 $ fdisk [-选项] [设备] # 不加选项会进入分区模式; # 加 -l 选项会列出所有分区; ### `fdisk`分区模式中常用命令: - `m`:列出常用命令; - `n`:添加新分区; - `p`:打印分区表; - `w`:保存并退出; - `q`:不保存退出; - `d`:删除分区; - `l`:列出分区类型; - `t`:修改分区类型; ### 示例 对/dev/sdb进行分区: ``` [root@lwz ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。- > 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x47a75227 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1):1 起始 扇区 (2048-20971519,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):+2G 分区 1 已设置为 Linux 类型,大小设为 2 GiB 命令(输入 m 获取帮助):n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p 分区号 (2-4,默认 2): 起始 扇区 (4196352-20971519,默认为 4196352): 将使用默认值 4196352 Last 扇区, +扇区 or +size{K,M,G} (4196352-20971519,默认为 20971519):+2G 分区 2 已设置为 Linux 类型,大小设为 2 GiB 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x316c2e28 设备 Boot Start End Blocks Id System /dev/sdb1 2048 4196351 2097152 83 Linux /dev/sdb2 4196352 8390655 2097152 83 Linux 命令(输入 m 获取帮助):n Partition type: p primary (2 primary, 0 extended, 2 free) e extended Select (default p): p 分区号 (3,4,默认 3):+1G 分区号 (3,4,默认 3): 起始 扇区 (8390656-20971519,默认为 8390656): 将使用默认值 8390656 Last 扇区, +扇区 or +size{K,M,G} (8390656-20971519,默认为 20971519):+1G 分区 3 已设置为 Linux 类型,大小设为 1 GiB 命令(输入 m 获取帮助):n Partition type: p primary (3 primary, 0 extended, 1 free) e extended Select (default e): e 已选择分区 4 起始 扇区 (10487808-20971519,默认为 10487808): 将使用默认值 10487808 Last 扇区, +扇区 or +size{K,M,G} (10487808-20971519,默认为 20971519): 将使用默认值 20971519 分区 4 已设置为 Extended 类型,大小设为 5 GiB 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x316c2e28 设备 Boot Start End Blocks Id System /dev/sdb1 2048 4196351 2097152 83 Linux /dev/sdb2 4196352 8390655 2097152 83 Linux /dev/sdb3 8390656 10487807 1048576 83 Linux /dev/sdb4 10487808 20971519 5241856 5 Extended 命令(输入 m 获取帮助): 命令(输入 m 获取帮助):d 分区号 (1-4,默认 4): 分区 4 已删除 命令(输入 m 获取帮助):q ``` ## 磁盘格式化 查看文件系统`filesystems`: ``` [root@lwz ~]# cat /etc/filesystems ext4 ext3 ext2 nodev proc nodev devpts iso9660 vfat hfs hfsplus * # 使用的是centos8系统 [root@lwz ~]# uname -a Linux lwz 4.18.0-80.el8.x86_64 #1 SMP Tue Jun 4 09:19:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux ``` 说明: `xfs`:centos7、8系统默认文件格式; ext4、ext3、ext2:旧版本centos的默认文件格式; ### 格式化命令`mke2fs` #### 语法 `mke2fs`:创建ext2、ext3、ext4文件系统; ``` $ mke2fs -t 文件类型 [-选项] 设备名 ``` `mkfs.ext4`:等于`mke2fs -t ext4`; ``` $ mkfs.ext4 [-选项] 设备名 ``` `mkfs.xfs`:创建xfs文件系统; ``` $ mkfs.xfs [-选项] 设备名 ``` #### 选项 - `-t`:指定文件系统类型; - `-b`:指定块大小; - `-m`:指定分区预留空间大小 - `-i`:指定inode大小 #### 示例 ``` [root@lwz ~]# mke2fs -t ext4 /dev/sdb1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 2621184 blocks 131059 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=2151677952 80 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 [root@lwz ~]# mke2fs -t ext4 -b 1024 /dev/sdb1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=1024 (log=0) 分块大小=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 10484736 blocks 524236 blocks (5.00%) reserved for the super user 第一个数据块=1 Maximum filesystem blocks=44040192 1280 block groups 8192 blocks per group, 8192 fragments per group 512 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553, 1024001, 1990657, 2809857, 5120001, 5971969 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 [root@lwz ~]# mke2fs -i 8192 -t ext4 /dev/sdb1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 1310720 inodes, 2621184 blocks 131059 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=2151677952 80 block groups 32768 blocks per group, 32768 fragments per group 16384 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 [root@lwz ~]# mke2fs -m 0.1 /dev/sdb1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 2621184 blocks 2621 blocks (0.10%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=2684354560 80 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: 完成 正在写入inode表: 完成 Writing superblocks and filesystem accounting information: 完成 ``` ## 磁盘挂载和卸载 ### 挂载`mount` `mount`命令单独使用,会查看当前挂载分区,分区文件系统的类型。 挂载磁盘/dev/sbd到/mnt目录下。 ``` $ mount /dev/sdb /mnt ``` ### 卸载`umount` ``` $ umount /dev/sdb ``` ### 永久挂载 ``` $ vim /etc/fstab /dev/sdb /mnt ext4 defaults 0 0 ``` 说明: * `/dev/sdb`:磁盘分区,也可以是分区标识`UUID`; * `/mnt`:挂载点; * `ext4`:文件系统类型; * `defaults`:mount的挂载参数,默认`defaults`;表示按照大多数文件系统默认值挂载;包含(rw、suid、dev、exec、auto、nouser、async) `async`:磁盘和内存不同步;系统每隔一段时间就会把内存数据写入磁盘中。 `sync`:磁盘和内存实时同步; `auto`:开机自动挂载; `noauto`:不开机自动挂载; * `0`:是否被dump备份;0表示不备份,1表示备份;默认为0; * `0`:开机时是否检测磁盘;0表示不检测,1、2表示检测;默认为0; ## lvm 安装lvm需要的包: $ yum install -y lvm ### 创建lvm格式分区 将`sdb`分成三个区,格式为lvm: ``` [root@lwz ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0xc9721557 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0xc9721557 设备 Boot Start End Blocks Id System 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1): 起始 扇区 (2048-20971519,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):+1G 分区 1 已设置为 Linux 类型,大小设为 1 GiB 命令(输入 m 获取帮助):t 已选择分区 1 Hex 代码(输入 L 列出所有代码):8e 已将分区“Linux”的类型更改为“Linux LVM” 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0xc9721557 设备 Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 8e Linux LVM 命令(输入 m 获取帮助):n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p 分区号 (2-4,默认 2): 起始 扇区 (2099200-20971519,默认为 2099200): 将使用默认值 2099200 Last 扇区, +扇区 or +size{K,M,G} (2099200-20971519,默认为 20971519):+1G 分区 2 已设置为 Linux 类型,大小设为 1 GiB 命令(输入 m 获取帮助):t 分区号 (1,2,默认 2): Hex 代码(输入 L 列出所有代码):8e 已将分区“Linux”的类型更改为“Linux LVM” 命令(输入 m 获取帮助):n Partition type: p primary (2 primary, 0 extended, 2 free) e extended Select (default p): p 分区号 (3,4,默认 3): 起始 扇区 (4196352-20971519,默认为 4196352): 将使用默认值 4196352 Last 扇区, +扇区 or +size{K,M,G} (4196352-20971519,默认为 20971519):+1G 分区 3 已设置为 Linux 类型,大小设为 1 GiB 命令(输入 m 获取帮助):t 分区号 (1-3,默认 3): Hex 代码(输入 L 列出所有代码):8e 已将分区“Linux”的类型更改为“Linux LVM” 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0xc9721557 设备 Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 8e Linux LVM /dev/sdb2 2099200 4196351 1048576 8e Linux LVM /dev/sdb3 4196352 6293503 1048576 8e Linux LVM 命令(输入 m 获取帮助): 保存 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 ``` ### 语法及选项 ``` pv: pvscan # 扫描 pvcreate 分区名 # 新建 pvdisplay # pv详细信息 pvremove 物理卷名 # 删除 vg: vgscan # 扫描 vgcreate 卷组 分区名 # 新建 vgdisplay # vg详细信息 vgremove 卷组 # 删除 vgextend 卷组 物理卷 # 向卷组中添加物理卷 vgreduce 卷组 物理卷 # 从卷组中删除物理卷 vgrename 旧组名 新组名 # 改名 lv: lvscan # 扫描逻辑卷 lvcreate [选项] 逻辑卷 卷组 # 用于创建LVM的逻辑卷 选项: -L:指定逻辑卷的大小,“+ -”增加或减少,单位为“kKmMgGtT”字节; -l:指定逻辑卷的大小(LE数)。`-l 100%free`:将vg剩余空间全部给予。 lvextend [选项] 逻辑卷 # 扩展逻辑卷空间 -选项同上 lvreduce [选项] 逻辑卷 # 收缩逻辑卷空间 -选项同上 lvremove 逻辑卷 # 删除指定LVM逻辑卷 lvresize [选项] 逻辑卷 # 调整逻辑卷空间大小 -选项同上 lvdisplay # 显示逻辑卷属性 ``` ### 创建物理卷pvcreate 创建pv ``` $ sudo pvcreate /dev/sdb1 $ sudo pvcreate /dev/sdb2 $ sudo pvcreate /dev/sdb3 # 查看物理卷信息 $ sudo pvdisplay ``` ### 创建卷组vgcreate 将sdb1、sdb2、sdb3创建一个名为vg01的卷组 ``` $ sudo vgcreate vg01 /dev/sdb1 /dev/sdb2 /dev/sdb3 # 查看卷组信息 $ sudo vgdisplay ``` ### 创建逻辑卷lvcreate 创建一个名为lv01的逻辑卷,大小为10G。并格式化 ``` $ sudo lvcreate -L 10G -n lv01 vg01 # 格式化 $ sudo mkfs.ext4 /dev/vg01/lv01 # 查看逻辑卷信息 $ sudo lvdisplay ``` ### 挂载逻辑卷 将lv01挂载到/mnt ``` $ sudo mount /dev/vg01/lv01 /mnt ``` 永久挂载逻辑卷 ``` $ sudo echo /dev/vg01/lv01 /mnt ext4 defaults 0 0 >> /etc/fstab ``` ### 扩容逻辑卷 如果vg中有剩余的空间: ``` # 重新设置卷大小 $ sudo lvresize -L 20G /dev/vg01/lv01 # 检查磁盘错误,错误无所谓,下一条命令更新成功即可 $ sudo e2fsck -f /dev/vg01/lv01 # 更新逻辑卷信息 $ sudo resize2fs /dev/vg01/lv01 # ext4更新命令 $ sudo xfs_growfs /dev/vg01/lv01 # xfs更新命令 ``` vg中没有剩余空间,先扩容vg再扩容lv: ``` # 1.首先新增一块硬盘,例如增加了一块100G的xvdb # 2.重复上述的格式分区操作,将xvdb分区为lvm,创建pv # 3.将新建的pv(xvdb1)加入vg组(vg01) $ sudo vgextend vg01 /dev/xvdb1 # 4.将vg中新增的空间,扩容给lv $ sudo lvextend -l +100%free /dev/vg01/lv01 # 5.更新lv卷信息 $ sudo resize2fs /dev/vg01/lv01 # ext4更新命令 $ sudo xfs_growfs /dev/vg01/lv01 # xfs更新命令 # 再次查看磁盘信息 $ sudo df -Th ``` ### 缩减逻辑卷 ``` $ sudo resize2fs /dev/vg01/lv01 10G # 更新逻辑卷的文件系统大小为10G $ sudo lvresize -L 10G /dev/vg01/lv01 # 更新逻辑卷大小为10G ``` ## 扩展内容 ### dd命令 ``` # 测试写入速度 $ dd if=/dev/zero of=/tmp/test1.out bs=1024 count=400000 $ dd if=/dev/zero of=/tmp/test2.out bs=1024 count=400000 conv=fsync $ dd if=/dev/zero of=/tmp/test3.out bs=1024 count=400000 conv=fdatasync # 测试读取速度 $ dd if=/tmp/test1.out of=/dev/null ``` `dd`命令说明: * `if=`:指定输入文件,这里用`/dev/zero`表示以零填充 * `of=`:指定输出文件,这里用`/swapfile`表示将文件输出到`/swapfile` * `bs=`:指定块大小,这里用`1024`表示以字节为单位 * `count=`:指定块数量,这里用`4096k`表示以`4096k*1024`最终等于你指定的swapfile大小。或者用`4M`表示,最终执行的结果也是4GB * `conv=`:指定转换方式,这里用`fsync`表示同步写入,`fdatasync`表示异步写入,主要为了避免操作系统“写缓存”干扰测试成绩。 ### raid磁盘阵列 raid磁盘阵列,是一种把多块硬盘(硬盘数量由raid级别决定)组合成单个硬盘(通常称为raid硬盘或raid卡)来提供冗余或增加吞吐量的一种技术。 raid级别: | raid级别 | 性能 | 冗余能力 | 空间利用率 | 磁盘数量(块) | | :------: | :----: |:----:|:----:|:----:| | raid 0 | 读写提升 | 无 | 100% | >=2 | | raid 1 | 读提升,写下降 | 有 | 50% | >=2 | | raid 5 | 读写都提升 | 有 | (n-1)/n% | >=3 | | raid 10 | 读写都提升 | 有 | 50% | >=4 | | raid 01 | 读写都提升 | 有 | 50% | >=4 | -------- # swap - 虚拟内存 **扩容**swap或者**创建**一个swap,并设置所需的大小,有两种方式可以实现。 例如,要创建一个大小为4GB的swapfile `fallocate`命令: $ sudo fallocate -l 4G /swapfile `dd`命令: $ sudo dd if=/dev/zero of=/swapfile bs=1024 count=4096k `dd`命令说明: * `if=`:指定输入文件,这里用`/dev/zero`表示以零填充 * `of=`:指定输出文件,这里用`/swapfile`表示将文件输出到`/swapfile` * `bs=`:指定块大小,这里用`1024`表示以字节为单位 * `count=`:指定块数量,这里用`4096k`表示以`4096k*1024`最终等于你指定的swapfile大小。或者用`4M`表示,最终执行的结果也是4GB **注意:**`fallocate`命令和`dd`命令都可以创建swapfile,但是`fallocate`命令会更快更方便。有时候`fallocate`命令不可用,这时可以使用`dd`命令代替。 设置swapfile的权限: $ sudo chmod 600 /swapfile 使用以下命令将swapfile设置为swap区域: $ sudo mkswap /swapfile 最后,启用swapfile: $ sudo swapon /swapfile 现在,你的swapfile已经成功扩容了。你可以使用以下命令来验证swap是否已经启用: $ sudo swapon --show **如果输出中包含`/swapfile`,则表示swap已经启用。** 永久挂载新的swap: $ sudo cp /etc/fstab /etc/fstab.bak $ sudo bash -c 'echo "/swapfile none swap sw 0 0" >> /etc/fstab' **记住,修改swapfile大小可能会对系统性能产生影响,请提前备份,谨慎操作。** 关闭swap: # 关闭所有swap $ sudo swapoff -a # 关闭指定的swap $ sudo swapoff /swapfile 删除swapfile: $ sudo rm /swapfile