目录
1. 总结vim的三种模式切换,配置vimrc实现写脚本自动生成注释。
第一题 总结vim的三种模式切换,配置vimrc实现写脚本自动生成注释。
vim三种模式及常用指令
.vimrc配置方案
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件标题
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java,.txt文件,自动插入文件头
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java,*.txt exec ":call SetTitle()"
""定义函数SetTitle,自动插入文件头
func SetTitle()
"如果文件类型为.sh文件
if &filetype == 'sh'
call setline(1,"\#!/bin/bash")
call append(line("."), "\#")
call append(line(".")+1, "\# fileName: ".expand("%"))
call append(line(".")+2, "\# author: liAng")
call append(line(".")+3, "\# mail: angl6112@163.com")
call append(line(".")+4, "\# created: ".strftime("%c"))
call append(line(".")+5, "\# ")
call append(line(".")+6, "\### BEGIN INIT INFO")
call append(line(".")+7, "\# Description:")
call append(line(".")+8, "\#")
call append(line(".")+9, "\#")
call append(line(".")+10, "\### END INIT INFO")
call append(line(".")+11, "set -e #遇到命令错误停止执行")
call append(line(".")+12, "")
endif
endfunc
autocmd BufNewFile * normal G
"自动缩进
set autoindent
set cindent
"Tab键的宽度
set tabstop=4
"统一缩进为4
set softtabstop=4
set shiftwidth=4
"不要用空格代替制表符
set noexpandtab
"在行和段开始处使用制表符
set smarttab
"显示行号
set number
第二题 使用grep/sed实现获取/etc/sysconfig/network-script/ifcfg-eth0目录的/etc/sysconfig/network-script/。或获取目录的ifcfg-eth0
获取目录路径:
#1.grep实现
[root@rocky85 19:30:31] ~
-- # echo "/etc/sysconfig/network-script/ifcfg-eth0" | grep -oE "^/.*/"
/etc/sysconfig/network-script/
[root@rocky85 19:31:12] ~
#2.sed实现
[root@rocky85 19:31:34] ~
-- # echo "/etc/sysconfig/network-script/ifcfg-eth0" | sed -E 's/(.*\/).*/\1/g'
/etc/sysconfig/network-script/
[root@rocky85 19:31:37] ~
-- #
获取文件名:
# grep实现
[root@rocky85 19:35:50] ~
-- # echo "/etc/sysconfig/network-script/ifcfg-eth0" | grep -oE "ifcfg-.*"
ifcfg-eth0
[root@rocky85 19:36:54] ~
# sed实现
[root@rocky85 19:32:28] ~
-- # echo "/etc/sysconfig/network-script/ifcfg-eth0" | sed -E 's/.*\/(.*$)/\1/g'
ifcfg-eth0
[root@rocky85 19:32:49] ~
-- #
如果是以 / 结尾, 如 “/etc/sysconfig/network-script/” 取所在路径和目录名:
获取目录路径:
[root@node01 18:13:12] ~
-- # echo "/etc/sysconfig/network-script/" | grep -oE '/[a-z]+/[a-Z]+/' #这种方式有些耍赖, 但是想不出好的grep方法
/etc/sysconfig/
[root@node01 18:17:28] ~
-- # echo "/etc/sysconfig/network-script/" | sed -E 's#(.*/).*/#\1#'
/etc/sysconfig/
[root@node01 18:18:16] ~
-- #
获取目录名:
[root@node01 18:20:23] ~
-- # echo "/etc/sysconfig/network-script/" | grep -oE '[a-z]+-[a-Z]+' #没想到好办法
network-script
[root@node01 18:20:24] ~
-- # echo "/etc/sysconfig/network-script/" | sed -E 's#.*/(.*)/#\1#'
network-script
[root@node01 18:20:26] ~
-- #
第三题 完成编程题
题目要求:
①可以让用户选择当前主机的所有网卡,选中网卡后,获取ip,网段,掩码。
②通过ping命令检测在线的主机,打印在线的主机,写入一个文件中。
③ 当ip的结尾是奇数时,在目标主机或当前主机,批量添加user1到user100用户,否则添加group1到group100,并生成对应的用户user1到user100,让用户的过期时间在1天之后。
#!/bin/bash
#
# fileName: set.sh
# author: liAng
# mail: angl6112@163.com
# created: Fri 02 Dec 2022 16:10:57 PM CST
#
### BEGIN INIT INFO
# Description:
#
#
### END INIT INFO
set -e #cript execution will stop on erro
set -u #Disallow calls to undefined variables
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
SKYBLUE='\033[0;36m'
PLAIN='\033[0m'
ipFile="./survival.ip"
>$ipFile
# 网卡列表
netList=$(ifconfig | grep -oE '^ens[0-9]{3}')
cat <<EOF
网卡列表:
$netList
EOF
echo
read -p '请输入网卡名称: ' netcard
#netcard=ens160
# iP
ipaddr=$(ifconfig $netcard | sed -n '/^\s*inet /p' | sed -E 's/.*inet ([0-9]{3}.*)\s+ netmask.*/\1/')
# 掩码
netmask=$(ifconfig $netcard | sed -n '/^\s*inet /p' | sed -E 's/.*netmask ([0-9]{3}.*) \s+broadcast .*/\1/')
# 网段, 假设24位网段
network=$(sed -E 's/(.*)[0-9]{1,3}/\10/' <<<$ipaddr)
cat <<EOF
ip地址: $ipaddr
子网掩码: $netmask
网段: $network/$netmask
EOF
echo
echo -e "$RED正在检测在线主机, 请稍等...$PLAIN"
echo -e "$GREEN在线主机:$PLAIN"
# ping网段内的所有ip
for n in {1..2} # {1..254}
do
ip="$(sed -E 's/^(.*\.)[0-9]{1,3}$/\1/' <<<$network)$n"
ping -c 3 $ip &>/dev/null
if [ $? -eq 0 ];then
echo -e "$YELLOW$ip$PLAIN"
echo $ip >>$ipFile # 存活IP写入文件
fi
done
#明天的日期
tomorrow=$(date -d '+1 day' +%F)
# 添加账户, 改为检查本机的IP类型, 添加本机账户
n=$(sed -E 's/.*\.([0-9]{1,3}$)/\1/' <<<$ipaddr)
let "res=$n & 1"
echo -e "$GREEN开始添加账户, 请稍等...$PLAIN"
if [ "$res" -eq 1 ];then
# 奇数
echo user{1..10}|xargs -n1 useradd
else
# 偶数
echo group{1..10} | xargs -n1 groupadd
# 添加账户,指定主要组,并设置明天过期
seq 10 | xargs -i useradd -g group{} -e $tomorrow user{}
fi
echo -e "$GREEN账户添加完成.$PLAIN"
第四题 总结分区,格式化,挂载命令的使用。
1、分区
分区类型
共两种分区表: MBR 和 GPT
分区的大小=(结束扇区编号-起始扇区编号) x 扇区大小
MBR分区表
位于硬盘的第一个扇区, 共512byte; 前446byte为bootloader(引导系统使用), 末尾2byte为标识位, 剩余64byte用于存储分区信息;
每个分区信息需要占用16byte, 64/16=4, 所以最多只能存储4个分区的信息。其中每个分区的记录扇区数的区域只占32bit, 所以单个分区的最大容量就是: 2^32*512byte换算后为2T
而为了突破四个分区的限制, 通常将前三个分区划分为"主分区"正常存储数据使用, 将第四个分区划分为"拓展分区", 对应分区编号1-4, 然后在"拓展分区"中划分"逻辑分区" 分区编号从5开始, 使用逻辑分区存储数据, 在这16byte中可以存储多个逻辑分区, 最终是系统中的可用分区数不局限于4个。
GPT分区表
相比MBR, GPT最多可以划分128个分区, 并且每个分区中使用64bit记录扇区数, 使得每个分区的大小可以达到 2^64*512byte=8Z, 如果使用4K扇区其容量为 2^64*4K=64Z
需要注意的是, 在windows中 GPT分区表必须结合UEFI引导使用或者使用BIOS+MBR, 而在linux则没有限制。
管理分区
lsblk 列出块设备
添加硬盘后, 如果找不到设备手动触发设备扫描: echo '- - -' >/sys/class/scsi_host/host*/scan
MBR: fdisk 只能管理mbr分区
例如:
查看磁盘信息
fdisk -l /dev/sdb 查看磁盘信息
创建分区
删除分区
p 分区列表
t 更改分区类型
n 创建新分区
d 删除分区
v 校验分区
u 转换单位
w 保存并退出
q 不保存并退出
GPT: parted(适用于MBR和GPT)
#parted 非交互式, 也支持交互式
parted /dev/sdb mklabel gpt|msdos #先设置disklabel
parted /dev/sdb print # 打印设备信息
parted /dev/sdb mkpart primary 1 200 (默认M)#创建主分区, 大小1-200M
parted /dev/sdb rm 1 # 删除分区, /sdb1
parted -l 列出所有硬盘分区信息
gdisk: 类似fdisk的 GPT分区工具, 只管理 GPT
# 需要先安装
yum install gdisk -y
分区完成后, 如果lsblk识别不到新分区, 可能是因为内核中加载的是旧的分区表, 需要使用 partprobe 通知内核更新分区表。
二、格式化
格式化是创建文件系统的过程。硬盘只是存储数据的介质, 而数据怎么存则是由"文件系统"决定。
目前常见的文件系统:
- linux:
- ext4: 比较成熟的文件系统, 各种工具很丰富
- xfs: 相比ext4较新, 并且不支持缩容
- swap: 交换分区, 也是一种文件系统
- windoes:
- FAT32: linux也通用, 但是单个文件不能超过4G
- NTFS: linux无法识别, 可以通过一些插件在linux上使用
mkfs.ext4 创建ext4文件系统
mkfs.xfs 创建xfs的文件系统
mkswap /dev/sdb2
#创建ext4文件系统
[root@rocky85 22:14:25] ~
-- # mkfs.ext4 /dev/sdb1
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: done
Creating filesystem with 7864320 4k blocks and 1966080 inodes
Filesystem UUID: 49f06c9c-9eb3-4636-880d-329afb9f969c
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
#创建xfs文件系统
[root@rocky85 22:14:35] ~
-- # mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2 isize=512 agcount=4, agsize=1966080 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=7864320, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=3840, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.
#使用分区创建swap
[root@rocky85 22:14:44] ~
-- # mkswap /dev/sdb3
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=fdb1bd75-eadf-46d5-b6f4-7db93ff3143f
[root@rocky85 22:14:52] ~
-- #
#使用文件创建swap
[root@rocky85 22:18:12] ~
-- # dd if=/dev/zero of=/swapfile bs=1M count=1024 #先生成文件, 1G大小, swap也1G
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.570392 s, 1.9 GB/s
[root@rocky85 22:19:00] ~
-- # stat /swapfile
File: /swapfile
Size: 1073741824 Blocks: 2097152 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 28289 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2022-12-02 22:18:59.561873513 +0800
Modify: 2022-12-02 22:19:00.132875853 +0800
Change: 2022-12-02 22:19:00.132875853 +0800
Birth: 2022-12-02 22:18:59.561873513 +0800
[root@rocky85 22:19:07] ~
-- # mkswap /swapfile #将这个文件格式化为swap类型
mkswap: /swapfile: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=ef213315-931a-45ba-8040-db8a81e56e0b
[root@rocky85 22:20:26] ~
-- # chmod 600 /swapfile #swap文件权限设置为600
[root@rocky85 22:20:51] ~
查看文件系统信息:
# 关键参数
[root@rocky85 22:01:52] ~
-- # tune2fs -l /dev/sdb1
tune2fs 1.45.6 (20-Mar-2020)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 9692b610-7684-437a-83b6-43d3ffe29451 #uuid
Filesystem state: clean #文件系统正常
Inode count: 3276800 # inode的数量
Block count: 13107200 #block的数量
Reserved block count: 655360 #保留的block的数量, 供root应急使用
Free blocks: 12822642 #剩余的block的数量 x block_size=剩余空间
Free inodes: 3276789 #剩余的inode的数量
First block: 0
Block size: 4096 #block的大小, 单位KB, 通常4k
# dumpe2fs也可以
[root@rocky85 22:05:55] ~
-- # dumpe2fs -h /dev/sdb1
# 查看xfs文件系统信息
[root@rocky85 22:06:53] ~
-- # xfs_info /dev/sdb2
meta-data=/dev/sdb2 isize=512 agcount=4, agsize=3276736 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=13106944, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=6399, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@rocky85 22:06:58] ~
-- #
三、挂载
# 临时挂载硬盘分区
[root@rocky85 22:09:06] ~
-- # mount /dev/sdb1 /mnt/ #挂载分区
[root@rocky85 22:09:13] ~
-- # df | grep mnt
/dev/sdb1 51343840 53272 48652744 1% /mnt
[root@rocky85 22:09:23] ~
-- # mount /dev/sr0 /cdrom #挂载光盘
[root@rocky85 22:09:39] ~
-- #
# 挂载swap分区
[root@rocky85 22:22:30] ~
-- # swapon /dev/sdb3 #挂载分区类型的swap
[root@rocky85 22:23:13] ~
-- # swapon /swapfile #挂载文件类型的swap
[root@rocky85 22:23:27] ~
-- # swapon -s #查看已挂载的swap的设备号
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/dev/sdb3 partition 2097148 0 -3
/swapfile file 1048572 0 -4
[root@rocky85 22:23:31] ~
-- # free -hm #查看swap大小已扩容
total used free shared buff/cache available
Mem: 3.6Gi 326Mi 1.8Gi 16Mi 1.5Gi 3.1Gi
Swap: 5.0Gi 0B 5.0Gi
[root@rocky85 22:23:36] ~
-- #
# 永久挂载, 挂载信息写入持久化文件 /etc/fstab
[root@rocky85 22:30:55] ~
-- # cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Nov 9 20:36:19 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root / xfs defaults 0 0
UUID=4c761727-17ab-4b50-b4a7-38ad082671f8 /boot xfs defaults 0 0
/dev/mapper/rl-swap none swap defaults 0 0
# 0 0 不备份, 不检查
UUID=49f06c9c-9eb3-4636-880d-329afb9f969c /mnt ext4 defaults 0 0
UUID=b260dcf8-5c20-4797-ac8f-96f9cd1de5aa /data xfs defaults 0 0
# 分区类型的swap使用uuid挂载, 挂载点是none, 文件系统类型swap
UUID=7ac2e48c-4239-40d0-8d03-4dbdb3581140 none swap defaults 0 0
#文件类型的swap使用文件路径挂载
/swapfile none swap defaults 0 0
[root@rocky85 22:30:36] ~
-- # mount -a #使用mount -a 挂载fstab中的文件系统
[root@rocky85 22:30:38] ~
-- # df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 17M 1.8G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/rl-root 17G 3.2G 14G 19% /
/dev/nvme0n1p1 1014M 188M 827M 19% /boot
tmpfs 371M 0 371M 0% /run/user/0
/dev/sdb1 30G 45M 28G 1% /mnt
/dev/sdb2 30G 247M 30G 1% /data
[root@rocky85 22:30:41] ~
-- # free -mh
total used free shared buff/cache available
Mem: 3.6Gi 326Mi 1.8Gi 16Mi 1.5Gi 3.1Gi
Swap: 2.0Gi 0B 2.0Gi
[root@rocky85 22:30:45] ~
-- # swapon -a #swap需要使用swapon -a挂载
[root@rocky85 22:30:53] ~
-- # free -mh
total used free shared buff/cache available
Mem: 3.6Gi 329Mi 1.8Gi 16Mi 1.5Gi 3.1Gi
Swap: 5.0Gi 0B 5.0Gi
[root@rocky85 22:30:55] ~
-- #
# 卸载硬盘分区
[root@rocky85 22:11:08] ~
-- # umount /mnt
[root@rocky85 22:11:13] ~
-- # umount /data
# 卸载swap分区
[root@rocky85 22:25:44] ~
-- # swapon -s #查看已挂载的swap的设备号
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/dev/sdb3 partition 2097148 0 -3
/swapfile file 1048572 0 -4
[root@rocky85 22:25:47] ~
-- # swapoff /swapfile #按照设备号关闭swap
[root@rocky85 22:25:56] ~
-- # swapoff /dev/sdb3
[root@rocky85 22:26:05] ~
-- # free -mh
total used free shared buff/cache available
Mem: 3.6Gi 324Mi 1.8Gi 16Mi 1.5Gi 3.1Gi
Swap: 2.0Gi 0B 2.0Gi
[root@rocky85 22:26:45] ~
-- #
#注释/etc/fstab中的挂载信息
[root@rocky85 22:33:48] ~
-- # cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Nov 9 20:36:19 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root / xfs defaults 0 0
UUID=4c761727-17ab-4b50-b4a7-38ad082671f8 /boot xfs defaults 0 0
/dev/mapper/rl-swap none swap defaults 0 0
# 0 0 不备份, 不检查
#UUID=49f06c9c-9eb3-4636-880d-329afb9f969c /mnt ext4 defaults 0 0
#UUID=b260dcf8-5c20-4797-ac8f-96f9cd1de5aa /data xfs defaults 0 0
# 分区类型的swap使用uuid挂载, 挂载点是none, 文件系统类型swap
#UUID=7ac2e48c-4239-40d0-8d03-4dbdb3581140 none swap defaults 0 0
#文件类型的swap使用文件路径挂载
#/swapfile none swap defaults 0 0
[root@rocky85 22:33:50] ~
-- #
第五题 总结RAID特性,LVM特性。
raid:
raid是一种磁盘阵列技术, 将多块磁盘组合成一个磁盘阵列, 来提供磁盘冗余提升性能。
raid通常由"raid阵列卡"实现, 这是一种硬件设备称为硬raid, 这种实现稳定性高, 同时还附带"阵列卡缓存"提高读写性能。
其次还有"软raid"顾名思义就是通过"软件"模拟raid特性提供冗余提高性能, 多用于家用环境, 成本低。
raid级别:
raid有raid0, raid1, raid4, raid5, raid6, raid01, raid10, raid40, raid50, raid60
不同的raid级别需要使用不同数量的硬盘, 同时提供了不同的磁盘冗余和性能提升(有些raid会降低性能)
实现方式 | 最少磁盘 | 冗余数量 | 磁盘利用率 | 特点 | |
---|---|---|---|---|---|
raid0 | 数据分散在所有盘中, 共同读写 | 1 | 无 | n | 数据均匀分布同时读写性能高, 但是没有冗余, 任何一块盘损坏都会导致所有数据丢失。 单盘raid0, 表面看没有意义, 但是做了raid之后应该能蹭到"阵列卡缓存", 应该有些许性能提升。 |
raid1 | 两块盘互为镜像盘 | 2 | 1 | n/2 | 数据同时写入两块盘, 写性能些许降低, 读性能会有提升。 |
raid4 | 四块盘组成raid, 数据分散写入n-1块盘, 剩余一块盘专门存储校验位, 用于恢复任何一块盘的数据。 | 4 | 1 | (n-1)/n | 在兼顾冗余的同时, 提高了读写性能。 但是实践中发现, 单独的校验盘的故障率过高。 |
raid5 | 最少三快盘组成阵列, 数据写入时会同时计算出校验位(异或算法) 数据和校验位交叉存储在所有盘上 | 3 | 1 | (n-1)/n | 在兼顾冗余的同时, 提高了读写性能。 相比raid4, 它的校验位和数据时交叉存储的, 降低了硬盘的故障率, 同时需要的硬盘数量更少。 |
raid6 | 最少四块盘组成阵列, 数据写入时使用双份校验法, 存储两份校验数据。 数据和校验位交叉存储在所有盘上 | 4 | 2 | (n-2)/n | 读写性能提升 校验数据存储两份, 允许两块盘故障, 相应的校验算法更复杂。 |
raid01 | 先做最少两组raid0, 然后将这两组raid0 合并为raid1 | 4 | 2 | n/2 | 实现了更高的冗余, 提高了性能。但是故障盘必须在同一组raid0上才是2块冗余, 否则就是1 |
raid10 | 先做最少两组raid1, 然后将这两组raid1 合并为raid0 | 4 | 2 | n/2 | 实现了更高的冗余, 提高了性能。但是故障盘必须分散在不同组raid0上才是2块冗余, 否则就是1 对比raid01更常用。 |
raid50 | 先做最少两组raid5, 然后将这两组raid5 合并为raid0 | 6 | 2 | (n-2)/n | 较好的兼顾性能和冗余。造价高 |
raid60 | 先做最少两组raid6, 然后将这两组raid6 合并为raid0 | 8 | 4 | (n-4)/n | 极高的冗余, 特殊场景使用。造价高 |
图例:
lvm特性
lvm位于是物理磁盘和文件系统之间的一个逻辑层, 它屏蔽了下层磁盘的差异, 使得不同类型不同大小的磁盘组合成统一的"逻辑卷组", 在卷组之中划分"逻辑卷"每个逻辑卷对应着一个"文件系统"。
逻辑卷是一个抽象概念, 通过逻辑卷使文件系统不在局限在某个固定大小的磁盘分区上,可以实现文件系统动态扩缩容。
注意: xfs类型的文件系统因为其文件系统边缘不支持收缩, 因此每次缩容后都需要重新创建文件系统。 扩容不收影响。
第六题 lvm管理
①准备20G/30G的2个分区,生成VG,并创建10G的mylv;
# 先准备一个新的磁盘大小50G /dev/sdd
# 然后划分两个分区, /dev/sdd1 20G 和 /dev/sdd2 30G
[root@rocky85 14:00:07] ~
-- # vgcreate myvg /dev/sdd{1,2} #分区可以直接创建vg, 会自动创建pv
Physical volume "/dev/sdd1" successfully created.
Physical volume "/dev/sdd2" successfully created.
Volume group "myvg" successfully created
[root@rocky85 14:00:14] ~
-- # lvcreate -L 10G -n mylv myvg #划分一个10g的mylv
Logical volume "mylv" created.
[root@rocky85 14:00:34] ~
-- #
②基于LVM,将10G的LV格式化挂载分区到/data/mysql;
添加gentoo用户,指定家目录为/data/mysql,确保/data/mysql的权限是gentoo用户,并切换确保gentoo用户家目录正常,之后复制/etc/sysconfig到gentoo家目录。
[root@rocky85 14:00:34] ~
-- # mkfs.ext4 /dev/myvg/mylv #创建文件系统
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: done
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 70583b72-b0dd-4ecd-b37e-dea0c1ae96ef
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
[root@rocky85 14:02:26] ~
-- # mkdir /data/mysql #创建挂载点
[root@rocky85 14:03:25] ~
-- # grep mylv /etc/fstab #持久化挂载, 逻辑卷可以直接写名称
/dev/mapper/myvg-mylv /data/mysql ext4 defaults 0 0
[root@rocky85 14:03:33] ~
-- #
[root@rocky85 14:03:33] ~
-- # mount -a #挂载
[root@rocky85 14:06:17] ~
-- # df | grep mysql
/dev/mapper/myvg-mylv 10255636 36888 9678076 1% /data/mysql
[root@rocky85 14:06:22] ~
-- #
[root@rocky85 14:07:53] ~
-- # useradd -d /data/mysql gentoo #创建gentoo指定家目录
[root@rocky85 14:07:59] ~
-- # ll /data/mysql/ -d #gentoo家目录权限不正确
drwxr-xr-x. 3 root root 4096 Dec 3 14:02 /data/mysql/
[root@rocky85 14:08:30] ~
-- # chown -R gentoo.gentoo /data/mysql #调整gentoo家目录权限
[root@rocky85 14:08:56] ~
-- # su - gentoo #切换gentoo测试账户
[gentoo@rocky85 14:08:59] ~
-- $ ls
lost+found
[gentoo@rocky85 14:09:01] ~
-- $ pwd #验证家目录
/data/mysql
[gentoo@rocky85 14:09:06] ~
-- $ exit
logout
[root@rocky85 14:09:15] ~
-- # grep gentoo /etc/passwd #验证家目录
gentoo:x:1023:1024::/data/mysql:/bin/bash
[root@rocky85 14:10:43] ~ #拷贝测试目录
-- # cp -ar /etc/sysconfig /data/mysql/
[root@rocky85 14:11:23] ~
-- # ll /data/mysql/
total 4
drwxr-xr-x. 5 root root 4096 Nov 18 10:39 sysconfig
[root@rocky85 14:12:26] ~
-- #
③此时扩容mylv到20G,确保数据不丢失。
[root@rocky85 14:14:52] ~
-- # vgdisplay myvg #查看vg空间是否足够
--- Volume group ---
VG Name myvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 49.99 GiB
PE Size 4.00 MiB
Total PE 12798
Alloc PE / Size 2560 / 10.00 GiB
Free PE / Size 10238 / 39.99 GiB #足够扩容10G
VG UUID XTRupm-O2YJ-60Hh-xILU-GCCV-WfGE-eX8ynL
[root@rocky85 14:15:14] ~ #-L 调整到20G, 也可以加-r 自动调整文件系统
-- # lvextend -L 20G -n /dev/myvg/mylv
Size of logical volume myvg/mylv changed from 10.00 GiB (2560 extents) to 20.00 GiB (5120 extents).
Logical volume myvg/mylv successfully resized.
[root@rocky85 14:15:48] ~
-- # resize2fs /dev/myvg/mylv #ext4文件系统, 手动调整文件系统边缘
resize2fs 1.45.6 (20-Mar-2020)
Filesystem at /dev/myvg/mylv is mounted on /data/mysql; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/myvg/mylv is now 5242880 (4k) blocks long.
[root@rocky85 14:16:11] ~
-- # df -h | grep mylv #检查已扩容到20G
/dev/mapper/myvg-mylv 20G 45M 19G 1% /data/mysql
[root@rocky85 14:16:43] ~
-- #
[root@rocky85 14:19:57] /data/mysql/sysconfig
-- # du -sh /data/mysql/sysconfig/ #检查文件
112K /data/mysql/sysconfig/
[root@rocky85 14:20:08] /data/mysql/sysconfig
-- #
④缩容mylv到5G确保数据不丢失。
[root@rocky85 14:27:42] ~
-- # umount /data/mysql #先卸载分区
[root@rocky85 14:27:51] ~
-- # e2fsck -f /dev/myvg/mylv #执行文件系统检查
e2fsck 1.45.6 (20-Mar-2020)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/myvg/mylv: 41/1310720 files (0.0% non-contiguous), 126350/5242880 blocks
[root@rocky85 14:28:03] ~
-- # resize2fs /dev/myvg/mylv 5G #按照缩容后的空间调整文件系统边缘, 调整后最好挂载查看下空间和数据
resize2fs 1.45.6 (20-Mar-2020)
Resizing the filesystem on /dev/myvg/mylv to 1310720 (4k) blocks.
The filesystem on /dev/myvg/mylv is now 1310720 (4k) blocks long.
[root@rocky85 14:29:34] ~
-- # lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv myvg -wi-a----- 20.00g #逻辑卷还是20G
root rl -wi-ao---- <17.00g
swap rl -wi-ao---- 2.00g
[root@rocky85 14:29:46] ~
-- # lvreduce -L 5G /dev/myvg/mylv #逻辑卷缩减到5G
WARNING: Reducing active logical volume to 5.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv? [y/n]: y
Size of logical volume myvg/mylv changed from 20.00 GiB (5120 extents) to 5.00 GiB (1280 extents).
Logical volume myvg/mylv successfully resized.
[root@rocky85 14:30:13] ~
-- # lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv myvg -wi-ao---- 5.00g #逻辑卷已缩减
root rl -wi-ao---- <17.00g
swap rl -wi-ao---- 2.00g
[root@rocky85 14:30:29] ~
-- # mount -a #挂载检查
[root@rocky85 14:30:32] ~
-- # df -h | grep mylv
/dev/mapper/myvg-mylv 4.8G 33M 4.5G 1% /data/mysql
[root@rocky85 14:30:44] ~
-- # du -sh /data/mysql/sysconfig/
112K /data/mysql/sysconfig/
[root@rocky85 14:30:55] ~
-- #
⑤基于mylv生成快照,修改或删除原卷中的数据,基于快照卷还原数据。
[root@rocky85 14:30:44] ~
-- # du -sh /data/mysql/sysconfig/
112K /data/mysql/sysconfig/
[root@rocky85 14:37:13] ~
-- # lvcreate -L 5G -s -n mylv-snapshot /dev/myvg/mylv #创建快照 -p r创建只读快照
Logical volume "mylv-snapshot" created.
[root@rocky85 14:38:20] ~
-- # mkdir /data/mysql-bak
[root@rocky85 14:38:30] ~
-- # mount /dev/myvg/mylv-snapshot /data/mysql-bak/ #挂载快照, 检查快照功能
[root@rocky85 14:38:54] ~
-- # du -sh /data/mysql-bak/sysconfig/
112K /data/mysql-bak/sysconfig/
[root@rocky85 14:38:58] ~
-- #
[root@rocky85 14:38:59] ~
-- # rm -rf /data/mysql/sysconfig/ #删除原逻辑卷文件
[root@rocky85 14:39:11] ~
-- # du -sh /data/mysql-bak/sysconfig/ #快照不受影响
112K /data/mysql-bak/sysconfig/
[root@rocky85 14:39:15] ~
-- # du -sh /data/mysql/sysconfig/
du: cannot access '/data/mysql/sysconfig/': No such file or directory
[root@rocky85 14:39:22] ~
-- #
#还原快照
[root@rocky85 15:41:37] ~
-- # umount /data/mysql #先卸载分区
[root@rocky85 15:41:43] ~
-- # umount /data/mysql-bak
[root@rocky85 15:41:45] ~
-- # lvconvert --merge /dev/myvg/mylv-snapshot #还原快照
Merging of volume myvg/mylv-snapshot started.
myvg/mylv: Merged: 100.00%
[root@rocky85 15:42:18] ~
-- #
[root@rocky85 15:42:18] ~
-- # mount /dev/myvg/mylv /data/mysql #文件恢复
[root@rocky85 15:42:42] ~
-- # du -sh /data/mysql/sysconfig/
112K /data/mysql/sysconfig/
[root@rocky85 15:42:53] ~
[root@rocky85 15:43:13] ~ #原来的快照自动删除了
-- # lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv myvg -wi-ao---- 5.00g
root rl -wi-ao---- <17.00g
swap rl -wi-ao---- 2.00g
[root@rocky85 15:43:16] ~
-- #