1、创建一个10G分区,并格式为ext4文件系统;
(1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;
(2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳;
1、创建分区;
使用fdisk命令在磁盘/dev/sdb上创建分区,过程如下:
2、格式化分区;
使用mke2fs命令将/dev/sdb1格式为ext4文件系统:
mke2fs命令选项说明:
-t:指定文件系统;
-b:指定磁盘块大小,单位为字节;
-m:指定为管理人员预留的空间占据的百分比;为避免空间耗尽导致管理操作(mv、cp等)无法完成,可使用该参数指定一定比例的预留空间,默认5%;
-L:指定卷标;
CentOS7中格式化分区时默认已经包含acl挂载选项,可通过tune2fs -l命令进行查看,如下:
如果不包含,可通过tune2fs命令选项来修改默认的挂载属性,如下:
tune2fs -o {FEATURE|^FEATURE}
FEATURE:启用默认属性
^FEATURE:禁用默认属性
3、挂载文件系统
使用mount命令挂载文件系统,过程如下:
1).创建文件系统挂载目录,即挂载点;
2).使用mount命令进行挂载,并使用-o来启用或禁用文件系统选项;
mount文件系统选项说明:
noexec: 不允许文件系统上的文件运行为进程,即使文件有执行权限;
noatime:在访问文件或目录时不更新其访问时间戳,以减少磁盘I/O;
3).验证;
2、创建一个大小为1G的swap分区,并创建好文件系统,并启用之;
1). 使用free命令查看下当前的swap空间大小:
2). 使用fdisk命令创建一个分区,并修改该分区ID为82(82为swap文件系统的ID,默认为83):
使用partx命令通知kernel重读磁盘分区表,选项说明如下:
-a: 通知kernel添加制定或全部分区
-v: verbose,显示详细信息
-s: 列出分区
3). 使用mkswap命令将分区格式化为swap文件系统:
4). 使用swapon命令激活swap交换分区:
swapon命令常用选项说明:
-a: 激活所有的交换分区;
-v: verbose,显示详细信息;
-s, --summary: 显示摘要信息;
-p, --priority <prio>: 指定交换分区设备的优先级;
5). 验证:
可使用swapon -s或free -m命令验证结果。
3、写一个脚本
(1)、获取并列出当前系统上的所有磁盘设备;
#!/bin/bash#echo "$(fdisk -l /dev/[sh]d[a-z] | grep -o '^Disk /dev/[sh]d[a-z]')"
结果:
(2)、显示每个磁盘设备上每个分区相关的空间使用信息;
#!/bin/bash#diskDev=$(fdisk -l /dev/[sh]d[a-z] | grep -o '^/dev/[sh]d[a-z][[:digit:]]')for i in $diskDevdo echo "$(fdisk -l $i)\n"done
结果:
4、总结RAID的各个级别及其组合方式和性能的不同;
常用RAID级别及说明如下表:
RAID级别 | 描述 | 性能 | 冗余 | 可用空间 | 最少磁盘数 |
RAID-0 | 被称为条带卷(strip);将多块磁盘并行组织起来,将数据条带化后切割为多段(chunk),平均同时存往各磁盘,读取数据时也从多块磁盘读取数据后再在RAID控制器的组织下组合为完整的数据; | 读、写性能均有提升 | 无容错能力,且风险率会随磁盘个数的增加而增长 | N*min(S1,S2,...) 磁盘个数*最小磁盘可用空间 | 2 |
RAID-1 | 被称为镜像卷(mirror);将多块磁盘并行组织起来,数据chunk在多块磁盘各写一份,读取时分别从各磁盘读取; | 读性能提升,写性能略有下降 | 有 | 1*min(S1,S2,…) 由最小可用空间的磁盘决定 | 2 |
RAID-4 不常用 | 磁盘分两类,一类用来存储数据,另一类用来存储校验码(数据磁盘的异或值)。校验码磁盘至少有一块,数据chunk以条带方式存储到各数据磁盘上,同时计算出数据的异或值并存储于校验磁盘; | 读写性能有提升,但更换磁盘后数据恢复时校验盘会成为瓶颈 | 有,允许坏1块磁盘 | (N-1)*min(S1,S2,…) 数据磁盘个数*最小磁盘的可用空间 | 3 |
RAID-5 | 与RAID-4类似,不同之处为各磁盘轮流作为校验磁盘; | 读、写性能均有提升 | 有,允许坏1块磁盘 | (N-1)*min(S1,S2,…) 数据磁盘个数*最小磁盘的可用空间 | |
RAID-6 不常用 | 与RAID-5类似,不同之处为同时由2块磁盘轮流作为校验盘; | 读、写性能均有提升 | 有,允许坏2块磁盘 | (N-2)*min(S1,S2,…) | 4 |
RAID-10 | 多块磁盘先组织为RAID-1,再将多组磁盘镜像组织为RAID-0,即先镜像再条带; | 读、写性能均有提升 | 有,每组镜像最多同时只能坏一块 | N*min(S1,S2,...)/2 所有最小磁盘空间数量的一半 | 4 |
RAID-01 不常用 | 与RAID-10相反,多块磁盘先组织为条带,多组磁盘条带再组织为镜像; | 读、写性能均有提升 | 有,同时只能有一个条带组出现故障,哪怕整个条带组的所有磁盘都出故障; | N*min(S1,S2,...)/2 所有最小磁盘空间数量的一半 | 4 |
JBOD | 将多块磁盘的可用空间串行组织为一个大的连续空间; | 无 | 无容错能力,且风险率会随磁盘个数的增加而增长 | sum(S1,S2,…) | N |
5、创建一个大小为10G的RAID1,要求有一个空闲盘,而且CHUNK大小为128k;
1). 创建三个大小为10G的分区,用来模拟三块磁盘(RAID-1至少需要2块磁盘,1块用来模拟空闲盘):
通知kernel重读磁盘分区表:
2). 创建RAID:
Linux下的软RAID是通过kernel的md模块来实现的,mdadm命令为kernel的md模块的管理命令,其常用选项及相关参数如下:
语法格式:mdadm [mode] <raiddevice> [options] <component-devices>
模式:
创建:-C
-n #: 使用#个块设备来创建此RAID;
-l #:指明要创建的RAID的级别,mdadm支持的RAID级别:LINEAR, RAID0, RAID1, RAID4, RAID5, RAID6, RAID10;;
-a {yes|no}:自动创建目标RAID设备的设备文件;
-c CHUNK_SIZE: 指明块大小;
-x #: 指明空闲盘的个数;
装配: -A
监控: -F
管理:
-f:将磁盘人工标记为损坏(faulty)
-r:将块设备从RAID卷中移除
-a:向RAID卷中添加块设备
-S, --stop:拆除RAID卷,释放所有块设备
# mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 -c 128 /dev/sdb{1,2,3}
检查RAID设备状态,带有冗余功能的RAID在创建后需要做按位对齐,使得某磁盘在损坏后可以恢复:
检查命令: mdadm -D 或 cat /proc/mdstat
对齐成功后:
3). 使用RAID:
(1).格式化。将/dev/md0格式化为ext4文件系统,并指明卷标为“MD0”:
(2).挂载。将/dev/md0挂载至/mydata,并检查挂载状态:
4). 模拟磁盘故障:
将/dev/sdb1人工标记为故障,来模拟磁盘错误,并观察空闲磁块的状态:
卸载故障磁盘:
向RAID卷中添加块设备/dev/sdb1:
5). 拆除RAID卷:
拆除RAID前需先卸载该RAID:
6、创建一个大小为4G的RAID5设备,chunk大小为256k,格式化ext4文件系统,要求可开机自动挂载至/backup目录,而且不更新访问时间戳,且支持acl功能;
1). 创建四个大小为4G的分区(/dev/sdb{5,6,7,8}),用来模拟组建RAID卷的磁盘设备,其三个作为数据盘,一个作为空闲盘:
2). 创建RAID-5,chunk为256K:
3). 格式化RAID设备为ext4文件系统,指明卷标,并检查默认挂载属性:
4). 修改/etc/fstab文件:
/etc/fstab文件中增加一行,使用卷标自动挂载RAID设备,并使用noatime参数。如下:
LABEL=MD0 /mydata ext4 defaults,noatime,acl 0 0
运行以下命令,根据/etc/fstab挂载设备:
# mount -a
5). 查看挂载状态:
7、写一个脚本
(1) 接受一个以上文件路径作为参数;
(2) 显示每个文件拥有的行数;
(3) 总结说明本次共为几个文件统计了其行数;
#!/bin/bash#if [ $# -eq 0 ];then echo "Parameters cannot be empty!" exit 1fifileCount=0for i in $@do if [ -f $i ] then linecount=($(wc -l $i)) echo "$i has $linecount lines." let fileCount++ else echo "$i not be regular file!" fidoneecho -e "Counted files: $fileCount \n"
结果:
8、写一个脚本
(1) 传递两个以上字符串当作用户名;
(2) 创建这些用户;且密码同用户名;
(3) 总结说明共创建了几个用户;
#/bin/bash#if [ ! $UID -eq 0 ]then echo "Please login root." exit 1fiif [ $# -eq 0 ]then echo -e "Parameters cannot be empty!\n"fiuserCount=0for user in $@do if id $user &> /dev/null then echo "$user already exists." else useradd $user [ $? -eq 0 ] && echo "$user" | passwd --stdin $user > /dev/null || echo -e "$user not created!\n" echo "$user to create success!" let userCount++ fidoneecho -e "Total of created user: $userCount\n"
结果:
9、写一个脚本,新建20个用户,visitor1-visitor20;计算他们的ID之和;
#/bin/bash#declare -i userNum=1declare -i sumUID=0while [ $userNum -le 20 ] ; do if id visitor$userNum &> /dev/null ; then echo "visitor$userNum already existing!" else useradd visitor$userNum &> /dev/null && echo "visitor$userNum" | passwd --stdin visitor$userNum &> /dev/null [ $? -eq 0 ] && echo "visitor$userNum created successfully." || echo "visitor$userNum Chris create failure!" fi echo "visitor$userNum UID is: $(id -u visitor$userNum)" let sumUID+=$(id -u visitor$userNum) let userNum++doneecho "The sum of the UID: $sumUID"
结果:
10、写一脚本,分别统计/etc/rc.d/rc.sysinit、/etc/rc.d/init.d/functions和/etc/fstab文件中以#号开头的行数之和,以及总的空白行数;
#/bin/bash#declare -i sum1=0 # Sum for # linesdeclare -i sum2=0 # Sum for null linesfor file in $@; do if [ -f $file ]; then s1=$(grep '^#' $file | wc -l) s2=$(grep '^$' $file | wc -l) echo "$file # lines: $s1" echo "$file null lines: $s2" sum1+=s1 sum2+=s2 else echo "$file not found or not text file!" fidoneecho -e "\nTotal # lines: $sum1"echo "Total null lines: $sum2"
结果:
11、写一个脚本,显示当前系统上所有默认shell为bash的用户的用户名、UID以及此类所有用户的UID之和;
#!/bin/bash#userList=$(grep '\/bin\/bash$' /etc/passwd)declare -i sumUID=0for user in $userList ; do userName=$(echo $user | cut -d: -f1) uid=$(echo $user | cut -d: -f3) echo -e "User: $userName\tUID: $uid" let sumUID+=$uiddoneecho "Sum UID: $sumUID"
结果:
12、写一个脚本,显示当前系统上所有,拥有附加组的用户的用户名;并说明共有多少个此类用户;
#!/bin/bash#allUsername=$(cut -d: -f1 /etc/passwd)declare -i sumSG=0echo 'There are supplementary groups of user: 'for user in $allUsername; do if id $user | grep ',' &> /dev/null ; then echo -n "$user " let sumSG++ fidoneecho -e "\nSum users: $sumSG"
结果:
13、创建一个由至少两个物理卷组成的大小为20G的卷组;要求,PE大小为8M;而在卷组中创建一个大小为5G的逻辑卷mylv1,格式化为ext4文件系统,开机自动挂载至/users目录,支持acl;
1). 创建磁盘块。创建/dev/sdb{1,2,3}并调整分区ID为8e,用来模拟构成PV的磁盘块:
2). 创建PV;
使用pvcreate命令创建PV,使用pvs命令显示pv列表:
3). 创建VG;
创建vg命令:vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
-s: 指定PE的大小
显示vg详情:vgdisplay [VolumeGroupName]
4). 创建LV;
LV创建命令:lvcreate -L #[mMgGtT] -n NAME VolumeGroup
-L: 指定LV的大小;
-n: 批定LV的名称;
LV查看命令:lvdisplay [-a|--all] [-v|--verbose] [VolumeGroupName|LogicalVolume{Name|Path} ...]
创建大小为5G的逻辑卷mylv1:
5). 格式化LV,并检查默认挂载选项;
将/dev/mapper/myvg-mylv1格式化为ext4文件系统:
6). 创建/users挂载点,修改/etc/fstab使LV自动挂载,并启用acl功能:
# mkdir -v /usersmkdir: created directory ‘/users’# blkid /dev/mapper/myvg-mylv1 /dev/mapper/myvg-mylv1: UUID="18c0e102-3072-4b5f-96c8-6c914169ae71" TYPE="ext4"# vim /etc/fstabUUID=18c0e102-3072-4b5f-96c8-6c914169ae71 /users ext4 defaults,acl 0 0 #在/etc/fstab文件中添加该行# mount -a
结果:
14、新建用户magedu;其家目录为/users/magedu,而后su切换至此用户,复制多个文件至家目录;
[root@C1 ~]# useradd -d /users/magedu magedu[root@C1 ~]# su - magedu[magedu@C1 ~]$ pwd/users/magedu[magedu@C1 ~]$ cp /etc/fstab /etc/hosts .
15、扩展mylv1至9G,确保扩展完成后原有数据完全可用;
扩展LV分区需要两步:
1). 使用lvextend命令扩展LV;
# lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
2). 使用resize2fs命令扩展逻辑卷上的文件系统,当不指定[NEW_SIZE]时代表扩展至最大;
# resize2fs /dev/VG_NAME/LV_NAME [NEW_SIZE]
检查源数据是否可用:
16、缩减mylv1至7G,确保缩减完成后原有数据完全可用;
收缩LV需经过以下步骤:
1). 卸载文件。收缩LV不允许在线运行;
2). 收缩前强制检查LV;
3). 收缩LV前需使用resize2fs命令收缩LV上的文件系统。注意:必须保证收缩后的空间可以存下该LV下的所有数据;
4). 使用lvreduce命令收缩LV至指定大小,空间大小的指定也可使用相对值,如:-2G;
5). 收缩LV后重新挂载该LV;
6). 检查数据是否可用;
过程如下:
17、对mylv1创建快照,并通过备份数据;要求保留原有的属主属组等信息;
LV快照说明:
对LV创建的快照可以保存LV在某一核的所有信息,包换状态信息和数据;
快照的大小可以于LV相同也可不同,这取决于快照的使用期限,当对LV创建快照时相当于创建了一个LV上元数据的监听器,当LV上数据更新时会首先将LV中的数据复制一份到快照后再对LV上的数据进行修改,在读取数据时会先检查快照中是否有数据,有则读取,没有则会读取与之对应的LV上的数据,此时快照相当于LV的另一个入口;
LV和与之对应的快照必须在同一个卷组(VG)中;
LV的快照可以单独挂载;
LV快照创建命令:
lvcreate -s -L #[mMgGtT] -p r -n snapshot_lv_name original_lv_name
-s|--snapshot: 指明创建快照;
-L|--size: 指定快照大小;
-p|--permission {r|rw}: 指定快照是否可写,通常快照为只读;
-n|--name SnapshotLogicalVolume{Name|Path}: 指定快照名;
对mylv1创建快照并检查快照信息:
查看LV上的元数据信息,修改后再与快照上同文件元数据对比: