RHCE实验记录总结

Posted luotianshuai

tags:

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

不管是运维还是开发系统的了解下Linux或者系统的温习整理一下Linux知识点无疑是较好的,这篇文章是对RHCSA&RHCE实验进行一个汇总,是我为了做实验方便(并分享给朋友)的一篇文章。

前言

开卷有益

  • 准备考RHCSA(红帽认证系统管理员)RHCE(红帽认证工程师)
  • 想做下Linux实验巩固下实操技能
  • 测试下自己现在Linux的技能掌握度

环境提示

系统版本:Centos7

虚拟环境:文章下方

  • 虚拟环境安装
  • 虚拟环境常用管理命令 

整体总结

1、看下第一个实验的例子,其实要是重置密码步骤:第一步干了什么、第二步干了什么也是可以重置密码的(仅仅是做好这个实验而已)

2、拿第一个实验例子举例,做完实验看下总结

  • 这个实验每一步的上下游关系(如果有的话)
  • 每一步是干了什么,有什么意义
  • 总结思考

 

RHCSA实验

恢复root密码

实验成果说明:

1、在忘记root密码的情况下如何恢复root密码

2、恢复root密码为redhat

实验前环境初始化:

1、重置server系统:rht-vmctl reset server

2、打开GUI(图形页面):rht-vmctl view server

3、在servser上执行命令初始化环境:lab rootpw setup

具体实验步骤:

技术图片
1、重启操作系统,然后在启动加载器菜单中终端倒计时
1.1. 使用相关按钮或菜单项向系统发送Ctrl+Alt+Del
1.2. 在显示启动加载器菜单后,按任意键中断倒计时

2、编辑默认的启动加载器条目,使其在刚刚挂载所有文件系统后、但在控制权移交给systemd前终止启动过程,然后在进行启动
2.1. 使用光标键突出显示默认的启动加载条目
2.2. 按e编辑当前条目
2.3. 使用光标键导航到以linux16开头的哪一行
2.4. 按End将光标移至行尾
2.5. 将rd.break附加到行未
2.6. 按Ctrl+x 使用修改后的配置进行启动

# 这里可以理解为本身linux有个微系统,还没有加载我们正式系统
# 以读写的形式重新挂载我们的正式系统所在的分区
# 在执行命令chroot从微系统切换至正式系统
3、在swich_root提示中,以只读的形式重新挂载/sysroot文件systemd,然后使用chroot进入/sysroot中的chroot存放文职
swich_root:/# mount -o remount,rw /sysroot
swich_root:/# chroot /sysroot

4、修改密码
sh-4.2# passwd root   或者 sh-4.2# echo redhat |passwd --stdin root 

5、将系统配置为在启动后自动执行完整的SElinux重新标记,由于passwd工具重新创建了不带SElinux上下文的/etc/shadow文件(当前SElinux并没有加载)所以这很有必要
sh-4.2# touch /.autorelabel

6、执行两次exit退出
6.1. 提示重启的时候SElinux重新标记需要花点时间稍等一下就好下次就没问题了

7、执行命令验证
[root@server0 ~]# lab rootpw grade
恢复root密码步骤

实验总结:

1、首先要明白整个启动过程

技术图片

2、了解了启动过程再看下上图备注

2.1、备注1

我们在进入到grub2加载器菜单按:"e" 进入加载项编译模式

按:“e”进入后找到内核加载项以:linux16 /boot/vmlinuz 开头在行尾加上:rd.break  告诉gurb2在这里停下

    linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 ro vconsole.keymap=us console=tty0 console=ttyS0,115200n8 crashkernel=auto  vconsole.font=latarcyrheb-sun16 LANG=en_US.UTF-8 console=tty1

修改后

    linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 root=UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 ro vconsole.keymap=us console=tty0 console=ttyS0,115200n8 crashkernel=auto  vconsole.font=latarcyrheb-sun16 LANG=en_US.UTF-8 console=tty1 rd.break

  

2.2、备注2

根据我们修改后grub2 会还未向实际的系统移交控制权限前停下
我们实际恢复root密码的操作是在这里操作的

  • 重新挂载/sysroot 已读写的方式
  • chroot 修改操作系统为/sysroot
  • 执行passwd修改root密码
  • 重新打标签因为passwd重新创建了一个不带Selinux标签的/etc/shadow(存密码的我们修改了密码)文件显然这个操作是很有必要的:touch /.autorelabel
  • exit
  • exit

管理本地 Linux 用户和组

实验成果说明

在本实验中,您将定义默认的密码策略,创建包含三个新用户的补充组,以及修改一个用户的密码策略

1、在 server 上有一个名为 consultants 的新组,三个新用户: sspade bboop dtracy
2、 所有新庄户都应该要求在首次登录时更改密码,并且之后每 30 天进行更改
3、新的顾问账户应当在 90 天合同到期,bboop 账户必须每 15 天更改一次密码

实验详细需求

开始重置您的 server 系统 : rht-vmctl reset server

1、确保新创建的用户具有必须每 30 天修改一次密码
2、新建一个名为: consultants 、GID 为 40000 的组
3、创建三个用户: sspade bboop dtracy 密码为: default ,并且将他们添加到补充组 consultants 中,主组应当保留为用户的专用组
4、确定未来 90 天后的日志,并将新用户均设置为在该日期到期
5、更改 bboop 账户的密码策略,使其 15 天要求创建新密码
6、此外强制所有用户在首次登录时更改密码
7、完成后运行: lab localusers grade 评估此次实验结果

具体实验步骤

技术图片
1. 确保新创建的用户具有必须每 30 天修改一次密码
    1.1 这个需求是对登录用户,针对的是所有用户考虑下login配置文件:/etc/login.defs
        # PASS_MAX_DAYS   Maximum number of days a password may be used.
        PASS_MAX_DAYS   99999    修改为:PASS_MAX_DAYS   99999

