Linux系统磁盘管理

Linux系统磁盘管理

文章目录

  • Linux系统磁盘管理
    • 磁盘简介
      • 磁盘分类
      • Linux中磁盘命名方式
      • MBR与GPT
    • 磁盘容量检查
    • 磁盘分区
      • fdisk分区
      • gdisk分区
    • 磁盘格式化
    • 磁盘挂载
      • 临时挂载磁盘
      • 永久挂载磁盘
      • 卸载挂载磁盘
    • 交换分区SWAP
      • 创建swapfile
      • 格式化swap分区
      • 检测当前swap分区情况
      • 开启新建的SWAP分区
      • 关闭新建的swap分区
      • //创建swap分区并且持久化使用
    • 生产磁盘故障案例
      • Inode被占满,导致磁盘有可用的剩余空间也无法继续使用

磁盘简介

磁盘分类

  • 固态硬盘
    固态硬盘的优缺点
    优点:
       读写速度快
       防震抗摔性强
       低功耗
       无躁音
       体积小,携带方便
    缺点:
       容量比机械硬盘小
       寿命比机械硬盘短
       制造成本高所以价格比机械硬盘高
  • 机械硬盘
       (优缺点与上相反)

Linux中磁盘命名方式

Linux中磁盘的命名方式与磁盘的接口有关,规则如下:

传统IDE接口硬盘:/dev/hd[a-z]
SCISI接口硬盘:/dev/sd[a-z]
虚拟化硬盘:/dev/vd[a-z]

在设备名称的定义规则如下, 其他的分区可以以此类推
系统的第一块SCSI接口的硬盘名称为/dev/sda
系统的第二块SCSI接口的硬盘名称为/dev/sdb
系统中分区由数字编号表示, 1-4留给主分区使用和扩展分区, 逻辑分区从5开始

//第一块磁盘
/dev/sda
//第一块磁盘的第一个分区
/dev/sda1
//第二块磁盘的第一个分区
/dev/sdb1

MBR与GPT

在使用新磁盘之前,你必须对其进行分区。MBR(Master Boot Record)和GPT(GUID Partition Table)是在磁盘上存储分区信息的两种不同方式。这些分区信息包含了分区从哪里开始的信息,这样操作系统才知道哪个扇区是属于哪个分区的,以及哪个分区是可以启动的。在磁盘上创建分区时,你必须在MBR和GPT之间做出选择

MBR是Master Boot Record的简称,也就是主引导记录,是位于磁盘最前边的一段引导(Loader)代码,主要用来引导操作系统的加载与启动

特点:
MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘
只支持最多4个主分区。若想要更多分区,需要创建扩展分区,并在其中创建逻辑分区

GPT磁盘是指使用GUID分区表的磁盘,GUID磁盘分区表(GUID Partition Table,缩写:GPT)其含义为“全局唯一标识磁盘分区表”,是一个实体硬盘的分区表的结构布局的标准

特点:

  1. GPT对磁盘大小没有限制
  2. 最多可以创建128个分区

注意:

MBR与GPT之间互相转换会导致数据丢失

GPT磁盘概述
MBR与GPT的区别

磁盘容量检查

使用df命令查看磁盘容量,不加参数以k为单位:

df -i   //查看inode使用情况
df -h   //以G或者T或者M人性化方式显示
df -T   //查看文件类型

