Linux攻关之基础模块十五 磁盘管理

Linux系统磁盘管理

    磁盘基本概述
    磁盘容量检查
    磁盘分区Fdisk
    磁盘格式化Mkfs
    磁盘挂载Mount
        临时挂载磁盘
        永久挂载磁盘
        卸载挂载磁盘
    虚拟磁盘SWAP
    生产磁盘故障案例

1.磁盘基本概述

磁盘三要素  磁道 扇区  磁柱

磁盘接口类型
    IDE         并口,133MBps
    SATA        串口,6gbps
    SCSI        并口,640MBps
    SAS         串口,6gbps     服务器常用
    USB         串口,3.0  480MBps

硬盘命名
    在设备名称的定义规则下,其他的分区可以以此类推
    系统的第一块scsi接口的硬盘名称为 /dev/sda
    系统的第二块scsi接口的硬盘名称为 /dev/sdb
    系统中分区由数字编号表示,1-4留给主分区使用和扩展分区,逻辑分区从5开始
    
    有些存放数据的设备并不是直接硬件对应的设备文件,而是通过软件生成的块设备文件,例如lvm和软raid设备文件
        物理硬盘  /dev/ss[a-z]
        KVM虚拟化 /dev/vd[a-z]  online
        
        //第一块硬盘
            /dev/sda
        //第二块硬盘第一个分区
            /dev/sdb1
        //第一块硬盘,第一块分区
            /dev/vda1
    
    注意:MBR方式只能分4个分区,GPT可分128个主分区
    MBR与GPT之间互相转换会导致数据丢失
    
    扩展
        GPT磁盘概述
        GPT与MBR区别
            第一个主要区别,MBR只能支持最大2T的硬盘。超过2T,必须使用GPT,否则无法使用所有存储空间。
            第二个主要区别,电脑启动方式是UEFI时,硬盘必须使用GPT分区表,而使用传统启动方式时,硬盘必须使用MBR分区表。

2.磁盘容量检查

查看磁盘分区信息
    fdisk -l  ****
    lsblk      *****
    gdisk -l    ***
    partx -s /dev/sda

2.1使用df命令查看磁盘容量,不加参数以K为单位
    df -i  //查看inode使用情况
    df -h  //以G或者T或者M人性化方式显示
    df -T  //查看文件类型
    
    //使用df命令查看磁盘,下面分别介绍每列什么含义
    [root@zph ~]# df -h

2.2使用lsblk查看分区情况
[root@zph ~]# lsblk 

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

du  -sh  opt  //人性化显示大小
    -s 列出总和
    -h 人性化显示容量信息

3.磁盘分区Fdisk 针对MBR

创建分区
    小于2TB存储硬盘,可选分区工具fdisk
//生产分区建议:如无特属于需求,直接使用整个磁盘即可,无需分区
//学习分区建议:1P+1E(3L) 2P+1E(2L) 3P+1E(1L)

[root@zph ~]# fdisk -l
[root@zph ~]# fdisk /dev/sdb
[root@zph ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xdec876ae 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):m  
命令操作
   a   toggle a bootable flag                       //切换分区启动标记
   b   edit bsd disklabel                           //编辑sdb磁盘格式
   c   toggle the dos compatibility flag            //切换dos兼容模式
   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             //创新新的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):+1G
分区 1 已设置为 Linux 类型,大小设为 1 GiB


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



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


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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200    23070719    10485760    5  Extended
/dev/sdb5         2101248     2306047      102400   83  Linux

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

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


//检查磁盘是否是MBR分区方式
[root@zph ~]# fdisk /dev/sdb -l | grep type
磁盘标签类型:dos (dos 就是 MBR)

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

partprobe
    如果是虚拟机或云主机,分区完之后会立即刷新 
    如果是物理主机,分区完之后必须手动刷新

4.磁盘分区Gdisk 针对GPT 使用gdisk 与fdisk相同

5.磁盘格式化Mkfs

5.1创建文件系统

格式化:低级格式化(分区之间进行,划分磁道)、高级格式化(分区之后对分区进行,创建文件系统)
    元数据区、数据区
        元数据区:inode
            大小、权限、属主属组、时间戳、数据块指针
        符号链接文件:存储数据指针的空间当中存储的是真实文件的访问路径
        设备文件:存储数据指针的空间当中存储的是设备号
            /dev/sda1

VFS:VFS(virtual File System):linux下的一个较为强大的文件系统工具
    兼容性很强,可以支持不同的文件系统
