第九章 vim 程序编辑器

总结: 
1. Linux 底下的配置文件多为文本文件,故使用 vim 即可进行设定编辑;
 vim 可视为程序编辑器,可用以编辑 shell script, 配置文件等,避免打错字;
 vi 为所有 unix like 的操作系统都会存在的编辑器,且执行速度快速;
 vi 有三种模式,一般指令模式可变换到编辑与指令列模式,但编辑模式与指令列模式不能互换;
 常用的按键有 i, [Esc], :wq 等;
 vi 的画面大略可分为两部份,(1)上半部的本文与(2)最后一行的状态+指令列模式;
 数字是有意义的,用来说明重复进行几次动作的意思,如 5yy 为复制 5 列之意;
 光标的移动中,大写的 G 经常使用,尤其是 1G, G 移动到文章的头/尾功能!
 vi 的取代功能也很棒! :n1,n2s/old/new/g 要特别注意学习起来;
 小数点『 . 』为重复进行前一次动作,也是经常使用的按键功能!
 进入编辑模式几乎只要记住: i, o, R 三个按钮即可!尤其是新增一列的 o 与取代的 R
 vim 会主动的建立 swap 暂存档,所以不要随意断线!
 如果在文章内有对齐的区块,可以使用 [ctrl]-v 进行复制/贴上/删除的行为
 使用 :sp 功能可以分区窗口
 若使用 vim 来撰写网页,若需要 CSS 元素数据,可透过 [crtl]+x, [crtl]+o 这两个连续组合按键来取得关
键词
 vim 的环境设定可以写入在 ~/.vimrc 文件中;
 可以使用 iconv 进行文件语系编码的转换
 使用 dos2unix 及 unix2dos 可以变更文件每一列的行尾断行字符。

第十章 认识与学习 BASH

总结: 
1. 由于核心在内存中是受保护的区块,因此我们必须要透过『 Shell 』将我们输入的指令与 Kernel 沟通,好
让 Kernel 可以控制硬件来正确无误的工作
 学习 shell 的原因主要有:文字接口的 shell 在各大 distribution 都一样;远程管理时文字接口速度较快;
shell 是管理 Linux 系统非常重要的一环,因为 Linux 内很多控制都是以 shell 撰写的。
 系统合法的 shell 均写在 /etc/shells 文件中;
 用户默认登入取得的 shell 记录于 /etc/passwd 的最后一个字段;
 bash 的功能主要有:命令编修能力;命令与文件补全功能;命令别名设定功能;工作控制、前景背景控制;
程序化脚本;通配符
 type 可以用来找到执行指令为何种类型,亦可用于与 which 相同的功能;
 变量就是以一组文字或符号等,来取代一些设定或者是一串保留的数据
 变量主要有环境变量与自定义变量,或称为全局变量与局部变量
 使用 env 与 export 可观察环境变量,其中 export 可以将自定义变量转成环境变量;
 set 可以观察目前 bash 环境下的所有变量;
 $? 亦为变量,是前一个指令执行完毕后的回传值。在 Linux 回传值为 0 代表执行成功;
 locale 可用于观察语系资料;
 可用 read 让用户由键盘输入变量的值
 ulimit 可用以限制用户使用系统的资源情况
 bash 的配置文件主要分为 login shell 与 non-login shell。login shell 主要读取 /etc/profile 与 ~/.bash_profile,
non-login shell 则仅读取 ~/.bashrc
 在使用 vim 时,若不小心按了 [crtl]+s 则画面会被冻结。你可以使用 [ctrl]+q 来解除冻结
 通配符主要有: *, ?, [] 等等
 数据流重导向透过 >, 2>, < 之类的符号将输出的信息转到其他文件或装置去;
 连续命令的下达可透过 ; && || 等符号来处理
 管线命令的重点是:『管线命令仅会处理 standard output,对于 standard error output 会予以忽略』 『管线
命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行。』
 本章介绍的管线命令主要有:cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs 等。

第十一章 正规表示法与文件格式化处理

总结:
1. 正规表示法就是处理字符串的方法,他是以行为单位来进行字符串的处理行为;
 正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处理程
序;
 只要工具程序支持正规表示法,那么该工具程序就可以用来作为正规表示法的字符串处理之用;
 正规表示法与通配符是完全不一样的东西!通配符 (wildcard) 代表的是 bash 操作接口的一个功能, 但正
规表示法则是一种字符串处理的表示方式!
 使用 grep 或其他工具进行正规表示法的字符串比对时,因为编码的问题会有不同的状态,因此, 你最好
将 LANG 等变量设定为 C 或者是 en 等英文语系!
 grep 与 egrep 在正规表示法里面是很常见的两支程序,其中, egrep 支持更严谨的正规表示法的语法;
 由于编码系统的不同,不同的语系 (LANG) 会造成正规表示法撷取资料的差异。因此可利用特殊符号如
[:upper:] 来替代编码范围较佳;
 由于严谨度的不同,正规表示法之上还有更严谨的延伸正规表示法;
 基础正规表示法的特殊字符有: *, ., [], [-], [^], ^, $ 等!
 常见的支持正规表示法的工具软件有: grep , sed, vim 等等
 printf 可以透过一些特殊符号来将数据进行格式化输出;
 awk 可以使用『字段』为依据,进行数据的重新整理与输出;
 文件的比对中,可利用 diff 及 cmp 进行比对,其中 diff 主要用在纯文本文件方面的新旧版本比对
 patch 指令可以将旧版数据更新到新版 (主要亦由 diff 建立 patch 的补丁来源文件)