//使用df命令查看磁盘,下面分别介绍每列什么含义
[root@guilaixiaobaii ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   38G  946M   37G    3% /
devtmpfs               1.9G     0  1.9G    0% /dev
tmpfs                  1.9G     0  1.9G    0% /dev/shm
tmpfs                  1.9G  8.7M  1.9G    1% /run
tmpfs                  1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/rhel-home   19G   33M   19G    1% /home
/dev/sda1             1014M  143M  872M   15% /boot
tmpfs                  378M     0  378M    0% /run/user/0

使用lsblk查看分区情况:

[root@guilaixiaobai ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   60G  0 disk 
├─sda1          8:1    0    1G  0 part /boot
└─sda2          8:2    0   59G  0 part 
  ├─rhel-root 253:0    0   37G  0 lvm  /
  ├─rhel-swap 253:1    0  3.9G  0 lvm  [SWAP]
  └─rhel-home 253:2    0 18.1G  0 lvm  /home
sdb             8:16   0   20G  0 disk 
sdc             8:32   0   20G  0 disk 
sdd             8:48   0   20G  0 disk 
sr0            11:0    1  3.8G  0 rom  

使用du命令查看目录或者文件的容量,不加参数以k为单位:

du -sh opt  //人性化输出显示大小
-s:列出总和
-h:人性化显示容量信息
[root@lisuhaoyi ~]# du -sh /root/

磁盘分区

分区工具有fdisk和gdisk,当硬盘小于2T的时候我们应该用fdisk来分区,而当硬盘大于2T的时候则应用gdisk来进行分区

fdisk分区

//生产分区建议: 如无特殊需求, 直接使用整个磁盘即可, 无需分区
//学习分区建议:1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (仅适用于练习)

[root@guilaixiaobai ~]# fdisk -l

磁盘 /dev/sda:64.4 GB, 64424509440 字节,125829120 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000983d7

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200   125829119    61864960   8e  Linux LVM

磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
....

[root@guilaixiaobai ~]# fdisk  /dev/sdb
Command (m for help): m //输入m列出常用的命令
Command action
   a   toggle a bootable flag   //切换分区启动标记
   b   edit bsd disklabel     //编辑sdb磁盘标签
   c   toggle the dos compatibility flag    //切换dos兼容模式
   d   delete a partition     //删除分区
   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 //创建新的Sun磁盘标签
   t   change a partition's system id   //修改分区ID,可以通过l查看id
   u   change display/entry units       //修改容量单位,磁柱或扇区
   v   verify the partition table       //检验分区表
   w   write table to disk and exit     //保存退出
   x   extra functionality (experts only)   //拓展功能
//创建主分区
命令(输入 m 获取帮助):n		//新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p			//选择主分区
分区号 (1-4,默认 1):		//默认回车
起始 扇区 (2048-41943039,默认为 2048):			//默认扇区回车
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G			//分配5G
分区 1 已设置为 Linux 类型,大小设为 5 GiB

//创建扩展分区
命令(输入 m 获取帮助):n		//新建分区
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e				//创建扩展分区
分区号 (2-4,默认 2):
起始 扇区 (10487808-41943039,默认为 10487808):		
将使用默认值 10487808
Last 扇区, +扇区 or +size{K,M,G} (10487808-41943039,默认为 41943039):	//默认划分所有空间给扩展分区
将使用默认值 41943039
分区 2 已设置为 Extended 类型,大小设为 15 GiB

//创建逻辑分区
命令(输入 m 获取帮助):n			//新建分区
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l					//创建逻辑分区
添加逻辑分区 5
起始 扇区 (10489856-41943039,默认为 10489856):
将使用默认值 10489856
Last 扇区, +扇区 or +size{K,M,G} (10489856-41943039,默认为 41943039):+5G				//分配100MB空间
分区 5 已设置为 Linux 类型,大小设为 5 GiB

//查看分区创建
命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xf8e96ee3

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux
/dev/sdb2        10487808    41943039    15727616    5  Extended
/dev/sdb5        10489856    20975615     5242880   83  Linux

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

//检查磁盘是否是MBR分区方式
[root@guilaixiaobai ~]# fdisk -l |grep "磁盘标签类型"
磁盘标签类型:dos

LANG=zh_CN.UTF-8		//切换中文
LANG=en_US.UTF-8		//切换英文

[root@guilaixiaobai ~]# fdisk -l /dev/sdb|grep type
Disk label type: dos

//安装parted, 刷新内核立即生效,无需重启 
[root@guilaixiaobai ~]# yum -y install parted
[root@guilaixiaobai ~]# partprobe /dev/sdb

gdisk分区

//安装gdisk工具
[root@guilaixiaobai ~]# yum -y install gdisk


[root@guilaixiaobai ~]# gdisk /dev/sdb
Command (? for help): n     //创建新分区
Partition number (1-128, default 1):
First sector (34-2097118, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-2097118, default = 2097118) or {+-}size{KMGTP}: +500M //分配500M大小

Command (? for help): p //打印查看
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1026047   500.0 MiB   8300  Linux filesystem

Command (? for help): w //保存分区
Do you want to proceed? (Y/N): y    //确认
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

//检查磁盘是否是gpt格式
[root@guilaixiaobai /]# fdisk /dev/sdb -l|grep type
Disk label type: gpt

//安装parted, 刷新内核立即生效,无需重启
[root@guilaixiaobait ~]# yum -y install parted
[root@guilaixiaobai~]# partprobe /dev/sdb

磁盘格式化

使用mkfs命令格式化磁盘,创建文件系统

//mkfs常用的选项有
-b  //设定数据区块占用空间大小,目前支持1024、2048、4096 bytes每个块。
-t  //用来指定什么类型的文件系统,可以是ext3,ext4, xfs
-i  //设定inode的大小
-N  //设定inode数量,防止Inode数量不够导致磁盘不足
-L  //预设该分区的标签label

//格式化整个sdb磁盘为ext4文件系统
[root@guilaixiaobai ~]# mkfs.ext4  /dev/sdb1

//也可以使用-t指定方式创建ext4文件系统
[root@guilaixiaobai ~]# mkfs -t ext4  /dev/sdb1

//也可以格式化sdb1分区为xfs文件系统
[root@guilaixiaobai ~]# mkfs.xfs  /dev/sdb1


[root@guilaixiaobai ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1342177280
40 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: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

注意 :

不要mkfs.ext4 /dev/sdb 不然你的分区会都没了

磁盘挂载

在上面的内容中讲到了磁盘的分区和格式化, 那么格式化完了后, 如何使用, 这就涉及到了挂载这块磁盘

挂载分区前需要创建挂载点, 挂载点以目录形式出现
如果往挂载点目录写入数据, 实际上会写入到该分区
挂载点建议是空目录, 不是也不影响挂载分区的使用,但是会隐藏原有的文件

临时挂载磁盘

命令:mount挂载磁盘,实质为文件系统指定访问入口
mount -t       //指定文件系统挂载分区,如ext3,ext4, xfs
mount -a       //重新读取/etc/fstab配置文件的所有分区
mount -o       //指定挂载参数

//fstab被损坏情况下,让只读文件系统可写(正常情况下不使用)
[root@guilaixiaobai ~]#mount -o rw,remount /  

//挂载/dev/sdb1至db1目录
[root@guilaixiaobai ~]# mkdir /db1
[root@guilaixiaobai ~]# mount /dev/sdb1  /db1

[root@guilaixiaobai ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   38G  952M   37G    3% /
devtmpfs               1.9G     0  1.9G    0% /dev
tmpfs                  1.9G     0  1.9G    0% /dev/shm
tmpfs                  1.9G  8.7M  1.9G    1% /run
tmpfs                  1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/rhel-home   19G   33M   19G    1% /home
/dev/sda1             1014M  143M  872M   15% /boot
tmpfs                  378M     0  378M    0% /run/user/0
/dev/sr0               3.8G  3.8G     0  100% /mnt
/dev/sdb1              4.8G   20M  4.6G    1% /db1					//df 有显示就是挂在上了

永久挂载磁盘

//使用blkid命令获取各分区的UUID
[root@guilaixiaobai ~]# blkid |grep "sdb1"
/dev/sdb1: UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" TYPE="xfs"

//使用UUID挂载磁盘sdb1分区至于db1, 临时挂载
[root@guilaixiaobai ~]# mount UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" /db1

//也可以把下面这行写到/etc/fstab中,永久挂载, 开机自动挂载
[root@guilaixiaobai ~]# tail -1 /etc/fstab    
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs  defaults 0  0

//加载fstab配置文件, 同时检测语法是否有错误
[root@guilaixiaobai ~]# mount –a

配置文件介绍:

[root@guilaixiaobai ~]# vim /etc/fstab

//分区标识(UUID或设备名)                    挂载点 文件类型    挂载参数    不检查 不备份
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1     ext4     defaults    0     0

//挂载参数, 可写fstab配置文件, 也可以mount时使用-o参数指定
参数              参数意义                               系统默认值
async           系统每隔一段时间把内存数据写入磁盘中,
sync            时时同步内存和磁盘中数据;
suid,nosuid     允许/不允许分区有suid属性                suid
rw,ro           可以指定文件系统是只读(ro)或可写(rw)       rw
exec,noexec     允许/不允许可执行文件执行,不要挂载根分区    exec
user,nouser     允许/不允许root外的其他用户挂载分区        nouser
auto,noauto     开机自动挂载/不自动挂载                    auto
default         默认文件系统挂载设置 rw, suid, dev, exec, auto, nouser, async

//加载所有配置
[root@guilaixiaobai ~]# mount -a

卸载挂载磁盘

umount -lf  //强制卸载挂载

//使用站点目录卸载
[root@guilaixiaobai ~]# umount /db1
//使用设备名卸载/dev/sdb1
[root@guilaixiaobai ~]# umount /dev/sdb1


//umount不能卸载的情况
[root@guilaixiaobai db1]# umount /db1  
umount: /db1: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1)
       
//如上情况解决办法有两种, 切换至其他目录 或使用'-l'选项强制卸载    
[root@guilaixiaobai db1]# umount -l /db1

交换分区SWAP

交换分区SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。

交换分区一般指定虚拟内存的大小为实际内存的1~1.5倍。如果实际内存超过8GB,可以直接划分16GB给虚拟内存即可,如果虚拟内存不够用的情况,须增加一个虚拟磁盘,由于不能给原有的磁盘重新分区,所以可以选择新建。

创建swapfile

[root@guilaixiaobai ~]# dd if=/dev/zero of=/opt/newdisk bs=1M count=1024
//if:指定源  一般写/dev/zero
//of:指定目标
//bs:定义块大小
//count:数量

格式化swap分区

[root@guilaixiaobai opt]# mkswap -f /opt/newdisk 

检测当前swap分区情况

[root@guilaixiaobai ~]# free -m

开启新建的SWAP分区

[root@guilaixiaobai ~]# swapon /opt/newdisk
[root@guilaixiaobai ~]# free -m

关闭新建的swap分区

[root@guilaixiaobai ~]# swapoff /opt/newdisk
[root@guilaixiaobai ~]# free -m

//创建swap分区并且持久化使用

例子: 给系统新增加一个交换分区(swap)
考试题目:一般是要求新建一个分区,并且把分区作为swap分区使用

查看内存和交换分区的使用情况
# free -m
             total       used       free     shared    buffers     cached
Mem:          1841        613       1227         16          0        258
-/+ buffers/cache:        354       1486
Swap:            0          0          0  <--- 没有交换分区



`swapon -s  也能用该命令查看,只是默认也是没有交换分区所有没有输出

fdisk  -l /dev/sdb
   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     6293503     2097152   83  Linux  <---准备把该分区作为交换分区


新建一个分区,并且把分区类型更改为82 
    新分区我们在上面的练习已经完成了,所以本例子不用分区,而是需要修改该分区的类型

fdisk  /dev/sdb

命令(输入 m 获取帮助):l  列出所有支持的分区类型对应的id

命令(输入 m 获取帮助):t  修改分区id
分区号 (1-5,默认 5):2  修改第2个分区
Hex 代码(输入 L 列出所有代码):82  修改成id为82
已将分区“Linux”的类型更改为“Linux swap / Solaris”

命令(输入 m 获取帮助):p

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     6293503     2097152   82  Linux swap / Solaris <---修改成功


命令(输入 m 获取帮助):w

强烈建议: 对分区做了修改后都刷新一下
partprobe  /dev/sdb

把sdb2格式化为交换分区
 mkswap  /dev/sdb2
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=ba08eb90-2003-44e6-9769-9a9351aebb05

启动交换分区
swapon /dev/sdb2  或者  # swanon -a  启动所有交换分区


查看
swapon -s
文件名             类型      大小  已用  权限
/dev/sdb2                               partition   2097148 0   -1

持久化保存交换分区的使用
blkid /dev/sdb2
/dev/sdb2: UUID="ba08eb90-2003-44e6-9769-9a9351aebb05" TYPE="swap" 


vi /etc/fstab 
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=cb3299d6-16e0-4644-9686-27907eefb8f3 /boot                   xfs     defaults        0 0
UUID=ba08eb90-2003-44e6-9769-9a9351aebb05  swap         swap    defaults  0 0

生产磁盘故障案例

Inode被占满,导致磁盘有可用的剩余空间也无法继续使用

inode是啥

[root@guilaixiaobai ~]# dd if=/dev/zero of=/opt/newdisk bs=1k count=1024
[root@guilaixiaobai ~]# mkfs.ext4 -i 1024 /opt/newdisk
[root@guilaixiaobai ~]# mkdir /data
[root@guilaixiaobai ~]# mount -t ext4 -o loop /opt/newdisk /data/

//inode被占满
[root@guilaixiaobai ~]# touch {1..20000}
touch: cannot touch `19997': No space left on device
touch: cannot touch `19998': No space left on device
touch: cannot touch `19999': No space left on device
touch: cannot touch `20000': No space left on device

//inode被占满,剩余block也是无法继续使用
[root@guilaixiaobai ~]# df -i|grep data
/opt/newdisk      1024  1024       0  100% /data
[root@guilaixiaobai ~]# df -h|grep data
/opt/newdisk    891K   34K  806K   5% /data

Block空间即将被占满, 但删除大文件也没有释放空间

假设现在线上正在运行Nginx服务, Nginx产生的日志已经达到了20个G, 磁盘眼看就看沾满了, 请问不重启Nginx的方式如何处理

//是会删除文件, 但Nginx持续占用着文件, 所以空间并不会被释放
rm -f access.log

//正确做法如下, 清空该文件即可释放文件内容
> access.log

你可能感兴趣的:(linux)