2. 新建一个名为: consultants 、GID 为 40000 的组
    2.1. groupadd consultants -g 40000
    2.2. 验证 cat /etc/group

3. 创建三个用户: sspade bboop dtracy 密码为: default ,并且将他们添加到补充组 consultants 中,主组应当保留为用户的专用组
    这个需求我们可以useradd name 然后在passwd修改密码我们取巧用for循环搞下
    
    3.1. 执行命令
        # stdin 可以从标准输入获取密码就不需要以交互的形式去修改密码了
        for i in sspade bboop dtracy; do useradd $i -G consultants; echo default |passwd $i --stdin ; done

    3.2. 验证
        新用户已添加: cat /etc/passwd
        附加组已生效: cat /etc/group   # 效果类似:consultants:x:40000:sspade,bboop,dtracy
        用户默认30天修改一次密码: chage -l xxxx

4. 确定未来 90 天后的日志,并将新用户均设置为在该日期到期
    这个地方注意的是如何获取90天后的日志,并确认90天后的日志然后修改用户
    4.1. 先通过: date -d "+90day" 获取90天后的日期
    4.2. 在确认: cal -y 获取日历年份表根据这个对照
    4.3. 在修改: for i in sspade bboop dtracy; do chage -E "2019-09-30" $i ; done
    4.4. 验证: chage -l sspade  看:Account expires 账号到期时间

5. 更改 bboop 账户的密码策略,使其 15 天要求创建新密码
    这需求就是设定用户多久修改一次密码,单独说一个用户的话
    5.1. chage bboop -M 15
    5.2. 验证
    [root@server0 ~]# chage -l bboop
    Last password change                                    : Jul 01, 2019
    Password expires                                        : Jul 31, 2019
    Password inactive                                       : never
    Account expires                                         : Sep 30, 2019
    Minimum number of days between password change          : 0
    Maximum number of days between password change          : 30
    Number of days of warning before password expires       : 7
    [root@server0 ~]# chage bboop -M 15
    [root@server0 ~]# chage -l bboop
    Last password change                                    : Jul 01, 2019
    Password expires                                        : Jul 16, 2019
    Password inactive                                       : never
    Account expires                                         : Sep 30, 2019
    Minimum number of days between password change          : 0
    Maximum number of days between password change          : 15    # 这里从配置文件新用户创建30天修改一次密码改成了15天修改一次
    Number of days of warning before password expires       : 7

6. 此外强制所有用户在首次登录时更改密码
    6.1 执行命令+验证

    # 之前
    [root@server0 ~]# chage -l bboop
    Last password change                                    : Jul 01, 2019
    Password expires                                        : Jul 16, 2019
    Password inactive                                       : never
    Account expires                                         : Sep 30, 2019
    Minimum number of days between password change          : 0
    Maximum number of days between password change          : 15
    Number of days of warning before password expires       : 7

    # 执行命令: for i in sspade bboop dtracy; do chage $i -d 0 ; done

    # 之后
    [root@server0 ~]# chage -l bboop
    Last password change                                    : password must be changed  # 这里都改成必须修改密码了
    Password expires                                        : password must be changed  # 这里都改成必须修改密码了
    Password inactive                                       : password must be changed  # 这里都改成必须修改密码了
    Account expires                                         : Sep 30, 2019
    Minimum number of days between password change          : 0
    Maximum number of days between password change          : 15
    Number of days of warning before password expires       : 7

7. 完成后运行: lab localusers grade 评估此次实验结果
    总体验证: lab localusers grade
管理本地Linux用户和组具体步骤

实验总结:

1、密码过期概念

技术图片

2、每个概念对应的参数

技术图片

 

 

 

利用Linux文件系统权限控制文件访问

实验成果说明

在本实验中您将配置包含供用户协作使用的目录的系统

- server 拥有一个名为 /home/stooges 的目录,以下三个用户可以在该目录中协作处理文件
- 只有用户和组可以在 /home/stooges 中访问、创建和删除文件。在此目录中创建的文件自动被分配到 stooges 的组所有权
- 用户创建新文件不可以由族外的人员访问

实验详细需求

开始前重置您的 server 系统,并执行: lab permissions setup

您的 server 计算机有三个账户: curly larry moe 这些账户是名为 stooges 的组的成员

1、打开终端窗口在 server 上成为 root 用户
2、创建 /home/stooges 目录
3、在 /home/stooges 目录中更改组权限,使其属于 stooges 组
4、对 /home/stoogs 目录设置权限,以是 GID 位置目录(2)、所有者(7)、和组(7)具有完全读取,其他用户没有权限(0)
5、检查是否正确设置权限
6、修改全局登录脚本,使普通用户拥有一个 umask 设置,该设置将阻止其他人查看或者修改新的文件和目录 
7、完成时 ----打开一个新的终端---- 运行: lab permissions grade 来验证实验结果

实验详细步骤

技术图片
1. 打开终端窗口在 server 上成为 root 用户
2. 创建 /home/stooges 目录
    2.1. mkdir /home/stooges
    2.2. 验证 ls /home
3. 在 /home/stooges 目录中更改组权限,使其属于 stooges 组
    3.1. chown :stooges /home/stooges
    3.2. 验证 ll -d /home/stooges

4. 对 /home/stoogs 目录设置权限,以是 GID 位置目录(2)、所有者(7)、和组(7)具有完全读取,其他用户没有权限(0)
    4.1. chmod 2770 /home/stoogs
    4.2. 验证 ls -d /home/stooges
        drwxrws---. 2 root stooges 6 Jul  2 11:17 /home/stooges

5. 检查是否正确设置权限
    5.1. 验证 ls -d /home/stooges
        drwxrws---. 2 root stooges 6 Jul  2 11:17 /home/stooges