VFS可支持的文件系统
    Linux的文件系统:ext2 ext3 ext4 xfs(centos 7)  reiserfs btrfs
    光盘   ISO9660
    网络文件系统   nfs  cifs
    集群文件系统 gfs  ocfs2
    内核级分布式文件系统   ceph
    Windows的文件系统  vfat ntfs
    伪文件系统    proc sysfs tmpfs hugepagefs
    Unix的文件系统   UFS  FFS  JFS
    交换文件系统    SWAP
    用户空间的文件系统    mogilfs moosefs  glusterfs

5.2mkfs
mkfs格式化硬盘  实质创建文件系统

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

//格式化整个sdb磁盘为xfs文件系统
[root@zph ~]# mkfs.xfs -f /dev/sdb
//也可以格式化某个磁盘的某个分区

5.3
ext与xfs文件系统对比
    EXT家族支持度最广,但
        创建文件系统慢
        修复慢
        存储容量有限
XFS同样是日志文件系统
    容量大,支持大存储
    高性能,创建/修复文件系统快
    inode与block都是系统需要用到的,才动态分配产生

6.磁盘挂载Mount

上面已经给磁盘分好区,格式化好文件系统,格式完后,使用就必须将磁盘挂载
    挂载分区前需要创建挂载点,挂载点以目录形式出现
    往挂载点写入数据,实际上就是写入磁盘分区中
    挂载点建议是空目录,不是也不影响挂载分区的使用
6.1临时挂载磁盘

    命令:mount 挂载硬盘 ,实质为文件系统指定访问入口
    mount -t     //指定文件系统挂载分区,如ext4  xfs  一般不用加 系统会检测
    mount -a     //读取/etc/fstab配置文件的所有分区
    mount -o     //指定挂载参数
            -o sync/async:同步/异步操作
                atime/noatime  文件或目录在被访问时是否更新其访问时间戳
                diratime/nodiratime   目录在被访问时是否更新其访问时间戳
                remount    重新挂载
                acl     支持使用acl功能:
                       mount -o acl device dit
                       tune2fs -o acl device
                ro   只读
                rw   读写
                dev/nodev   此设备上是否允许创建设备文件
                exec/noexec   此设备上的文件是否允许运行
                auto/noauto   
                user/nouser  是否允许普通用户挂载次文件系统
                suid/nosuid  是否允许程序文件上的suid和sgid特殊权限是否生效
                relatime/norelatime
                defaults :rw,suid,dev,exec,auto,nouser,async,relatime
    mount -U     //挂载时以UUID方式指明设备
    //fstab被损坏的情况下,让只读文件系统可写(正常情况下不使用)
    [root@zph ~]# mount -o rw,remount /
    
    //挂载/dev/sdb1至db1目录
    [root@zph ~]# mkdir /db1
    [root@zph ~]# mount /dev/sdb1 /db1/

6.2永久挂载磁盘
/etc/fstab文件
    每行定义一个要挂载的文件系统及相关属性
        6个字段
            1)要挂载的设备
                设备文件
                LABEL
                UUID
                伪文件系统 如sysfs,proc,tmpfs等
            2)挂载点
                swap类型的设备的挂载点位swap
            3)文件系统类型
            4)挂载选项
                defaults  使用默认挂载选项
                如果需要同时指明多个挂载选项,彼此间以逗号隔开
            5)转储频率(备份)
                0 从不备份
                1 每天备份一次
                2 每隔一天备份一次
            6)自检次序
                0 不自检
                1 首先自检,通常只能是根文件系统
                2 次级自检

注意:可以使用mount -a  加载/etc/fstab文件  同时检测是否存在语法错误


案例:使用UUID进行自动挂载
[root@zph ~]# blkid /dev/sdb1 | awk '{print $2}' >> /etc/fstab   //blkid获取uuid
[root@zph ~]# blkid /dev/sdb5 | awk '{print $2}' >> /etc/fstab 
[root@zph ~]# cat /etc/fstab
UUID="819a5b72-799b-4bd2-b44d-e820b2004bb1" /data1     xfs     defaults        0 0
UUID="89b50c89-14d9-453d-b988-7e1978b0a25d" /data2     xfs     defaults        0 0  
[root@zph ~]# mount -a   //加载配置  不用重启 实现挂载


6.3卸载挂载硬盘
umount -lf  //强制卸载挂载

//使用站点目录卸载
[root@zph ~]# umount /db1

也可以使用设备名卸载  umount /dev/sdb1


//umount 不能卸载的情况
[root@zph ~]# umount /db1
umount:/db1: device is busy

如上情况 有两种办法 切换至其他目录或者使用-l

7.虚拟磁盘SWAP

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

方法一  拿出内存作为虚拟内存
7.1创建swapfile
[root@zph ~]# dd if=/dev/zero of=/opt/swapfile bs=4k count=102400
       //if  指定源  一般写/dev/zero
       //of  指定目标  
       //bs  定义块大小
       //count  数量

