【BASH】回顾与知识点梳理(三十五)

【BASH】回顾与知识点梳理 三十五

    • [三十五. 二十七至三十四章知识点总结及练习](#三十五. 二十七至三十四章知识点总结及练习)
      • [35.1 总结](#35.1 总结)
      • [35.2 练习](#35.2 练习)
      • [35.3 简答题](#35.3 简答题)

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

三十五. 二十七至三十四章知识点总结及练习

35.1 总结

  • Quota 可公平的分配系统上面的磁盘容量给用户;分配的资源可以是磁盘容量(block)或可建立文件数量(inode);

  • Quota 的限制可以有 soft/hard/grace time 等重要项目;

  • Quota 是针对整个 filesystem 进行限制,XFS 文件系统可以限制目录!

  • Quota 的使用必须要核心与文件系统均支持。文件系统的参数必须含有 usrquota, grpquota, prjquota

  • Quota 的 xfs_quota 实作的指令有 report, print, limit, timer... 等指令;

  • 磁盘阵列 (RAID) 有硬件与软件之分,Linux 操作系统可支持软件磁盘阵列,透过 mdadm 套件来达成;

  • 磁盘阵列建置的考虑依据为『容量』、『效能』、『资料可靠性』等;

  • 磁盘阵列所建置的等级常见有的 raid0, raid1, raid1+0, raid5 及 raid6

  • 硬件磁盘阵列的装置文件名与 SCSI 相同,至于 software RAID 则为 /dev/md[0-9]

  • 软件磁盘阵列的状态可藉由 /proc/mdstat 文件来了解;

  • LVM 强调的是『弹性的变化文件系统的容量』;

  • 与 LVM 有关的组件有: PV/VG/PE/LV 等组件,可以被格式化者为 LV

  • 新的 LVM 拥有 LVM thin volume 的功能,能够动态调整磁盘的使用率!

  • LVM 拥有快照功能,快照可以记录 LV 的数据内容,并与原有的 LV 共享未更动的数据,备份与还原就变的很简单;

  • XFS 透过 xfs_growfs 指令,可以弹性的调整文件系统的大小

  • 系统可以透过 at 这个指令来排程单一工作的任务!『at TIME』为指令下达的方法,当 at 进入排程后, 系统执行该排程工作时,会到下达时的目录进行任务;

  • at 的执行必须要有 atd 服务的支持,且 /etc/at.deny 为控制是否能够执行的使用者账号;

  • 透过 atq, atrm 可以查询与删除 at 的工作排程;

  • batch 与 at 相同,不过 batch 可在 CPU 工作负载小于 0.8 时才进行后续的工作排程;

  • 系统的循环例行性工作排程使用 crond 这个服务,同时利用 crontab -e 及 /etc/crontab 进行排程的安排;

  • crontab -e 设定项目分为六栏,『分、时、日、月、周、指令』为其设定依据;

  • /etc/crontab 设定分为七栏,『分、时、日、月、周、执行者、指令』为其设定依据;

  • anacron 配合 /etc/anacrontab 的设定,可以唤醒停机期间系统未进行的 crontab 任务!

  • 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等),为实体文件的型态存在;

  • 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。

  • 程序彼此之间是有相关性的,故有父进程与子进程之分。而 Linux 系统所有进程的父进程就是 init 这个PID 为 1 号的进程。

  • 在 Linux 的进程呼叫通常称为 fork-and-exec 的流程!进程都会藉由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。

  • 常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为:服务 (daemon)。

  • 在工作管理 (job control) 中,可以出现提示字符让你操作的环境就称为前景 (foreground),至于其他工作就可以让你放入背景 (background) 去暂停或运作。(jobs,fg,bg, kill -signal %n)

  • 与 job control 有关的按键与关键词有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;

  • 进程管理的观察指令有: ps, top, pstree 等等;

  • 进程之间是可以互相控制的,传递的讯息 (signal) 主要透过 kill 这个指令在处理;

  • 进程是有优先级的,该项目为 Priority,但 PRI 是核心动态调整的,用户只能使用 nice 值去微调 PRI

  • nice 的给予可以有: nice, renice, top 等指令;

  • vmstat 为相当好用的系统资源使用情况观察指令;(-a -d)

  • SELinux 当初的设计是为了避免使用者资源的误用,而 SELinux 使用的是 MAC 委任式存取设定;

  • SELinux 的运作中,重点在于主体进程 (Subject) 能否存取目标文件资源 (Object) ,这中间牵涉到政策(Policy) 内的规则, 以及实际的安全性本文类别 (type);

  • 安全性本文的一般设定为:『Identify:role:type』其中又以 type 最重要;

  • SELinux 的模式有: enforcing, permissive, disabled 三种,而启动的政策 (Policy) 主要是 targeted

  • SELinux 启动与关闭的配置文件在: /etc/selinux/config

  • SELinux 的启动与观察: getenforce, sestatus 等指令

  • 重设 SELinux 的安全性本文可使用 restorecon 与 chcon

  • 在 SELinux 有启动时,必备的服务至少要启动 auditd 这个!

  • 若要管理预设的 SELinux 布尔值,可使用 getsebool, setsebool 来管理!

  • 早期的服务管理使用 systemV 的机制,透过 /etc/init.d/*, service, chkconfig, setup 等指令来管理服务的启动/关闭/预设启动;

  • 从 CentOS 7.x 开始,采用 systemd 的机制,此机制最大功能为平行处理,并采单一指令管理 (systemctl),开机速度加快!

  • systemd 将各服务定义为 unit,而 unit 又分类为 service, socket, target, path, timer 等不同的类别,方便管理与维护

  • 启动/关闭/重新启动的方式为: systemctl [start|stop|restart] unit.service

  • 设定预设启动/预设不启动的方式为: systemctl [enable|disable] unit.service

  • 查询系统所有启动的服务用 systemctl list-units --type=service 而查询所有的服务 (含不启动) 使用systemctl list-unit-files --type=service

  • systemd 取消了以前的 runlevel 概念 (虽然还是有兼容的 target),转而使用不同的 target 操作环境。常见操作环境为 multi-user.target 与 graphical.target。 不重新启动而转不同的操作环境使用 systemctl isolate unit.target,而设定预设环境则使用 systemctl set-default unit.target

  • systemctl 系统默认的配置文件主要放在 /usr/lib/systemd/system,管理员若要修改或自行设计时,则建议放在 /etc/systemd/system/ 目录下。

  • 管理员应使用 man systemd.unit, man systemd.service, man systemd.timer 查询 /etc/systemd/system/ 底下配置文件的语法, 并使用 systemctl daemon-reload 加载后,才能自行撰写服务与管理服务喔!

  • 除了 atd 与 crond 之外,可以 透过 systemd.timer 亦即 timers.target 的功能,来使用 systemd 的时间管理功能。

  • 一些不需要的服务可以关闭喔!

35.2 练习

RAID+LVM

情境模拟题一:由于 LVM 可以弹性调整 filesystem 的大小,但是缺点是可能没有加速与硬件备份(与快照不同)的功能。 而磁盘阵列则具有效能与备份的功能,但是无法提供类似 LVM 的优点。在此情境中,我们想利用『在 RAID 上面建置 LVM』的功能,以达到两者兼顾的能力。

  • 目标:测试在 RAID 磁盘上面架构 LVM 系统;
  • 需求:需要具有磁盘管理的能力,包括 RAID 与 LVM;
  • 前提:会用到本章建立出来的 /dev/vda5, /dev/vda6, /dev/vda7 三个分区槽!
  1. 重新处理系统,我们在这个练习当中,需要 /dev/vda5, /dev/vda6, /dev/vda7 建置成一个 RAID5 的/dev/md0 磁盘!详细的作法这里就不谈了! 你得要使用 gdisk 来处理成为如下的模样:
bash 复制代码
[root@study ~]# gdisk -l /dev/vda
Number Start (sector) End (sector) Size Code Name
 1 2048 6143 2.0 MiB EF02
 2 6144 2103295 1024.0 MiB 0700
 3 2103296 65026047 30.0 GiB 8E00
 4 65026048 67123199 1024.0 MiB 8300 Linux filesystem
 5 67123200 69220351 1024.0 MiB FD00 Linux RAID
 6 69220352 71317503 1024.0 MiB FD00 Linux RAID
 7 71317504 73414655 1024.0 MiB FD00 Linux RAID
  1. 开始使用 mdadm 来建立一个简单的 RAID5 数组!简易的流程如下:
bash 复制代码
[root@study ~]# mdadm --create /dev/md0 --auto=yes --level=5 \
> --raid-devices=3 /dev/vda{5,6,7}
[root@study ~]# mdadm --detail /dev/md0 | grep -i uuid
 UUID : efc7add0:d12ee9ca:e5cb0baa:fbdae4e6
[root@study ~]# vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=efc7add0:d12ee9ca:e5cb0baa:fbdae4e6

若无出现任何错误讯息,此时你已经具有 /dev/md0 这个磁盘阵列装置了!接下来让我们处理 LVM 吧!

  1. 开始处理 LVM ,现在我们假设所有的参数都使用默认值,包括 PE ,然后 VG 名为 raidvg ,LV 名为raidlv ,底下为基本的流程:
bash 复制代码
[root@study ~]# pvcreate /dev/md0 <==建立 PV
[root@study ~]# vgcreate raidvg /dev/md0 <==建立 VG
[root@study ~]# lvcreate -L 1.5G -n raidlv raidvg <==建立 LM
[root@study ~]# lvscan
ACTIVE '/dev/raidvg/raidlv' [1.50 GiB] inherit

这样就搞定了 LVM 了!而且这个 LVM 是架构在 /dev/md0 上面的喔!然后就是文件系统的建立与挂载了!

  1. 尝试建立成为 XFS 文件系统,且挂载到 /srv/raidlvm 目录下:
bash 复制代码
[root@study ~]# mkfs.xfs /dev/raidvg/raidlv
[root@study ~]# blkid /dev/raidvg/raidlv
/dev/raidvg/raidlv: UUID="4f6a587d-3257-4049-afca-7da1d405117d" TYPE="xfs"
[root@study ~]# vim /etc/fstab
UUID="4f6a587d-3257-4049-afca-7da1d405117d" /srv/raidlvm xfs defaults 0 0
[root@study ~]# mkdir /srv/raidlvm
[root@study ~]# mount -a
[root@study ~]# df -Th /srv/raidlvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/raidvg-raidlv xfs 1.5G 33M 1.5G 3% /srv/raidlvm
  1. 上述就是 LVM 架构在 RAID 上面的技巧,之后的动作都能够使用本章的其他管理方式来管理, 包括RAID 热拔插机制、LVM 放大缩小机制等等。

systemd

情境模拟题:透过设定、启动、观察等机制,完整的了解一个服务的启动与观察现象。

  • 目标:了解 daemon 的控管机制,以 sshd daemon 为例;
  • 前提:需要对本章已经了解,尤其是 systemd 的管理 部分;
  • 需求:已经有 sshd 这个服务,但没有修改过埠口!

在本情境中,我们使用 sshd 这个服务来观察,主要是假设 sshd 要开立第二个服务,这个第二个服务的 port 放行于 222 ,那该如何处理? 可以这样做看看:

  1. 基本上 sshd 几乎是一定会安装的服务!只是我们还是来确认看看好了!
bash 复制代码
[root@study ~]# systemctl status sshd.service
sshd.service - OpenSSH server daemon
 Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
 Active: active (running) since Thu 2015-08-13 14:31:12 CST; 20h ago
[root@study ~]# cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
  1. 透过观察 man sshd,我们可以查询到 sshd 的配置文件位于 /etc/ssh/sshd_config 这个文件内!再 man sshd_config 也能知道原来埠口是使用 Port 来规范的! 因此,我想要建立第二个配置文件,档名假设为/etc/ssh/sshd2_config 这样!
bash 复制代码
[root@study ~]# cd /etc/ssh
[root@study ssh]# cp sshd_config sshd2_config
[root@study ssh]# vim sshd2_config
Port 222
# 随意找个地方加上这个设定值!你可以在文件的最下方加入这行也 OK 喔!
  1. 接下来开始修改启动脚本服务档!
bash 复制代码
[root@study ~]# cd /etc/systemd/system
[root@study system]# cp /usr/lib/systemd/system/sshd.service sshd2.service
[root@study system]# vim sshd2.service
[Unit]
Description=OpenSSH server daemon 2
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -f /etc/ssh/sshd2_config -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
[root@study system]# systemctl daemon-reload
[root@study system]# systemctl enable sshd2
[root@study system]# systemctl start sshd2
[root@study system]# tail -n 20 /var/log/messages
# semanage port -a -t PORT_TYPE -p tcp 222
 where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.
# 认真的看!你会看到上面这两句!也就是 SELinux 的埠口问题!请解决!
[root@study system]# semanage port -a -t ssh_port_t -p tcp 222
[root@study system]# systemctl start sshd2
[root@study system]# netstat -tlnp | grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1300/sshd
tcp 0 0 0.0.0.0:222 0.0.0.0:* LISTEN 15275/sshd
tcp6 0 0 :::22 :::* LISTEN 1300/sshd
tcp6 0 0 :::222 :::* LISTEN 15275/sshd

35.3 简答题

  • 在大量新增账号范例中, 如果我想要让每个用户均具有 soft/hard 各为 40MB/50MB 的容量时,应该如何修改这个 script ?

    你得先要依据本章的作法,先将 /home 制作好 quota 的环境然后, 你可以在 do...done 内的最后一行,新增一行内容为:

    bash 复制代码
    xfs_quota -x -c "limit -u bsoft=40M bhard=50M ${username}" /home

    这样就可以在制作用户时,指定更新密码且给予 quota 的限制!

  • 如果我想要让 RAID 具有保护数据的功能,防止因为硬件损毁而导致数据的遗失,那我应该要选择的 RAID 等级可能有哪些?

    具有备份数据的有: RAID-1, RAID-5, RAID-6, RAID-10

  • 在预设的 LVM 设定中,请问 LVM 能否具有『备份』的功能?

    是有的,就是那个快照 (snopshot) 的功能,此功能即可进行数据的备份!

  • 如果你的计算机主机有提供 RAID 0 的功能,你将你的三颗硬盘全部在 BIOS 阶段使用 RAID 芯片整合成为一颗大磁盘, 则此磁盘在 Linux 系统当中的文件名为何?

    由于硬件磁盘阵列是在 BIOS 阶段完成的,因此 Linux 系统会捉到一个完整的大的 RAID 磁盘,此磁盘的文件名就会是『 /dev/sda 』! 但如果是 Intel 的芯片组,则还是可能会成为 /dev/md127 等相关的档名!

  • 今天假设我有一个指令程序,名称为: ping.sh 这个档名!我想要让系统每三分钟执行这个文件一次, 但是偏偏这个文件会有很多的讯息显示出来,所以我的 root 账号每天都会收到差不多四百多封的信件,光是收信就差不多快要疯掉了! 那么请问应该怎么设定比较好呢?

    这个涉及数据流重导向的问题,我们可以将他导入文件或者直接丢弃!如果该讯息不重要的话, 那么就予以丢弃,如果讯息很重要的话,才将他保留下来!假设今天这个命令不重要, 所以将他丢弃掉!因此,可以这样写:

bash 复制代码
*/3 * * * * root /usr/local/ping.sh > /dev/null 2>&1
  • 您预计要在 2024 年的 2 月 14 日寄出一封给 kiki ,只有该年才寄出!该如何下达指令?
bash 复制代码
echo "happy"|at 1am 2024-02-14
  • 下达 crontab -e 之后,如果输入这一行,代表什么意思?* 15 * * 1-5 /usr/local/bin/tea_time.sh
    周一至周五每天的15点的每分钟执行tea_time.sh
    应该写成
    30 15 * * 1-5 /usr/local/bin/tea_time.sh
  • 我用 vi 编辑 /etc/crontab 这个文件,我编辑的那一行是这样的:
    25 00 * * 0 /usr/local/bin/backup.sh这一行代表的意义是什么?
    这一行代表...没有任何意义!因为语法错误!您必须要了解,在 /etc/crontab 当中每一行都必须要有使用者才行!所以,应
    该要将原本那行改成:
    25 00 * * 0 root /usr/local/bin/backup.sh
  • 请问,您的系统每天、每周、每个月各有进行什么工作?
bash 复制代码
[root@node-135 backups]# ll /etc/cron.monthly/
total 0
[root@node-135 backups]# ll /etc/cron.weekly/
total 0
[root@node-135 backups]# ll /etc/cron.daily/
total 16
-rwx------. 1 root root 219 Apr  1  2020 logrotate
-rwxr-xr-x. 1 root root 618 Oct 30  2018 man-db.cron
-rwx------. 1 root root 208 Apr 11  2018 mlocate
-rwx------. 1 root root 558 May 18  2022 rhsmd
  • 每个星期六凌晨三点去系统搜寻一下内有 SUID/SGID 的任何文件!并将结果输出到 /tmp/uidgid.files
bash 复制代码
vim /etc/crontab
0 3 * * 6 root find / -perm /6000 >/tmp/uidgid.files
  • 使用 netstat -tul 与 netstat -tunl 有什么差异?为何会这样?
    使用 n 时, netstat 就不会使用主机名与服务名称 (hostname & service_name) 来显示, 取而代之的则是以 IP 及 port number 来显示的。IP 的分析与 /etc/hosts 及 /etc/resolv.conf 有关, 这个在未来服务器篇才会提到。至于 port number 则与 /etc/services 有关,请自行参考喔!
  • 你能否找出来,启动 port 3306 这个埠口的服务为何?
    透过搜寻 /etc/services 内容,得到 port 3306 为 mysql 所启动的埠口喔!查询 google, 可得到 mysql 为一种网络数据库系统软件。
bash 复制代码
[root@node-135 backups]# grep '3306' /etc/services
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
  • 你可以透过哪些指令查询到目前系统默认开机会启动的服务?
bash 复制代码
systemctl list-units 以及 systemctl list-unit-files
  • 承上,那么哪些服务『目前』是在启动的状态?
    结果同上!只是若要进一步的信息,应该使用 systemctl status [unit.service] 一项一项查询!

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

相关推荐
编程版小新6 分钟前
C++初阶:STL详解(四)——vector迭代器失效问题
开发语言·c++·迭代器·vector·迭代器失效
c4fx25 分钟前
Delphi5利用DLL实现窗体的重用
开发语言·delphi·dll
鸽芷咕1 小时前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
代码雕刻家1 小时前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
Fan_web1 小时前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html
梦想科研社1 小时前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
风等雨归期1 小时前
【python】【绘制小程序】动态爱心绘制
开发语言·python·小程序