linux磁盘管理

linux磁盘管理

1 为什么要分区

易于管理和使用

比如说我们把磁盘分了sda1、sda2、sda3、sda4盘,我们假设sda1盘为系统盘,其他的比如说游戏、办公、软件盘,电脑搜索文件时只需要在相对应的分区搜索就可以了,没必要进行全盘搜索。大大节省了寻找文件的时间

有利于数据的安全

通过分区可以降低数据损失的风险。出现硬盘坏道、错误操作、重装系统都有可能造成数据损失,如果分区了,那么我们就可以将损失最小化。

2 相关概念

磁盘 Disk 计算机的外部存储器设备

分区 Disk Partition 分区是在磁盘上划分出来的一块独立的区域

主分区(Primary Partition):主分区是硬盘的启动分区,它是独立的,在一个物理磁盘(disk)上,最多只能有四个主分区

扩展分区(Extended Partition):扩展分区是除主分区外,硬盘上剩下的空间所建立起来的分区。扩展分区不能直接使用,它需要以逻辑分区的方式来使用,所以说扩展分区可以分成若干逻辑分区。所有的逻辑分区都是扩展分区的一部分

物理卷 PV 这也是一个磁盘分区,它可以更灵活地被划分和组合。可以将多个物理卷组合成一个卷组,然后在卷组上创建一个或多个逻辑卷。逻辑卷的大小可以随时调整,而不受物理卷的位置或大小的限制

卷组 vg是一个或多个物理卷的组合,相当于是一个存储资源池

逻辑卷 Logical Volume 这是卷组中抽象出来的一个磁盘空间

格式化 将分区格式化成不同的文件系统,常用的有ext4, xfs

文件系统 linux系统中"一切皆文件",文件系统决定了如何在磁盘/分区上对文件进行命名、存储、和检索

挂载 我们无法直接访问磁盘中的文件,必须指定一个本地的一个文件目录关联到目标磁盘上的文件系统,通过指定的本地的文件目录才能直接查看磁盘中的文件,这个文件目录成为挂载点,这个行为称为挂载

这张图画的很清楚:

linux磁盘管理

3 查看磁盘信息

df

disk filesystem 磁盘文件系统,用于显示文件系统的磁盘空间使用情况

  Filesystem Size Used Avail Use% Mounted on
  tmpfs 388M 2.0M 386M 1% /run
  /dev/mapper/ubuntu--vg-ubuntu--lv 18G 12G 5.0G 71% /
  tmpfs 1.9G 0 1.9G 0% /dev/shm
  tmpfs 5.0M 4.0K 5.0M 1% /run/lock
  /dev/sda2 1.8G 381M 1.3G 24% /boot
  tmpfs 388M 120K 388M 1% /run/user/1000
  /dev/sr0 2.0G 2.0G 0 100% /media/xhs/Ubuntu-Server 22.04.3 LTS amd64

/run:这是一个tmpfs文件系统,tmpfs是基于内存的文件系统,可以使用内存或swap分区来存储文件,读写速度非常快。

/:这是主文件系统,它是一个逻辑卷(/dev/mapper/ubuntu–vg-ubuntu–lv)

/dev/shm:这是一个共享内存tmpfs,使用RAM作为存储介质,读写速度非常快

/run/lock:这是一个tmpfs文件系统,用于存储锁文件

/boot:俗称启动盘(/dev/sda2),包含了启动linux系统所需的一些重要文件

/run/user/1000:这是一个tmpfs文件系统,用于存储用户级别的session数据

/media/xhs/Ubuntu-Server 22.04.3 LTS amd64:这是光盘驱动器(/dev/sr0),一个Ubuntu Server 22.04.3 LTS的安装光盘。

随机访问存储(Random Access Memory,简称RAM)是计算机中的一种主要存储设备。它可以快速读取和写入数据,并且能够随机访问任意位置的存储单元,因此被称为"随机访问存储"。RAM一般用于存储正在运行的程序、数据和操作系统等信息,RAM具有快速读取和写入数据的能力,可以使计算机更快地执行操作。RAM可以被认为是一种短期存储,因为当计算机关闭时,RAM中的所有数据都会被清除。

