Linux基础命令介绍十二:磁盘与文件系统

系统 Linux
本篇讲述磁盘管理相关的命令。计算机中需要持久化存储的数据一般是保存在硬盘等辅助存储器中。硬盘一般容量较大,为了便于管理和使用,可以将硬盘分成一到多个逻辑磁盘,称为分区;为使分区中的文件组织成操作系统能够处理的形式,需要对分区进行格式化(创建文件系统);在linux中,对于格式化后的分区,还必须经过挂载之后才能使用。

本篇讲述磁盘管理相关的命令。计算机中需要持久化存储的数据一般是保存在硬盘等辅助存储器中。硬盘一般容量较大,为了便于管理和使用,可以将硬盘分成一到多个逻辑磁盘,称为分区;为使分区中的文件组织成操作系统能够处理的形式,需要对分区进行格式化(创建文件系统);在linux中,对于格式化后的分区,还必须经过挂载(可简单理解为将分区关联至linux目录树中某个已知目录)之后才能使用。

[[179947]]

1、df 显示文件系统磁盘空间使用量

  1. [root@centos7 temp]# df -h 
  2. 文件系统                 容量  已用  可用 已用% 挂载点 
  3. /dev/mapper/centos-root   49G   18G   31G   36% / 
  4. devtmpfs                 3.9G     0  3.9G    0% /dev 
  5. tmpfs                    3.9G     0  3.9G    0% /dev/shm 
  6. tmpfs                    3.9G  367M  3.5G   10% /run 
  7. tmpfs                    3.9G     0  3.9G    0% /sys/fs/cgroup 
  8. /dev/sda1                497M  125M  373M   26% /boot 
  9. /dev/mapper/centos-home   24G  4.0G   20G   17% /home 
  10. tmpfs                    783M     0  783M    0% /run/user/0  

选项-h作用是转换数字的显示单位(默认为KB)。

显示信息文件系统列下面带tmpfs字样的是虚拟内存文件系统(此处不做展开)。

文件系统/dev/mapper/centos-root的挂载点是/(根目录),即通常所说的根分区(或根文件系统);/dev/sda1(boot分区)中保存了内核映像和一些启动时需要的辅助文件;另外,还对用户家目录单独做了分区(/dev/mapper/centos-home)。

在linux中还可以做一个特殊的分区:swap分区(交换分区)。作用是:当系统的物理内存不够用时,会将物理内存中一部分暂时不使用的数据交换至swap分区中,当需要使用这些数据时,再从swap空间交换回内存空间。swap在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间。但由于硬盘的速度远远低于内存,使swap只能作为物理内存的辅助。通常swap空间的大小是实际物理内存大小的1到2倍。使用命令free可以查看swap空间的大小。

选项-i显示inode信息

  1. [root@centos7 tmp]# df -i 
  2. 文件系统                   Inode 已用(I)  可用(I) 已用(I)% 挂载点 
  3. /dev/mapper/centos-root 50425856   78822 50347034       1% / 
  4. devtmpfs                  998721     391   998330       1% /dev 
  5. tmpfs                    1001340       1  1001339       1% /dev/shm 
  6. tmpfs                    1001340     490  1000850       1% /run 
  7. tmpfs                    1001340      13  1001327       1% /sys/fs/cgroup 
  8. /dev/sda1                 512000     330   511670       1% /boot 
  9. /dev/mapper/centos-home 24621056  190391 24430665       1% /home 
  10. tmpfs                    1001340       1  1001339       1% /run/user/0  

这里显示的数字是该文件系统中inode数量的使用情况。

2、fdisk 磁盘分区工具

  1. fdisk [options] [device...] 

