1、创建一个10G分区,并格式为ext4文件系统;

   (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;

   (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳;

    1、创建分区;

    使用fdisk命令在磁盘/dev/sdb上创建分区,过程如下:

    wKiom1fXpwvSDnjSAAFYnce2uPQ167.png


    2、格式化分区;

    使用mke2fs命令将/dev/sdb1格式为ext4文件系统:

    mke2fs命令选项说明:

        -t:指定文件系统;

      -b:指定磁盘块大小,单位为字节;

      -m:指定为管理人员预留的空间占据的百分比;为避免空间耗尽导致管理操作(mv、cp等)无法完成,可使用该参数指定一定比例的预留空间,默认5%;

      -L:指定卷标;

    wKiom1fXujbgSIkVAACmUfWZD6k345.png


    CentOS7中格式化分区时默认已经包含acl挂载选项,可通过tune2fs -l命令进行查看,如下:

    wKiom1fXvVuyOX81AAGE0duk4RI706.png

    如果不包含,可通过tune2fs命令选项来修改默认的挂载属性,如下:

    tune2fs -o {FEATURE|^FEATURE}

      FEATURE:启用默认属性

      ^FEATURE:禁用默认属性

    wKioL1fXvvewbSjvAADwvuc3U6k896.png

   

    3、挂载文件系统

    使用mount命令挂载文件系统,过程如下:

    1).创建文件系统挂载目录,即挂载点;

    2).使用mount命令进行挂载,并使用-o来启用或禁用文件系统选项;

        mount文件系统选项说明:

        noexec: 不允许文件系统上的文件运行为进程,即使文件有执行权限;

        noatime:在访问文件或目录时不更新其访问时间戳,以减少磁盘I/O; 

    3).验证;   

    wKiom1fXzRGiG9neAAA8KxGUw5A528.png

    

2、创建一个大小为1G的swap分区,并创建好文件系统,并启用之;

    1). 使用free命令查看下当前的swap空间大小:

    wKioL1fYu_fyfBteAAAbVS6Kfsk206.png


    2). 使用fdisk命令创建一个分区,并修改该分区ID为82(82为swap文件系统的ID,默认为83):

    wKiom1fYvhGA-fTwAAD5psxW_x4107.png

    

 使用partx命令通知kernel重读磁盘分区表,选项说明如下:

    -a: 通知kernel添加制定或全部分区

    -v: verbose,显示详细信息

    -s: 列出分区

 wKiom1fYxQzizJgeAABUt-5lulE812.png


    3). 使用mkswap命令将分区格式化为swap文件系统:

    wKioL1fYv8KDybWGAAAc_mp6xoU757.png


    4). 使用swapon命令激活swap交换分区:

        swapon命令常用选项说明:

        -a: 激活所有的交换分区;

        -v: verbose,显示详细信息;

        -s, --summary: 显示摘要信息;

        -p, --priority <prio>: 指定交换分区设备的优先级;

        wKioL1fY36SAE-DHAAAoIBGhNkw973.png


    5). 验证:

    wKioL1fY3_zw8zAZAAA4Vc0BDPk911.png

    可使用swapon -s或free -m命令验证结果。 


3、写一个脚本

   (1)、获取并列出当前系统上的所有磁盘设备;

#!/bin/bash
#
echo "$(fdisk -l /dev/[sh]d[a-z] | grep -o '^Disk /dev/[sh]d[a-z]')"

 结果:

 wKioL1fZHqKw2w7yAAAMSKVTwqA427.png

   (2)、显示每个磁盘设备上每个分区相关的空间使用信息;

#!/bin/bash
#
diskDev=$(fdisk -l /dev/[sh]d[a-z] | grep -o '^/dev/[sh]d[a-z][[:digit:]]')
for i in $diskDev
do
    echo "$(fdisk -l $i)\n"
done

 结果:

   wKioL1fZIQThyEOfAACfaIWn4Vs800.png

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块用来模拟空闲盘)

    wKioL1fjp2iCSz35AAInsGBTKcM054.png


  通知kernel重读磁盘分区表:

    wKioL1fjqfyQyhRYAABCjCLnKHM499.png

    

  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

    wKiom1fkxr6wT_Q7AAEKWgp21MY051.png

   对齐成功后:

    wKiom1fkxr-iaTJgAADB6LdPEF8991.png


 3). 使用RAID:

  (1).格式化。将/dev/md0格式化为ext4文件系统,并指明卷标为“MD0”:

    wKiom1fkyXPSciTxAACgIvyfT9g292.png


  (2).挂载。将/dev/md0挂载至/mydata,并检查挂载状态:

    wKiom1fkypmQlx3YAACJ1K4e7s8594.png


 4). 模拟磁盘故障:

    将/dev/sdb1人工标记为故障,来模拟磁盘错误,并观察空闲磁块的状态:

    wKioL1fkzzqjA-1PAADZx6dd6oA553.png


    卸载故障磁盘:

    wKiom1fk0JKDdoIDAACns3m1Ui8299.png

    

    向RAID卷中添加块设备/dev/sdb1:

    wKiom1fk0Sfy-M4PAACrgB0bE4g963.png


 5). 拆除RAID卷:

    拆除RAID前需先卸载该RAID:

    wKiom1fk1mWS8nFpAAAiT6n8fAY067.png


    