du

Disk Usage 磁盘使用情况,用于检查文件和目录的磁盘使用信息,显示的是文件和目录占用信息,而不是它们实际使用的空间,例如,如果文件系统的块大小是4KB,那么即使创建一个只有1字节的文件,文件系统也会为这个文件预留4KB的空间。du命令显示的文件大小可能会大于文件实际的大小。

du 会显示出所有挂载的文件系统的空间使用情况

-s 只显示总计,-h 以人类可读的格式显示

  du -sh ./cloud-deploy
  300K cloud-deploy
  
  du -h ./cloud-deploy
  8.0K ./cloud-deploy/.git/info
  8.0K ./cloud-deploy/.git/refs/remotes/origin
  12K ./cloud-deploy/.git/refs/remotes
  4.0K ./cloud-deploy/.git/refs/tags
  ...

lsblk

用于列出所有块设备信息

  设备名称 主设备号:次设备号 可移动设备 只读 类型 挂载点
  NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
  loop0 7:0 0 4K 1 loop /snap/bare/5
  loop2 7:2 0 74.1M 1 loop /snap/core22/1033
  loop3 7:3 0 63.5M 1 loop /snap/core20/2015
  ...
  loop10 7:10 0 40.4M 1 loop /snap/snapd/20671
  sda 8:0 0 20G 0 disk
  ├─sda1 8:1 0 1M 0 part
  ├─sda2 8:2 0 1.8G 0 part /boot
  └─sda3 8:3 0 18.2G 0 part
  └─ubuntu--vg-ubuntu--lv 253:0 0 18.2G 0 lvm /
  sdb 8:16 0 20G 0 disk
  sr0 11:0 1 2G 0 rom /media/xhs/Ubuntu-Server 22.04.3 LTS amd64

主设备号:主设备号用于标识设备的类型。例如,所有的SCSI硬盘设备都有相同的主设备号。
次设备号:次设备号用于标识同一类型的设备中的特定设备。例如,第一个SCSI硬盘的次设备号是0,第二个SCSI硬盘的次设备号是1,以此类推。

fdisk

可以是Fixed Disk也可以是Format Disk,用来查看、创建、删除、检查磁盘分区

-l 列出所有分区表

  ~# fdisk -l
  Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
  Disk model: VMware Virtual S # 磁盘的型号。在这种情况下,它是一个VMware虚拟磁盘。
  Units: sectors of 1 * 512 = 512 bytes # 每个扇区是512字节
  Sector size (logical/physical): 512 bytes / 512 bytes # 逻辑扇区和物理扇区的大小
  I/O size (minimum/optimal): 512 bytes / 512 bytes # 最小和最优的I/O大小
  Disklabel type: gpt # 磁盘标签的类型。GPT(GUID Partition Table)。
  Disk identifier: D1840A28-5A7D-4F13-8495-D55FDDF187F7 # 磁盘的唯一标识符
  
  设备 开始扇区 结束扇区 扇区总数
  Device Start End Sectors Size Type
  /dev/sda1 2048 4095 2048 1M BIOS boot
  /dev/sda2 4096 3719167 3715072 1.8G Linux filesystem
  /dev/sda3 3719168 41940991 38221824 18.2G Linux filesystem
  ...

pvs

  PV VG Fmt Attr PSize PFree
  /dev/sda3 ubuntu-vg lvm2 a-- 18.22g 0
  /dev/sdb1 vg156 lvm2 a-- 1020.00m 0
  /dev/sdb3 vg0 lvm2 a-- <3.00g <2.00g
  /dev/sdb5 vg156 lvm2 a-- 1020.00m 1012.00m
  /dev/sdb6 vg156 lvm2 a-- <2.00g 0