7.2格式化swap分区
[root@zph ~]# mkswap[-f] /opt/swapfile 
正在设置交换空间版本 1,大小 = 409596 KiB
无标签,UUID=7f828ee3-1299-44ba-bfb3-cbc1e6b562ce

7.3检查当前swap分区情况
[root@zph ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         549         346          16        1084        1230
Swap:          1999           0        1999   (原来就是1999)

7.4启动虚拟磁盘,并检查
//启动swapfile时,会提示权限过高,按照提示修改权限
[root@zph ~]# swapon /opt/swapfile
swapon: /opt/swapfile:不安全的权限 0644,建议使用 0600。
[root@zph ~]# chmod 0600 /opt/swapfile 
[root@zph ~]# swapon /opt/swapfile
swapon: /opt/swapfile:swapon 失败: 设备或资源忙
[root@zph ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         550         345          16        1084        1230
Swap:          2399           0        2399   (可看出多出来了)


7.5关闭虚拟磁盘,并检查
[root@zph ~]# swapoff /opt/swapfile 
[root@zph ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         549         345          16        1084        1230
Swap:          1999           0        1999


方法二  创建swap分区并且持久化使用
//先查看内存和交换分区使用情况
[root@zph opt]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         549         756          16         673        1230
Swap:          1999           0        1999

//新建一个分区,并且把分区类型改为82
    新分区上面已经创建完成,直接更改


[root@zph opt]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


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

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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     1026047      512000   83  Linux
/dev/sdb2         1026048    11511807     5242880    5  Extended
/dev/sdb5         1028096     5222399     2097152   82  Linux swap / Solaris

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

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@zph opt]# partprobe /dev/sdb5     //强烈建议对分区做完操作进行刷新



把sdb5格式化为交换分区
[root@zph opt]# mkswap /dev/sdb5
mkswap: /dev/sdb5: warning: wiping old xfs signature.
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=03cd80aa-73d7-449e-8bfa-6ab6c3d83ec8


启动交换分区
[root@zph opt]# swapon /dev/sdb5
或者
swapon -a  启动所有交换分区



查看
[root@zph opt]# swapon -s
文件名				类型		大小	已用	权限
/dev/dm-1                              	partition	2047996	0	-2
/dev/sdb5                              	partition	2097148	0	-3


让交换分区开机自动挂载,持久化保存交换分区使用

[root@zph opt]# blkid /dev/sdb5 | awk '{print $2}' >> /etc/fstab

[root@zph opt]# vim /etc/fstab
....
UUID="03cd80aa-73d7-449e-8bfa-6ab6c3d83ec8"     swap   swap    defaults        0 0

8.生产环境磁盘故障案例

8.1
Inode被沾满 ,导致磁盘有可用的剩余空间也无法继续使用
//创建环境
[root@zph data]# dd if=/dev/zero of=/opt/swapfile bs=1k count=1024
[root@zph data]# mkfs.ext4 -i 1024 /opt/swapfile
[root@zph data]# mkdir /data
[root@zph data]# mount -t ext4 -o loop /opt/swapfile  /data/
[root@zph data]# cd /data/

//inode被占满
[root@zph data]# touch {1..20000}
touch: 无法创建"1014": 设备上没有空间
touch: 无法创建"1015": 设备上没有空间
touch: 无法创建"1016": 设备上没有空间
touch: 无法创建"1017": 设备上没有空间
touch: 无法创建"1018": 设备上没有空间
...


//inode被占满 ,剩余block也无法继续使用
[root@zph data]# df -h | grep data
/dev/loop0               891K   38K  782K    5% /data
[root@zph data]# df -i |grep data
/dev/loop0                  1024    1024        0     100% /data


解决办法:使用find查找出小文件,删除,释放inode 这里的小文件是企业定义的
[root@zph ~]# find /data -size -1k -delete



8.2
Block空间即将被占满,但删除大文件也没有释放空间
    假设在线上正在运行Nginx服务,Nginx产生的日志已经达到了20个G,磁盘眼看着就要占满了,请问在不重启Nginx的方式下的处理方式

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

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

8.3正在使用的文件丢失后,如何恢复

解决:通过删除文件的进程文件描述符来恢复

(1)查看文件被哪个进程使用
[root@zph ~]# lsof /var/log/messages
或
[root@zph ~]# lsof | grep messages
(2)通过文件描述符查看文件内容是否匹配
[root@zph ~]# cat /proc/751/fd/4
(3)模拟误删文件
[root@zph ~]# rm -f /var/log/messages
(4)查看删除文件后进程使用状态
[root@zph ~]# lsof | grep delete
(5)恢复
[root@zph ~]# cp /proc/751/fd/4 /var/log/messages
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值