Linux存储管理

Posted 徐中祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux存储管理相关的知识,希望对你有一定的参考价值。

Linux存储管理

一 磁盘在系统的命名

设备名称分区信息设备类型
/dev/sda/dev/sda1第一块物理磁盘第一分区
/dev/sdb/dev/sdb2第二块磁盘第二个分区
/dev/vdd/dev/vdd4第四块虚拟磁盘的第四个分区

分区主要分为三类:主分区<—扩展分区<—逻辑分区

#1、逻辑分区属于扩展分区,扩展分区属于主分区
#2、主分区又叫做引导分区,是可以安装系统的分区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpammEGg-1623078521394)(img/image-20210410154003515.png)]

目前常见的磁盘分区格式有两种,MBR 分区和 GPT 分区:

MBR 分区,MBR 的意思是 "主引导记录"。MBR 最大支持 2TB 容量,在容量方面存在着极大的瓶颈。
GPT 分区,GPT 意为 GUID 分区表,它支持的磁盘容量比 MBR 大得多。这是一个正逐渐取代 MBR 的新标准,它是由 UEFI 辅住而形成的,将来 UEFI 用于取代老旧的 Bios,而 GPT 则取代老旧的 MBR。

磁盘分区工具

fdisk 工具用于 MBR 格式
gdisk 工具用于 GPT 格式

二 MBR分区

查看设备详情,以及分区的情况

[root@egon ~]# lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   10G  0 disk 
├─sda1   8:1    0  500M  0 part /boot
├─sda2   8:2    0    1G  0 part [SWAP]
└─sda3   8:3    0  8.5G  0 part /
[root@egon ~]# 
[root@egon ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk 
[root@egon ~]# lsblk /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc    8:32   0  20G  0 disk 

fdisk工具:

适用于磁盘小于2TB的磁盘,分区类型MBR,主分区4或主分区3+扩展分区(逻辑分区+…),分区后需要保存后才能生效

[root@egon ~]# 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 partitions 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)     #拓展功能

优先掌握

n
p
d  # 删除一个已有的分区,保存退出后需要执行partprobe命令刷新一下分区表
w

fdisk创建分区

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

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

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

命令(输入 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 获取帮助):p

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux

命令(输入 m 获取帮助)

重复上述步骤,创建四个1G的主分区

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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504     8390655     1048576   83  Linux

此时虽然空间够用,但已经无法继续创建新的了

命令(输入 m 获取帮助):
命令(输入 m 获取帮助):n
If you want to create more than four partitions, you must replace a
primary partition with an extended partition first.

命令(输入 m 获取帮助)

删除主分区4,然后新建一个扩展分区,剩余空间都给他

命令(输入 m 获取帮助):d  # 删除主分区4
分区号 (1-4,默认 4)4
分区 4 已删除

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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux

命令(输入 m 获取帮助):n  # 新建扩展分区
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e  # 选择创建扩展分区
已选择分区 4
起始 扇区 (6293504-41943039,默认为 6293504):
将使用默认值 6293504
Last 扇区, +扇区 or +size{K,M,G} (6293504-41943039,默认为 41943039)# 直接回车,剩余空间都给它
将使用默认值 41943039
分区 4 已设置为 Extended 类型,大小设为 17 GiB

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

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

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504    41943039    17824768    5  Extended

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

可以查看一下

[root@egon ~]# lsblk /dev/sdb
...

三 GPT分区

新增一块2500G的盘,然后用GPT的方式格式化

# 需要安装命令
[root@egon ~]# yum install gdisk -y

[root@egon ~]# gdisk /dev/sdc
......
Command (? for help): m
b    back up GPT data to a file                            #将GPT数据备份到文件中

c    change a partition's name                            #更改分区的名称

d    delete a partition                                    #删除分区

i    show detailed information on a partition            #显示分区的详细信息

l    list known partition types                            #列出已知的分区类型

n    add a new partition                                    #添加一个新的分区

o    create a new empty GUID partition table (GPT)        #创建一个新的空GUID分区表(GPT)
p    print the partition table                            #打印分区表

q    quit without saving changes                            #没有保存更改就退出

r    recovery and transformation options (experts only)    #恢复和转换选项(仅限专家使用)
s    sort partitions                                        #年代分类分区

t    change a partition's type code                        #不要更改分区的类型代码

v    verify disk                                            #验证磁盘

w    write table to disk and exit                        #将表写入磁盘并退出

x    extra functionality (experts only)                    #额外功能(仅限专家使用)
?    print this menu                                        #打印菜单

优先掌握

n
p
d
w

gdisk创建分区

Command (? for help): n  # 新建
Partition number (1-128, default 1):  # 直接回车,默认分区号为1
First sector (34-5242879966, default = 2048) or {+-}size{KMGTP}: #直接回车,使用默认的起始位置
Last sector (2048-5242879966, default = 5242879966) or {+-}size{KMGTP}: +1G # 设定1G的空间
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): L  # 列出所有文件系统
......会看到一系列文件系统信息,默认的8300编号代表Linux filesystem,用它就好
Hex code or GUID (L to show codes, Enter = 8300):  # 直接回车用默认8300就好
Changed type of partition to 'Linux filesystem'