pvdisplay 查看更详细的信息

   Physical volume 
  PV Name /dev/sdb3
  VG Name vg0
  PV Size 3.00 GiB / not usable 4.00 MiB
  Allocatable yes
  PE Size 4.00 MiB
  Total PE 767
  Free PE 511
  Allocated PE 256
  PV UUID K9XGZP-Wj8m-okSb-Bd7l-aiRS-iOMr-Mswu56

vgs

  VG #PV #LV #SN Attr VSize VFree
  ubuntu-vg 1 1 0 wz--n- 18.22g 0
  vg0 1 1 0 wz--n- <3.00g <2.00g
  vg156 3 1 0 wz--n- <3.99g 1012.00m

PV 物理卷数量

LV 逻辑卷数量

SN 快照数量

Attr 卷组属性,表示此卷组可读写(w),大小可调整(z),没有 RAID(-),没有部分模式(-),没有集群(n),没有内部策略(-)

vgdisplay 查看更详细的信息

lvs

  LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao 18.22g
  lv0 vg0 -wi-a- 1.00g
  lv156 vg156 -wi-a- 3.00g

lvdisplay 查看更详细的信息

4 添加

添加partition

  ~# fdisk /dev/sdb
  
  Welcome to fdisk (util-linux 2.37.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.
  Created a new DOS disklabel with disk identifier 0x868fc991.
  
  Command (m for help): m # 查看帮助
  
  Help:
  
  DOS (MBR)
  a toggle a bootable flag
  b edit nested BSD disklabel
  c toggle the dos compatibility flag
  
  Generic
  d delete a partition
  F list free unpartitioned space
  l list known partition types
  n add a new partition
  p print the partition table
  t change a partition type
  v verify the partition table
  i print information about a partition
  
  Misc
  m print this menu
  u change display/entry units
  x extra functionality (experts only)
  
  Script
  I load disk layout from sfdisk script file
  O dump disk layout to sfdisk script file
  
  Save & Exit
  w write table to disk and exit
  q quit without saving changes
  
  Create a new label
  g create a new empty GPT partition table
  G create a new empty SGI (IRIX) partition table
  o create a new empty DOS partition table
  s create a new empty Sun partition table
  
  Command (m for help): n # 创建分区
  Partition type
  p primary (0 primary, 0 extended, 4 free)
  e extended (container for logical partitions)
  Select (default p): # 默认创建主分区
  
  Using default response p.
  Partition number (1-4, default 1): 默认分区号是1
  First sector (2048-41943039, default 2048): # 默认开始扇区是2048
  Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): +1G # 选择结束扇区,这里使用+1G表示创建1G空间,默认选项会将所有空间用于创建分区
  
  Created a new partition 1 of type 'Linux' and of size 1 GiB.
  
  Command (m for help): p # 查看分区信息,
  Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
  Disk model: VMware Virtual S
  Units: sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disklabel type: dos
  Disk identifier: 0x868fc991
  
  Device Boot Start End Sectors Size Id Type
  /dev/sdb1 2048 2099199 2097152 1G 83 Linux
  
  Command (m for help): wq # w保存,q退出

再创建三个主分区,大小分别为2、3、4G

  Command (m for help): p
  Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
  Disk model: VMware Virtual S
  Units: sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disklabel type: dos
  Disk identifier: 0x868fc991
  
  Device Boot Start End Sectors Size Id Type
  /dev/sdb1 2048 2099199 2097152 1G 83 Linux
  /dev/sdb2 2099200 6293503 4194304 2G 83 Linux
  /dev/sdb3 6293504 12584959 6291456 3G 83 Linux
  /dev/sdb4 12584960 20973567 8388608 4G 83 Linux

此时再想创建,就会提示不能创建

  Command (m for help): n
  To create more partitions, first replace a primary with an extended partition.

必须将主分区替换为扩展分区,扩展分区可以包含多个逻辑分区,将刚刚创建的4号分区删除

  Command (m for help): d
  Partition number (1-4, default 4):
  
  Partition 4 has been deleted.
  
  Command (m for help): n
  Partition type
  p primary (0 primary, 0 extended, 4 free)
  e extended (container for logical partitions)
  Select (default p): e # 选择e即可,接下来流程都一样