6. 修改全局登录脚本,使普通用户拥有一个 umask 设置,该设置将阻止其他人查看或者修改新的文件和目录
    6.1 两个文件
        /etc/profile
        /etc/bashrc

        找到umask项目然后修改为
        if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
               umask 007
        else
               umask 027
        fi

7. 完成时 ----打开一个新的终端---- 运行: lab permissions grade 来验证实验结果
    验证: lab permissions grade
利用 Linux 文件系统权限控制文件访问

 实验总结:

1、正常的权限不需要特别的记: r:w:x  对应数字:4:2:x   

2、默认的权限:file 644  dir 755

3、特殊权限需要理解下:

特殊权限 对文件的影响 对目录的影响
u+s(suid)                          以拥有文件的用户身份,而不是运行文件的用户身份执行:例子(ls -l //bin/passwd)  无~
g+s(sgid) 以拥有文件组的身份执行文件   在目录中最新创建的文件将其组所有者设置为恶目录的组所有者相匹配
o+t(sticky) 无~  对目录具有写write权限的用户可以删除其所有用的文件,而无法删除或强制保存到其他用户所拥有的文件 例子:ls -ld /tmp

特殊权限也可以用数值表示(从右往左数第4位):

setuid=4   setgid=2   sticky=1 

 

给文件增加特殊的S权限:

[root@server0 ~]# chmod 4666 file
[root@server0 ~]# ls -l file 
-rwSrw-rw-. 1 root root 0 Jul 3 16:36 file
[root@server0 ~]#

给目录增加特殊权限s

[root@server0 ~]# ls -ld dir
drwxr-xr-x. 2 root root 6 Jul 3 16:57 dir
[root@server0 ~]# chmod 2755 dir
[root@server0 ~]# ls -ld dir
drwxr-sr-x. 2 root root 6 Jul 3 16:57 dir
[root@server0 ~]#

给目录增加t权限t

[root@server0 ~]# ls -ld dir2
drwxr-xr-x. 2 root root 6 Jul 3 16:59 dir2
[root@server0 ~]# chmod 1755 dir2
[root@server0 ~]# ls -ld dir2/
drwxr-xr-t. 2 root root 6 Jul 3 16:59 dir2/
[root@server0 ~]#

4、umask 修改默认文件和目录的权限

我们touch 一个文件会发现它的权限是:644 -rw-r--r--

我们mkdir 一个目录会发现他的全显示:755 drwxr-xr-x

 

你所看的文件和目录的默认权限实际上不是它最大的默认权限

 

文件的最大默认权限是: 666  -rw-rw-rw-

目录的最大默认权限是: 777   drwxrwxrwx

 

因为在系统中每一个进程都具有umask,它的作用就是清除该进程创建的新文件和目录的指定权限

执行命令:umask 会看到当前的权限

[root@server0 ~]# umask
0022
[root@server0 ~]# 

上面那一串的意思:在最大默认权限上做减法

# umask计算后的文件的默认权限(减去2=减去写权限)

0666
0022 -
------
0644

# umask计算后的目录的默认权限(减去2=减去写权限)
0777
0022 -
------
0755

举个例子:我想创建的目录和文件other用户什么权限也没有怎么办?实际上就是减去other权限位的:读、写、执行权限

[root@server0 ~]# umask 027   # 如果写三位默认特殊权限位为0
[root@server0 ~]# umask
0027
[root@server0 ~]# touch 1
[root@server0 ~]# mkdir dir
[root@server0 ~]# ll
total 0
-rw-r-----. 1 root root 0 Jul  3 17:15 1
drwxr-x---. 2 root root 6 Jul  3 17:15 dir
[root@server0 ~]# 

实际使用的永久修改的话:echo "umask 0027" > /etc/profile.d/default_umask.sh  就行每次登陆就会加载default_umask.sh

但是这个实验想pass需要修改:/etc/bashrc   /etc/profile    的umask配置

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
    umask 002
else
    umask 022   
fi

 

使用文件ACL控制对文件的访问权限 

写在开头吧:就是对基本的文件权限体系的一个增强,基本文件体系天单一了:只有文件所属人、文件所属组、其他权限  在外加3个特殊权限

实验成果说明:

在本实验中您将更新协作目录,将添加ac使其具有适当的权限,同时限定特定的用户和组

实验详细需求:

开始重置您的 server 系统 : rht-vmctl reset server  并在server系统上执行: lab acl setup   

 

执行lab acl setup 会在/shares/ 目录下初始化目录,并初始化linux用户信息

需求:

1 case目录及其内容应该属于组 bakerstreet 。新增至 cases 目录中的文件应自动属于组 bakerstreet 。现有文件应针对用户和组设置为rw(提示:切勿使用setfacl)

2 将 ACL添加至 cases 目录 (及其内容),以允许 scotlandyard 组成员具有文件的 读取/写入权限 以及目录的执行权限。限制用户 jones 使其只具有文件的读取权限和目录的执行权限

3 添加ACL以确保 cases 目录中的任何文件或者目录均针对所有授权用户和组应用了正确权限

4 验证您已经正确更改了ACL和文件系统(验证步骤,如果对自己操作有信心可以直接指定第5步验证)

4.1 使用 ls 和 getfacl 检查 /shares/cases 上的设置

4.2 切换用户为:holmes 和 lestrade 验证能够写入文件、读取文件、创建目录以及对新目录的文件执行写操作

4.3 切换用户为 jones 尝试写一个文件(应该会失败)并且尝试创建新目录(应该会失败)。使用 jones 用户应该可以读取cases目录中的 adventures.txt 以及读取在 holmes 或 lestrade 新建目录中所编写的“测试” 文件

5 在server上执行命令: lab acl grade 进行验证

实验详细步骤: 

技术图片
# 1
# case目录及其内容应该属于组 bakerstreet
chown -R :bakerstreet cases
# 新增至 cases 目录中的文件应自动属于组 bakerstreet
chmod g+s cases
# 现有文件应针对用户和组设置为rw(提示:切勿使用setfacl)
chmod 660 cases/*

# 2
# 将 ACL添加至 cases 目录 (及其内容),以允许 scotlandyard 组成员具有文件的 读取/写入权限 以及目录的执行权限
setfacl -Rm g:scotlandyard:rwX cases
# 限制用户 jones 使其只具有文件的读取权限和目录的执行权限
setfacl -Rm u:jones:rX cases


# 3
# 添加ACL以确保 cases 目录中的任何新文件或者目录均针对所有授权用户和组应用了正确权限
# 这句话可能有点绕,确保cases目录中的任何“”新文件“” 也就是默认权限需要注意下
setfacl -d -Rm g:scotlandyard:rwX cases
setfacl -d -Rm u:jones:rX cases

# 4
# 查看结果对比
[root@server0 shares]# ll -d cases
drwxrws---+ 4 root bakerstreet 113 7月  12 06:29 cases
[root@server0 shares]# ll cases/
总用量 32
-rw-rw----+ 1 root    bakerstreet 22 7月  12 06:29 adventures.txt
-rw-rw----+ 1 root    bakerstreet  8 7月  12 06:29 do_NOT_delete.grading.txt
drwxrws---+ 2 gregson bakerstreet 21 7月  12 06:29 gregson.dir
-rw-rw----+ 1 root    bakerstreet 38 7月  12 06:29 moriarty.txt
drwxrws---+ 2 watson  bakerstreet 21 7月  12 06:29 watson.dir
[root@server0 shares]#
[root@server0 shares]#
[root@server0 shares]# getfacl cases
# file: cases
# owner: root
# group: bakerstreet
# flags: -s-
user::rwx
user:jones:r-x
group::rwx
group:scotlandyard:rwx
mask::rwx
other::---
default:user::rwx
default:user:jones:r-x
default:group::rwx
default:group:scotlandyard:rwx
default:mask::rwx
default:other::---

使用文件ACL控制对文件的访问权限 详细步骤
使用文件ACL控制对文件的访问权限 详细步骤

实验总结:

 1 默认也有acl属性

文件或目录acl权限,其实就是对现有权限不足的一个扩展
默认他也是有acl属性的

[root@server0 shares]# ll
总用量 4
drwxrwx---. 2 root root       78 7月  12 05:48 cases
drwxrws---+ 3 root controller 92 7月  12 05:48 steamies
[root@server0 shares]# getfacl cases
# file: cases
# owner: root
# group: root
user::rwx
group::rwx
other::---

[root@server0 shares]# pwd
/shares
[root@server0 shares]#

2、应用acl后文件权限项后面有个加号,标识启用了acl

# 当我们给他们添加了acl属性后看下
# drwsrws---+  在权限这里有个:"+" 对比之前是 drwxrwx---.  当有个加号的时候标记这个文件或目录已经应用了acl
[root@server0 shares]# ll
drwsrws---+ 3 shuai controller 100 Jul 10 16:42 steamies

3、acl优先级

3.1 首先注意一点acl包含了现有权限,它可以理解为现有权限的扩展,当我们启用了acl之后看acl的权限即可
3.2 acl掩码概念
    
    .....
    mask::rwx   # 这一行就是掩码掩码规定了:指定用户、指定用户组、组  的最大权限
    .....

    3.2.1 可以理解为何umask差不多的概念它:定义了程序运行的最大权限 
    3.2.2 文件属主(文件的用户)、other 不受掩码限制
    3.2.3 acl指定的用户、acl指定用户组、用户组、受掩码限制 ,不过还蛮友善的给出你经过mask降级后的实际权限(#effective:xxx)

例子:
[root@server0 shares]# getfacl test
# file: test
# owner: watson
# group: bakerstreet
user::rwx
user:james:rwx                #effective:rw-
group::rwx                    #effective:rw-
group:scotlandyard:rwx        #effective:rw-
mask::rw-
other::r-x


3.3 例子运行匹配
如果以文件所有者watson身份执行则调用:(文件用户ACL权限) 且不受掩码限制
    user::rwx

如果以指定用户ACL条目中列出的用户身份运行,则应用指定用户权限
    例如:用james 执行文件就应用:user:james:rwx 权限

    前提掩码也的有权限: mask::rwx  允许
    如果掩码是没有权限: mask::rw-  那么user:james:rwx 的最大权限就自动降为rw-   

如果以文件组所有者相匹配的组身份运行或者以ACL条目中列出的指定用户组运行,则应用相应匹配的ACL
    例如用: 文件所属组 bakerstreet 这个组运行 那么就应用:group::rwx 权限
    前提掩码也的有可执行权限:mask::rwx  允许
    如果掩码是没有可执行权限:mask::rw-  那么 bakerstreet 这个组不允许执行

    或用ACL列表中指定的组: group:scotlandyard:rwx 运行就应用: group:scotlandyard:rwx 权限
    前提掩码也的有可执行权限:mask::rwx  允许
    如果掩码是没有可执行权限:mask::rw-  那么 scotlandyard 这个组不允许执行

# 否则应用文件的other权限,且不受掩码限制

安装和更新软件包

实验成果说明:

说明:在本实验中您将使用yum安装和更新选定的软件包

成功:系统上安装新的和更新软件包

实验详细需求:

开始重置您的 server 系统 : rht-vmctl reset server   

需求:
1 创建文件:/etc/yum.repos.d/errata.repo,以启用在 content 计算机上找到的"更新"存储库。它应该访问在一下的 URL 中找到:http://content.example.com/rhel7.0/x86_64/errata ,且不要检查 GPG 签名

2 将 server 配置为遵循非常具体的软件要求,它必须安装有一下软件包的最新版本。请勿安装所有更新。仅安装列出的软件包更新(如果这些更新可用)

  • 内核(更新现有包)
  • xsane-gimp (新软件包)
  • rht-system (新软件包)
  • 鉴于安全原因,不应当装有 wvdial 软件包

3 当您准备好检查您的工作时,请在 server 上运行 lab software grade

实验详细步骤

技术图片
1 添加配置
vim /etc/yum.repos.d/errata.repo
[errata]
name=errata
baseurl=http://content.example.com/rhel7.0/x86_64/errata
gpgcheck=0

2 安装要求的包
yum -y install xsane-gimp rht-system

3 卸载需求需要卸载的包
yum remove -y wvdial

4 验证
lab software grade
安装和更新软件包详细步骤

 

实验总结:

1、yum源baseurl指定的目标是什么

不管是Centos还是RedHat我们要找一个目录,这个目录包含两个文件目录:
- Packages  (这个是实际仓库存的东西)
- repodata  (这个目录是这个yum仓库的清单信息它里面包含了这个库里都有啥)


# 一般Centos的(Packages和repodata)在这个路径下,那么baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/
# redhat同理
http://mirrors.aliyun.com/centos/7/os/x86_64/


# baseurl可以写成变量
http://mirrors.163.com/centos/$releasever/os/$arch/

$releasever 这个变量是来自于centos-release包的Version字段         大系统版本
$arch       这个变量是来自于centos-release包的Architecture字段    CPU架构

[xxxxxxx ~]# rpm -qi centos-release
Name        : centos-release
Version     : 7
Release     : 4.1708.el7.centos
Architecture: x86_64
Install Date: Fri 03 Nov 2017 07:06:08 PM CST
Group       : System Environment/Base
Size        : 37949
License     : GPLv2
Signature   : RSA/SHA256, Thu 31 Aug 2017 12:04:53 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : centos-release-7-4.1708.el7.centos.src.rpm
Build Date  : Wed 30 Aug 2017 11:53:09 PM CST
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
Summary     : CentOS Linux release file
Description :
CentOS Linux release files

 2、gpgcheck=0 或者1

先了解什么是gpgcheck它是一种数字签名检查,如果启用gpg验证,yum install的时候就会拿着这个这个签名验证你是否安装的是正确的包而不是第三方修改过或者和黑客修改后的包

一般在Packages、repodata目录所在的同级别目录中有一个:RPM-GPG-KEY-CentOS-7 下载并在配置文件制定下载后的文件路径:gpgkey=file:///etc/pki/rpm-gpg/xxxxxx,然后就可以启用验证了gpgcheck=1

逻辑卷管理(LVM) 

实验成果说明:

在此实验中,您将根据现有逻辑卷大小,同时根据需要添加LVM资源,然后添加一个新的逻辑卷,该逻辑卷带有永久挂载的XFS文件系统

实验详细需求:

开始重置您的 server 系统 : rht-vmctl reset server  并在server系统上执行: lab lvm setup

 

1、在/dev/vdb上创建 512 Mib分区,将其初始化为物理卷,然后使用他来扩展finance卷组

2、将loans逻辑卷扩展到 768 Mib,包括文件系统

3、在现有卷组中,创建名为 risk 且大小为 128 MiB的一个新逻辑卷,添加XFS文件系统,并将其挂于 /finance/risk

4、完成工作后重新启动 server计算机,然后从server计算机运行命令: lab lvm grade 验证

实验详细步骤:

技术图片
1、在/dev/vdb上创建 512 Mib分区,将其初始化为物理卷,然后使用他来扩展finance卷组

# 先创建一个LVM的分区,类型选择:8e
fdisk /dev/vdb

/dev/vdb1            2048     1050623      524288   8e  Linux LVM
/dev/vdb2         1050624     2074623      512000   8e  Linux LVM   # new

# 执行命令 partprobe  分区检索,否则检索不到新分区
partprobe

# 转换为pv物理卷
[root@server0 ~]# pvcreate /dev/vdb2
  Physical volume "/dev/vdb2" successfully created

# 扩展卷组
[root@server0 ~]# vgextend finance /dev/vdb2
  Volume group "finance" successfully extended

# 逻辑卷是在卷组基础上创建的,扩展逻辑卷
[root@server0 ~]# lvextend -L 786M /dev/finance/loans
  Rounding size to boundary between physical extents: 788.00 MiB
  Extending logical volume loans to 788.00 MiB
  Logical volume loans successfully resized
[root@server0 ~]# lvs
  LV    VG      Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
  loans finance -wi-ao---- 788.00m
[root@server0 ~]#

2、将loans逻辑卷扩展到 768 Mib,包括文件系统

# 扩容文件系统
[root@server0 ~]# df -h
文件系统                   容量  已用  可用 已用% 挂载点
/dev/vda1                   10G  3.0G  7.1G   30% /
devtmpfs                   906M     0  906M    0% /dev
tmpfs                      921M   80K  921M    1% /dev/shm
tmpfs                      921M   17M  904M    2% /run
tmpfs                      921M     0  921M    0% /sys/fs/cgroup
/dev/mapper/finance-loans  253M   13M  240M    6% /finance/loans

[root@server0 ~]# xfs_growfs /finance/loans
meta-data=/dev/mapper/finance-loans isize=256    agcount=4, agsize=16384 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=65536, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 65536 to 201728

[root@server0 ~]# df -h
文件系统                   容量  已用  可用 已用% 挂载点
/dev/vda1                   10G  3.0G  7.1G   30% /
devtmpfs                   906M     0  906M    0% /dev
tmpfs                      921M   80K  921M    1% /dev/shm
tmpfs                      921M   17M  904M    2% /run
tmpfs                      921M     0  921M    0% /sys/fs/cgroup
/dev/mapper/finance-loans  785M   14M  772M    2% /finance/loans

3、在现有卷组中,创建名为 risk 且大小为 128 MiB的一个新逻辑卷,添加XFS文件系统,并将其挂于 /finance/risk

# 创建新逻辑卷
[root@server0 ~]# lvs
  LV    VG      Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
  loans finance -wi-ao---- 788.00m

[root@server0 ~]# lvcreate finance -L 128M --name risk
  Logical volume "risk" created
[root@server0 ~]# lvs
  LV    VG      Attr       LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
  loans finance -wi-ao---- 788.00m
  risk  finance -wi-a----- 128.00m

# 格式化为xfs文件系统
[root@server0 ~]# mkfs.xfs /dev/finance/risk
meta-data=/dev/finance/risk      isize=256    agcount=4, agsize=8192 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=32768, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

# 创建挂载点并修改fstab
[root@server0 ~]# mkdir -p /finance/risk
[root@server0 ~]# vim /etc/fstab
# 新增
/dev/finance/risk  /finance/risk    xfs  defaults  0 0

4、完成工作后重新启动 server计算机,然后从server计算机运行命令: lab lvm grade 验证

lab lvm grade
逻辑卷管理 详细实验步骤

实验总结:

1、LVM逻辑图

技术图片

2、比较不错的实践

系统盘:RAID 1   /dev/sda

数据盘:RAID5   /dev/sdb   用sdb创建LVM分区-->创建物理卷-->把物理卷加入到卷组-->创建N个逻辑卷

添加启用SWAP分区(交换分区)

实验成果说明:

创建并启用swap分区

实验详细需求:

1、创建1个500M的swap交换分区

实验详细步骤:

技术图片
1、创建SWAP类型的分区

# 创建分区并设置分区类型为swap

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

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

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

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-20971519,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +sizeK,M,G (2048-20971519,默认为 20971519):+500M
分区 1 已设置为 Linux 类型,大小设为 500 MiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):82
已将分区“Linux”的类型更改为“Linux swap / Solaris”

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

磁盘 /dev/vdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x78cd0f7c

   设备 Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048     1026047      512000   82  Linux swap / Solaris

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

# 分区检索
[root@server0 ~]# partprobe

# 初始化为swap分区
[root@server0 ~]# mkswap /dev/vdb1
正在设置交换空间版本 1,大小 = 511996 KiB
无标签,UUID=b5751a60-e080-4cbd-9fda-14cba16041d7

2、新增fstab挂载

# 获取分区UUID
[root@server0 ~]# blkid
/dev/vda1: UUID="9bf6b9f7-92ad-441b-848e-0257cbb883d1" TYPE="xfs"
/dev/vdb1: UUID="b5751a60-e080-4cbd-9fda-14cba16041d7" TYPE="swap"

# 新增挂载配置
[root@server0 ~]# vim /etc/fstab
UUID=b5751a60-e080-4cbd-9fda-14cba16041d7 swap swap defaults 0 0

# 测试激活交换分区
[root@server0 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          1841        550       1290         16          0        246
-/+ buffers/cache:        302       1538
Swap:          499          0        499

# 重启测试交换分区还存在
添加启用swap交换分区 详细实验步骤

实验总结:

1、什么是SWAP分区

一个进程启动需要相应的物理内存空间,当物理内存不够用的时候,会把空闲的进程使用的内存写入到SWAP分区(硬盘上)把腾出来的额内存给其他进程使用,如果进程需要访问写入到SWAP分区的内容同理把其他进程空闲的内存腾出来写入到SWAP在把SWAP数据读出来写到物理内存

2、SWAP分区的优缺点

优点:SWAP相当于一个缓冲区,不至于当内存用完新程序或需要使用内存的程序无法正常运行

缺点:SWAP分区毕竟是硬盘和物理内存比起来非常慢

 

autofs自动挂载文件系统

实验成果说明:

在此实验中,您将安装一个软件包以支持自动挂载文件系统,本实验是基于ldap & krb5验证 + nfs (lab nfs setup)这些都已经初始化完了,我们只需要配置autofs即可

实验详细需求:

开始重置您的 desktop 系统 : rht-vmctl reset desktop  并在 desktop 系统上执行:lab nfs setup

 

classroom.example.com 正在共享/home/guests

desktop0 挂载点/home/guests/ldapuser0

用户名:ldapuser0    密码:kerberos

 

1、安装自动挂载home目录所需的任何包

2、添加配置文件(必须以.autofs结尾)和映射文件(必须以auto.开头)

3、启用并启动自动挂载服务

4、使用ssh切换到localhost上的ldapuser0,然后确认:挂载是否OK、读取/写入权限是否OK

5、重新启动desktop0计算,然后从desktop0计算执行命令:lab nfs grade 验证

实验详细步骤:

技术图片
1、安装自动挂载home目录所需的任何包

# 安装autofs
[root@desktop0 ~]# yum -y install autofs

2、添加配置文件(必须以.autofs结尾)和映射文件(必须以auto.开头)

# 添加配置文件
[root@desktop0 ~]# vim /etc/auto.master.d/nfs.autofs
#挂载的目录     映射配置文件
/-              /etc/auto.home

# 添加映射文件
[root@desktop0 ~]# vim /etc/auto.home
#挂载点         挂载选项              要挂载的文件系统
/home/guests    -typefs=rw            classroom.example.com:/home/guests

3、启用并启动自动挂载服务
# 启动服务、检查状态、并设置开机启动
[root@desktop0 ~]# systemctl start autofs.service
[root@desktop0 ~]# systemctl status autofs.service
[root@desktop0 ~]# systemctl enable autofs.service

4、使用ssh切换到localhost上的ldapuser0,然后确认:挂载是否OK、读取/写入权限是否OK
ssh ldapuser0@localhost

# 没有报错创建文件正常、挂载正常即可

5、重新启动desktop0计算,然后从desktop0计算执行命令:lab nfs grade 验证
lab nfs grade
autofs自动挂载文件系统 详细步骤

实验总结:

1、autofs是什么以及应用场景

挂载共享资源存在两个问题

  • 将挂载信息写入到/etc/fstab文件中,可实现开机自动挂载。但是如果远程共享资源过多,则会给网络带宽和服务器的硬件资源带来很大负载。
  • 如果挂载的资源长期不使用,也会造成服务器资源的浪费。

autofs就是为了解决上面两个问题而存在的:autofs自动挂载服务是一种Linux系统守护进程,当检测到用户视图访问一个尚未挂载的文件系统时,会自动挂载该文件系统。简单来说,将挂载信息写入/etc/fstab文件中,系统在每次开机时都会自动挂载,而autofs服务则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器硬件资源的开销。

2、两种配置文件,我感觉其实是可以放在一起但是为啥要拆两个(最终把classroom.example.com:/home/guests共享挂载到:/目录的,/home/guests这个点上)

########### 自动挂载配置文件
[root@desktop0 ~]# cat /etc/auto.master.d/nfs.autofs
#挂载的目录     映射配置文件
/-              /etc/auto.home


########### 自动挂载配置文件的映射文件
[root@desktop0 ~]# cat /etc/auto.home
#挂载点         挂载选项              要挂载的文件系统
/home/guests    -typefs=rw            classroom.example.com:/home/guests

 

管理SElinux安全 

实验成果说明:

在本实验中,您将解决SElinux访问被拒绝的问题,在SElinux处于强制模式时,系统管理员使用新web服务器向客户端交付内容时遇到的问题解决它

实验详细需求:

开始重置您的 server 系统 : rht-vmctl reset server    并初始化:lab selinux setup

1、在server上启动web浏览器并浏览至:http://localhost/lab-content 将会看到一个错误

2、研究并切丁正在阻止Apache提供Web内容服务的SElinux问题

3、解决正在阻止Apache提供Web内容服务的SElinux问题

4、验证SElinux问题已经解决,斌企鹅Apache能够提供Web内容服务

5、运行lab selinux grade命令确认您的结论

具体实验步骤:

技术图片
1 看日志

/var/log/message
```
Jul 12 17:05:07 localhost setroubleshoot: SELinux is preventing /usr/sbin/httpd from open access on the file . For complete SELinux messages. run sealert -l a4e40289-984d-4a57-b791-e0520a066046
Jul 12 17:05:07 localhost python: SELinux is preventing /usr/sbin/httpd from open access on the file .

*****  Plugin catchall_boolean (89.3 confidence) suggests   ******************

If you want to allow httpd to read user content
Then you must tell SELinux about this by enabling the httpd_read_user_content boolean.

Do
setsebool -P httpd_read_user_content 1
```
报错都提醒你如何处理selinux了,执行命令:setsebool -P httpd_read_user_content 1


/var/log/httpd/error_log
```
[Fri Jul 12 17:05:06.582895 2019] [core:error] [pid 2293] (13)Permission denied: [client ::1:42650] AH00132: file permissions deny server access: /var/web-content/lab-content/index.html
```
httpd 也会有提示关注下

2 查看目录和文件的上下文
```
ls -dZ /var/web-content /var/www
drwxr-xr-x. root root unconfined_u:object_r:var_t:s0   /var/web-content
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www
```
3 修改目录和文件的默认上下文
```
semanage fcontext -a -t httpd_sys_content_t /var/web-content(/.*)
```
4 还原目录和文件的默认上下文
```
restorecon -R web-content/
```
管理SElinux安全详细步骤

实验总结:

1、文件权限后面有个“.” 说明该文件打上了selinux标签

系统在启动的时候回自动打标签:
-rw-r--r--. 1 root root 0 7月 12 13:10 no_label

禁用selinux后,新创建的文件就不会有selinux标签了
-rw-r--r--. 1 root root 0 7月 12 13:10 label
-rw-r--r-- 1 root root 0 7月 12 13:26 no_label

2、新创建的文件会继承目录的“上下文标签”

适用于:vim、cp、touch

如果在其他位置创建的并且权限得以保留比如:mv、cp -a 那么还会保留之前的“上下文标签”

3、selinux 有两个模式:

[root@server0 shares]# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]

# 强制模式
Enforcing 遵守策略规则并记录冲突(异常)
# 启用强制模式
setenforce Enforcing 或者 setenforce 1

# 许可模式
策略规则冲突仅记录日志消息
# 启用策略模式
setenforce Permissive 或者 setenforce 0

4、小总结

selinux “上下文标签” 由4个部分组成由 ":" 分隔
user:role:type:level

user: 用户
    - system_u: 系统用户大部分就是系统自己产生的文件
    - unconfined_u:不受限的用户,也就是说该文件来自于不受限的进程所产生的
基本上,如果是系统或软件本身所提供的文件,大多数就是system_u这个身份名称,而如果是我们用户透过bash自己建立的文件,则大多数是不受限制的,如果是网络服务所产生的的文件,或者系统服务运行过程中的文件,则大部分的识别就会是system_u


查看登录用户和selinux用户映射关系
[root@server0 shares]# semanage login -l

登录名                  SELinux 用户           MLS/MCS 范围           服务

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *


role:角色
透过角色字段,我们可以知道这个资料是属于进程,文件资源还是使用者。
object_r:代表的是文件或目录等文件资源
system_r:代表的就是进程

type:类型

[root@server0 shares]# ll /var/www -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html


因为selinux是类型强制所以一般我们只需要关注类型就可以

context查询工具seinfo、sesearch
yum install setools-console  # 工具

```
seinfo -u    # 查询所有的user字段的种类
seinfo -r    # 查询所有的role字段的种类
seinfo -t    # 查询所有的type字段的种类 

sesearch -A 可以查询什么类型进程可以读取什么type类型的文件
sesearch -A -s 进程type    # 查询type类型的进程能够读取的文件type    
```

总结:
1 进程也有一个标签 
2 标签对应:
    标签可以访问那些 标签
    标签对资源的权限属性

firewall限制网络(新一代防火墙替代iptables) 

实验成果说明:

在此实验中,您将在server0服务器上配置防火墙,以阻止对ssh和端口8080/TCP上运行Web以外服务的访问

实验详细需求:

开始重置您的 server 系统 : rht-vmctl reset server  并在server系统上执行: lab firewall setup

 

1、配置系统,使iptables和ip6iptables服务不会被管理员以外启动

2、检查firewalld服务是否正在运行。如果未运行其启动该服务

3、验证默认防火墙区域是否是public

4、确保public区域的永久配置中没有打开不需要的端口

5、向public区域的永久配置添加端口8080/TCP验证配置

6、重新启动server0计算机(为进行快速测试,也可以使用sudo firewall-cmd --reload)

7、从desktop计算机运行:lab firewall grade 进行验证

实验详细步骤:

技术图片
1、配置系统,使iptables和 ip6iptables 服务不会被管理员以外启动
[root@server0 ~]# systemctl status iptables
iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled)
   Active: inactive (dead)

[root@server0 ~]# systemctl mask iptables.service
ln -s /dev/null /etc/systemd/system/iptables.service
[root@server0 ~]# systemctl status iptables
iptables.service
   Loaded: masked (/dev/null)
   Active: inactive (dead)


[root@server0 ~]# systemctl status ip6tables
ip6tables.service - IPv6 firewall with ip6tables
   Loaded: loaded (/usr/lib/systemd/system/ip6tables.service; disabled)
   Active: inactive (dead)

[root@server0 ~]# systemctl mask ip6tables.service
ln -s /dev/null /etc/systemd/system/ip6tables.service
[root@server0 ~]# systemctl status ip6tables
ip6tables.service
   Loaded: masked (/dev/null)
   Active: inactive (dead)

2、检查firewalld服务是否正在运行。如果未运行其启动该服务
[root@server0 ~]# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: inactive (dead) since 六 2019-07-13 07:15:59 CST; 4min 22s ago
 Main PID: 471 (code=exited, status=0/SUCCESS)

7月 13 07:07:26 localhost systemd[1]: Started firewalld - dynamic firewall daemon.
7月 13 07:15:59 server0.example.com systemd[1]: Stopping firewalld - dynamic firewall daemon...
7月 13 07:15:59 server0.example.com systemd[1]: Stopped firewalld - dynamic firewall daemon.

[root@server0 ~]# systemctl start firewalld.service
[root@server0 ~]# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since 六 2019-07-13 07:21:45 CST; 2s ago
 Main PID: 2559 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─2559 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

7月 13 07:21:44 server0.example.com systemd[1]: Starting firewalld - dynamic firewall daemon...
7月 13 07:21:45 server0.example.com systemd[1]: Started firewalld - dynamic firewall daemon.


3、验证默认防火墙区域是否是public
[root@server0 ~]# firewall-cmd --get-default-zone
public

# 如果不是
[root@server0 ~]# firewall-cmd --set-default-zone=public

4、确保public区域的永久配置中没有打开不需要的端口(永久配置重启还会生效,当前配置仅当前用用重启恢复为永久配置)

[root@server0 ~]# firewall-cmd --list-ports --permanent   # 永久配置
[root@server0 ~]# firewall-cmd --list-ports   # 当前加载

[root@server0 ~]# firewall-cmd --list-services  # 当前加载配置
dhcpv6-client ssh
[root@server0 ~]# firewall-cmd --list-services --permanent # 永久配置
dhcpv6-client ssh
[root@server0 ~]#

# 有多余的服务,干掉dhcpv6-client
[root@server0 ~]# firewall-cmd --remove-service=dhcpv6-client --permanent  # 永久配置
success
[root@server0 ~]# firewall-cmd --remove-service=dhcpv6-client  # 当前加载
success
[root@server0 ~]#

5、向public区域的永久配置添加端口8080/TCP验证配置
[root@server0 ~]# firewall-cmd --add-port=8080/tcp --permanent
success
[root@server0 ~]# firewall-cmd --add-port=8080/tcp
success

6、重新启动server0计算机(为进行快速测试,也可以使用sudo firewall-cmd --reload)
# reload验证
[root@server0 ~]# firewall-cmd --reload
success
[root@server0 ~]# firewall-cmd --list-ports --permanent
8080/tcp
[root@server0 ~]# firewall-cmd --list-ports
8080/tcp
[root@server0 ~]# firewall-cmd --list-services --permanent
ssh
[root@server0 ~]# firewall-cmd --list-services
ssh
[root@server0 ~]#

7、从desktop计算机运行:lab firewall grade 进行验证

# 登录desktop
lab firewall grade
firewall限制网络 详细操作步骤

实验总结:

1、多个区域的概念

  • 多个区域是同时运行着的,默认区域是其中的一个运行区域而已

2、正常区域只是个逻辑上的概念(区域里有一些默认的配置),来看它的匹配方式

  • 第一:如果一个客户端数据包的源 IP 地址匹配,匹配到某一个zone中的规则了(防止歧义就用详细的IP:1.1.1.1),那么就应用这个zone的这个规则
  • 第二:如果一个客户端数据包进入服务器的某一个接口(如 eth0),如果不满足第一条就应用这个zone的默认规则
  • 如果上面两个都满足就应用默认zone规则

 

RHCE实验

 待整理

 

 

练习环境获取方法

1、关注公众号

2、输入:rhce

技术图片

技术图片

 

 

 

--end--

以上是关于RHCE实验记录总结的主要内容,如果未能解决你的问题,请参考以下文章

Face-anti-spoofing实验记录

求网页制作实验报告

AOV拓扑排序实验总结-1

复利计算总结

实验二

[计算机组成原理]——运算器实验