6、创建一个大小为4G的RAID5设备,chunk大小为256k,格式化ext4文件系统,要求可开机自动挂载至/backup目录,而且不更新访问时间戳,且支持acl功能;

  1). 创建四个大小为4G的分区(/dev/sdb{5,6,7,8}),用来模拟组建RAID卷的磁盘设备,其三个作为数据盘,一个作为空闲盘:

    wKioL1fk4ImC1Yj8AACoMKx2VyQ792.png   


  2). 创建RAID-5,chunk为256K:

    wKioL1fk4rPy4Rf1AAD_rUKAg8s554.png


  3). 格式化RAID设备为ext4文件系统,指明卷标,并检查默认挂载属性:

    wKioL1fk6BmBjNhiAAEWWSdPDqM541.png


  4). 修改/etc/fstab文件:

    /etc/fstab文件中增加一行,使用卷标自动挂载RAID设备,并使用noatime参数。如下:

LABEL=MD0   /mydata     ext4    defaults,noatime,acl    0 0

 运行以下命令,根据/etc/fstab挂载设备:

# mount -a


  5). 查看挂载状态:

    wKiom1fk7QeTQIeIAAAUH1-PX-g362.png


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"

     结果:

    wKioL1favLeQe1mrAACzxnXEIzU004.png

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"

     结果:

    wKiom1faxp_yYEW4AAA423X7Lcg247.png


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"

    结果:

    wKiom1fk9-mRZlfmAACnASECkvY446.png


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"

    结果:

    wKiom1flBgKATNNiAAA_zjGMOBg740.png

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"

    结果:

    wKiom1flQvywsLlRAABAHJY39jQ594.png


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"

    结果:

    wKiom1flTWaQu5xHAABc4pJ1e7o409.png


13、创建一个由至少两个物理卷组成的大小为20G的卷组;要求,PE大小为8M;而在卷组中创建一个大小为5G的逻辑卷mylv1,格式化为ext4文件系统,开机自动挂载至/users目录,支持acl;

    1). 创建磁盘块。创建/dev/sdb{1,2,3}并调整分区ID为8e,用来模拟构成PV的磁盘块:

        wKiom1fmgVfRcFXdAACoT3dTmv0957.png


    2). 创建PV;

        使用pvcreate命令创建PV,使用pvs命令显示pv列表:

        wKioL1fmh2LwHdrEAABJtYSdZzs496.png


    3). 创建VG;

        创建vg命令:vgcreate  [-s #[kKmMgGtTpPeE]] VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]

            -s: 指定PE的大小

        显示vg详情:vgdisplay [VolumeGroupName]

        wKioL1fmi5CQmLT5AADWSuFonfo815.png


    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:

            wKioL1fmjo_AbdcTAADRgoN8OsY508.png


    5). 格式化LV,并检查默认挂载选项;

        将/dev/mapper/myvg-mylv1格式化为ext4文件系统:

        wKiom1fmkQnh-xHtAAEpEfKARi4401.png


    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   /users  ext4    defaults,acl    0 0     #在/etc/fstab文件中添加该行

# mount -a

    结果:

    wKioL1fmk2zha2JKAAAj95LxwRg751.png


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]

    wKiom1fmmIaTR4VoAAFHSjx_0Og898.png

    检查源数据是否可用:

    wKiom1fmmkCyjOkIAAC5iPQ9034960.png

16、缩减mylv1至7G,确保缩减完成后原有数据完全可用;

    收缩LV需经过以下步骤:

        1). 卸载文件。收缩LV不允许在线运行;

        2). 收缩前强制检查LV;

        3). 收缩LV前需使用resize2fs命令收缩LV上的文件系统。注意:必须保证收缩后的空间可以存下该LV下的所有数据;

        4). 使用lvreduce命令收缩LV至指定大小,空间大小的指定也可使用相对值,如:-2G;

        5). 收缩LV后重新挂载该LV;

        6). 检查数据是否可用;

    过程如下:

        wKiom1fmnXnxYowbAAHGnPvf_m4261.png


17、对mylv1创建快照,并通过备份数据;要求保留原有的属主属组等信息;

    LV快照说明:

  1.         对LV创建的快照可以保存LV在某一核的所有信息,包换状态信息和数据;

  2.         快照的大小可以于LV相同也可不同,这取决于快照的使用期限,当对LV创建快照时相当于创建了一个LV上元数据的监听器,当LV上数据更新时会首先将LV中的数据复制一份到快照后再对LV上的数据进行修改,在读取数据时会先检查快照中是否有数据,有则读取,没有则会读取与之对应的LV上的数据,此时快照相当于LV的另一个入口;

  3.         LV和与之对应的快照必须在同一个卷组(VG)中;

  4.         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创建快照并检查快照信息:            

        wKiom1fmr5Tg5bf1AAEgSFRKH-E402.png

    

    查看LV上的元数据信息,修改后再与快照上同文件元数据对比:    

        wKioL1fmr3XAiEYCAAG1v7dVA84891.png