Command (? for help): p  # 打印查看
......
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem

Command (? for help): w  # 保存
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y  # 输入y保存
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

四 格式化制作文件系统与挂载

磁盘必须格式化制作文件系统,然后挂载才能使用

针对一块硬盘/dev/sdb

可以不分区,直接格式化制作文件系统

[root@egon ~]# mkfs.xfs /dev/sdb  # /dev/sdb整体就是一个分区

也可以基于mbr或者gpt分区方式分区完毕后,针对某一个分区比如/dev/sdb1制作文件系统

[root@egon ~]# mkfs.xfs /dev/sdb1

ps

centos7选择xfs格式作为默认文件系统,而且不再使用以前的ext,仍然支持ext4,xfs专为大数据产生,每个单个文件系统最大可以支持8eb,单个文件可以支持16tb,不仅数据量大,而且扩展性高。还可以通过xfsdump,xfsrestore来备份和恢复。

挂载与卸载:以/dev/sdb1为例演示

# 挂载
[root@egon ~]# mount /dev/sdb1 /opt/

# 卸载
umount /dev/sdb1 # 或者umount /opt

# 强制卸载
umount -l /dev/sdb1 # 或者umount -l /opt

思考问题:

  • 1、往目录/opt下新建的文件存到了哪里?

  • 2、卸载/opt后,数据是否存在?

  • 3、重新格式化/dev/sdb1后,数据是否依然存在?

    [root@localhost ~]# mkfs.xfs -f /dev/sdb1  # 强制重新格式化,需要加-f
    
  • 4、同一个分区/文件系统挂载到不同的文件夹下,数据的来源是否一致?

开启开机自动挂载

方式一:将挂载命令写入文件/etc/rc.local

注意:centos7下/etc/rc.local文件里配置的开机启动项不执行的解决办法

[root@egon ~]# ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 713 21:08 /etc/rc.local -> rc.d/rc.local
[root@egon ~]# ll /etc/rc.d/rc.local  # 没有执行权限,需要加上
-rw-r--r--. 1 root root 523 116 15:03 /etc/rc.d/rc.local
[root@egon ~]# chmod +x /etc/rc.d/rc.local 

方式二:编辑文件/etc/fstab

[root@egon ~]# sed -i '$a /dev/sdb1 /opt xfs defaults 0 0' /etc/fstab 
[root@egon ~]# tail -1 /etc/fstab 
/dev/sdb1 /opt xfs defaults 0 0

补充:磁盘挂载mount

-t 指定文件系统
-a 挂载/etc/fstab中配置的所有

[root@egon ~]# mount -t xfs /dev/sdb1 /db1

可以查看到文件系统的uuid并挂载
[root@egon ~]# blkid | grep sdb1
/dev/sdb1: UUID="10a939a8-d17c-4a0f-9a89-8066ac013855" TYPE="xfs" 
[root@egon ~]# mount UUID="10a939a8-d17c-4a0f-9a89-8066ac013855" /opt

建议配置文件/etc/fstab用uuid
[root@egon ~]# tail -1 /etc/fstab  # 编辑文件,新增一行
UUID="10a939a8-d17c-4a0f-9a89-8066ac013855" /opt xfs defaults 0 0
[root@egon ~]# mount -a  
[root@egon ~]# df  # 查看挂载情况

