Linux作业7
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/d | grep -o '^Disk /dev/d')" 结果:
(2)、显示每个磁盘设备上每个分区相关的空间使用信息;
#!/bin/bash
#
diskDev=$(fdisk -l /dev/d | grep -o '^/dev/d[[:digit:]]')
for i in $diskDev
do
echo "$(fdisk -l $i)\n"
done 结果:
4、总结RAID的各个级别及其组合方式和性能的不同;
常用RAID级别及说明如下表:
RAID级别描述性能冗余可用空间最少磁盘数RAID-0被称为条带卷(strip);将多块磁盘并行组织起来,将数据条带化后切割为多段(chunk),平均同时存往各磁盘,读取数据时也从多块磁盘读取数据后再在RAID控制器的组织下组合为完整的数据;读、写性能均有提升无容错能力,且风险率会随磁盘个数的增加而增长N*min(S1,S2,...)
磁盘个数*最小磁盘可用空间2RAID-1被称为镜像卷(mirror);将多块磁盘并行组织起来,数据chunk在多块磁盘各写一份,读取时分别从各磁盘读取;读性能提升,写性能略有下降有1*min(S1,S2,…)
由最小可用空间的磁盘决定2RAID-4
不常用磁盘分两类,一类用来存储数据,另一类用来存储校验码(数据磁盘的异或值)。校验码磁盘至少有一块,数据chunk以条带方式存储到各数据磁盘上,同时计算出数据的异或值并存储于校验磁盘;读写性能有提升,但更换磁盘后数据恢复时校验盘会成为瓶颈有,允许坏1块磁盘(N-1)*min(S1,S2,…)
数据磁盘个数*最小磁盘的可用空间3RAID-5与RAID-4类似,不同之处为各磁盘轮流作为校验磁盘;读、写性能均有提升有,允许坏1块磁盘(N-1)*min(S1,S2,…)
数据磁盘个数*最小磁盘的可用空间
RAID-6
不常用与RAID-5类似,不同之处为同时由2块磁盘轮流作为校验盘;读、写性能均有提升有,允许坏2块磁盘(N-2)*min(S1,S2,…)4RAID-10多块磁盘先组织为RAID-1,再将多组磁盘镜像组织为RAID-0,即先镜像再条带;读、写性能均有提升有,每组镜像最多同时只能坏一块N*min(S1,S2,...)/2
所有最小磁盘空间数量的一半4RAID-01
不常用与RAID-10相反,多块磁盘先组织为条带,多组磁盘条带再组织为镜像;读、写性能均有提升有,同时只能有一个条带组出现故障,哪怕整个条带组的所有磁盘都出故障;N*min(S1,S2,...)/2
所有最小磁盘空间数量的一半4JBOD将多块磁盘的可用空间串行组织为一个大的连续空间;无无容错能力,且风险率会随磁盘个数的增加而增长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 <raiddevice> <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 1
fi
fileCount=0
for 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!"
fi
done
echo -e "Counted files: $fileCount \n" 结果:
8、写一个脚本
(1) 传递两个以上字符串当作用户名;
(2) 创建这些用户;且密码同用户名;
(3) 总结说明共创建了几个用户;
#/bin/bash
#
if [ ! $UID -eq 0 ]
then
echo "Please login root."
exit 1
fi
if [ $# -eq 0 ]
then
echo -e "Parameters cannot be empty!\n"
fi
userCount=0
for 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++
fi
done
echo -e "Total of created user: $userCount\n" 结果:
9、写一个脚本,新建20个用户,visitor1-visitor20;计算他们的ID之和;
#/bin/bash
#
declare -i userNum=1
declare -i sumUID=0
while [ $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++
done
echo "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 # lines
declare -i sum2=0# Sum for null lines
for 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!"
fi
done
echo -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=0
for user in $userList ; do
userName=$(echo $user | cut -d: -f1)
uid=$(echo $user | cut -d: -f3)
echo -e "User: $userName\tUID: $uid"
let sumUID+=$uid
done
echo "Sum UID: $sumUID" 结果:
12、写一个脚本,显示当前系统上所有,拥有附加组的用户的用户名;并说明共有多少个此类用户;
#!/bin/bash
#
allUsername=$(cut -d: -f1 /etc/passwd)
declare -i sumSG=0
echo 'There are supplementary groups of user: '
for user in $allUsername; do
if id $user | grep ',' &> /dev/null ; then
echo -n "$user "
let sumSG++
fi
done
echo -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 #] VolumeGroupNamePhysicalDevicePath
-s: 指定PE的大小
显示vg详情:vgdisplay
4). 创建LV;
LV创建命令:lvcreate -L # -n NAME VolumeGroup
-L: 指定LV的大小;
-n: 批定LV的名称;
LV查看命令:lvdisplay[-a|--all][-v|--verbose]
创建大小为5G的逻辑卷mylv1:
5). 格式化LV,并检查默认挂载选项;
将/dev/mapper/myvg-mylv1格式化为ext4文件系统:
6). 创建/users挂载点,修改/etc/fstab使LV自动挂载,并启用acl功能:
# mkdir -v /users
mkdir: created directory ‘/users’
# blkid /dev/mapper/myvg-mylv1
/dev/mapper/myvg-mylv1: UUID="18c0e102-3072-4b5f-96c8-6c914169ae71" TYPE="ext4"
# vim /etc/fstab
UUID=18c0e102-3072-4b5f-96c8-6c914169ae71 /usersext4 defaults,acl 0 0 #在/etc/fstab文件中添加该行
# mount -a 结果:
14、新建用户magedu;其家目录为/users/magedu,而后su切换至此用户,复制多个文件至家目录;
# useradd -d /users/magedu magedu
# su - magedu
$ pwd
/users/magedu
$ cp /etc/fstab /etc/hosts .
15、扩展mylv1至9G,确保扩展完成后原有数据完全可用;
扩展LV分区需要两步:
1). 使用lvextend命令扩展LV;
# lvextend -L [+]# /dev/VG_NAME/LV_NAME
2). 使用resize2fs命令扩展逻辑卷上的文件系统,当不指定时代表扩展至最大;
# resize2fs /dev/VG_NAME/LV_NAME
检查源数据是否可用:
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 # -p r -n snapshot_lv_name original_lv_name
-s|--snapshot: 指明创建快照;
-L|--size: 指定快照大小;
-p|--permission{r|rw}: 指定快照是否可写,通常快照为只读;
-n|--name SnapshotLogicalVolume{Name|Path}: 指定快照名;
对mylv1创建快照并检查快照信息:
查看LV上的元数据信息,修改后再与快照上同文件元数据对比:
页:
[1]