之后创建的分区都称为逻辑分区

  Command (m for help): p
  Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
  Disk model: VMware Virtual S
  Units: sectors of 1 * 512 = 512 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disklabel type: dos
  Disk identifier: 0x868fc991
  
  Device Boot Start End Sectors Size Id Type
  /dev/sdb1 2048 2099199 2097152 1G 83 Linux
  /dev/sdb2 2099200 6293503 4194304 2G 83 Linux
  /dev/sdb3 6293504 12584959 6291456 3G 83 Linux
  /dev/sdb4 12584960 20973567 8388608 4G 5 Extended
  /dev/sdb5 12587008 14684159 2097152 1G 83 Linux
  /dev/sdb6 14686208 18880511 4194304 2G 83 Linux

lsblk 发现sdb4只有1k

  sdb 8:16 0 20G 0 disk
  ├─sdb1 8:17 0 1G 0 part
  ├─sdb2 8:18 0 2G 0 part
  ├─sdb3 8:19 0 3G 0 part
  ├─sdb4 8:20 0 1K 0 part
  ├─sdb5 8:21 0 1G 0 part
  └─sdb6 8:22 0 2G 0 part

扩展分区本身并不包含任何数据,它只是一个容器,用于包含逻辑分区(如/dev/sdb5和/dev/sdb6)。因此,扩展分区的大小显示为1K,这只是一个占位符,表示这是一个扩展分区,而不是实际的数据分区。实际的数据存储在逻辑分区中,可以看到/dev/sdb5和/dev/sdb6各有1G和2G的存储空间。

只能拥有一个扩展分区,所有逻辑分区都被挂在扩展分区下面,逻辑分区的大小总和不能超过扩展分区(上文中是4G)

创建物理卷

  pvcreate /dev/sdb3

创建卷组

  vgcreate vg0 /dev/sdb3

创建lvm

  lvcreate -n lv0 -L 1G vg0
  # -n 指定名称 -L 指定大小

lsblk 查看

  sdb 8:16 0 20G 0 disk
  ├─sdb1 8:17 0 1G 0 part
  ├─sdb2 8:18 0 2G 0 part
  ├─sdb3 8:19 0 3G 0 part
  │ └─vg0-lv0 253:1 0 1G 0 lvm

挂载文件系统

  # 指定一个用于挂载的目录
  mkdir -p /mnt/lv0
  
  # 将逻辑卷初始化为ext4
  mkfs.ext4 /dev/vg0/lv0
  
  # 挂载
  mount /dev/vg0/lv0 /mnt/lv0/
  
  # part也能进行挂载,同样需要先初始化,然后挂载到一个目录即可
  mount /dev/sdb1 /mnt/lv1/

lsblk

  sdb 8:16 0 20G 0 disk
  ├─sdb1 8:17 0 1G 0 part /mnt/lv1
  ├─sdb2 8:18 0 2G 0 part
  ├─sdb3 8:19 0 3G 0 part
  │ └─vg0-lv0 253:1 0 1G 0 lvm /mnt/lv0
  ...

在/mnt/lv1和/mnt/lv0目录中写一些文件,使用df查看:

  /dev/mapper/vg0-lv0 974M 257M 650M 29% /mnt/lv0
  /dev/sdb1 974M 514M 393M 57% /mnt/lv1

mount是临时挂载,实现永久挂载:

  cat >> /etc/fstab << EOF
  /dev/vg0/lv0 /mnt/lv0/ ext4 defaults 0 0
  EOF
  # 参数解释,从左往右分别为:
  # 要挂载的设备 挂载点 文件系统类型 挂载选项(选默认选项)
  # 第一个0 是dump备份的参数。0表示不备份,1表示需要备份。
  # 第二个0 是文件系统检查的顺序。0表示不检查,1表示首先检查(通常用于根文件系统),2表示接下来检查(用于非根文件系统)默认设置为0就好了

5 删除

