磁盘管理
Linux 的磁盘服务提供了丰富的工具和技术,可以满足各种需求,从基本的文件系统管理到高级的磁盘阵列和逻辑卷管理。合理使用这些工具和技术,可以实现对磁盘存储的有效管理和优化,确保系统的稳定性和性能。
基于Ubuntu2404系统,VMware系统搭建
parted分区命令
Parted(Partition Editor)是一个功能强大的命令行工具,用于磁盘分区管理。它支持创建、删除、调整磁盘分区,以及显示磁盘的详细信息。
查看磁盘信息
parted -l
root@huhy:~# parted -l Model: VMware, VMware Virtual S (scsi) Disk /dev/sda: 107GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 96.6GB 96.6GB ext4 3 96.6GB 98.8GB 2147MB ext4 Error: /dev/sdb: unrecognised disk label Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 107GB Sector size (logical/physical): 512B/512B Partition Table: unknown Disk Flags: Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only. Error: /dev/sr0: unrecognised disk label Model: NECVMWar VMware SATA CD01 (scsi) Disk /dev/sr0: 2755MB Sector size (logical/physical): 2048B/2048B Partition Table: unknown Disk Flags: root@huhy:~#
parted -l 命令显示了系统中三个磁盘设备的信息:/dev/sda、/dev/sdb 和 /dev/sr0。/dev/sdb 没有识别到有效的分区表,需要对其进行初始化和分区操作。
选择磁盘:在操作之前,首先需要选择要操作的磁盘,这会进入Parted的交互模式,可以在此模式下执行具体的操作
parted /dev/sdb
print;显示磁盘分区信息
(parted) print Error: /dev/sdb: unrecognised disk label Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 107GB Sector size (logical/physical): 512B/512B Partition Table: unknown Disk Flags: (parted)
创建新的分区表,类型如下
- gpt:GUID Partition Table,适用于现代系统和大容量磁盘。
- msdos:适用于旧系统,最大支持 2TB 磁盘。
(parted) mklabel gpt
创建新分区;一个50GB的 ext4 分区,名称primary(可自定义),除了使用绝对数值(如 0GB、50GB)外,还可以使用百分比、扇区、MB、TB 等单位来表示。
(parted) mkpart primary ext4 0GB 50GB
(parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 107GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 50.0GB 50.0GB ext4 primary
删除分区;通过Number删除
(parted) rm 1
(parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 107GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags
调整分区大小:使用resizepart命令可以调整选定分区的大小
(parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 107GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 50.0GB 50.0GB ext4 huhy (parted) resizepart 1 60GB (parted) print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 107GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 60.0GB 60.0GB ext4 huhy
退出
(parted) quit
查看验证
root@huhy:~# parted -l Model: VMware, VMware Virtual S (scsi) Disk /dev/sda: 107GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 96.6GB 96.6GB ext4 3 96.6GB 98.8GB 2147MB ext4 Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 107GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 60.0GB 60.0GB huhy Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only. Error: /dev/sr0: unrecognised disk label Model: NECVMWar VMware SATA CD01 (scsi) Disk /dev/sr0: 2755MB Sector size (logical/physical): 2048B/2048B Partition Table: unknown Disk Flags:
mkfs磁盘格式化命令
mkfs(Make File System)命令用于在分区上创建文件系统。这是一个重要的命令,用于初始化磁盘或分区,使其能够存储文件和目录。
命令的基本语法如下:
mkfs [options] <filesystem> <device>
常用选项
- -t :指定文件系统类型。例如,-t ext4。
- -V:显示版本信息。
- -v:显示详细信息。
- -c:检查坏块(有些文件系统不支持)。
- -L
- -n
- -N :指定文件系统的节点数量。
常见文件系统类型
- ext2/ext3/ext4:常用的 Linux 文件系统类型。
- vfat:兼容 Windows 的 FAT 文件系统。
- ntfs:Windows NT 文件系统。
- xfs:高性能文件系统,适用于大文件和大容量存储。
- btrfs:现代 Linux 文件系统,具有高级功能(快照、压缩等)。
格式化为 ext4 文件系统
mkfs -t ext4 /dev/sdb1
命令通用,更简洁一点
mkfs.ext4 /dev/sdb1
root@huhy:~# mkfs -t ext4 /dev/sdb1 mke2fs 1.47.0 (5-Feb-2023) Creating filesystem with 14648181 4k blocks and 3662848 inodes Filesystem UUID: 05f0f3aa-ce5b-40d3-8b81-2eda92e3a116 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424 Allocating group tables: done Writing inode tables: done Creating journal (65536 blocks): done Writing superblocks and filesystem accounting information: done
验证查看
root@huhy:~# blkid /dev/sdb1 /dev/sdb1: UUID="05f0f3aa-ce5b-40d3-8b81-2eda92e3a116" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="huhy" PARTUUID="c7b208a2-75dd-4910-9e32-b26df9b78040"
格式化为 FAT 文件系统
mkfs -t vfat /dev/sdb1
格式化为 NTFS 文件系统
mkfs -t ntfs /dev/sdb1
格式化为 XFS 文件系统
mkfs -t xfs /dev/sdb1
为分区设置卷标为 “MyData”:卷标是一种人类可读的标识符,可以帮助用户更轻松地识别和管理磁盘
mkfs.ext4 -L MyData /dev/sdb1
需要输入y回车确定
root@huhy:~# mkfs.ext4 -L MyData /dev/sdb1 mke2fs 1.47.0 (5-Feb-2023) /dev/sdb1 contains a ext4 file system created on Thu Jul 18 08:07:47 2024 Proceed anyway? (y,N) y Creating filesystem with 14648181 4k blocks and 3662848 inodes Filesystem UUID: 102ac9ce-d6ee-445b-874e-9ca5633dfa92 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424 Allocating group tables: done Writing inode tables: done Creating journal (65536 blocks): done Writing superblocks and filesystem accounting information: done root@huhy:~# blkid /dev/sdb1 /dev/sdb1: LABEL="MyData" UUID="102ac9ce-d6ee-445b-874e-9ca5633dfa92" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="huhy" PARTUUID="c7b208a2-75dd-4910-9e32-b26df9b78040"
将磁盘还原成未格式化状态
使用 parted 删除所有分区
parted /dev/sdb
(parted) rm 1
使用 dd 清除分区表和文件系统元数据
dd if=/dev/zero of=/dev/sdb bs=512 count=2048
dd命令
dd 是一个强大的 Unix/Linux 工具,用于低级别的数据复制和转换。它能够将数据从一个地方复制到另一个地方,同时可以进行一定程度的转换和处理。
基本语法
dd if=<输入文件> of=<输出文件> [options]
常见选项
- bs=:指定读写操作的块大小(以字节为单位)。例如 bs=4M 表示使用 4MB 的块大小。
- count=:指定读取的块数。
- skip=:指定在读取输入文件之前跳过的块数。
- seek=:指定在写入输出文件之前跳过的块数。
- conv=:指定转换选项,如 notrunc(不截断输出文件)、sync(同步输出到磁盘)、* noerror(忽略读取错误)、fsync(在完成后刷新数据到磁盘)。
复制一个磁盘
dd if=/dev/sda of=/dev/sdb bs=4M
创建磁盘映像: 将 /dev/sda 复制到一个映像文件 disk.img
dd if=/dev/sda of=disk.img bs=4M
恢复磁盘映像: disk.img 恢复到 /dev/sda
dd if=disk.img of=/dev/sda bs=4M
清除磁盘前几个扇区:清除 /dev/sdb 的前 2048 个扇区
dd if=/dev/zero of=/dev/sdb bs=512 count=2048
制作启动盘:将 ISO 文件写入到 USB 驱动器
dd if=ubuntu.iso of=/dev/sdX bs=4M
备份 MBR(主引导记录):备份 /dev/sda 的前 512 字节(通常是 MBR)到一个文件:
dd if=/dev/sda of=mbr_backup.img bs=512 count=1
恢复 MBR:将备份的 MBR 恢复到 /dev/sda
dd if=mbr_backup.img of=/dev/sda bs=512 count=1
生成随机数据文件:如果把of换成指定盘,可直接填盘!!!
if=/dev/urandom of=random_data.img bs=1M count=100
实时进度显示:dd 本身不显示复制进度,但可以使用 status=progress 选项(在 GNU coreutils 8.24 及以上版本中提供):
dd if=/dev/sda of=/dev/sdb bs=4M status=progress
或者使用 pv(pipe viewer)来显示进度:
apt-get install pv dd if=/dev/sda | pv | sudo dd of=/dev/sdb bs=4M
PV物理卷
物理卷是指真实的物理磁盘或分区,它们通过 LVM 的 pvcreate 命令初始化,以便被 LVM 管理和使用。物理卷通常对应于硬盘驱动器或分区,它们的内容可以直接被操作系统读取和写入
将物理设备初始化为物理卷
pvcreate /dev/sda1
显示物理卷的信息
pvdisplay /dev/sda1
扫描所有物理卷
pvscan
从 LVM 中移除物理卷
pvremove /dev/sda1
VG卷组
卷组是由一个或多个物理卷组成的逻辑单元,它们汇总成一个可供逻辑卷使用的磁盘池。卷组的创建通过 vgcreate 命令完成,可以动态地向其中添加或移除物理卷,从而灵活地管理存储空间。
创建卷组
vgcreate myvg /dev/sda1 /dev/sdb1
向现有卷组添加物理卷
vgextend myvg /dev/sdc1
从卷组中移除物理卷
vgreduce myvg /dev/sdb1
显示卷组的信息
vgdisplay myvg
扫描所有卷组
vgscan
删除卷组
vgremove myvg
LV逻辑卷
逻辑卷是从卷组中分配的逻辑存储空间单元,它类似于传统磁盘分区,但具有更多的灵活性和功能。逻辑卷的创建通过 lvcreate 命令完成,可以根据需要调整大小,并支持添加、删除和快照等高级操作。
创建逻辑卷:创建一个 10GB 的逻辑卷,myvg是存在的卷组
lvcreate -L 10G -n mylv myvg
或者创建一个使用卷组中所有剩余空间的逻辑卷
lvcreate -l 100%FREE -n mylv myvg
扩展逻辑卷
lvextend -L +5G /dev/myvg/mylv
将逻辑卷扩展到卷组中所有剩余空间
lvextend -l +100%FREE /dev/myvg/mylv
缩小逻辑卷:将逻辑卷缩小到 5GB
lvreduce -L 5G /dev/myvg/mylv
显示逻辑卷的信息
lvdisplay /dev/myvg/mylv
删除逻辑卷
lvremove /dev/myvg/mylv
重命名逻辑卷
lvrename /dev/myvg/oldlv /dev/myvg/newlv
调整逻辑卷的大小:将逻辑卷调整到 15GB
lvresize -L 15G /dev/myvg/mylv
将逻辑卷调整为卷组中所有剩余空间:
lvresize -l +100%FREE /dev/myvg/mylv
演示;关系与工作流程
初始化物理卷: 使用 pvcreate 命令将物理磁盘或分区标记为 LVM 的物理卷。
创建卷组: 使用 vgcreate 命令创建一个卷组,并将一个或多个物理卷添加到其中。
创建逻辑卷: 使用 lvcreate 命令从卷组中分配逻辑存储空间,并创建一个逻辑卷。
文件系统操作: 在逻辑卷上创建文件系统,例如使用 mkfs 命令。
挂载和使用: 将逻辑卷挂载到文件系统中,并开始使用。
动态管理: 随着需求的变化,可以使用 lvextend、lvreduce 等命令调整逻辑卷的大小,或使用 vgextend、vgreduce 命令修改卷组的物理卷配置。
创建两个物理卷
root@huhy:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 90G 0 part / └─sda3 8:3 0 2G 0 part /boot sdb 8:16 0 100G 0 disk ├─sdb1 8:17 0 27.9G 0 part └─sdb2 8:18 0 18.6G 0 part sr0 11:0 1 2.6G 0 rom root@huhy:~# pvcreate /dev/sdb1 /dev/sdb2 WARNING: ext4 signature detected on /dev/sdb1 at offset 1080. Wipe it? [y/n]: y Wiping ext4 signature on /dev/sdb1. Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdb2" successfully created. root@huhy:~#
创建卷组: 将这两个物理卷添加到一个新的卷组 myvg
root@huhy:~# vgcreate myvg /dev/sdb1 /dev/sdb2 Volume group "myvg" successfully created
创建逻辑卷: 在 myvg 卷组中创建一个 10GB 的逻辑卷 mylv
root@huhy:~# lvcreate -L 10G -n mylv myvg Logical volume "mylv" created. root@huhy:~#
创建文件系统: 为逻辑卷 mylv 创建 ext4 文件系统:
root@huhy:~# mkfs.ext4 /dev/myvg/mylv mke2fs 1.47.0 (5-Feb-2023) Creating filesystem with 2621440 4k blocks and 655360 inodes Filesystem UUID: 7e2c5e79-ff85-46be-964a-4b345b1239ce Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done
创建挂载点并挂载逻辑卷 mylv
root@huhy:~# mkdir /mnt/mylv root@huhy:~# mount /dev/myvg/mylv /mnt/mylv root@huhy:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 90G 0 part / └─sda3 8:3 0 2G 0 part /boot sdb 8:16 0 100G 0 disk ├─sdb1 8:17 0 27.9G 0 part │ └─myvg-mylv 252:0 0 10G 0 lvm /mnt/mylv └─sdb2 8:18 0 18.6G 0 part sr0 11:0 1 2.6G 0 rom root@huhy:~#