补充:/etc/fstab配置文件编写格式

要挂载的设备挂载点(入口)文件系统类型挂载参数是否备份是否检查
/dev/sdb1/dataxfsdefaults00

第一列:device:这里用来指定你要挂载的文件系统的设备名称或块信息,除了指定设备文件外,也可以使用UUID、LABEL来指定分区。

第二列:dir:指定挂载点的路径;

第三列:type:指定文件系统的类型,如ext3,ext4,xfs等;

第四列:options:指定挂载的参数,默认为defaults;

参数含义
async/sync是否同步方式运行,默认async(异步)。
user/nouser是否允许普通用户使用mount命令挂载,默认nouser。
exec/noexec是否允许可执行文件执行,默认exec。
suid/nosuid是否允许存在suid属性的文件,默认suid。
auto/noauto执行mount -a时,此文件系统是否被主动挂载,默认auto。
rw/ro是否只读或者读写模式进行挂载。默认rw。
defaults具有rw,suid,exec,auto,nouser,async等默认参数的设定。

第五列:dump:表示该挂载后的文件系统能否被dump备份命令作用;

选项含义
0代表不做备份。
1代表要每天进行备份操作。
2代表不定日期的进行备份操作。

第六列:pass:这里用来指定如何使用fsck来检查硬盘。

选项含义
0代表不检查
1检查,挂载点为 / 的(即根分区)时候,必须在这里填写1,其他的都不能填写1。
2检查 (当1级别检验完成之后进行2级别检验)

五 制作swap分区

查看