必须按照和创建相反的顺序删除分区。直接使用fdisk删除sdb3会发生这种事情:

  fdisk -l
  Device Boot Start End Sectors Size Id Type
  /dev/sdb1 2048 2099199 2097152 1G 83 Linux
  /dev/sdb2 2099200 6293503 4194304 2G 83 Linux
  /dev/sdb4 12584960 20973567 8388608 4G 5 Extended
  /dev/sdb5 12587008 14684159 2097152 1G 83 Linux
  /dev/sdb6 14686208 18880511 4194304 2G 83 Linux
  
  lsblk
  sdb 8:16 0 20G 0 disk
  ├─sdb1 8:17 0 1G 0 part /mnt/lv1
  ├─sdb2 8:18 0 2G 0 part
  ├─sdb3 8:19 0 3G 0 part
  │ └─vg0-lv0 253:1 0 1G 0 lvm /mnt/lv0
  ├─sdb4 8:20 0 512B 0 part
  ├─sdb5 8:21 0 1G 0 part
  ...

可以看到两个命令的结果不一致,事实上除了fdisk外,其它的命令都显示sdb3仍然还在,所以sdb3根本没有被删除,这种不一致不好好处理会产生更大的麻烦,最好按以下顺序删除:

卸载文件系统

  # umount <挂载点>
  umount /mnt/lv0/

如果提示挂载点被占用,可以使用 lsof /mnt/lv0/ 查看有什么进程在使用,并可以选择kill它们
强制卸载命令:umount -l /mnt/lv0

删除逻辑卷

  lvremove /dev/vg0/lv0

删除卷组

  vgremove /dev/vg0

删除物理卷

  pvremove /dev/sdb3

删除分区

fdisk /dev/sdb



  Command (m for help): d
  Partition number (1-6, default 6): 3
  
  Partition 3 has been deleted.

如果还是提示不能删除,那么使用 partprobe 更新分区表

6 扩容

fdisk扩容必须确保当前分区后面没有其它分区。

先使用d删除分区,然后用n创建更大的分区,而且新分区的起始位置必须和原分区的起始位置相同,否则会丢失数据。这一步就不演示了。

扩大分区后, 还需要扩大文件系统的空间

  fdisk /dev/sdb`
  # d 删除3, 4, 5 6号分区
  # n 创建更大的3号分区
  
  # 扩大文件系统的空间
  resize2fs /dev/sdb3

扩容不能跨区这点很麻烦,假如4,5,6号分区有数据不能删除,那3号分区就无法扩容,gparted可以调整其它分区的大小,但是gparted是图形化工具,使用的情况有限。

卷组可以解决这个情况

  lsblk
  sdb 8:16 0 20G 0 disk
  ├─sdb1 8:17 0 1G 0 part
  ...
  ├─sdb5 8:21 0 1G 0 part
  └─sdb6 8:22 0 2G 0 part
  
  # 创建物理卷
  pvcreate /dev/sdb1
  pvcreate /dev/sdb5
  pvcreate /dev/sdb6
  
  # 创建卷组
  vgcreate vg156 /dev/sdb1 /dev/sdb5 /dev/sdb6
  # 已有的卷组可以添加物理卷
  vgextend vg156 /dev/sdb2
  
  # 创建lvm
  lvcreate -n lv156 -L 1G vg156
  
  lsblk
  sdb 8:16 0 20G 0 disk
  ├─sdb1 8:17 0 1G 0 part
  ...
  ├─sdb5 8:21 0 1G 0 part
  └─sdb6 8:22 0 2G 0 part
  └─vg156-lv156 253:2 0 1G 0 lvm
  
  # 可以随时给lvm扩容
  lvextend -L 3G /dev/vg156/lv156
  
  lsblk
  sdb 8:16 0 20G 0 disk
  ├─sdb1 8:17 0 1G 0 part
  │ └─vg156-lv156 253:2 0 3G 0 lvm
  ...
  ├─sdb5 8:21 0 1G 0 part
  │ └─vg156-lv156 253:2 0 3G 0 lvm
  └─sdb6 8:22 0 2G 0 part
  └─vg156-lv156 253:2 0 3G 0 lvm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值