第十二章、学习 Shell Scripts

总结: 
1. shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的
语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想
要的处理目的
 shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了,因为 Shell 
scripts 的速度较慢,且使用的 CPU 资源较多,造成主机资源的分配不良。
 在 Shell script 的文件中,指令的执行是从上而下、从左而右的分析与执行;
 shell script 的执行,至少需要有 r 的权限,若需要直接指令下达,则需要拥有 r 与 x 的权限;
 良好的程序撰写习惯中,第一行要宣告 shell (#!/bin/bash) ,第二行以后则宣告程序用途、版本、作者等
 对谈式脚本可用 read 指令达成;
 要建立每次执行脚本都有不同结果的数据,可使用 date 指令利用日期达成;
 script 的执行若以 source 来执行时,代表在父程序的 bash 内执行之意!
 若需要进行判断式,可使用 test 或中括号 ( [] ) 来处理;
 在 script 内,$0, $1, $2..., $@ 是有特殊意义的!
 条件判断式可使用 if...then 来判断,若是固定变量内容的情况下,可使用 case $var in ... esac 来处理
 循环主要分为不定循环 (while, until) 以及固定循环 (for) ,配合 do, done 来达成所需任务!
 我们可使用 sh -x script.sh 来进行程序的 debug

第十三章、Linux 账号管理与 ACL 权限设定

总结: 
1. Linux 操作系统上面,关于账号与群组,其实记录的是 UID/GID 的数字而已;
 使用者的账号/群组与 UID/GID 的对应,参考 /etc/passwd 及 /etc/group 两个文件
 /etc/passwd 文件结构以冒号隔开,共分为七个字段,分别是『账号名称、密码、UID、GID、全名、家目录、
shell』
 UID 只有 0 与非为 0 两种,非为 0 则为一般账号。一般账号又分为系统账号 (1~999) 及可登入者账号
(大于 1000)
 账号的密码已经移动到 /etc/shadow 文件中,该文件权限为仅有 root 可以更动。该文件分为九个字段,内
容为『 账号名称、加密密码、密码更动日期、密码最小可变动日期、密码最大需变动日期、密码过期前警
告日数、密码失效天数、 账号失效日、保留未使用』
 使用者可以支持多个群组,其中在新建文件时会影响新文件群组者,为有效群组。而写入 /etc/passwd 的第
四个字段者, 称为初始群组。
 与使用者建立、更改参数、删除有关的指令为:useradd, usermod, userdel 等,密码建立则为 passwd;
 与群组建立、修改、删除有关的指令为:groupadd, groupmod, groupdel 等;
 群组的观察与有效群组的切换分别为:groups 及 newgrp 指令;
 useradd 指令作用参考的文件有: /etc/default/useradd, /etc/login.defs, /etc/skel/ 等等
 观察用户详细的密码参数,可以使用『 chage -l 账号 』来处理;
 用户自行修改参数的指令有: chsh, chfn 等,观察指令则有: id, finger 等
 ACL 的功能需要文件系统有支持,CentOS 7 预设的 XFS 确实有支持 ACL 功能!
 ACL 可进行单一个人或群组的权限管理,但 ACL 的启动需要有文件系统的支持;
 ACL 的设定可使用 setfacl ,查阅则使用 getfacl ;
 身份切换可使用 su ,亦可使用 sudo ,但使用 sudo 者,必须先以 visudo 设定可使用的指令;
 PAM 模块可进行某些程序的验证程序!与 PAM 模块有关的配置文件位于 /etc/pam.d/* 及 /etc/security/*
 系统上面账号登入情况的查询,可使用 w, who, last, lastlog 等;
 在线与使用者交谈可使用 write, wall,脱机状态下可使用 mail 传送邮件!

第十四章、磁盘配额(Quota)与进阶文件系统管理

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 指令,可以弹性的调整文件系统的大小

第十五章、例行性工作排程(crontab)

总结:
1. 系统可以透过 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 任务!

第十六章、进程管理与 SELinux 初探

总结: 
1. 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等),为实体文
件的型态存在;
 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操
作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。
 程序彼此之间是有相关性的,故有父进程与子进程之分。而 Linux 系统所有进程的父进程就是 init 这个
PID 为 1 号的进程。
 在 Linux 的进程呼叫通常称为 fork-and-exec 的流程!进程都会藉由父进程以复制 (fork) 的方式产生一个
一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一
个子进程的存在。
 常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会
被我们称为:服务 (daemon)。
 在工作管理 (job control) 中,可以出现提示字符让你操作的环境就称为前景 (foreground),至于其他工作就
可以让你放入背景 (background) 去暂停或运作。
 与 job control 有关的按键与关键词有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;
 进程管理的观察指令有: ps, top, pstree 等等;
 进程之间是可以互相控制的,传递的讯息 (signal) 主要透过 kill 这个指令在处理;
 进程是有优先级的,该项目为 Priority,但 PRI 是核心动态调整的,用户只能使用 nice 值去微调 PRI
 nice 的给予可以有: nice, renice, top 等指令;
 vmstat 为相当好用的系统资源使用情况观察指令;
 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 来管理!