在阿里云上买了一台ECS服务器(Centos7)和一块20G的数据盘,发现找不到数据盘,google一番找到了,又发现数据盘是个裸盘,就像刚买来的硬盘一样,需要分区、格式化(创建文件系统)、挂载才能使用。本文讲述一下这段经历。
在使用MBR的磁盘中,分区可分为主分区和扩展分区,在扩展分区中又可以分为多个逻辑分区。分区表位于MBR中,由于MBR只有512字节,限制了分区表中的数量,因此MBR磁盘最多包含4个分区,其中包含了3个主分区以及1个扩展分区中的多个逻辑分区。通常来说主分区/dev/sda1,/dev/sda2,/dev/sda3,/dev/sda4,但是由于最多只能有4个主分区,当需要有多于4个分区的时候,只能将最后一个分区用于扩展分区,于是逻辑分区从/dev/sda5开始,并且无论主分区是有用完,只要有扩展分区,那么逻辑分区都是从/dev/sda5开始的。这也是为什么在很多系统中存在/dev/sda1,/dev/sda2,/dev/sda5,而没有/dev/sda3,/dev/sda4的原因。
发现数据盘
可以有以下几种方法查看当前系统中的磁盘:
sudo fdisk -l
lsblk
sudo parted -l
通过sudo fdisk -l
查看:
[davenkin@davenkin-vm ~]$ sudo fdisk -l
[sudo] password for davenkin:
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0008d73a
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83884031 41940992 83 Linux
Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
使用lsblk
查看:
[davenkin@davenkin-vm ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 253:0 0 40G 0 disk
`-vda1 253:1 0 40G 0 part /
vdb 253:16 0 20G 0 disk
通过sudo parted -l
查看:
[davenkin@davenkin-vm ~]$ sudo parted -l
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 42.9GB 42.9GB primary ext4 boot
Error: /dev/vdb: unrecognised disk label
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
可以看到,有个名为/dev/vdb
的磁盘,空间20G,尚未进行分区。
此时,如果使用df -h
是看不到/dev/vdb这个盘的,因为df -h
只能显示已经创建了文件系统并且挂载之后的分区。
[davenkin@davenkin-vm ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 3.5G 34G 10% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 396K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 380M 0 380M 0% /run/user/1000
分区
可以通过以下方式进行磁盘分区:
- fdisk
- parted
使用fdisk /dev/vdb
进行分区:
[davenkin@davenkin-vm ~]$ sudo fdisk /dev/vdb
[sudo] password for davenkin:
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x4710ccf3.
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
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
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)
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): 11943039
Partition 1 of type Linux and of size 5.7 GiB is set
Command (m for help): wq
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
上面,我们在20G的磁盘中创建了一个大小5.7G的分区,此时便可以查看到新建的分区了名字为/dev/vdb1
:
[davenkin@davenkin-vm ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 253:0 0 40G 0 disk
`-vda1 253:1 0 40G 0 part /
vdb 253:16 0 20G 0 disk
`-vdb1 253:17 0 10.5G 0 part
也可以通过sudo fdisk -l
查看:
[davenkin@davenkin-vm ~]$ sudo fdisk -l
[sudo] password for davenkin:
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0008d73a
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 83884031 41940992 83 Linux
Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x255331f3
Device Boot Start End Blocks Id System
/dev/vdb1 2048 11943039 5970496 83 Linux
但是此时用df -h
依然是看不到的,因为我们只是创建了分区,格式化和挂载。
格式化(创建文件系统)
文件系统位于分区之上,使用mkfs.ext4
创建EXT4文件系统:
[davenkin@davenkin-vm ~]$ sudo mkfs.ext4 /dev/vdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
373888 inodes, 1492624 blocks
74631 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1528823808
46 block groups
32768 blocks per group, 32768 fragments per group
8128 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
挂载分区
使用mount
命令挂载刚才创建的/dev/vdb1
分区:
sudo mount /dev/vdb1 /mnt/data
然后便可以查看到挂载之后的分区了,没有文件系统的分区是不能挂载的:
[davenkin@davenkin-vm ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 3.5G 34G 10% /
devtmpfs 1.9G 4.0K 1.9G 1% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 368K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs 380M 0 380M 0% /run/user/1000
/dev/vdb1 5.5G 23M 5.2G 1% /mnt/data
对于mount来说,我们需要首先创建号/mnt/data目录。可以看到,/mnt/data目录在创建好后,其实是隶属于/根目录的,也即属于/dev/vda1磁盘下,我们可以直接向目录中新建文件。然后,在mount了/dev/vdb1之后,原来的文件不可见了(但是依然存在于/dev/vda1上),然后新创建的文件会存于/dev/vdb1下。如果我们取消挂载/dev/vdb1,那么之前存在与/dev/vda1中的文件又会显示出来。
启动自动挂载
通过mount
命令挂载分区,在机器重启之后就消失了,为了能使机器在启动的时候自动挂载分区,我们需要修改/etc/fstab
文件:
echo /dev/vdb1 /mnt/data ext4 defaults 0 0 >> /etc/fstab
删除所有分区
方法一:
sudo wipefs -a /dev/vdb
方法二:
sudo dd if=/dev/zero of=/dev/vdb bs=512 count=1 conv=notrunc
逻辑卷(LVM)
当我们创建了了一个分区之后,它的大小便固定了,这个不利于之后的扩展,为此有了LVM,它可以动态地改变分区的大小。
LVM中主要有以下三个概念:
- PV(Physical Volume):即物理分区或者磁盘。
- VG(Volume Group):卷组,多个PV组成一个VG,VG就像一个池子一样。
- LV(Logic Volume):逻辑卷,在VG上创建出来的对机器可见的分区,有自己的文件系统。
虽然LVM可以使用裸盘作为PV,但是并不推荐这么做,推荐先对磁盘进行分区,在用于LVM。
LVM使用步骤
使用LVM主要分为以下几步:
- 通过物理分区创建PV
- 通过PV创建VG
- 在VG上创建LV
- 格式化LV
- 挂载LV
为了使用LVM,我们先创建两个物理分区:
- /dev/vdb1
- /dev/vdb2
通过lsblk
查看如下:
[davenkin@davenkin-vm dev]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 253:0 0 40G 0 disk
`-vda1 253:1 0 40G 0 part /
vdb 253:16 0 20G 0 disk
|-vdb1 253:17 0 5.7G 0 part
`-vdb2 253:18 0 4.8G 0 part
(1)通过物理分区创建PV
[davenkin@davenkin-vm dev]$ sudo pvcreate /dev/vdb1 /dev/vdb2
Physical volume "/dev/vdb1" successfully created.
Physical volume "/dev/vdb2" successfully created.
如果分区上已经有了文件系统,系统会提示我们需要擦除文件系统之后才能创建PV。
通过sudo pvs
查看所创建的PV:
[davenkin@davenkin-vm dev]$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/vdb1 lvm2 --- 5.69g 5.69g
/dev/vdb2 lvm2 --- <4.77g <4.77g
(2)通过PV创建VG
创建名为LVMVG
的VG:
[davenkin@davenkin-vm dev]$ sudo vgcreate LVMVG /dev/vdb1 /dev/vdb2
Volume group "LVMVG" successfully created
此时再次执行sudo pvs
,可以看到PV所属于的VG了:
[davenkin@davenkin-vm dev]$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/vdb1 LVMVG lvm2 a-- 5.69g 5.69g
/dev/vdb2 LVMVG lvm2 a-- <4.77g <4.77g
通过sudo vgs
查看所创建的VG:
[davenkin@davenkin-vm dev]$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
LVMVG 2 0 0 wz--n- <10.46g <10.46g
(3)在VG上创建LV
创建两个LV,名字分别为lv1和lv2:
[davenkin@davenkin-vm dev]$ sudo lvcreate -L 4G -n lv1 LVMVG
WARNING: ext4 signature detected on /dev/LVMVG/lv1 at offset 1080. Wipe it? [y/n]: y
Wiping ext4 signature on /dev/LVMVG/lv1.
Logical volume "lv1" created.
[davenkin@davenkin-vm dev]$ sudo lvcreate -L 4G -n lv2 LVMVG
Logical volume "lv2" created.
查看所创建的LV:
[davenkin@davenkin-vm dev]$ sudo vgs -o +lv_size,lv_name
VG #PV #LV #SN Attr VSize VFree LSize LV
LVMVG 2 2 0 wz--n- <10.46g <2.46g 4.00g lv1
LVMVG 2 2 0 wz--n- <10.46g <2.46g 4.00g lv2
此时执行sudo lsblk
:
[davenkin@davenkin-vm dev]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 253:0 0 40G 0 disk
`-vda1 253:1 0 40G 0 part /
vdb 253:16 0 20G 0 disk
|-vdb1 253:17 0 5.7G 0 part
| `-LVMVG-lv1 252:0 0 4G 0 lvm
`-vdb2 253:18 0 4.8G 0 part
`-LVMVG-lv2 252:1 0 4G 0 lvm
可以看到,在创建LV时,根据物理分区的大小,两个LV分别在物理上位于/dev/vdb1和/dev/vdb2,此时/dev/vdb1和/dev/vdb2均有空间剩余。如果我们用VG中所有的剩余空间创建一个lv3,那么可以推断出,lv3将一部分位于/dev/vdb1上,另一部分位于/dev/vdb2上。
将VG所有剩余空间创建lv3:
[davenkin@davenkin-vm dev]$ sudo lvcreate -l 100%FREE -n lv3 LVMVG
Logical volume "lv3" created.
此时在运行lsblk
:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 253:0 0 40G 0 disk
`-vda1 253:1 0 40G 0 part /
vdb 253:16 0 20G 0 disk
|-vdb1 253:17 0 5.7G 0 part
| |-LVMVG-lv1 252:0 0 4G 0 lvm
| `-LVMVG-lv3 252:2 0 2.5G 0 lvm
`-vdb2 253:18 0 4.8G 0 part
|-LVMVG-lv2 252:1 0 4G 0 lvm
`-LVMVG-lv3 252:2 0 2.5G 0 lvm
可以看到lv3同时跨越了/dev/vdb1和/dev/vdb2。
创建号的LV可以从以下两个地方找到:
- /dev/VG名/LV名
- /dev/mapper/VG名-LV名
比如,以上创建的三个LV分别位于:
- /dev/LVMVG/lv1
- /dev/LVMVG/lv2
- /dev/LVMVG/lv3
或者:
- /dev/mapper/LVMVG-lv1
- /dev/mapper/LVMVG-lv2
- /dev/mapper/LVMVG-lv3
(4)格式化LV
[davenkin@davenkin-vm mapper]$ sudo mkfs.ext4 /dev/LVMVG/lv1
[sudo] password for davenkin:
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
262144 inodes, 1048576 blocks
52428 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1073741824
32 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
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
(5)挂载LV
sudo mount /dev/LVMVG/lv1 /mnt/data
(6)删除LV/VG/PV
删除LVM中的东西是需要顺序的,首先需要将mount上的LV取消挂载:
sudo umount /mnt/data
然后删除LV:
sudo lvremove /dev/LVMVG/lv1 /dev/LVMVG/lv2 /dev/LVMVG/lv3
然后删除VG:
sudo vgremove LVMVG
最后删除PV:
sudo pvremove /dev/vdb1 /dev/vdb2