选项-l表示列出分区表

  1. [root@centos7 tmp]# fdisk -l /dev/sda 
  2.  
  3. 磁盘 /dev/sda:85.9 GB, 85899345920 字节,167772160 个扇区 
  4. Units = 扇区 of 1 * 512 = 512 bytes 
  5. 扇区大小(逻辑/物理):512 字节 / 512 字节 
  6. I/O 大小(最小/***):512 字节 / 512 字节 
  7. 磁盘标签类型:dos 
  8. 磁盘标识符:0x0001abbc 
  9.  
  10.    设备   Boot      Start         End      Blocks   Id  System 
  11. /dev/sda1   *        2048     1026047      512000   83  Linux 
  12. /dev/sda2         1026048   167772159    83373056   8e  Linux LVM 
  13. [root@centos7 tmp]#  

当前机械硬盘中包含一到多个固定在主轴(spindle)上的盘片(platter),盘片由硬质磁性合金材料构成。每张盘片有上下两个表面,每个表面都包含数量巨大的扇区(sector),扇区是大小为512 byte的区块,这些区块均匀的分布于盘片的同心圆上,这些同心圆被称为磁道(track)。上千个磁道的宽度相当于人类头发的直径。

硬盘中使用固定于磁臂(disk arm)顶端的磁头(disk head 上下两面均有)读写盘面中的数据。硬盘不工作时,磁头停留在启停区(盘片上靠近主轴的区域);启停区外是数据区,盘片最外围磁道称为0磁道;硬盘启动后,盘片会围绕主轴高速旋转,盘片旋转产生的气流相当强,足以使磁头托起,并与盘面保持一个微小的距离(大概相当于人类头发直径的千分之一)。磁臂摆动,可以将磁头移动至任意磁道上方。

单一磁道示意图:  

 

单一磁道示意图 

当前硬盘转速大概在7200转/分钟到15000转/分钟左右。假设硬盘转速是10000转/分钟,则意味着,转一圈需要的时间是6ms。

所有盘面上的同一磁道构成一个圆柱,通常称做柱面(Cylinder),系统将数据存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最上方0磁头最外围0磁道***个扇区开始写入,写满一个磁道之后,接着在同一柱面的下一个磁头继续写入。同一个柱面都写满之后才推进到内层的下一个柱面。

fdisk命令中device通常是/dev/hda、/dev/hdb....(IDE接口类型的硬盘设备名)或/dev/sda、/dev/sdb....(SCSI接口类型硬盘设备名),表示整个硬盘,如果硬盘被分区,则在设备名后追加一个数字表示此设备的第几个分区。如上例中的/dev/sda1和/dev/sda2

硬盘磁头存取数据是以扇区(512bytes)为单位的(上例中Start和End列),但操作系统存取数据是以块(Block)为单位的(注意:这里说的Block的大小不同于fdisk命令输出中的Blocks列,fdisk命令输出中Blocks列的大小为1024 bytes);扇区是硬件级别的,Block是文件系统级别的,也就是说在创建文件系统(格式化)的时候才决定一个block的大小、数量。一个块的大小是一个扇区大小2的n次方倍,本例文件系统Block的默认大小为4096 bytes(格式化时可以指定为其他值)。

我们在252这台机器上新添加三块硬盘(每块200GB) 

  1. [root@idc-v-71252 ~]# ls -l /dev/sd[a-d]* 
  2. brw-rw---- 1 root disk 8,  0 12月 13 09:49 /dev/sda 
  3. brw-rw---- 1 root disk 8,  1 12月 13 09:49 /dev/sda1 
  4. brw-rw---- 1 root disk 8,  2 12月 13 09:49 /dev/sda2 
  5. brw-rw---- 1 root disk 8, 16 12月 13 09:49 /dev/sdb 
  6. brw-rw---- 1 root disk 8, 32 12月 13 09:49 /dev/sdc 
  7. brw-rw---- 1 root disk 8, 48 12月 13 09:49 /dev/sdd 
  8. #这里看到除了原有被分过区的sda外,多出了设备sdb、sdc、sdd 
  9. #这里的第五列由逗号分隔的两个数字组成,它们是内核用来识别具体设备的标识号。  

下面使用fdisk命令对新磁盘进行分区

  1. [root@idc-v-71252 ~]# fdisk /dev/sdb 
  2. 欢迎使用 fdisk (util-linux 2.23.2)。 
  3.  
  4. 更改将停留在内存中,直到您决定将更改写入磁盘。 
  5. 使用写入命令前请三思。 
  6.  
  7. Device does not contain a recognized partition table 
  8. 使用磁盘标识符 0xc41dfd92 创建新的 DOS 磁盘标签。 
  9.  
  10. 命令(输入 m 获取帮助):  

在提示符后输入m获取帮助信息(列出了在提示符后可使用的命令及其解释)

  1. 命令(输入 m 获取帮助):m 
  2. 命令操作 
  3.    a   toggle a bootable flag 
  4.    b   edit bsd disklabel 
  5.    c   toggle the dos compatibility flag 
  6.    d   delete a partition 
  7.    g   create a new empty GPT partition table 
  8.    G   create an IRIX (SGI) partition table 
  9.    l   list known partition types 
  10.    m   print this menu 
  11.    n   add a new partition 
  12.    o   create a new empty DOS partition table 
  13.    p   print the partition table 
  14.    q   quit without saving changes 
  15.    s   create a new empty Sun disklabel 
  16.    t   change a partition's system id 
  17.    u   change display/entry units 
  18.    v   verify the partition table 
  19.    w   write table to disk and exit 
  20.    x   extra functionality (experts only
  21.  
  22. 命令(输入 m 获取帮助):  

命令n表示创建一个新分区

  1. 命令(输入 m 获取帮助):n 
  2. Partition type: 
  3.    p   primary (0 primary, 0 extended, 4 free
  4.    e   extended 
  5. Select (default p):   

此处可选项有两个,p表示主分区(primary),e表示扩展分区(extended),默认为主分区。

每块硬盘分区后,位于0磁头0柱面1扇区的是一个特殊区域,称为MBR(Main Boot Record 主引导记录区),其中前446字节是Bootloader(引导加载程序),之后的64字节是DPT(Disk Partition Table 硬盘分区表),***两个字节的Magic Number(硬盘有效标志)。

DPT中记录了此块硬盘有哪些分区,由于其大小的限制,使得分区表只能包含4条记录,可以是一到四个主分区或一个扩展分区和一到三个主分区。其中扩展分区可以再分区,称为逻辑分区。

我们选择默认的主分区:

  1. Select (default p):  
  2. Using default response p 
  3. 分区号 (1-4,默认 1): 
  4. 起始 扇区 (2048-419430399,默认为 2048): 
  5. 将使用默认值 2048 
  6. Last 扇区, +扇区 or +size{K,M,G} (2048-419430399,默认为 419430399):+100G 
  7. 分区 1 已设置为 Linux 类型,大小设为 100 GiB 
  8.  
  9. 命令(输入 m 获取帮助):  

每一步骤都有相应提示,可以被使用的扇区从2048号开始(前面的扇区包括MBR用做其他用途),分区结束扇区的指定可以是扇区号,也可以是+size这样的格式。这里我们指定分区大小为100G

使用p命令打印分区信息:

  1. 命令(输入 m 获取帮助):p 
  2.  
  3. 磁盘 /dev/sdb:214.7 GB, 214748364800 字节,419430400 个扇区 
  4. Units = 扇区 of 1 * 512 = 512 bytes 
  5. 扇区大小(逻辑/物理):512 字节 / 512 字节 
  6. I/O 大小(最小/***):512 字节 / 512 字节 
  7. 磁盘标签类型:dos 
  8. 磁盘标识符:0xc41dfd92 
  9.  
  10.    设备   Boot      Start         End      Blocks   Id  System 
  11. /dev/sdb1            2048   209717247   104857600   83  Linux 
  12.  
  13. 命令(输入 m 获取帮助):  

注意这里的显示的不同,Boot列如果有*标志,表示此分区为boot分区。Id列表示分区类型,可以使用命令l列出所有支持的类型,其中82表示linux swap,83表示linux默认分区类型,8e表示linux lvm(后述)。

然后我们将信息保存:

  1. 命令(输入 m 获取帮助):w 
  2. The partition table has been altered! 
  3.  
  4. Calling ioctl() to re-read partition table
  5. 正在同步磁盘。 
  6. [root@idc-v-71252 ~]#   

3、mkfs 创建文件系统

选项-t可以指定文件系统类型(包括ext3 ext4 btrfs xfs reiserfs等)

  1. [root@idc-v-71252 ~]# mkfs -t ext4 /dev/sdb1 #或者直接执行 mkfs.ext4 /dev/sdb1 
  2. mke2fs 1.42.9 (28-Dec-2013) 
  3. 文件系统标签= 
  4. OS type: Linux 
  5. 块大小=4096 (log=2) 
  6. 分块大小=4096 (log=2) 
  7. Stride=0 blocks, Stripe width=0 blocks 
  8. 6553600 inodes, 26214400 blocks 
  9. 1310720 blocks (5.00%) reserved for the super user 
  10. ***个数据块=0 
  11. Maximum filesystem blocks=2174746624 
  12. 800 block groups 
  13. 32768 blocks per group, 32768 fragments per group 
  14. 8192 inodes per group 
  15. Superblock backups stored on blocks:  
  16.         32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,  
  17.         4096000, 7962624, 11239424, 20480000, 23887872 
  18.  
  19. Allocating group tables: 完成                             
  20. 正在写入inode表: 完成                             
  21. Creating journal (32768 blocks): 完成 
  22. Writing superblocks and filesystem accounting information: 完成    
  23.  
  24. [root@idc-v-71252 ~]#   

这样,我们就把刚刚分的区格式化成了ext4文件系统,输出信息中显示了inode和block数量等信息。

4、mount 挂载文件系统

将格式化好的文件系统挂载至/root/temp/tmp

  1. [root@idc-v-71252 tmp]# mount /dev/sdb1 /root/temp/tmp 
  2. [root@idc-v-71252 tmp]# df -h 
  3. 文件系统                 容量  已用  可用 已用% 挂载点 
  4. /dev/mapper/centos-root   49G   14G   35G   28% / 
  5. devtmpfs                 3.9G     0  3.9G    0% /dev 
  6. tmpfs                    3.9G     0  3.9G    0% /dev/shm 
  7. tmpfs                    3.9G  8.5M  3.9G    1% /run 
  8. tmpfs                    3.9G     0  3.9G    0% /sys/fs/cgroup 
  9. /dev/sda1                497M  170M  328M   35% /boot 
  10. /dev/mapper/centos-home   24G   16G  7.6G   68% /home 
  11. tmpfs                    799M     0  799M    0% /run/user/0 
  12. /dev/sdb1                 99G   61M   94G    1% /root/temp/tmp 
  13. [root@idc-v-71252 tmp]#   

可以看到新分区已经可以使用了,在格式化时,系统会将磁盘上一定空间(此处是5%)保留做其他用途,可以使用命令dumpe2fs /dev/sdb1 2>/dev/null|grep 'Reserved block count'查看保留块数量。

这样挂载的分区只是临时有效,当系统重启时,并不会自动挂载该分区。如需要***生效,可以将分区信息写入分区配置文件/etc/fstab

  1. [root@idc-v-71252 ~]# cat /etc/fstab  
  2.  
  3. # /etc/fstab 
  4. # Created by anaconda on Fri Jan 15 00:59:59 2016 
  5. # Accessible filesystems, by reference, are maintained under '/dev/disk' 
  6. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 
  7. /dev/mapper/centos-root /                       xfs     defaults        0 0 
  8. UUID=10205c20-bd44-4991-8c84-7b38db63a581 /boot                   xfs     defaults        0 0 
  9. /dev/mapper/centos-home /home                   xfs     defaults        0 0 
  10. /dev/mapper/centos-swap swap                    swap    defaults        0 0  

此文件中记录了原有分区及其挂载信息,#开头的行为注释行,其余行被分为6列:

***列表示文件系统

第二列是挂载点

第三列为文件系统类型

第四列为选项

第五列表示是否对该文件系统使用dump工具备份,0表示不备份

第六列表示是否使用fsck工具对该文件系统做定时检查,0表示不检查

在文件中追加如下信息后,系统重启时新分区也会被自动挂载:

  1. /dev/sdb1 /root/temp/tmp ext4 defaults 0 0 

在使用mount命令挂载时,可以使用选项-o options指定挂载选项(/etc/fstab中第四列)

如对已挂载的新分区重新以只读方式挂载:

  1. [root@idc-v-71252 home]# mount -o remount,ro /dev/sdb1 
  2. [root@idc-v-71252 home]# cd /root/temp/tmp 
  3. [root@idc-v-71252 tmp]# touch 1 
  4. touch: 无法创建"1": 只读文件系统 
  5. [root@idc-v-71252 tmp]#   

此时再在目录/root/temp/tmp中创建文件时显示报错:只读文件系统

  1. [root@idc-v-71252 tmp]# mount -o remount,rw /dev/sdb1 
  2. [root@idc-v-71252 tmp]# touch 2 
  3. [root@idc-v-71252 tmp]# ls 
  4. 2  lost+found 
  5. [root@idc-v-71252 tmp]# 重新以读写方式挂载后可以创建文件  

配置文件中的defaults指的是选项:rw, suid, dev, exec, auto, nouser, 和 async. 它们的意思请查看mount的man手册

选项-a表示读取配置文件中所有记录并重新挂载

选项-B或--bind可以使一个目录挂载至另一个目录

  1. [root@idc-v-71252 tmp]# ls -l /opt/ 
  2. 总用量 0 
  3. [root@idc-v-71252 tmp]#  
  4. [root@idc-v-71252 tmp]# mount --bind /root/temp/tmp /opt 
  5. [root@idc-v-71252 tmp]# ls /opt -l 
  6. 总用量 16 
  7. -rw-r--r-- 1 root root     0 12月 13 14:44 2 
  8. drwx------ 2 root root 16384 12月 13 12:54 lost+found 
  9. [root@idc-v-71252 tmp]#  

这样挂载的目录使用df命令并不能查看到,可以使用mount命令查看

  1. [root@idc-v-71252 tmp]# mount | grep /dev/sdb1 
  2. /dev/sdb1 on /root/temp/tmp type ext4 (rw,relatime,data=ordered) 
  3. /dev/sdb1 on /opt type ext4 (rw,relatime,data=ordered)  

选项-t表示指定文件系统类型,如挂载光盘:

  1. [root@centos7 tmp]# mount -t iso9660 /dev/cdrom /mnt 
  2. mount: /dev/sr0 写保护,将以只读方式挂载 
  3. [root@centos7 tmp]#  
  4. #或者挂载NFS文件系统(x.x.x.x是NFS服务器IP地址) 
  5. mount -t nfs x.x.x.x:/src_dir /path/to/local/dest_dir  

5、umount 卸载文件系统

卸载时既可以指定设备名也可以指定挂载点,当文件系统内有进程正在使用某文件时,卸载会报错:

  1. [root@idc-v-71252 ~]# umount /root/temp/tmp 
  2. umount: /root/temp/tmp:目标忙。 
  3.         (有些情况下通过 lsof(8) 或 fuser(1) 可以 
  4.          找到有关使用该设备的进程的有用信息) 
  5. [root@idc-v-71252 ~]#   

此时可使用lsof或fuser找出进程(见这里),停止该进程之后再卸载即可。

如果是卸载光盘还可以用eject命令

  1. [root@centos7 tmp]# eject 

6、fsck 检查并修复文件系统

可以使用fsck命令检查分区是否正常,需要在卸载的状态检查

  1. [root@idc-v-71252 temp]# umount /dev/sdb1 
  2. [root@idc-v-71252 temp]# fsck /dev/sdb1 
  3. fsck,来自 util-linux 2.23.2 
  4. e2fsck 1.42.9 (28-Dec-2013) 
  5. /dev/sdb1: clean, 12/6553600 files, 459544/26214400 blocks  

直接执行命令时,如果检测到受损,会有交互式提示询问是否进行修复坏块

选项-a表示不询问直接修复

选项-y表示总是对交互式询问输入yes

7、mkswap 创建swap分区

linux的swap分区可以用磁盘分区做,也可以用文件做,当前系统的swap使用的是分区。下面举一个使用文件创建swap分区的例子

首先使用命令dd生成一个大小为8G的文件

  1. [root@idc-v-71252 tmp]# dd if=/dev/zero of=swapfile bs=1024K count=8192 
  2. 记录了8192+0 的读入 
  3. 记录了8192+0 的写出 
  4. 8589934592字节(8.6 GB)已复制,35.1683 秒,244 MB/秒 
  5. [root@idc-v-71252 tmp]# 
  6. #命令会在当前目录下创建一个文件swapfile 
  7. #if表示指定读取的文件或设备 
  8. #of表示指定写入的文件或设备 
  9. #bs表示一次读出或写入的大小 
  10. #count表示读出或写入次数 
  11. [root@idc-v-71252 tmp]# du -sh swapfile  
  12. 8.0G    swapfile  

创建swap分区

  1. [root@idc-v-71252 tmp]# mkswap swapfile  
  2. 正在设置交换空间版本 1,大小 = 8388604 KiB 
  3. 无标签,UUID=84fbe922-9444-482b-aa55-631ce72161c0  

8、swapon/swapoff 启用/停用swap文件或设备

  1. [root@idc-v-71252 tmp]# swapon swapfile 
  2. swapon: /root/temp/tmp/swapfile:不安全的权限 0644,建议使用 0600。 
  3. [root@idc-v-71252 tmp]# free -m 
  4.               total        used        free      shared  buff/cache   available 
  5. Mem:           7983         115          53           8        7813        7794 
  6. Swap:         16255           0       16255 
  7. #此处看到swap分区已被扩大 
  8. [root@idc-v-71252 tmp]# swapoff swapfile 
  9. [root@idc-v-71252 tmp]# free -m 
  10.               total        used        free      shared  buff/cache   available 
  11. Mem:           7983         109          59           8        7813        7800 
  12. Swap:          8063           0        8063  

9、parted 磁盘分区工具

前面所述的MBR中的分区表不支持大于2TB以上的分区,为了解决这一限制和MBR的其它不足,出现了GTP(全局唯一标识分区表 GUID Partition Table),是一种磁盘的分区表的结构布局的标准,属于UEFI(统一可扩展固件接口)标准的一部分。需要使用命令parted划分支持GTP的分区(可兼容MBR分区)。

直接使用命令parted时会进入交互界面

  1. [root@idc-v-71252 ~]# parted /dev/sdb 
  2. GNU Parted 3.1 
  3. 使用 /dev/sdb 
  4. Welcome to GNU Parted! Type 'help' to view a list of commands. 
  5. (parted)    

可以在提示符后输入help显示可用命令列表(命令可简写)

命令print(简写p)表示打印分区表

  1. (parted) p                                                                 
  2. Model: VMware Virtual disk (scsi) 
  3. Disk /dev/sdb: 215GB 
  4. Sector size (logical/physical): 512B/512B 
  5. Partition Table: msdos 
  6. Disk Flags:  
  7.  
  8. Number  Start   End    Size   Type     File system  标志 
  9.  1      1049kB  107GB  107GB  primary  ext4 
  10.  
  11. (parted)   

命令quit表示退出交互界面

选项-s表示非交互模式,此时命令写在后面

  1. [root@idc-v-71252 ~]# parted -s /dev/sdb print 
  2. Model: VMware Virtual disk (scsi) 
  3. Disk /dev/sdb: 215GB 
  4. Sector size (logical/physical): 512B/512B 
  5. Partition Table: msdos 
  6. Disk Flags:  
  7.  
  8. Number  Start   End    Size   Type     File system  标志 
  9.  1      1049kB  107GB  107GB  primary  ext4 
  10.  
  11. [root@idc-v-71252 ~]# fdisk -l /dev/sdb1 
  12.  
  13. 磁盘 /dev/sdb1:107.4 GB, 107374182400 字节,209715200 个扇区 
  14. Units = 扇区 of 1 * 512 = 512 bytes 
  15. 扇区大小(逻辑/物理):512 字节 / 512 字节 
  16. I/O 大小(最小/***):512 字节 / 512 字节 
  17.  
  18. [root@idc-v-71252 ~]#  

Partition Table后的msdos表示为MBR分区,之所以两个命令中sdb1分区大小显示为107G而不是100G是因为在进行计算时使用1000 bytes作为1KB计数。

不能在已经做MBR分区的硬盘上做GTP分区,重做会导致原有分区被格式化。

这里在新磁盘/dev/sdc上做GTP分区:

  1. [root@idc-v-71252 ~]# parted /dev/sdc 
  2. GNU Parted 3.1 
  3. 使用 /dev/sdc 
  4. Welcome to GNU Parted! Type 'help' to view a list of commands. 
  5. (parted)  

注意交互模式与fdisk命令不同,parted的命令一旦按回车确认,命令就马上执行,对磁盘的更改就立即生效。

命令mklabel指定分区格式(msdos或gtp),如果格式未知,使用print命令时会报错:错误: /dev/sdc: unrecognised disk label

  1. (parted) mklabel gpt 

命令mkpart表示创建新分区,后面接分区类型(主分区还是扩展分区)、文件系统类型(ext4等,可省略)、起始点、结束点。

  1. (parted) mkpart primary 0KB 100GB 
  2. 警告: You requested a partition from 0.00B to 100GB (sectors 0..195312500). 
  3. The closest location we can manage is 17.4kB to 100GB (sectors 34..195312500). 
  4. Is this still acceptable to you? 
  5. 是/Yes/否/No? yes                                                          
  6. 警告: The resulting partition is not properly aligned for best performance. 
  7. 忽略/Ignore/放弃/Cancel? ignore                                            
  8. (parted) p                                                                 
  9. Model: VMware Virtual disk (scsi) 
  10. Disk /dev/sdc: 215GB 
  11. Sector size (logical/physical): 512B/512B 
  12. Partition Table: gpt 
  13. Disk Flags:  
  14.  
  15. Number  Start   End    Size   File system  Name     标志 
  16.  1      17.4kB  100GB  100GB               primary  

命令rm表示删除分区,后面接分区号 

  1. (parted) rm 1                                                              
  2. (parted) p                                                                 
  3. Model: VMware Virtual disk (scsi) 
  4. Disk /dev/sdc: 215GB 
  5. Sector size (logical/physical): 512B/512B 
  6. Partition Table: gpt 
  7. Disk Flags:  
  8.  
  9. Number  Start  End  Size  File system  Name  标志 
  10.  
  11. (parted)   

下面使用非交互模式继续

  1. [root@idc-v-71252 ~]# parted -s /dev/sdc mkpart primary ext4 18KB 100GB  
  2. 警告: The resulting partition is not properly aligned for best performance. 
  3. [root@idc-v-71252 ~]# parted -s /dev/sdc print 
  4. Model: VMware Virtual disk (scsi) 
  5. Disk /dev/sdc: 215GB 
  6. Sector size (logical/physical): 512B/512B 
  7. Partition Table: gpt 
  8. Disk Flags:  
  9.  
  10. Number  Start   End    Size   File system  Name     标志 
  11.  1      17.9kB  100GB  100GB               primary  

这里使用1000 bytes作为1KB计数格式化并挂载(部分输出略) 

  1. [root@idc-v-71252 temp]# mkfs.ext4 /dev/sdc1 
  2. [root@idc-v-71252 temp]# mount /dev/sdc1 /root/temp/tmp_1 
  3. [root@idc-v-71252 temp]# df -h|grep ^/dev 
  4. /dev/mapper/centos-root   49G   22G   27G   44% / 
  5. /dev/sda1                497M  170M  328M   35% /boot 
  6. /dev/mapper/centos-home   24G   16G  7.6G   68% /home 
  7. /dev/sdb1                 99G   61M   94G    1% /root/temp/tmp 
  8. /dev/sdc1                 92G   61M   87G    1% /root/temp/tmp_1  

***再用parted做一个MBR扩展分区,命令如下: 

  1. parted -s /dev/sdd mklabel msdos 
  2. parted -s /dev/sdd mkpart extended 100GB 100% 
  3. parted -s /dev/sdd mkpart logical 100GB 200GB  

结果显示为: 

  1. [root@idc-v-71252 temp]# parted -s /dev/sdd print 
  2. Model: VMware Virtual disk (scsi) 
  3. Disk /dev/sdd: 215GB 
  4. Sector size (logical/physical): 512B/512B 
  5. Partition Table: msdos 
  6. Disk Flags:  
  7.  
  8. Number  Start  End    Size   Type      File system  标志 
  9.  1      100GB  215GB  115GB  extended               lba 
  10.  5      100GB  200GB  100GB  logical 
  11.  
  12. [root@idc-v-71252 temp]# fdisk -l /dev/sdd 
  13.  
  14. 磁盘 /dev/sdd:214.7 GB, 214748364800 字节,419430400 个扇区 
  15. Units = 扇区 of 1 * 512 = 512 bytes 
  16. 扇区大小(逻辑/物理):512 字节 / 512 字节 
  17. I/O 大小(最小/***):512 字节 / 512 字节 
  18. 磁盘标签类型:dos 
  19. 磁盘标识符:0x0006d495 
  20.  
  21.      设备 Boot      Start         End      Blocks   Id  System 
  22. /dev/sdd1       195311616   419430399   112059392    f  W95 Ext'd (LBA) 
  23. /dev/sdd5       195313664   390625279    97655808   83  Linux  

格式化及挂载(省略部分输出) 

  1. [root@idc-v-71252 temp]# mkfs.ext4 /dev/sdd5 
  2. [root@idc-v-71252 temp]# mount /dev/sdd5 /root/temp/tmp_2 
  3. [root@idc-v-71252 temp]# df -h|grep ^/dev 
  4. /dev/mapper/centos-root   49G   22G   27G   44% / 
  5. /dev/sda1                497M  170M  328M   35% /boot 
  6. /dev/mapper/centos-home   24G   16G  7.6G   68% /home 
  7. /dev/sdb1                 99G   61M   94G    1% /root/temp/tmp 
  8. /dev/sdc1                 92G   61M   87G    1% /root/temp/tmp_1 
  9. /dev/sdd5                 92G   61M   87G    1% /root/temp/tmp_2  

这些新分区都可以写入配置文件/etc/fstab中实现重启后自动挂载

LVM 逻辑卷管理

LVM是linux环境下对磁盘分区进行管理的一种机制,能够使系统管理员更方便的为应用与用户分配存储空间。

术语

物理存储介质(The physical media):指的是系统的存储设备,如上面制作的分区/dev/sdb1、/dev/sdc1、/dev/sdd5

物理卷(PV: Physical Volume):相当于物理存储介质,但添加了与LVM相关的管理参数。

卷组(VG: Volume Group):由一个或多个物理卷组成。

逻辑卷(LV: Logical Volume):在卷组的基础上划分的逻辑分区(文件系统)。

PE(physical extent):每一个物理卷被划分为称为PE的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。

LE(logical extent):逻辑卷也被划分为被称为LE的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

步骤

1、创建分区

可以使用fdisk或parted进行分区,和前面举例中的区别仅仅是分区类型要选8e。这里将三块新硬盘的剩余空间做成LVM分区,parted方式(仅举一例,其余略):

  1. parted -s /dev/sdb mkpart primary 107GB 100% 
  2. parted -s /dev/sdb toggle 2 lvm  #表示将第二个分区定义为lvm类型(8e)  

2、创建PV

  1. [root@idc-v-71252 ~]# pvcreate /dev/sd[bcd]2 
  2.   Physical volume "/dev/sdb2" successfully created 
  3.   Physical volume "/dev/sdc2" successfully created 
  4.   Physical volume "/dev/sdd2" successfully created 
  5. [root@idc-v-71252 ~]#  
  6. #查看 
  7. [root@idc-v-71252 ~]# pvscan  
  8.   PV /dev/sda2   VG centos   lvm2 [79.51 GiB / 64.00 MiB free
  9.   PV /dev/sdb2               lvm2 [100.00 GiB] 
  10.   PV /dev/sdc2               lvm2 [106.87 GiB] 
  11.   PV /dev/sdd2               lvm2 [93.13 GiB] 
  12.   Total: 4 [379.50 GiB] / in use: 1 [79.51 GiB] / in no VG: 3 [300.00 GiB]  

3、创建VG 

  1. [root@idc-v-71252 ~]# vgcreate -s 8M test_lvm /dev/sd[bcd]2 
  2.   Volume group "test_lvm" successfully created 
  3. #这里使用选项-s指定PE大小为8M,卷组起名为test_lvm 
  4. #查看 
  5. [root@idc-v-71252 ~]# vgscan  
  6.   Reading all physical volumes.  This may take a while... 
  7.   Found volume group "centos" using metadata type lvm2 
  8.   Found volume group "test_lvm" using metadata type lvm2  

4、创建LV

  1. [root@idc-v-71252 ~]# lvcreate -n test_1 -L 50G test_lvm  
  2.   Logical volume "test_1" created. 
  3. [root@idc-v-71252 ~]#  
  4. #选项-n指定LV名为test_1,-L指定大小,也可以用选项-l指定LE的数量 
  5. #查看 
  6. [root@idc-v-71252 ~]# lvscan  
  7.   ACTIVE            '/dev/centos/swap' [7.88 GiB] inherit 
  8.   ACTIVE            '/dev/centos/home' [23.48 GiB] inherit 
  9.   ACTIVE            '/dev/centos/root' [48.09 GiB] inherit 
  10.   ACTIVE            '/dev/test_lvm/test_1' [50.00 GiB] inherit 
  11. [root@idc-v-71252 ~]#   

5、格式化及挂载 

  1. #在这里进行格式化,***步分区之后并不需要格式化。 
  2. #这里我们格式化成xfs格式 
  3. [root@idc-v-71252 ~]# mkfs.xfs /dev/test_lvm/test_1 
  4. meta-data=/dev/test_lvm/test_1   isize=256    agcount=4, agsize=3276800 blks 
  5.          =                       sectsz=512   attr=2, projid32bit=1 
  6.          =                       crc=0        finobt=0 
  7. data     =                       bsize=4096   blocks=13107200, imaxpct=25 
  8.          =                       sunit=0      swidth=0 blks 
  9. naming   =version 2              bsize=4096   ascii-ci=0 ftype=0 
  10. log      =internal log           bsize=4096   blocks=6400, version=2 
  11.          =                       sectsz=512   sunit=0 blks, lazy-count=1 
  12. realtime =none                   extsz=4096   blocks=0, rtextents=0 
  13. [root@idc-v-71252 ~]# mount /dev/test_lvm/test_1 /root/temp/test_1 
  14. [root@idc-v-71252 ~]# df -h|grep ^/dev 
  15. /dev/mapper/centos-root       49G   22G   27G   44% / 
  16. /dev/sda1                    497M  170M  328M   35% /boot 
  17. /dev/mapper/centos-home       24G   16G  7.6G   68% /home 
  18. /dev/sdb1                     99G   61M   94G    1% /root/temp/tmp 
  19. /dev/sdc1                     92G   61M   87G    1% /root/temp/tmp_1 
  20. /dev/sdd5                     92G   61M   87G    1% /root/temp/tmp_2 
  21. /dev/mapper/test_lvm-test_1   50G   33M   50G    1% /root/temp/test_1  

这里文件系统之所以显示为/dev/mapper/....是因为内核利用Mapper Device机制将设备做了映射:

  1. [root@idc-v-71252 ~]# ls -l /dev/mapper/test_lvm-test_1 
  2. lrwxrwxrwx 1 root root 7 12月 14 09:58 /dev/mapper/test_lvm-test_1 -> ../dm-3 
  3. [root@idc-v-71252 ~]# ls -l /dev/test_lvm/test_1 
  4. lrwxrwxrwx 1 root root 7 12月 14 09:58 /dev/test_lvm/test_1 -> ../dm-3  

实际上/dev/test_lvm/test_1和/dev/mapper/test_lvm-test_1指向了同一个设备/dev/dm-3(在配置文件/etc/fstab中写任意一种都可以),这里就不对映射机制做详细展开了。

命令

前面举例中说到了几个创建和查看命令,除此之外,LVM还有一系列的命令,它们都以pv/vg/lv开头,所起的作用大多是增加、删除、扩充、缩减、查看、改变等等。

创建命令

  1. pvcreate vgcreate lvcreate 

查看命令分三类,显示信息侧重或详细程度不同:

  1. pvs pvscan pvdisplay 
  2. vgs vgscan vgdisplay 
  3. lvs lvscan lvdisplay  

改变属性(分别改变本层次上对象的属性)

  1. pvchange vgchange lvchange 

扩容

  1. vgextend lvextend 

扩容LV举例(注意内核可能不支持对某些文件系统的在线扩容,此时需要先将文件系统卸载): 

  1. [root@idc-v-71252 dev]# lvextend -L +10G /dev/test_lvm/test_1 
  2.   Size of logical volume test_lvm/test_1 changed from 50.00 GiB (6400 extents) to 60.00 GiB (7680 extents). 
  3.   Logical volume test_1 successfully resized. 
  4. [root@idc-v-71252 ~]# df -h /dev/mapper/test_lvm-test_1 
  5. 文件系统                     容量  已用  可用 已用% 挂载点 
  6. /dev/mapper/test_lvm-test_1   50G   33M   50G    1% /root/temp/test_1 
  7. #此时扩容还没有生效,使用xfs_growfs对xfs文件系统进行在线扩容 
  8. [root@idc-v-71252 dev]# xfs_growfs /dev/test_lvm/test_1 
  9. meta-data=/dev/mapper/test_lvm-test_1 isize=256    agcount=4, agsize=3276800 blks 
  10.          =                       sectsz=512   attr=2, projid32bit=1 
  11.          =                       crc=0        finobt=0 
  12. data     =                       bsize=4096   blocks=13107200, imaxpct=25 
  13.          =                       sunit=0      swidth=0 blks 
  14. naming   =version 2              bsize=4096   ascii-ci=0 ftype=0 
  15. log      =internal               bsize=4096   blocks=6400, version=2 
  16.          =                       sectsz=512   sunit=0 blks, lazy-count=1 
  17. realtime =none                   extsz=4096   blocks=0, rtextents=0 
  18. data blocks changed from 13107200 to 15728640 
  19. [root@idc-v-71252 ~]# df -h /dev/mapper/test_lvm-test_1 
  20. 文件系统                     容量  已用  可用 已用% 挂载点 
  21. /dev/mapper/test_lvm-test_1   60G   33M   60G    1% /root/temp/test_1  

ext系列的文件系统扩容时需要使用命令resize2fs进行在线扩容

缩减(慎用) 

  1. vgreduce lvreduce 

改名

  1. vgrename lvrename 

还有一些其他命令这里就不再列出了,关于它们的用法请查看相关手册

本文简要介绍了磁盘和LVM相关的管理命令,另外,还有一个介于物理磁盘和磁盘分区的中间层:RAID(独立冗余磁盘阵列),它提供磁盘级别的数据冗余能力。当前服务器上一般都有RAID卡(硬件),关于它的设置以及原理就不在此叙述了,请搜索相关文档。

责任编辑:庞桂玉 来源: segmentfault
相关推荐

2020-11-19 08:44:35

Linux

2018-01-10 12:42:09

Linux磁盘文件系统

2009-12-22 09:43:13

Linux文件系统组织

2021-01-22 10:40:08

Linux文件内存

2009-12-18 17:08:10

Linux常见文件系统

2011-01-13 13:18:38

Linux网络文件

2009-10-12 11:14:51

LinuxLinux磁盘文件系统管理

2010-04-07 18:42:42

Unix命令

2021-06-28 06:24:12

磁盘存储VFS

2021-06-22 15:16:01

磁盘机械磁盘固态磁盘

2021-06-21 14:52:45

磁盘机械磁盘固态磁盘

2021-06-29 07:47:22

文件系统磁盘

2010-03-02 15:09:26

Linux mount

2011-03-07 09:11:23

2023-09-27 23:19:04

Linuxmount

2010-03-10 18:29:41

2009-10-13 14:31:26

:Linux系统磁盘系统管理

2011-01-13 14:10:30

Linux文件系统

2016-12-23 12:46:41

Linux命令进程与内存

2020-07-22 14:53:06

Linux系统虚拟文件
点赞
收藏

51CTO技术栈公众号