[root@localhost ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         186        1571           9         222        1600
Swap:          1023           0        1023

制作swap分区

[root@localhost ~]# fdisk /dev/sdb  # 分出一个1G的硬盘空间
[root@localhost ~]# mkswap /dev/sdb1  # 格式化为swap

激活swap分区

[root@localhost ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         185        1568           9         225        1601
Swap:          1023           0        1023
[root@localhost ~]# swapon /dev/sdb1  # 激活 
[root@localhost ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         186        1567           9         225        1600
Swap:          2047           0        2047

关闭swap分区

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         186        1567           9         225        1600
Swap:          2047           0        2047
[root@localhost ~]# swapon -s
文件名				类型		大小	已用	权限
/dev/sda2                              	partition	1048572	0	-2
/dev/sdb1                              	partition	1048572	0	-3
[root@localhost ~]# swapoff -a  # 关闭具体某一个用swapon /dev/sdb1 
[root@localhost ~]# swapon -s
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         185        1570           9         224        1601
Swap:             0           0           0

如果磁盘没有过多的分区可用,也可以通过文件增加SWAP空间,本质上还是磁盘

[root@localhost ~]# dd if=/dev/zero of=/swap_file bs=1M count=200
[root@localhost ~]# chmod 0600 /swap_file 
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         185        1364           9         430        1598
Swap:             0           0           0
[root@localhost ~]# mkswap -f /swap_file 
[root@localhost ~]# swapon /swap_file
[root@localhost ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         222        1300           9         458        1550
Swap:           199           0         199

开机自动挂载新增的swap分区

[root@localhost ~]# blkid | grep /dev/sdb1
/dev/sdb1: UUID="91d30c2d-2b43-40b1-b2b5-6f828c585f97" TYPE="swap" PARTUUID="d3b7649d-54aa-45eb-8bef-dccfe6915413" 
[root@localhost ~]# vim /etc/fstab 
[root@localhost ~]# tail -1 /etc/fstab 
UUID="91d30c2d-2b43-40b1-b2b5-6f828c585f97" swap                  swap    defaults        0 0

六 Dell R740服务器配置RAID5+1

https://www.cnblogs.com/linhaifeng/articles/13921161.html

七 修复服务器文件系统

在Linux系统中,为了增加系统性能,通常系统会将一些数据写先放在内存中,并不会直接将数据写入硬盘,这是因为内存速度要比硬盘快若干倍。但是有个问题,万一公司服务器突然断电或者其他未知原因,再次启动后,会造成文件系统错误:“emergency mode”

welcome to emergency mode!after logging intype “journalctl -xb” to view system logs,“systemctl reboot” to reboot ,“systemctl default” to try again to boot into default mode。
give root password for maintenance

执行任何命令都会有以下(或相似)错误

Error getting authority: Error initializing authority: Could not connect: No such file or directory (g-io-error-quark, 1)

查看运行日志,可以提示出损坏的文件系统

journalctl -xb

修复方式:

# 0、如果进入不了操作系统,可以进入单用户模式下操作

# 1、首先尝试mount和umount文件系统,以便重放日志,修复文件系统,如果不行,再进行如下操作。

# 2、执行xfs_repair -n,只检查不修复:检查文件系统是否损坏,如何损坏会列出将要执行的操作
[root@localhost ~]# xfs_repair -n /dev/sdb2
如果是日志和数据不一致了,xfs 默认会在挂载的时候修复这种不一致,操作系统给出的建议是以读写的方式挂载并自动修复,可以尝试以只读不修复方式挂载文件系统。
[root@localhost ~]# mount -o ro,norecovery /dev/sdb2 /opt

# 3、如果上述挂载不成功,可以执行xfs_repair修复文件系统
[root@localhost ~]# xfs_repair /dev/sdb2 

# 4、如果还不行,那最后方法只能采用"损失部分数据的修复方法"
根据打印消息,修复失败时:
先执行xfs_repair -L /dev/sdb2(清空日志,会丢失文件)
再执行xfs_repair /dev/sdb2

说明:-L是修复xfs文件系统的最后手段,慎重选择,它会清空日志,会丢失用户数据和文件。
备注:在执行xfs_repair操作前,最好使用xfs_metadump工具保存元数据,一旦修复失败,最起码可以恢复到修复之前的状态。

# 5、修复完成以后,尝试能不能正常挂载 ,如能,取消挂载,再启动就正常了

示例

# 1、准备一个1G的文件系统与数据
[root@localhost ~]# mount /dev/sdb1 /opt/
[root@localhost ~]# echo big_egon > /opt/1.txt

# 2、模拟文件系统损坏
[root@localhost ~]# dd if=/dev/zero of=/dev/sdb bs=500M count=1  # 直接干/dev/sdb而不是sdb1
记录了1+0 的读入
记录了1+0 的写出
524288000字节(524 MB)已复制,1.09433 秒,479 MB/[root@localhost ~]# # 此时看似一切都正常
[root@localhost ~]# cat /opt/1.txt 
big_egon
[root@localhost ~]# echo egon_nb > /opt/2.txt
[root@localhost ~]# cat /opt/2.txt 
egon_nb
[root@localhost ~]# # 但是重新挂载就会失效,即断电后系统重启,重新挂载不成功

[root@localhost ~]# umount /opt 
[root@localhost ~]# mount /dev/sdb1 /opt
mount: /dev/sdb1 写保护,将以只读方式挂载
mount: 未知的文件系统类型“(null)# 3、修复
[root@localhost ~]# xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
bad primary superblock - bad magic number !!!
。。。。。。
修复失败,无法挂载
[root@localhost ~]# mount /dev/sdb1 /opt/
mount:/dev/sdb1 挂载到 /opt 失败: 结构需要清理

[root@localhost ~]# xfs_repair -L /dev/sdb1  # 强制修复
[root@localhost ~]# mount /dev/sdb1 /opt/
[root@localhost ~]# ls /opt/  # 数据丢失,所以此时修复的意义在于可用,至于数据,你需要自己有备份意识
[root@localhost ~]# 

ps:如果是ext文件系统,修复需要用fsck命令

fsck -f -y /dev/sda1 

-y 对所有问题都回答 "yes"
-f 即使文件系统标记为 clean 也强制进行检查

八 xfs文件系统备份与恢复

命令与软件包

[root@localhost ~]# rpm -qf `which xfsdump`
xfsdump-3.1.7-1.el7.x86_64
[root@localhost ~]# rpm -qf `which xfsrestore`
xfsdump-3.1.7-1.el7.以上是关于Linux存储管理的主要内容,如果未能解决你的问题,请参考以下文章

如何将代码片段存储在 mongodb 中?

数据库系统原理 片段翻译

使用 Git 来管理 Xcode 中的代码片段

Linux 内核源代码分析 chap 2 存储管理

如何将 r ggplot 图存储为 html 代码片段

massCode 一款优秀的开源代码片段管理器