Linux磁盘管理 第一部分
前言
之前我们学习了关于管道和重定向相关的知识,现在我们来讨论一下关于硬盘(存储)管理相关的知识。
一、基本分区
1.磁盘简介
磁盘,也称作硬盘、disk,不同于内存,它的容量比较大。
磁盘的类型,从工作原理区分可以分为机械硬盘和固态硬盘。
机械硬盘既是传统普通磁盘,主要有盘片、磁头、盘片转轴及控制电机、磁头控制器、数据转换器、接口、缓存等几个部分组成。
固态驱动器(Solid State Disk 或 Solid State Drive, 简称SSD),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘。
尺寸:硬盘的尺寸有1.8英寸、2.5英寸和3.5英寸大小的区别。
接口:硬盘的接口在早期为宽扁的IDE接口,SAS接口,目前主流的机械硬盘接口为SATA接口。
转速:硬盘的转速即为每分钟盘片可以转多少圈,一般的规格为5400rpm,7200rpm,10000rpm,15000rpm和30000rpm。但是转速过快会导致磁盘的噪音很大,所以目前大多数家用电脑都是5400和7200的转速。
一些术语:
-
盘片:一块磁盘有若干个盘片,每个盘片都有可以存储数据的上、下两个盘面(Side)。这些盘面堆叠在主轴上高速旋转。
-
柱面:所有盘面上的同一磁道构成一个圆柱,称作柱面。
-
磁道:每个盘面被划分为多个同心圆,这些同心圆的轨迹就被称作磁道,磁道从外向内从0开始顺序编号。
-
扇区:将一个盘面划分为若干内角相同的扇形,这样盘面上每个磁道就被分为若干段圆弧,每段圆弧叫做一个扇区。
命名:
在我们比较熟悉的windows系统中,磁盘从0开始编号,磁盘0、磁盘1……
在linux系统中(以CentOS为例),kernel(内核)对不同接口硬盘的命名方式如下:
对于SATA(串口):
/dev/sda
/dev/sdb
/dev表示设备文件目录,s代表sata串口,d代表硬盘,a为第一块。sdb同理为第二块硬盘。
对于IDE(并口):
/dev/hda
/dev/hdb
h代表接口类型为并口。
分区方式:
磁盘有两种分区方式,为MBR和GPT。
**MBR(Master Boot Record 主引导记录)**是一种很传统的分区方式,位于磁盘最前边的一段引导代码。MBR支持最大的磁盘容量是 <2TB,设计时分配4个分区。
如果希望超过4个分区,需要放弃主分区,改为扩展分区和逻辑分区。
**GPT(GUID Partition Table,GUID为 Globally Unique Identifier,全局唯一标识分区表)**分区模式使用GUID分区表,是源自EFI标准的一种较新的磁盘分区表的结构的标准。与普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。GPT支持大于2T的硬盘,支持128个分区。
2.管理磁盘
管理新磁盘通常有三部曲:
分区(MBR或GPT)
格式化文件系统(File System)
挂载(mount)
- 查看磁盘信息:
我们可以用如下的命令查看磁盘信息:
ll /dev/sd*
即为查看在dev目录下以sd开头的所有文件。
输出如下:
brw-rw----. 1 root disk 8, 0 Jan 28 09:42 /dev/sda
brw-rw----. 1 root disk 8, 1 Jan 28 09:42 /dev/sda1
brw-rw----. 1 root disk 8, 2 Jan 28 09:42 /dev/sda2
brw-rw----. 1 root disk 8, 16 Jan 28 09:42 /dev/sdb
brw-rw----. 1 root disk 8, 32 Jan 28 09:42 /dev/sdc
brw-rw----. 1 root disk 8, 48 Jan 28 09:42 /dev/sdd
brw-rw----. 1 root disk 8, 64 Jan 28 09:42 /dev/sde
brw-rw----. 1 root disk 8, 80 Jan 28 09:42 /dev/sdf
brw-rw----. 1 root disk 8, 96 Jan 28 09:42 /dev/sdg
brw-rw----. 1 root disk 8, 112 Jan 28 09:42 /dev/sdh
brw-rw----. 1 root disk 8, 128 Jan 28 09:42 /dev/sdi
我们可以看到权限位前面的第一位为b,不同于之前的目录d(directory),这里指的是磁盘b(block)。
或者我们也可以用下面的方式来查看硬盘:
lsblk
利用lsblk指令查看磁盘信息:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
sdd 8:48 0 5G 0 disk
sde 8:64 0 5G 0 disk
sdf 8:80 0 5G 0 disk
sdg 8:96 0 5G 0 disk
sdh 8:112 0 5G 0 disk
sdi 8:128 0 5G 0 disk
sr0 11:0 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64
- 创建分区:
以MBR为例,首先我们启动分区工具:
fdisk /dev/sdb
以第二块磁盘为例(不要用第一块系统盘来尝试)。
这之后我们会进入会话模式。
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 0xb09ef24c.
Command (m for help):
这里第二段提示我们,更改将会停留在内存中,直到我们决定将更改写入磁盘,使用写入命令前请三思。
我们输入字母n进行分区
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
接下来会令你选择主分区(primary)或是扩展分区(extended)。MBR主分区最多只能有4个。所以是4 free。
我们先选择p,划分主分区。
Select (default p): p
Partition number (1-4, default 1):
接下来选择分区的编号,我们选择1。
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
起始扇区,由于我在虚拟机里挂载的磁盘为5G,一共可以存储5,368,709,120个字节,我们磁盘扇区一般以512字节为一个单位,所以5,368,709,120/512 = 10,485,760,和上面shell中提示的最大大小一致。
在这里我们就敲击回车键,选择默认的第2048个扇区即可。(0-2047存储的就是MBR的文件)。
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
这里需要我们选择最后一个扇区。即为选择磁盘分区结束的扇区,即分区大小。
我们实际环境根据磁盘划分,如4T硬盘,一般可以500G为一个分区。
我们可以输入分区大小"+2G"然后回车。
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759): +2G
Partition 1 of type Linux and of size 2 GiB is set
这里提示我们分区1已设置为Linux类型,大小设为2GB。但是这一切都没有生效,只是存储在了内存里。
我们需要在会话模式中输入w进行保存:
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
这样才真正的将磁盘分区成功,并且自动退出了会话模式。
我们可以输入命令来刷新分区表:
partprobe /dev/sdb
partprobe即为partition probe ,分区准备。
这样第二块硬盘sdb的分区刷新成功。
这个时候我们查看磁盘信息,即可看到我们给第二块硬盘sdb的2GB分区信息:
我们可以用命令:
fdisk -l /dev/sdb
查看第二块磁盘的分区结果:
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 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: 0xb09ef24c
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
同样,我们也可以用lsblk来查看磁盘信息:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
└─sdb1 8:17 0 2G 0 part
sdc 8:32 0 5G 0 disk
sdd 8:48 0 5G 0 disk
sde 8:64 0 5G 0 disk
sdf 8:80 0 5G 0 disk
sdg 8:96 0 5G 0 disk
sdh 8:112 0 5G 0 disk
sdi 8:128 0 5G 0 disk
sr0 11:0 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64
至此,一般的分区操作就完成了。
- 创建文件系统:
在这里我们要用命令:
mkfs.ext4 /dev/sdb1
#或者用参数 -t 指定文件系统类型
mkfs -t ext4 /dev/sdb1
mk指的是make,与mkdir命令中的mk一致,指创造。
fs即为file system,文件系统。
ext4为extended4 扩展文件系统的第四代,是Linux文件系统的类型。在Windows下对应的是NTFS和FAT32。
/dev/sdb1 第二块串口硬盘的第一个分区,准备格式化了。
输入命令后可以看到:
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
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
我们可以看到一个文件块大小为4096个字节(block)。如果学习过操作系统的文件系统(在后面的文章我也会阐述),就会明白这个是什么,包括下面的inode等概念。
- 挂载:
格式化磁盘之后我们还要将其挂载,创建挂载点。一个分区一个挂载点。
我们先创建一个挂载点的目录:
mkdir /mnt/disk1
再用mount命令进行挂载:
mount -t ext4 /dev/sdb1 /mnt/disk1
这样我们就把磁盘sdb1挂载到了目录/mnt/disk1中。
我们可以用如下命令查看:
df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 974M 0 974M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 11M 980M 2% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 4.2G 13G 25% /
/dev/sda1 xfs 1014M 172M 843M 17% /boot
tmpfs tmpfs 199M 20K 199M 1% /run/user/0
/dev/sr0 iso9660 4.4G 4.4G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt/disk1
用df命令看到最后一行就是我们新挂载的sdb1磁盘。
- 卸载
可以用umount指令来解除磁盘的挂载:
umount /dev/sdb1
如果在挂载的时候,在磁盘里面保存了文件,那么解除挂载之后文件不会消失,再挂载之后,将会出现在新挂载的目录之下。相当于拔出U盘。
- 创建逻辑分区
当我们的硬盘需要4个及以上的分区时,我们的MBR引导不能满足创建4个以上的主分区,我们只能舍弃一个主分区并改为扩展分区,同样,在fdisk中可以进行操作:
Command (m for help): n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e):
我们可以看到只有一个空闲的主分区位置,我们现在创建扩展分区:
Select (default e): e
Selected partition 4
First sector (5015552-10485759, default 5015552):
Using default value 5015552
Last sector, +sectors or +size{K,M,G} (5015552-10485759, default 10485759):
Using default value 10485759
Partition 4 of type Extended and of size 2.6 GiB is set
输入e之后,开始扇区和结束扇区我们都选择默认的值,这样最后的空间都被划分到了扩展分区中,之后我们可以在扩展分区中划分多个逻辑分区,用来存储文件。扩展分区和主分区的最大不同在于,扩展分区不能安装操作系统。
创建扩展分区之后,在fdisk中输入n,将会默认创建逻辑分区。
创建若干个逻辑分区之后,我们在fdisk中输入p查看分区表,可以看到:
Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 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: 0xb09ef24c
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
/dev/sdb2 4196352 4605951 204800 83 Linux
/dev/sdb3 4605952 5015551 204800 83 Linux
/dev/sdb4 5015552 10485759 2735104 5 Extended
/dev/sdb5 5017600 5427199 204800 83 Linux
/dev/sdb6 5429248 5838847 204800 83 Linux
/dev/sdb7 5840896 6250495 204800 83 Linux
/dev/sdb8 6252544 10485759 2116608 83 Linux
可以看到,分区1-3为主分区,分区4为扩展分区,分区5-8为分区4中的逻辑分区。
最后我们用lsblk查看所有磁盘的信息,可以看到:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 2G 0 part /mnt/disk1
├─sdb2 8:18 0 200M 0 part /mnt/disk2
├─sdb3 8:19 0 200M 0 part
├─sdb4 8:20 0 512B 0 part
├─sdb5 8:21 0 200M 0 part
├─sdb6 8:22 0 200M 0 part
├─sdb7 8:23 0 200M 0 part
└─sdb8 8:24 0 2G 0 part
sdc 8:32 0 5G 0 disk
sdd 8:48 0 5G 0 disk
sde 8:64 0 5G 0 disk
sdf 8:80 0 5G 0 disk
sdg 8:96 0 5G 0 disk
sdh 8:112 0 5G 0 disk
sdi 8:128 0 5G 0 disk
sr0 11:0 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64
可以看到,扩展分区sdb4,虽然包含了5-8分区,但是4分区只占了512B,也就是只占了一个扇区。
二、交换分区管理SWAP
1.简介
交换分区如果学习过操作系统的内存管理,就一定不会陌生,交换分区是用来"提升"内存的容量,防止OOM(out of memory)内存溢出。在Windows系统中,起到这个作用的空间叫做虚拟内存。
一般情况下,推荐swap的大小设置为内存的2倍。
大于4GB而小于16GB内存的操作系统,最少需要4GB交换空间。
大于16GB而小于64GB内存的操作系统,最少需要8GB交换空间。
大于64GB而小于256GB内存的操作系统,最少需要16GB交换空间。
2.查看当前的交换分区
我们可以先用free指令查看当前内存的使用情况:
free -m
total used free shared buff/cache available
Mem: 1980 784 522 26 673 1006
Swap: 2047 0 2047
可以看到我的虚拟机一共有2G内存,使用了784M,交换分区同样为2G,目前没有使用。
同时,我们可以用lsblk详细查看交换分区:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
可以看到sda2分区中,swap分区大小为2G。
3.创建交换分区
- 分区:
我们在创建交换分区的时候,可以先把硬盘按照主分区一样分区:
Command (m for help): p
Disk /dev/sdc: 5368 MB, 5368709120 bytes, 10485760 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: 0x8adede63
Device Boot Start End Blocks Id System
/dev/sdc1 2048 2099199 1048576 83 Linux
这个时候,sdc1还是Linux一般的存储文件的类型。
之后在fdisk的会话模式中输入t,然后输入82(具体的各种类型ID可以在输入t之后输入L查看):
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): L
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
1e Hidden W95 FAT1 80 Old Minix
Hex code (type L to list all codes):
可以看到上面列出了所有支持修改的文件系统类型,其中,82为Linux的交换分区类型,8e为Linux的逻辑卷类型LVM。
交换分区的ID为82(16进制)。输入82:
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'
Command (m for help): p
Disk /dev/sdc: 5368 MB, 5368709120 bytes, 10485760 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: 0x8adede63
Device Boot Start End Blocks Id System
/dev/sdc1 2048 2099199 1048576 82 Linux swap / Solaris
Command (m for help):
我们可以看到,这个时候sdc1已经成为交换分区了。
- 格式化:
给交换分区格式化我们需要用mkswap命令,而不是mkfs命令:
mkswap /dev/sdc1
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=413af02f-3fdc-4df0-a00d-49f1d910664b
- 挂载:
挂载交换分区用swapon命令:
swapon /dev/sdc1
- 验证:
我们先用 free -m 查看内存使用情况:
free -m
total used free shared buff/cache available
Mem: 1980 784 521 26 673 1005
Swap: 3071 0 3071
可以看到交换分区变成了3G。
- 卸载
交换分区解除挂载可以用swapoff指令:
swapoff /dev/sdc1
这样就卸载了交换分区的sdc1部分。
三、注意
在磁盘挂载的时候,被挂载的目录如果在挂载之前有文件,在挂载新的磁盘之后,挂载之前的文件将会被覆盖隐藏,该目录只会显示挂载的硬盘的文件!当我们卸载挂载的磁盘之后,挂载之前的文件又会显示出来。
总结
本次我们介绍了一般磁盘管理的常用指令,分区,格式化和挂载,同时我们也讨论了如何将交换分区格式化和挂载,接下来我们将会讨论关于逻辑卷LVM和其他磁盘管理的操作。