1、计算机概论

· 根据本章内文的说明,请找出目前全世界跑的最快的超级计算机的:(1)系统名称 (2)所在位置 (3)使用的CPU 型号与规格 (4)总共使用的 CPU 数量 (5)全功率操作 1 天时,可能耗用的电费 (请上台电网站查询相关电价来计算)。

· 动动手实作题:假设你不知道你的主机内部的各项组件数据,请拆开你的主机机壳,并将内部所有的组件
拆开,并且依序列出:
o CPU 的厂牌、型号、最高频率;
o 主存储器的容量、接口 (DDR/DDR2/DDR3 等);
o 显示适配器的接口 (AGP/PCIe/内建) 与容量
o 主板的厂牌、南北桥的芯片型号、BIOS 的厂牌、有无内建的网卡或声卡等
o 硬盘的连接接口 (SATA/SAS 等)、硬盘容量、转速、缓冲存储器容量等。
然后再将他组装回去。注意,拆装前务必先取得你主板的说明书,因此你可能必须要上网查询上述的各项数据。

· 利用软件:假设你不想要拆开主机机壳,但想了解你的主机内部各组件的信息时,该如何是好? 如果使用
的是 Windows 操作系统,可使用 CPU-Z(http://www.cpuid.com/cpuz.php)这套软件,如果是 Linux 环境下,可
以使用『cat /proc/cpuinfo』 及使用『lspci』来查阅各项组件的型号;

· 如本章图 0.2.1 所示,找出第四代 Intel i7 4790 CPU 的: (1)与南桥沟通的 DMI 带宽有多大? (2)第二层
快取的容量多大? (3)最大 PCIe 通道数量有多少?并据以说明主板上面 PCIe 插槽的数量限制。(请
google 此 CPU 相关资料即可发现)

· 由 google 查询 Intel SSD 520 固态硬盘相关的菜单,了解 (1)连接界面、(2)最大读写速度及 (3)最大随机读
写数据 (IOPS) 的数据。


2、Linux是什么与如何学习

(要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看)
实作题部分:
· 请上网找出目前 Linux 核心的最新稳定版与发展中版本的版本号码,请注明查询的日期与版本的对应。
· 请上网找出 Linux 的吉祥物企鹅的名字,以及最原始的图档画面。(提示:请前往 http://www.linux.org 查阅)
· 请上网找出 Andriod 与 Linux 核心版本间的关系。(提示:请前往 https://zh.wikipedia.org/wiki/Android 查阅)

简答题部分:
· 你在你的主机上面安装了一张网络卡,但是开机之后,系统却无法使用,你确定网络卡是好的,那么可能的问题出在哪里?该如何解决?                                                                                                                                                                                      因为所有的硬件都没有问题,所以,可能出问题的地方在于系统的核心(kernel) 不支持这张网络卡。解决的方法,(1)到网络卡
的开发商网站,(2)下载支持你主机操作系统的驱动程序, (3)安装网卡驱动程序后,就可以使用了。

· 一个操作系统至少要能够完整的控制整个硬件,请问,操作系统应该要控制硬件的哪些单元?                                                     根据硬件的运作,以及数据在主机上面的运算情况与写入/读取情况,我们知道至少要能够控制:(1)input/output control, (2)device control, (3)process management, (4)file management. 等等

· 我在 Windows 上面玩的游戏,可不可以拿到 Linux 去玩?
当然不行!因为游戏也是一个应用程序 (application),他必须要使用到核心所提供的工具来开发他的游戏, 所以这个游戏是
不可在不同的平台间运作的。除非这个游戏已经进行了移植。

· Linux 本身仅是一个核心与相关的核心工具而已,不过,他已经可以驱动所有的硬件, 所以,可以算是一个很阳春的操作系统了。经过其他应用程序的开发之后,被整合成为 Linux distribitions。请问众多的distributions 之间,有何异同?
相同:(1)同样使用 http://www.kernel.org 所释出的核心; (2)支持同样的标准,如 FHS、LSB 等; (3)使用几乎相同的自由软
件 (例如 GNU 里面的 gcc/glibc/vi/apache/bind/sendmail... ); (4)几乎相同的操作接口 (例如均使用 bash/KDE/GNOME 等等)。
不同:使用的 kernel 与各软件的版本可能会不同;各开发商加入的应用工具不同,使用的套件管理模式不同(dpkg 与 RPM)

· Unix 是谁写出来的? GNU 计划是谁发起的?
Unix 是 Ken Thompson 写的,1973 年再由 Dennis Ritchie 以 C 语言改写成功。 至于 GNU 与 FSF 则是 Richard Stallman 发
起的。

· GNU 的全名为何?他主要由那个基金会支持?
GNU 是 GNU is Not Unix 的简写,是个无穷循环! 另外,这个计划是由自由软件基金会 (Free Software Foundation, FSF) 所支
持的! 两者都是由 Stallman 先生所发起的!

· 何谓多人 ( Multi-user ) 多任务 ( Multitask )?
Multiuser 指的是 Linux 允许多人同时连上主机之外,每个用户皆有其各人的使用环境,并且可以同时使用系统的资源!
Multitask 指的是多任务环境,在 Linux 系统下, CPU 与其他例如网络资源可以同时进行多项工作, Linux 最大的特色之一
即在于其多任务时,资源分配较为平均!

· 简单说明 GNU General Public License ( GPL ) 与 Open Source 的精神:
1. GPL 的授权之软件,乃为自由软件(Free software),任何人皆可拥有他; 2. 开发 GPL 的团体(或商业企业)可以经由该软
件的服务来取得服务的费用; 3. 经过 GPL 授权的软件,其属于 Open source 的情况,所以应该公布其原始码; 4. 任何人
皆可修改经由 GPL 授权过的软件,使符合自己的需求; 5. 经过修改过后 Open source 应该回馈给 Linux 社群。

· 什么是 POSIX ?为何说 Linux 使用 POSIX 对于发展有很好的影响?
POSIX 是一种标准规范,主要针对在 Unix 操作系统上面跑的程序来进行规范。若你的操作系统符合 POSIX ,则符合 POSIX 
的程序就可以在你的操作系统上面运作。 Linux 由于支持 POSIX ,因此很多 Unix 上的程序可以直接在 Linux 上运作, 因
此程序的移植相当简易!也让大家容易转换平台,提升 Linux 的使用率。

· 简单说明 Linux 成功的因素?
1. 藉由 Minix 操作系统开发的 Unix like ,没有版权的纠纷;
2. 藉助于 GNU 计划所提供的各项工具软件, gcc/bash 等;
3. 藉由 Internet 广为流传;
4. 藉由支持 POSIX 标准,让核心能够适合所有软件的开发;
5. 托瓦兹强调务实,虚拟团队的自然形成!


3、主机规划与磁盘分区

实作题部分:

· 请分析你的家庭计算机,以你的硬件配备来计算可能产生的耗电量,最终再以计算出来的总瓦数乘上你可
能开机的时间, 以推估出一年你可能会花费多少钱在你的这部主机上面?
硬件里面包括 CPU/硬盘/主板/内存/显示适配器/屏幕等等都会消耗电力,同时电源供应器也会消耗一部份的电力。 若有实际
测量工具时,请使用测量结果来计算。若无测量工具,请上网找出每个组件的最大理论消耗功率来计算。
问答题部分:

· 一部计算机主机是否只要 CPU 够快,整体速度就会提高?
不见得!一部计算机系统的速度与整体计算机系统的运作有关,每个组件皆会影响计算机的速度! 这包括了内存、CPU、AGP
与显示适配器速度,硬盘的速度以及其他相关的输入输出接口等等! 所以,如果您的系统是升级的,那么还得必须要注意各
个旧组件是否可以保留, 或者旧的可以用的组件必须要舍弃!

· Linux 对于硬件的要求需要的考虑为何?是否一定要很高的配备才能安装 Linux ?
Linux 对于硬件的要求是因『服务种类、服务范围及主机的角色』而定的。例如一部专门用来运算数值解析的 Linux 运算工
作站,需要比较强大的 CPU 与足够的 RAM 来进行工作,至于一般家庭用的仅用来做为 ADSL 宽带分享器的 Linux 主机,
则只要 P-III 等级的计算机,甚至 P-II 系列的等级,就可以很顺利的运行 Linux 了。

· 一部好的主机在安装之前,最好先进行规划,哪些是必定需要注意的 Linux 主机规划事项?
依据上一题的答案内容,我们知道 Linux 对于硬件的要求是『因地制宜』地!所以,要进行 Linux 的安装之前,一定需要规
划 Linux 主机的定位与角色!因此, Linux 的主机是否开放网络服务?这部主机的未来规划中,是否需要进行大量的运算?
这 部主机是否需要提供很大的硬盘容量来服务客户端的使用?这部主机预计开放的网络服务内容? 等等,都是需要经过考
虑的,尤其未来的『套件选择安装』上面,更需要依据这些规划来设定。

· 请写下下列配备中,在 Linux 的装置文件名:
SATA 硬盘:
CDROM:
打印机:
软盘驱动器:
o SATA 硬盘:/dev/sd[a-d]
o CDROM:/dev/cdrom
o 打印机:/dev/lp[0-2]
o 软盘驱动器:/dev/fd[0-1]

· 目前在个人计算机上面常见的硬盘与主板的连接接口有哪两个?
有内建的 SATA 界面与外接式的 USB 界面


4、安装centos 7.x

· Linux 的目录配置以『树状目录』来配置,至于磁盘分区槽(partition)则需要与树状目录相配合! 请问,在
预设的情况下,在安装的时候系统会要求你一定要分区出来的两个 Partition 为何?
就是根目录『/』与内存置换空间『Swap』

· 预设使用 MBR 分区方式的情况下,在第二颗 SATA 磁盘中,分区『六个有用』的分区槽 (具有 filesystem 
的) ,此外,已知有两个 primary 的分区类型!请问六个分区槽的档名?
/dev/sdb1(primary)
/dev/sdb2(primary)
/dev/sdb3(extended)
/dev/sdb5(logical 底下皆为 logical)
/dev/sdb6
/dev/sdb7
/dev/sdb8
请注意,5-8 这四个 logical 容量相加的总和为 /dev/sdb3!

· 什么是 GMT 时间?台北时间差几个钟头?
GMT 时间指的是格林威治时间,称为标准的时间,而台北时间较 GMT 快了 8 小时!

· 软件磁盘阵列的装置文件名为何?
RAID : /dev/md[0-127];
· 如果我的磁盘分区时使用 MBR 方式,且设定了四个 Primary 分区槽,但是磁盘还有空间,请问我还能不能使用这些空间?
不行!因为最多只有四个 Primary 的磁盘分区槽,没有多的可以进行分区了!且由于没有 Extended ,所以自然不能再使用
Logical 分区


5、首次登入与在线求助

情境模拟题一:我们在纯文本界面,例如 tty2 里面看到的欢迎画面,就是在那个 login:之前的画面(CentOS Linux 7 ...)
是怎么来的?
· 目标:了解到终端机接口的欢迎讯息是怎么来的?
· 前提:欢迎讯息的内容,是记录到/etc/issue 当中的
· 需求:利用 man 找到该文件当中的变量内容
情境模拟题一的解决步骤:
1. 欢迎画面是在/etc/issue 文件中,你可以使用『nano /etc/issue』看看该文件的内容(注意,不要修改这个文件
内容,看完就离开),这个文件的内容有点像底下这样:
\S
Kernel \r on an \m
2. 与 tty3 比较之下,发现到核心版本使用的是 \r 而硬件等级则是 \m 来取代,这两者代表的意义为何? 由
于这个文件的档名是 issue,所以我们使用『man issue』来查阅这个文件的格式;
3. 透过上一步的查询我们会知道反斜杠(\)后面接的字符是与 agetty(8)及 mingetty(8)有关,故进行『man agetty』
这个指令的查询。
4. 由于反斜杠(\)的英文为『escape』因此在上个步骤的 man 环境中,你可以使用『/escape』来搜寻各反斜杠后
面所接字符所代表的意义为何。
5. 请自行找出:如果我想要在/etc/issue 文件内表示『时间(localtime)』与『tty 号码(如 tty1, tty2 的号码)』的话,
应该要找到那个字符来表示(透过反斜杠的功能)?(答案为:\t 与 \l)

简答题部分:
· 简单的查询一下,Physical console / Virtual console / Terminal 的说明为何?
console 有『控制台』的意思在里面,因此你可以这样看的:
o 实体控制面板:实体的屏幕、键盘、鼠标等界面,让妳可以使用该配备来操作系统的环境,就称为实体控制面板
(Physical console)
o 虚拟控制台:由系统衍生出的虚拟控制面板,你可以透过该虚拟控制面板搭配你自己系统的实体配备,来操作远程
系统的环境。每个虚拟控制台都是独立运作的。
o 终端机:你可以用该界面来取得一个可以控制系统的 shell 环境。
由这些定义来看,一般来说,我们取得可以与系统互动的环境,大致上都称为 terminal 就是了。

· 请问如果我以文本模式登入 Linux 主机时,我有几个终端机接口可以使用?如何切换各个不同的终端机接
口?
共有六个, tty1 ~ tty6 ,切换的方式为 Crtl + Alt + [F1]~[F6]

· 在 Linux 系统中,/VBird 与/vbird 是否为相同的文件?
两者为不同的文件,因为 Linux 系统中,大小写字母代表意义不一样!

· 我想要知道 date 如何使用,应该如何查询?
最简单的方式就是使用 man date 或 info date 来查看,如果该套件有完整说明的话,那么应该也可以在 /usr/share/doc 里面找
到说明档!

· 我想要在今天的 1:30 让系统自己关机,要怎么做?
shutdown -h 1:30

· 如果我 Linux 的 X Window 突然发生问题而挂掉,但 Linux 本身还是好好的,那么我可以按下哪三个按
键来让 X window 重新启动?
[crtl]+[alt]+[backspace]

· 我想要知道 2010 年 5 月 2 日是星期几?该怎么做?
最简单的方式直接使用 cal 5 2010 即可找出 2010 年 5 月份的月历。

· 使用 man date 然后找出显示目前的日期与时间的参数,成为类似:2015/10/16-20:03
date +%Y/%m/%d-%H:%M

· 若以 X-Window 为预设的登入方式,那请问如何进入 Virtual console 呢?
可以按下 [Ctrl] + [Alt] + [F2] ~ [F6] 进入 Virtual console ( 共六个 ); 而按下 [Ctrl] + [Alt] + [F1] 可回到 X-Window 的 desktop 
中!

· 简单说明在 bash shell 的环境下, [tab] 按键的用途?
[Tab] 按键可做为命令补齐或文件补齐的功能,与所接的指令位置有关。 接在一串指令的第一个单字后面,则为命令补齐,
否则则为文件补齐! 目前尚有选项/参数补齐的功能。

· 如何强制中断一个程序的进行?(利用按键,非利用 kill 指令)
可以利用 [Ctrl] + c 来中断!

· Linux 提供相当多的在线查询,称为 man page,请问,我如何知道系统上有多少关于 passwd 的说明?又,
可以使用其他的程序来取代 man 的这个功能吗?
可以利用 man -f passwd 来查询,另外,如果有提供 info 的文件数据时 (在 /usr/share/info/ 目录中) ,则能够利用 info passwd 
来查询之!

· 在 man 的时候, man page 显示的内容中,指令(或文件)后面会接一组数字,这个数字若为 1, 5, 8 ,表示
该查询的指令(或文件)意义为何?
代表意义为 1) 一般用户可以使用的指令或可执行文件案 5)一些配置文件的文件内容格式 8)系统管理员能够使用的管理指
令。

· man page 显示的内容的文件是放置在哪些目录中?
放置在 /usr/share/man/ 与 /usr/local/man 等默认目录中。

· 请问这一串指令『 foo1 -foo2 foo3 foo4 』中,各代表什么意义?
foo1 一定是指令, -foo2 则是 foo1 这个指令的选择项目参数, foo3 与 foo4 则不一定, 可能是 foo1 的参数设定值,也
可能是额外加入的 parameters。

· 当我输入 man date 时,在我的终端机却出现一些乱码,请问可能的原因为何?如何修正?
如果没有其他错误的发生,那么发生乱码可能是因为语系的问题所致。 可以利用 export LANG=en_US.utf8 或者是 export 
LC_ALL=en_US.utf8 等设定来修订这个问题。

· 我输入这个指令『ls -al /vbird』,系统回复我这个结果:『ls: /vbird: No such file or directory』 请问发生了什么事?』
不要紧张,很简单的英文,因为系统根本没有 /vbird 这个文件的存在啊! ^_^

· 我想知道目前系统有多少指令是以 bz 为开头的,可以怎么作?
直接输入 bz[tab][tab] 就可以知道了!

· 承上题,在出现的许多指令中,请问 bzip2 是干嘛用的?
在使用 man bzip2 之后,可以发现到,其实 bzip2 是用来作为压缩与解压缩文件案用的!

· 在终端机里面登入后,看到的提示字符 $ 与 # 有何不同?平时操作应该使用哪一个?
# 代表以 root 的身份登入系统,而 $ 则代表一般身份使用者。依据提示字符的不同, 我们可以约略判断登入者身份。一般
来说,建议日常操作使用一般身份使用者登入,亦即是 $ !

· 我使用 dmtsai 这个账号登入系统了,请问我能不能使用 reboot 来重新启动? 若不能,请说明原因,若可以,请说明指令如何下达?
理论上 reboot 仅能让 root 执行。不过,如果 dmtsai 是在主机前面以图形接口登入时,则 dmtsai 还是可以透过图形接口功能来
关机。


6、Linux的文件权限与目录配置

· 早期的 Unix 系统文件名最多允许 14 个字符,而新的 Unix 与 Linux 系统中,文件名最多可以容许几个字符?
由于使用 Ext2/Ext3/Ext4/xfs 文件系统,单一档名可达 255 字符

· 当一个一般文件权限为 -rwxrwxrwx 则表示这个文件的意义为?
任何人皆可读取、修改或编辑、可以执行,但不一定能删除。

· 我需要将一个文件的权限改为 -rwxr-xr-- 请问该如何下达指令?
chmod 754 filename 或 chmod u=rwx,g=rx,o=r filename

· 若我需要更改一个文件的拥有者与群组,该用什么指令?
chown, chgrp

· 请问底下的目录与主要放置什么数据:
/etc/, /boot, /usr/bin, /bin, /usr/sbin, /sbin, /dev, /var/log, /run
o /etc/:几乎系统的所有配置文件案均在此,尤其 passwd,shadow
o /boot:开机配置文件,也是预设摆放核心 vmlinuz 的地方
o /usr/bin, /bin:一般执行档摆放的地方
o /usr/sbin, /sbin:系统管理员常用指令集
o /dev:摆放所有系统装置文件的目录
o /var/log:摆放系统注册表文件的地方
o /run:CentOS 7 以后才有,将经常变动的项目(每次开机都不同,如程序的 PID)移动到内存暂存,所以 /run 并不占实际磁盘容量

· 若一个文件的档名开头为『 . 』,例如 .bashrc 这个文件,代表什么?另外,如何显示出这个文件名与他的相关属性?
有『 . 』为开头的为隐藏档,需要使用 ls -a 这个 -a 的选项才能显示出隐藏文件的内容,而使用 ls -al 才能显示出属性。


7、Linux文件与目录管理

情境模拟题一:假设系统中有两个账号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同支持一个名为project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。 请问该目录的权限设定应为何?请先以传统权限说明,再以 SGID 的功能解析。
· 目标:了解到为何项目开发时,目录最好需要设定 SGID 的权限!
· 前提:多个账号支持同一群组,且共同拥有目录的使用权!
· 需求:需要使用 root 的身份来进行 chmod, chgrp 等帮用户设定好他们的开发环境才行! 这也是管理员的重要任务之一!
首先我们得要先制作出这两个账号的相关数据,账号/群组的管理在后续我们会介绍, 您这里先照着底下的指令来制作即可:
[root@study ~]# groupadd project <==增加新的群组
root@study ~]# useradd -G project alex <==建立 alex 账号,且支持 project
[root@study ~]# useradd -G project arod <==建立 arod 账号,且支持 project
[root@study ~]# id alex <==查阅 alex 账号的属性
uid=1001(alex) gid=1002(alex) groups=1002(alex),1001(project) <==确实有支持!
[root@study ~]# id arod
uid=1002(arod) gid=1003(arod) groups=1003(arod),1001(project) <==确实有支持!
然后开始来解决我们所需要的环境吧!
1. 首先建立所需要开发的项目目录:
[root@study ~]# mkdir /srv/ahome
[root@study ~]# ll -d /srv/ahome
drwxr-xr-x. 2 root root 6 Jun 17 00:22 /srv/ahome
2. 从上面的输出结果可发现 alex 与 arod 都不能在该目录内建立文件,因此需要进行权限与属性的修改。 由
于其他人均不可进入此目录,因此该目录的群组应为 project,权限应为 770 才合理。
[root@study ~]# chgrp project /srv/ahome
[root@study ~]# chmod 770 /srv/ahome
[root@study ~]# ll -d /srv/ahome
drwxrwx---. 2 root project 6 Jun 17 00:22 /srv/ahome
# 从上面的权限结果来看,由于 alex/arod 均支持 project,因此似乎没问题了!
3. 实际分别以两个使用者来测试看看,情况会是如何?先用 alex 建立文件,然后用 arod 去处理看看。
[root@study ~]# su - alex <==先切换身份成为 alex 来处理
[alex@www ~]$ cd /srv/ahome <==切换到群组的工作目录去
[alex@www ahome]$ touch abcd <==建立一个空的文件出来!
[alex@www ahome]$ exit <==离开 alex 的身份
[root@study ~]# su - arod
[arod@www ~]$ cd /srv/ahome
[arod@www ahome]$ ll abcd
-rw-rw-r--. 1 alex alex 0 Jun 17 00:23 abcd
# 仔细看一下上面的文件,由于群组是 alex ,arod 并不支持!
# 因此对于 abcd 这个文件来说, arod 应该只是其他人,只有 r 的权限而已啊!
[arod@www ahome]$ exit
由上面的结果我们可以知道,若单纯使用传统的 rwx 而已,则对刚刚 alex 建立的 abcd 这个文件来说,
arod 可以删除他,但是却不能编辑他!这不是我们要的样子啊!赶紧来重新规划一下。
4. 加入 SGID 的权限在里面,并进行测试看看:
root@study ~]# chmod 2770 /srv/ahome
[root@study ~]# ll -d /srv/ahome
drwxrws---. 2 root project 17 Jun 17 00:23 /srv/ahome
测试:使用 alex 去建立一个文件,并且查阅文件权限看看:
[root@study ~]# su - alex
[alex@www ~]$ cd /srv/ahome
[alex@www ahome]$ touch 1234
[alex@www ahome]$ ll 1234
-rw-rw-r--. 1 alex project 0 Jun 17 00:25 1234
# 没错!这才是我们要的样子!现在 alex, arod 建立的新文件所属群组都是 project,由于两人均属于此群组,加上 umask 都是 002,这样两人才可以互相修改对方的文件!
所以最终的结果显示,此目录的权限最好是『2770』,所属文件拥有者属于 root 即可,至于群组必须要为两人共同支持的 project 这个群组才行!
简答题部分:

· 什么是绝对路径与相对路径
绝对路径的写法为由 / 开始写,至于相对路径则不由 / 开始写!此外,相对路径为相对于目前工作目录的路径!

· 如何更改一个目录的名称?例如由 /home/test 变为 /home/test2
mv /home/test /home/test2

· PATH 这个环境变量的意义?
这个是用来指定执行文件执行的时候,指令搜寻的目录路径。

· umask 有什么用处与优点?
umask 可以拿掉一些权限,因此,适当的定义 umask 有助于系统的安全, 因为他可以用来建立默认的目录或文件的权限。

· 当一个使用者的 umask 分别为 033 与 044 他所建立的文件与目录的权限为何?
在 umask 为 033 时,则预设是拿掉 group 与 other 的 w(2)x(1) 权限,因此权限就成为『文件 -rw-r--r-- , 目录 drwxr--r-- 』
而当 umask 044 时,则拿掉 r 的属性,因此就成为『文件 -rw--w--w-,目录 drwx-wx-wx』

· 什么是 SUID ?
当一个指令具有 SUID 的功能时,则:
o SUID 权限仅对二进制程序(binary program)有效;
o 执行者对于该程序需要具有 x 的可执行权限;
o 本权限仅在执行该程序的过程中有效 (run-time);
o 执行者将具有该程序拥有者 (owner) 的权限。

· 当我要查询 /usr/bin/passwd 这个文件的一些属性时(1)传统权限;(2)文件类型与(3)文件的隐藏属性,可以使用什么指令来查询?
ls -al
file
lsattr

· 尝试用 find 找出目前 linux 系统中,所有具有 SUID 的文件有哪些?
find / -perm +4000 -print

· 找出 /etc 底下,文件大小介于 50K 到 60K 之间的文件,并且将权限完整的列出 (ls -l):
find /etc -size +50k -a -size -60k -exec ls -l {} \;     注意到 -a ,那个 -a 是 and 的意思,为符合两者才算成功

· 找出 /etc 底下,文件容量大于 50K 且文件所属人不是 root 的档名,且将权限完整的列出 (ls -l);
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
上面两式均可!注意到 ! ,那个 ! 代表的是反向选择,亦即『不是后面的项目』之意!

· 找出 /etc 底下,容量大于 1500K 以及容量等于 0 的文件:
find /etc -size +1500k -o -size 0         相对于 -a ,那个 -o 就是或 (or) 的意思啰!


8、Linux磁盘与文件系统管理

· 情境模拟题一:复原本章的各例题练习,本章新增非常多 partition ,请将这些 partition 删除,恢复到原本刚安装好时的状态。
o 目标:了解到删除分区槽需要注意的各项信息;
o 前提:本章的各项范例练习你都必须要做过,才会拥有 /dev/vda4 ~ /dev/vda7 出现;
o 需求:熟悉 gdisk, parated, umount, swapoff 等指令。
由于本章处理完毕后,将会有许多新增的 partition ,所以请删除掉这两个 partition 。删除的过程需要注意的是:

1. 需先以 free / swapon -s / mount 等指令查阅,要被处理的文件系统不可以被使用! 如果有被使用,则
你必须要使用 umount 卸除文件系统。如果是内存置换空间,则需使用 swapon -s 找出被使用的分区槽, 再
以 swapoff 去卸除他!
[root@study ~]# umount /data/ext4 /data/xfs /data/file /data/win
[root@study ~]# swapoff /dev/vda6 /tmp/swap
2. 观察 /etc/fstab ,该文件新增的行全部删除或批注!
[root@study ~]# nano /etc/fstab
.....(前面省略).....
/dev/mapper/centos-swap swap swap defaults 0 0 # 从这行之后全删除
UUID="e0fa7252-b374-4a06-987a-3cb14f415488" /data/xfs xfs defaults 0 0
/srv/loopdev /data/file xfs defaults,loop 0 0
UUID="6b17e4ab-9bf9-43d6-88a0-73ab47855f9d" swap swap defaults 0 0
/tmp/swap swap swap defaults 0 0
UUID="6032-BF38" /data/win vfat defaults 0 0
3. 使用『 gdisk /dev/vda 』删除,也可以使用『 parted /dev/vda rm 号码』删除喔!
[root@study ~]# parted /dev/vda rm 7
[root@study ~]# parted /dev/vda rm 6
[root@study ~]# parted /dev/vda rm 5
[root@study ~]# parted /dev/vda rm 4
[root@study ~]# partprobe
[root@study ~]# rm /tmp/swap /srv/loopdev

· 情境模拟题二:由于我的系统原本分区的不够好,我的用户希望能够独立一个 filesystem 附挂在/srv/myproject 目录下。 那你该如何建立新的 filesystem ,并且让这个 filesystem 每次开机都能够自动的挂载到 /srv/myproject ,且该目录是给 project 这个群组共享的,其他人不可具有任何权限。且该 filesystem 具有 1GB 的容量。
o 目标:理解文件系统的建置、自动挂载文件系统与项目开发必须要的权限;
o 前提:你需要进行过第六章的情境模拟才可以继续本章;
o 需求:本章的所有概念必须要清楚!
那就让我们开始来处理这个流程吧!
1. 首先,我们必须要使用 gdisk /dev/vda 来建立新的 partition。 然后按下『 n 』,按下『Enter』选择
默认的分区槽号码,再按『Enter』选择预设的启始磁柱, 按下『+1G』建立 1GB 的磁盘分区槽,
再按下『Enter』选择预设的文件系统 ID。 可以多按一次『p 』看看是否正确,若无问题则按下『w』
写入分区表;
2. 避免重新启动,因此使用『 partprobe 』强制核心更新分区表;
3. 建立完毕后,开始进行格式化的动作如下:『mkfs.xfs -f /dev/vda4』,这样就 OK 了!
4. 开始建立挂载点,利用:『 mkdir /srv/myproject 』来建立即可;
5. 编写自动挂载的配置文件:『 nano /etc/fstab 』,这个文件最底下新增一行,内容如下:
/dev/vda4 /srv/myproject xfs defaults 0 0
6. 测试自动挂载:『 mount -a 』,然后使用『 df /srv/myproject 』观察看看有无挂载即可!
7. 设定最后的权限,使用:『 chgrp project /srv/myproject 』以及『 chmod 2770 /srv/myproject 』即可。

简答题部分:

· 我们常常说,开机的时候,『发现磁盘有问题』,请问,这个问题的产生是『filesystem 的损毁』,还是『磁盘的损毁』?
特别需要注意的是,如果您某个 filesystem 里面,由于操作不当,可能会造成 Superblock 数据的损毁, 或者是 inode 的架
构损毁,或者是 block area 的记录遗失等等,这些问题当中,其实您的『磁盘』还是好好的, 不过,在磁盘上面的『文件系
统』则已经无法再利用!一般来说,我们的 Linux 很少会造成 filesystem 的损毁, 所以,发生问题时,很可能整个磁盘都损
毁了。但是,如果您的主机常常不正常断电,那么, 很可能磁盘是没问题的,但是,文件系统则有损毁之虞。此时,重建文
件系统 (reinstall) 即可! 不需要换掉磁盘啦! ^_^

· 当我有两个文件,分别是 file1 与 file2 ,这两个文件互为 hard link 的文件,请问, 若我将 file1 删除,
然后再以类似 vi 的方式重新建立一个名为 file1 的文件, 则 file2 的内容是否会被更动?
这是来自网友的疑问。当我删除 file1 之后,file2 则为一个正规文件,并不会与他人共同分享同一个 inode 与 block ,因此,
当我重新建立一个档名为 file1 时,他所利用的 inode 与 block 都是由我们的 filesystem 主动去搜寻 meta data ,找到空的
inode 与 block 来建立的, 与原本的 file1 并没有任何关连性喔!所以,新建的 file1 并不会影响 file2 呢!


9、文件与文件系统的压缩、打包与备份

· 情境模拟题一:请将本章练习过程中产生的不必要的文件删除,以保持系统容量不要被恶搞!
o rm /home/CentOS-7-x86_64-Minimal-1503-01.iso
o rm -rf /srv/newcd/
o rm /custom.iso
o rm -rf /tmp/vda2.img /tmp/boot.cpio /tmp/boot /tmp/boot2 /tmp/boot3
o rm -rf /tmp/services* /tmp/system.*
o rm -rf /root/etc* /root/system.tar.bz2 /root/boot
· 情境模拟题二:你想要逐时备份 /home 这个目录内的数据,又担心每次备份的信息太多, 因此想要使用xfsdump 的方式来逐一备份数据到 /backups 这个目录下。该如何处理?
o 目标:了解到 xfsdump 以及各个不同 level 的作用;
o 前提:被备份的资料为单一 partition ,亦即本例中的 /home

实际处理的方法其实还挺简单的!我们可以这样做看看:
1. 先替该目录制作一些数据,亦即复制一些东西过去吧!
mkdir /home/chapter8; cp -a /etc /boot /home/chapter8
2. 开始进行 xfsdump ,记得,一开始是使用 level 0 的完整备份喔!
mkdir /backups
xfsdump -l 0 -L home_all -M home_all -f /backups/home.dump /home
3. 尝试将 /home 这个文件系统加大,将 /var/log/ 的数据复制进去吧!
cp -a /var/log/ /home/chapter8
此时原本的 /home 已经被改变了!继续进行备份看看!
4. 将 /home 以 level 1 来进行备份:
xfsdump -l 1 -L home_1 -M home_1 -f /backups/home.dump.1 /home
ls -l /backups
妳应该就会看到两个文件,其中第二个文件 (home.dump.1) 会小的多!这样就搞定啰备份数据!

· 情境模拟三:假设过了一段时间后,妳的 /home 变的怪怪的,妳想要将该 filesystem 以刚刚的备份数据还
原, 此时该如何处理呢?妳可以这样做的:

1. 由于 /home 这个 partition 是用户只要有登入就会使用,因此你应该无法卸除这个东西!因此,你必
须要注销所有一般用户,然后在 tty2 直接以 root 登入系统,不要使用一般账号来登入后 su 转成 root !
这样才有办法卸除 /home 喔!
2. 先将 /home 卸除,并且将该 partition 重新格式化!
df -h /home
/dev/mapper/centos-home 5.0G 245M 4.8G 5% /home
umount /home
mkfs.xfs -f /dev/mapper/centos-home
3. 重新挂载原本的 partition ,此时该目录内容应该是空的!
mount -a
妳可以自行使用 df 以及 ls -l /home 查阅一下该目录的内容,是空的啦!
4. 将完整备份的 level 0 的文件 /backups/home.dump 还原回来:
cd /home
xfsrestore -f /backups/home.dump .
此时该目录的内容为第一次备份的状态!还需要进行后续的处理才行!
5. 将后续的 level 1 的备份也还原回来:
xfsrestore -f /backups/home.dump.1 .
此时才是恢复到最后一次备份的阶段!如果还有 level 2, level 3 时,就得要一个一个的依序还原才行!

6. 最后删除本章练习的复制档
rm -rf /home/chapter8


10、vim程序编辑器

· 在第七章的情境模拟题二的第五点,编写 /etc/fstab 时,当时使用 nano 这个指令, 请尝试使用 vim 去编辑 /etc/fstab ,并且将第七章新增的那一列的 defatuls 改成 default ,会出现什么状态? 离开前请务必要修订成原本正确的信息。此外,如果将该列批注 (最前面加 #),你会发现字体颜色也有变化喔!

· 尝试在你的系统中,你惯常使用的那个账号的家目录下,将本章介绍的 vimrc 内容进行一些常用设定,包括:
o 设定搜寻高亮度反白
o 设定语法检验启动
o 设定默认启动行号显示
o 设定有两行状态栏 (一行状态+一行指令列) :set laststatus=2

简答题部分:

· 我用 vi 开启某个文件后,要在第 34 列向右移动 15 个字符,应该在一般指令模式中下达什么指令?
(1)先按下 34G 到第 34 列;(2)再按下 [ 15 + 向右键 ],或 [ 15l ] 亦可!

· 在 vi 开启的文件中,如何去到该文件的页首或页尾?
去页首按下 1G 或 gg ;去页尾按下 G 即可

· 在 vi 开启的文件中,如何在光标所在列中,移动到行头及行尾?
移动到行头,按 0 ,移动到行尾按 $ 即可!

· vi 的一般指令模式情况下,按下『 r 』有什么功能?
取代光标所在的那个字符

· 在 vi 的环境中,如何将目前正在编辑的文件另存新档名为 newfilename?
:w newfilename

· 在 linux 底下最常使用的文书编辑器为 vi ,请问如何进入编辑模式?
在一般指令模式底下输入: i, I, a, A 为在本列当中输入新字符;(出现 –Insert- )
在一般指令模式当中输入: o, O 为在一个新的一列输入新字符;
在一般指令模式当中输入: r, R 为取代字符!(左下角出现 –Replace-)

· 在 vi 软件中,如何由编辑模式跳回一般指令模式?
可以按下[Esc]

· 在 vi 环境中,若上下左右键无法使用时,请问如何在一般指令模式移动光标?
[h, j, k, l]分别代表[左、下、上、右]

· 在 vi 的一般指令模式中,如何删除一列、n 列;如何删除一个字符?
分别为 dd, ndd, x 或 X (dG 及 d1G 分别表示删除到页首及页尾)

· 在 vi 的一般指令模式中,如何复制一列、n 列并加以贴上?
分别为 yy, nyy, p 或 P

· 在 vi 的一般指令模式中如何搜寻 string 这个字符串?
?string (往前搜寻)   /string (往后搜寻)

· 在 vi 的一般指令模式中,如何取代 word1 成为 word2,而若需要使用者确认机制,又该如何?
:1,$s/word1/word2/g 或:1,$s/word1/word2/gc (需要使用者确认)

· 在 vi 目前的编辑文件中,在一般指令模式下,如何读取一个文件 filename 进来目前这个文件?
:r filename

· 在 vi 的一般指令模式中,如何存盘、离开、存档后离开、强制存档后离开?
:w; :q: :wq; :wq!

· 在 vi 底下作了很多的编辑动作之后,却想还原成原来的文件内容,应该怎么进行?
直接按下 :e! 即可恢复成文件的原始状态!
· 我在 vi 这个程序当中,不想离开 vi ,但是想执行 ls /home 这个指令,vi 有什么额外的功能可以达到这个目的:
事实上,可以使用[ :! ls /home ]不过,如果你学过后面的章节之后,你会发现,执行[ ctrl + z ]亦可暂时退出 vi 让你在指令列
模式当中执行指令喔!


11、认识与学习bash

· 情境模拟题一:由于 ~/.bash_history 仅能记录指令,我想要在每次注销时都记录时间,并将后续的指令 50 笔记录下来, 可以如何处理?
o 目标:了解 history ,并透过数据流重导向的方式记录历史命令;
o 前提:需要了解本章的数据流重导向,以及了解 bash 的各个环境配置文件信息。
其实处理的方式非常简单,我们可以了解 date 可以输出时间,而利用 ~/.myhistory 来记录所有历史记录,
而目前最新的 50 笔历史记录可以使用 history 50 来显示,故可以修改 ~/.bash_logout 成为底下的模样:
[dmtsai@study ~]$ vim ~/.bash_logout
date >> ~/.myhistory
history 50 >> ~/.myhistory
clear

简答题部分:

· 在 Linux 上可以找到哪些 shell(举出三个) ?那个文件记录可用的 shell ?而 Linux 预设的 shell 是?
1) /bin/bash, /bin/tcsh, /bin/csh
2) /etc/shells
3) bash ,亦即是 /bin/bash。

· 你输入一串指令之后,发现前面写的一长串数据是错的,你想要删除游标所在处到最前面的指令串内容,应该如何处理?
按下 [crtl]+u 组合键即可!

· 在 shell 环境下,有个提示字符 (prompt),他可以修改吗?要改什么?默认的提示字符内容是?
可以修改的,改 PS1 这个变量,这个 PS1 变量的默认内容为:『[\u@\h \W]\$』

· 如何显示 HOME 这个环境变量?
echo $HOME

· 如何得知目前的所有变量与环境变量的设定值?
环境变量用 env 或 export 而所有变量用 set 即可显示

· 我是否可以设定一个变量名称为 3myhome ?
不行!变量不能以数字做为开头,参考变量设定规则的内容

· 在这样的练习中『A=B』且『B=C』,若我下达『unset $A』,则取消的变数是 A 还是 B?
被取消的是 B 喔,因为 unset $A 相当于 unset B 所以取消的是 B ,A 会继续存在!

· 如何取消变量与命令别名的内容?
使用 unset 及 unalias 即可

· 如何设定一个变量名称为 name 内容为 It's my name ?
name=It\'s\ my\ name 或 name="It's my name"

· bash 环境配置文件主要分为哪两种类型的读取?分别读取哪些重要文件?
(1)login shell:主要读取 /etc/profile 及 ~/.bash_profile
(2)non-logni shell:主要读取 ~/.bashrc 而已。

· CentOS 7.x 的 man page 的路径配置文件案?
/etc/man_db.conf

· 试说明 ', ", 与 ` 这些符号在变量定义中的用途?
参考变量规则那一章节,其中, " 可以具有变量的上下文属性,' 则仅有一般字符,至于 ` 之内则是可先被执行的指令。

· 跳脱符号 \ 有什么用途?
可以用来跳脱特殊字符,例如 Enter, $ 等等,使成为一般字符!

· 连续命令中, ;, &&, || 有何不同?
分号可以让两个 command 连续运作,不考虑 command1 的输出状态, && 则前一个指令必需要没有错误讯息,亦即回传值
需为 0 则 command2 才会被执行, || 则与 && 相反!

· 如何将 last 的结果中,独立出账号,并且印出曾经登入过的账号?
last | cut -d ' ' -f1 | sort | uniq

· 请问 foo1 && foo2 | foo3 > foo4 ,这个指令串当中, foo1/foo2/foo3/foo4 是指令还是文件? 整串指令的意
义为?
foo1, foo2 与 foo3 都是指令, foo4 是装置或文件。整串指令意义为:
(1)当 foo1 执行结果有错误时,则该指令串结束;
(2)若 foo1 执行结果没有错误时,则执行 foo2 | foo3 > foo4 ;其中:
(2-1)foo2 将 stdout 输出的结果传给 foo3 处理;
(2-2)foo3 将来自 foo2 的 stdout 当成 stdin ,处理完后将数据流重新导向 foo4 这个装置/文件

· 如何秀出在 /bin 底下任何以 a 为开头的文件文件名的详细资料?
ls -ld /bin/a*

· 如何秀出 /bin 底下,文件名为四个字符的文件?
ls -ld /bin/????

· 如何秀出 /bin 底下,档名开头不是 a-d 的文件?
ls -ld /bin/[^a-d]*

· 我想要让终端机接口的登入提示字符修改成我自己喜好的模样,应该要改哪里?(filename)
/etc/issue

· 承上题,如果我是想要让使用者登入后,才显示欢迎讯息,又应该要改哪里?
/etc/motd


12、正规表示法与文件格式化处理

· 情境模拟题一:透过 grep 搜寻特殊字符串,并配合数据流重导向来处理大量的文件搜寻问题。
o 目标:正确的使用正规表示法;
o 前提:需要了解数据流重导向,以及透过子指令 $(command) 来处理档名的搜寻;我们简单的以搜寻星号 (*) 来处理底下的任务:
1. 利用正规表示法找出系统中含有某些特殊关键词的文件,举例来说,找出在 /etc 底下含有星号 (*) 的文件与内容:
解决的方法必须要搭配通配符,但是星号本身就是正规表示法的字符,因此需要如此进行:
[dmtsai@study ~]$ grep '\*' /etc/* 2> /dev/null
你必须要注意的是,在单引号内的星号是正规表示法的字符,但我们要找的是星号,因此需要加上跳脱字符 (\)。但是在 /etc/* 的那个 * 则是 bash 的通配符! 代表的是文件的档名喔!不过由上述的这个结果中,我们仅能找到 /etc 底下第一层子目录的数据,无法找到次目录的数据, 如果想要连同完整的 /etc 次目录数据,就得要这样做:
[dmtsai@study ~]$ grep '\*' $(find /etc -type f ) 2> /dev/null
# 如果只想列出档名而不要列出内容的话,使用底下的方式来处理即可喔!
[dmtsai@study ~]$ grep -l '\*' $(find /etc -type f ) 2> /dev/null

2. 但如果文件数量太多呢?如同上述的案例,如果要找的是全系统 (/) 呢?你可以这样做:
[dmtsai@study ~]$ grep '\*' $(find / -type f 2> /dev/null )
-bash: /usr/bin/grep: Argument list too long
真要命!由于指令列的内容长度是有限制的,因此当搜寻的对象是整个系统时,上述的指令会发生
错误。那该如何是好? 此时我们可以透过管线命令以及 xargs 来处理。举例来说,让 grep 每次仅
能处理 10 个档名,此时你可以这样想:
a. 先用 find 去找出文件;
b. 用 xargs 将这些文件每次丢 10 个给 grep 来作为参数处理;
c. grep 实际开始搜寻文件内容。
所以整个作法就会变成这样:
[dmtsai@study ~]$ find / -type f 2> /dev/null | xargs -n 10 grep '\*'

3. 从输出的结果来看,数据量实在非常庞大!那如果我只是想要知道檔名而已呢?你可以透过 grep 的
功能来找到如下的参数!
[dmtsai@study ~]$ find / -type f 2> /dev/null | xargs -n 10 grep -l '\*'

· 情境模拟题二:使用管线命令配合正规表示法建立新指令与新变量。我想要建立一个新的指令名为 myip ,
这个指令能够将我系统的 IP 捉出来显示。而我想要有个新变量,变量名为 MYIP ,这个变量可以记录我
的 IP 。
处理的方式很简单,我们可以这样试看看:
1. 首先,我们依据本章内的 ifconfig, sed 与 awk 来取得我们的 IP ,指令为:
[dmtsai@study ~]$ ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g'| sed 's/ *netmask.*$//g'
2. 再来,我们可以将此指令利用 alias 指定为 myip 喔!如下所示:
[dmtsai@study ~]$ alias myip="ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g'| \
> sed 's/ *netmask.*$//g'
3. 最终,我们可以透过变量设定来处理 MYIP 喔!
[dmtsai@study ~]$ MYIP=$( myip )
4. 如果每次登入都要生效,可以将 alias 与 MYIP 的设定那两行,写入你的 ~/.bashrc 即可!

简答题部分:

· 我想要知道,在 /etc 底下,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来,要怎样进行?grep [XYZ] /etc/*
· 将 /etc/kdump.conf 内容取出后,(1)去除开头为 # 的行 (2)去除空白行 (3)取出开头为英文字母的那几行 (4)最终统计总行数该如何进行?
grep -v '^#' /etc/kdump.conf | grep -v '^$' | grep '^[[:alpha:]]' | wc -l


13、学习shell scripts

· 请建立一支 script ,当你执行该 script 的时候,该 script 可以显示:

1. 你目前的身份 (用 whoami ) 2. 你目前所在的目录 (用 pwd)
#!/bin/bash
echo -e "Your name is ==> $(whoami)"
echo -e "The current directory is ==> $(pwd)"

· 请自行建立一支程序,该程序可以用来计算『你还有几天可以过生日』啊?
#!/bin/bash
read -p "Pleas input your birthday (MMDD, ex> 0709): " bir
now=`date +%m%d`
if [ "$bir" == "$now" ]; then
echo "Happy Birthday to you!!!"
elif [ "$bir" -gt "$now" ]; then
year=`date +%Y`
total_d=$(($((`date --date="$year$bir" +%s`-`date +%s`))/60/60/24))
echo "Your birthday will be $total_d later"
else
year=$((`date +%Y`+1))
total_d=$(($((`date --date="$year$bir" +%s`-`date +%s`))/60/60/24))
echo "Your birthday will be $total_d later"
fi

· 让用户输入一个数字,程序可以由 1+2+3... 一直累加到用户输入的数字为止。
#!/bin/bash
read -p "Please input an integer number: " number
i=0
s=0
while [ "$i" != "$number" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "the result of '1+2+3+...$number' is ==> $s"

· 撰写一支程序,他的作用是: 1.) 先查看一下 /root/test/logical 这个名称是否存在; 2.) 若不存在,则建立一个文件,使用 touch 来建立,建立完成后离开; 3.) 如果存在的话,判断该名称是否为文件,若为文件则将之删除后建立一个目录,文件名为 logical ,之后离开; 4.) 如果存在的话,而且该名称为目录,则移除此目录!                                                                 #!/bin/bash
if [ ! -e logical ]; then
touch logical
echo "Just make a file logical"
exit 1
elif [ -e logical ] && [ -f logical ]; then
rm logical
mkdir logical
echo "remove file ==> logical"
echo "and make directory logical"
exit 1
elif [ -e logical ] && [ -d logical ]; then
rm -rf logical
echo "remove directory ==> logical"
exit 1
else
echo "Does here have anything?"
fi

· 我们知道 /etc/passwd 里面以 : 来分隔,第一栏为账号名称。请写一只程序,可以将 /etc/passwd 的第一栏取出,而且每一栏都以一行字符串『The 1 account is "root" 』来显示,那个 1 表示行数。
#!/bin/bash
accounts=`cat /etc/passwd | cut -d':' -f1`
for account in $accounts
do
declare -i i=$i+1
echo "The $i account is \"$account\" "
done


14、Linux账号管理与ACL权限设定

· 情境模拟题一:想将本服务器的账号分开管理,分为单纯邮件使用,与可登入系统账号两种。其中若为纯邮件账号时, 将该账号加入 mail 为初始群组,且此账号不可使用 bash 等 shell 登入系统。若为可登入账号时, 将该账号加入 youcan 这个次要群组。
o 目标:了解 /sbin/nologin 的用途;
o 前提:可自行观察使用者是否已经建立等问题;
o 需求:需已了解 useradd, groupadd 等指令的用法;
解决方案如下:
1. 预先察看一下两个群组是否存在?
[root@study ~]# grep mail /etc/group
[root@study ~]# grep youcan /etc/group
[root@study ~]# groupadd youcan
可发现 youcan 尚未被建立,因此如上表所示,我们主动去建立这个群组啰。
2. 开始建立三个邮件账号,此账号名称为 pop1, pop2, pop3 ,且密码与账号相同。可使用如下的程序来处理:
[root@study ~]# vim popuser.sh
#!/bin/bash
for username in pop1 pop2 pop3
do
useradd -g mail -s /sbin/nologin -M $username
echo $username | passwd --stdin $username
done
[root@study ~]# sh popuser.sh
3. 开始建立一般账号,只是这些一般账号必须要能够登入,并且需要使用次要群组的支持!所以:
[root@study ~]# vim loginuser.sh
#!/bin/bash
for username in youlog1 youlog2 youlog3
do
useradd -G youcan -s /bin/bash -m $username
echo $username | passwd --stdin $username
done
[root@study ~]# sh loginuser.sh
4. 这样就将账号分开管理了!非常简单吧!

简答题部分

· root 的 UID 与 GID 是多少?而基于这个理由,我要让 test 这个账号具有 root 的权限,应该怎么作?root 的 UID 与 GID 均为 0 ,所以要让 test 变成 root 的权限,那么就将 /etc/passwd 里面, test 的 UID 与 GID 字段变成 0 即可!

· 假设我是一个系统管理员,我有一个用户最近不乖,所以我想暂时将他的账号停掉, 让他近期无法进行任何动作,等到未来他乖一点之后,我再将他的账号启用,请问:我可以怎么作比较好??
由于这个账号是暂时失效的,所以不能使用 userdel 来删除,否则很麻烦!那么应该如何设定呢?再回去瞧一瞧 /etc/shadow 的
架构,可以知道有这几个可使用的方法:
o 将 /etc/passwd 的 shell 字段写成 /sbin/nologin ,即可让该账号暂时无法登入主机;
o 将 /etc/shadow 内的密码字段,增加一个 * 号在最前面,这样该账号亦无法登入!
o 将 /etc/shadow 的第八个字段关于账号取消日期的那个,设定小于目前日期的数字,那么他就无法登入系统了!

· 我在使用 useradd 的时候,新增的账号里面的 UID, GID 还有其他相关的密码控制,都是在哪几个文件里面设定的?
在 /etc/login.defs 还有 /etc/default/useradd 里面规定好的!

· 我希望我在设定每个账号的时候( 使用 useradd ),预设情况中,他们的家目录就含有一个名称为 www 的子目录,我应该怎么作比较好?
由于使用 useradd 的时候,会自动以 /etc/skel 做为默认的家目录,所以,我可以在 /etc/skel 里面新增加一个名称为 www 的目录即可!

· 简单说明系统账号与一般用户账号的差别?
一般而言,为了让系统能够顺利以较小的权限运作,系统会有很多账号, 例如 mail, bin, adm 等等。而为了确保这些账号能
够在系统上面具有独一无二的权限, 一般来说 Linux 都会保留一些 UID 给系统使用。在 CentOS 5.x 上面,小于 500 以下
的账号 (UID) 即是所谓的 System account。

· 简单说明,为何 CentOS 建立使用者时,他会主动的帮使用者建立一个群组,而不是使用 /etc/default/useradd 的设定?
不同的 linux distributions 对于使用者 group 的建立机制并不相同。主要的机制分为:
o Public group schemes: 用户将会直接给予一个系统指定的群组,一般来说即是 users , 可以 SuSE Server 9 为代表;
o Private group schemes: 系统会建立一个与账号一样的组名!以 CentOS 7.x 为例!

· 如何建立一个使用者名称 alex, 他所属群组为 alexgroup, 预计使用 csh, 他的全名为 "Alex Tsai", 且他还得要加入 users 群组当中!
groupadd alexgroup
useradd -c "Alex Tsai" -g alexgroup -G users -m alex
务必先建立群组,才能够建立使用者喔!

· 由于种种因素,导致你的用户家目录以后都需要被放置到 /account 这个目录下。 请问,我该如何作,可以
让使用 useradd 时,默认的家目录就指向 /account ?
最简单的方法,编辑 /etc/default/useradd ,将里头的 HOME=/home 改成 HOME=/account 即可。

· 我想要让 dmtsai 这个使用者,加入 vbird1, vbird2, vbird3 这三个群组,且不影响 dmtsai 原本已经支持的次要群组时,该如何动作?
usermod -a -G vbird1,vbird2,vbird3 dmtsai


15、磁盘配额(quota)与进阶文件系统管理

· 情境模拟题一:由于 LVM 可以弹性调整 filesystem 的大小,但是缺点是可能没有加速与硬件备份(与快照不同)的功能。 而磁盘阵列则具有效能与备份的功能,但是无法提供类似 LVM 的优点。在此情境中,我们想利用『在 RAID 上面建置 LVM』的功能,以达到两者兼顾的能力。
o 目标:测试在 RAID 磁盘上面架构 LVM 系统;
o 需求:需要具有磁盘管理的能力,包括 RAID 与 LVM;
o 前提:会用到本章建立出来的 /dev/vda5, /dev/vda6, /dev/vda7 三个分区槽!
那要如何处理呢?如下的流程一个步骤一个步骤的实施看看吧:
1. 重新处理系统,我们在这个练习当中,需要 /dev/vda5, /dev/vda6, /dev/vda7 建置成一个 RAID5 的
/dev/md0 磁盘!详细的作法这里就不谈了! 你得要使用 gdisk 来处理成为如下的模样:
[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
2. 开始使用 mdadm 来建立一个简单的 RAID5 数组!简易的流程如下:
[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 吧!
3. 开始处理 LVM ,现在我们假设所有的参数都使用默认值,包括 PE ,然后 VG 名为 raidvg ,LV 名为
raidlv ,底下为基本的流程:
[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 上面的喔!然后就是文件系统的建立与挂载了!
4. 尝试建立成为 XFS 文件系统,且挂载到 /srv/raidlvm 目录下:
[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
5. 上述就是 LVM 架构在 RAID 上面的技巧,之后的动作都能够使用本章的其他管理方式来管理, 包括
RAID 热拔插机制、LVM 放大缩小机制等等。

简答题部分:

· 在前一章的第一个大量新增账号范例中, 如果我想要让每个用户均具有 soft/hard 各为 40MB/50MB 的容量时,应该如何修改这个 script ?
你得先要依据本章的作法,先将 /home 制作好 quota 的环境然后, 你可以在 do...done 内的最后一行,新增一行内容为:
xfs_quota -x -c "limit -u bsoft=40M bhard=50M ${username}" /home
这样就可以在制作用户时,指定更新密码且给予 quota 的限制!

· 如果我想要让 RAID 具有保护数据的功能,防止因为硬件损毁而导致数据的遗失,那我应该要选择的 RAID 等级可能有哪些? (请以本章谈到的等级来思考即可)
具有备份数据的有: RAID-1, RAID-5, RAID-6

· 在预设的 LVM 设定中,请问 LVM 能否具有『备份』的功能?
是有的,就是那个快照 (snopshot) 的功能,此功能即可进行数据的备份!

· 如果你的计算机主机有提供 RAID 0 的功能,你将你的三颗硬盘全部在 BIOS 阶段使用 RAID 芯片整合成为一颗大磁盘, 则此磁盘在 Linux 系统当中的文件名为何?
由于硬件磁盘阵列是在 BIOS 阶段完成的,因此 Linux 系统会捉到一个完整的大的 RAID 磁盘,此磁盘的文件名就会是
『 /dev/sda 』! 但如果是 Intel 的芯片组,则还是可能会成为 /dev/md127 等相关的档名!


16、例行性工作排程(crontab)

· 今天假设我有一个指令程序,名称为: ping.sh 这个档名!我想要让系统每三分钟执行这个文件一次, 但是偏偏这个文件会有很多的讯息显示出来,所以我的 root 账号每天都会收到差不多四百多封的信件,光是收信就差不多快要疯掉了! 那么请问应该怎么设定比较好呢?这个涉及数据流重导向的问题,我们可以将他导入文件或者直接丢弃!如果该讯息不重要的话, 那么就予以丢弃,如果讯息很重要的话,才将他保留下来!假设今天这个命令不重要, 所以将他丢弃掉!因此,可以这样写:
*/3 * * * * root /usr/local/ping.sh > /dev/null 2>&1

· 您预计要在 2016 年的 2 月 14 日寄出一封给 kiki ,只有该年才寄出!该如何下达指令?
at 1am 2016-02-14

· 下达 crontab -e 之后,如果输入这一行,代表什么意思?
* 15 * * 1-5 /usr/local/bin/tea_time.sh
在每星期的 1~5 ,下午 3 点的每分钟,共进行 60 次 /usr/local/bin/tea_time.sh 这个文件。 要特别注意的是,每个星期 1~5 的
3 点都会进行 60 次ㄟ!很麻烦吧~是错误的写法啦~ 应该是要写成:
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

· 请问,您的系统每天、每周、每个月各有进行什么工作?因为 CentOS 系统默认的例行性命令都放置在 /etc/cron.* 里面,所以,你可以自行去: /etc/cron.daily/, /etc/cron.week/, /etc/cron.monthly/ 这三个目录内看一看, 就知道啦! ^_^

· 每个星期六凌晨三点去系统搜寻一下内有 SUID/SGID 的任何文件!并将结果输出到 /tmp/uidgid.filesvi /etc/crontab
0 3 * * 6 root find / -perm /6000 > /tmp/uidgid.files


17、进程管理与SELinux初探

· 简单说明什么是程序 (program) 而什么是进程 (process)?
程序 (program) 是系统上面可以被执行的文件,由于 Linux 的完整檔名 (由 / 写起) 仅能有一个, 所以 program 的档名具有
单一性。当程序被执行后,就会启动成进程 (process), 一个 program 可以被不同的使用者或者相同的使用者重复的执行成为
多个进程, 且该程序所造成的进程还因为不同的使用者,而有不同的权限,且每个 process 几乎都是独立的。

· 我今天想要查询 /etc/crontab 与 crontab 这个程序的用法与写法,请问我该如何在线查询?
查询 crontab 指令可以使用 man crontab 或 info crontab ,至于查询 /etc/crontab ,则可以使用 man 5 crontab 啰!

· 我要如何查询 crond 这个 daemon 的 PID 与他的 PRI 值呢?
ps -lA | grep crond 即可查到!

· 我要如何修改 crond 这个 PID 的优先执行序?
先以 ps aux 找到 crond 的 PID 后,再以: renice -n number PID 来调整!

· 我是一般身份使用者,我是否可以调整不属于我的进程的 nice 值?此外,如果我调整了我自己的进程的nice 值到 10 ,是否可以将他调回 5 呢?
不行!一般身份使用者仅能调整属于自己的 PID 进程,并且,只能将 nice 值一再地调高,并不能调低,所以调整为 10 之后,就不能降回 5 啰!

· 我要怎么知道我的网络卡在开机的过程中有没有被捉到?
可以使用 dmesg 来视察!


18、认识服务系统

· 情境模拟题:透过设定、启动、观察等机制,完整的了解一个服务的启动与观察现象。
o 目标:了解 daemon 的控管机制,以 sshd daemon 为例;
o 前提:需要对本章已经了解,尤其是 systemd 的管理 部分;
o 需求:已经有 sshd 这个服务,但没有修改过埠口!
在本情境中,我们使用 sshd 这个服务来观察,主要是假设 sshd 要开立第二个服务,这个第二个服务的 port 放行于 222 ,那该如何处理? 可以这样做看看:
1. 基本上 sshd 几乎是一定会安装的服务!只是我们还是来确认看看好了!
[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
2. 透过观察 man sshd,我们可以查询到 sshd 的配置文件位于 /etc/ssh/sshd_config 这个文件内!再 man 
sshd_config 也能知道原来埠口是使用 Port 来规范的! 因此,我想要建立第二个配置文件,档名假设为
/etc/ssh/sshd2_config 这样!
[root@study ~]# cd /etc/ssh
[root@study ssh]# cp sshd_config sshd2_config
[root@study ssh]# vim sshd2_config
Port 222
# 随意找个地方加上这个设定值!你可以在文件的最下方加入这行也 OK 喔!
3. 接下来开始修改启动脚本服务档!
[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

简答题部分:

· 使用 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 为一种网络数据库系统软件。

· 你可以透过哪些指令查询到目前系统默认开机会启动的服务?
systemctl list-units 以及 systemctl list-unit-files
· 承上,那么哪些服务『目前』是在启动的状态?
结果同上!只是若要进一步的信息,应该使用 systemctl status [unit.service] 一项一项查询!


19、认识与分析登录档

实作题:

· 请在你的 CentOS 7.x 上面,依照鸟哥提供的 logfile.sh 去安装,并将结果取出分析看看。

简答题部分:

· 如果你想要将 auth 这个服务的结果中,只要讯息等级高于 warn 就给予发送 email 到 root 的信箱,该如何处理?
利用 vim 去编辑 /etc/rsyslog.conf 文件,内容为auth.warn root

· 启动系统注册表信息时,需要启动哪两个 daemon 呢?
systemd-journald.service, rsyslog.service
· rsyslogd 以及 logrotate 个别透过什么机制来执行?
rsyslogd 为 stand alone daemon 的机制; logrotate 则是透过 crontab 来执行的!只是个指令而已。


20、开机流程、模块管理与loader

· 情境模拟题一:利用救援光盘来处理系统的错误导致无法开机的问题。
o 目标:了解救援光盘的功能;
o 前提:了解 grub 的原理,并且知道如何使用 chroot 功能;
o 需求:打字可以再加快一点啊! ^_^
这个部分鸟哥就不捉图了,请大家自行处理啰~假设你的系统出问题而无法顺利开机,此时拿出原版光盘,然后重新以光盘来启动你的系统。 然后你应该要这样作的:
1. 利用光盘开机时,看到开机项目后,请选择『Troubleshooting』项目 --> 『Rescue a CentOS system』
项目,按下 Enter 就开始开机程序;
2. 然后就进入救援光盘模式的文件系统搜寻了!这个救援光盘会去找出目前你的主机里面与 CentOS 7.x 相关的操作系统, 并将该操作系统汇整成为一个 chroot 的环境等待你的处置!但是他会有三个模式可以选择,分别是『continue』继续成为可擦写挂载;『Read-Only』将侦测到的操作系统变成只读挂载;『Skip』略过这次的救援动作。在这里我们选择『 Continue 』吧!
3. 如果你有安装多个 CentOS 7.x 的操作系统 (多重操作系统的实作),那就会出现选单让你选择想要处理的根目录是哪个! 选择完毕就请按 Enter 吧!
4. 然后系统会将侦测到的信息通知你!一般来说,可能会在屏幕上显示类似这样的讯息:『 chroot /mnt/sysimage』此时请按下 OK 吧!
5. 按下 OK 后,系统会丢给你一个 shell 使用,先用 df 看一下挂载情况是否正确? 若不正确请手动挂载其他未被挂载的 partition 。等到一切搞定后,利用 chroot /mnt/sysimage 来转成你原本的操作系统环境吧!等到你将一切出问题的地方都搞定,请 reboot 系统,且取出光盘,用硬盘开机吧!

简答题部分:

· 因为 root 密码忘记,我使用 rd.break 的核心参数重新启动,并且修改完 root 密码,重新启动后可以顺利
开机完毕, 但是我使用所有的账号却都无法登入系统!为何会如此?可能原因为何?最可能的原因是 /.autorelabel 没有建立,且你为 SELinux Enforcing 的模式之故。如果是这样,那你必须要重新进入 rd.break ,然后重新建立 /.autorelabel 即可。若不想要于开机过程等太久,可以将 /etc/selinux/config 内的 SELinux 类型设定为 permissive 再以 19.4.1 的方法去 restorecon 回复 /etc 底下的文件 SELinux 类型即可。

· 万一不幸,我的一些模块没有办法让 Linux 的核心捉到,但是偏偏这个核心明明就有支持该模块, 我要让该模块在开机的时候就被加载,那么应该写入那个文件?
应该写入 /etc/modprobe.d/*.conf 这个文件,他是模块加载相关的地方呢!当然,也可以写入 /etc/sysconfig/modules/* 里面。

· 如何在 grub2 开机过程当中,指定以『 multi-user.target 』来开机?
在开机进入 boot loader 之后,利用 grub shell 的功能,亦即输入『 e 』进入编辑模式, 然后在 linux16 后面增加:linux16 .... systemd.unit=multi-user.target就能够进入纯文本模式啰!
· 如果你不小心先安装 Linux 再安装 Windows 导致 boot loader 无法找到 Linux 的开机选单,该如何挽
救?
方法有很多,例如:
(1)藉助第三方软件,安装类似 spfdisk 的软件在 MBR 里面,因为他同时认识 Linux 与 Windows ,所以就可以用他来进入
Linux 啦!
(2)或者使用类似 KNOPPIX 的 Live CD 以光盘开机进入 Linux 之后,再以 chroot 软件切换根目录 (/),然后重新安装 grub 
等 boot loader ,同样也可以重新让两个操作系统存在啦!
总之,只要你知道 MBR / Super block / boot loader 之间的相关性,怎么切换都可能啊! ^_^


21、基础系统设定与备份策略

简答题部分:

· 如果你想要知道整个系统的周边硬件装置,可以使用哪个指令查询?
lspci 可以查询到,更可使用 lspci -v 来查询更详细信息。

· 承上题,那么如果单纯只想要知道 USB 装置呢?又该如何查询?
lsusb 就可以查询的到!

· (挑战题)如果你的网络设定妥当了,但是却老是发现网络不通,你觉得应该如何进行测试?
(1)先检查硬件,每个环节 (网卡、hub/switch、路由器等) 的灯号是否有亮?有亮再进行下个动作;
(2)使用 ifconfig 检查 IP 与 netmask 的数据是否正确,若正确才可进行下一步;
(3)使用 route 看看 default gateway 是否正确,若正确再进行下一步;
(4)使用 ping -c 3 [gateway IP] ,若有响应才进行下一步;
(5)使用 ping -c 3 [外部 IP,例如 168.95.1.1] ,若有响应则 IP 正常,若无回应,请检查 gateway 的设定
(6)使用 dig www.google.com 看看能否找到 IP ,找不到则请检查 /etc/resolv.conf 的设定。

· 挑战题:尝试将你在学习本书所进行的各项任务备份下来,然后删除你的系统,接下来重新安装最新的
CentOS 7.x , 再将你备份的资料复原回来,看看能否成功的让你的系统回复到之前的状态呢?

· 挑战题:查询一下何谓企鹅龙软件,讨论一下该软件的还原机制是属于累积备份?还是完整备份?

· 常用的完整备份 (full backup) 工具指令有哪些?
xfsdump + xfsrestore, dd, cpio 搭配 find 等软件。

· 你所看到的常见的储存设备有哪些?
Floppy, Mo, Zip, CD-RW, DVD-RW, 外接式 USB 硬盘, Tape, 外接式储存数组 (RAID),额外的储存架构,如 SAN, NAS 等。


22、软件安装:原始码与tarball

实作题部分:

· 请前往企鹅游戏网站 http://xpenguins.seul.org/ 下载 xpenguins-2.2.tar.gz 原始码文件,并安装该软件。安装完毕之后,请在 GNOME 图形接口执行 xpenguins , 看看有没有出现如同官网上面出现的小企鹅?(你有可能需要安装 yum install libX*-devel 才行喔)

情境模拟题部分:

· 请依照底下的方式来建置你的系统的重要文件指纹码,并每日比对此重要工作。
1. 将 /etc/{passwd,shadow,group} 以及系统上面所有的 SUID/SGID 文件建立文件列表,该列表档名为
『 important.file 』;
[root@study ~]# ls /etc/{passwd,shadow,group} > important.file
[root@study ~]# find /usr/sbin /usr/bin -perm /6000 >> important.file
2. 透过这个档名列表,以名为 md5.checkfile.sh 的档名去建立指纹码,并将该指纹码文件『 finger1.file 』
设定成为不可修改的属性;
[root@study ~]# vim md5.checkfile.sh
#!/bin/bash
for filename in $(cat important.file)
do
 md5sum $filename >> finger1.file
done
[root@study ~]# sh md5.checkfile.sh
[root@study ~]# chattr +i finger1.file
3. 透过相同的机制去建立后续的分析数据为 finger_new.file ,并将两者进行比对,若有问题则提供
email 给 root 查阅:
[root@study ~]# vim md5.checkfile.sh
#!/bin/bash
if [ "$1" == "new" ]; then
 for filename in $(cat important.file)
 do
 md5sum $filename >> finger1.file
 done
 echo "New file finger1.file is created."
 exit 0
fi
if [ ! -f finger1.file ]; then
 echo "file: finger1.file NOT exist."
 exit 1
fi
[ -f finger_new.file ] && rm finger_new.file
for filename in $(cat important.file)
do
 md5sum $filename >> finger_new.file
done
testing=$(diff finger1.file finger_new.file)
if [ "$testing" != "" ]; then
 diff finger1.file finger_new.file | mail -s 'finger trouble..' root
fi
[root@study ~]# vim /etc/crontab
30 2 * * * root cd /root; sh md5.checkfile.sh
如此一来,每天系统会主动的去分析你认为重要的文件之指纹数据,然后再加以分析,看看有没有被更动过。 不过,如果该变动是正常的,例如 CentOS 自动的升级时,那么你就得要删除finger1.file , 再重新建置一个新的指纹数据库才行!否则你会每天收到有问题信件的回报喔!


23、软件安装RPM、SRPM、YUM

· 情境模拟题:透过 EPEL 安装 NTFS 文件系统所需要的软件
o 目标:利用 EPEL 提供的软件来搜寻是否有 NTFS 所需要的各项模块!;
o 目标:你的 Linux 必须要已经接上 Internet 才行;
o 需求:最好了解磁盘容量是否够用,以及如何启动服务等。
其实这个任务非常简单!因为我们在前面各小节的说明当中已经说明了如何设定 EPEL 的 yum 配置文件,此时你只要透过底下的方式来处理即可:
o 使用 yum --enablerepo=epel search ntfs 找出所需要的软件名称
o 再使用 yum --enablerepo=epel install ntfs-3g ntfsprogs 来安装即可!

简答题部分:

· 如果你曾经修改过 yum 配置文件内的软件库设定 (/etc/yum.repos.d/*.repo) ,导致下次使用 yum 进行安装时老是发现错误, 此时你该如何是好?
先确认你的配置文件确实是正确的,如果没问题,可以将 yum 的快取清除,使用『yum clean all』即可。 事实上, yum 的所有快取、下载软件、下载软件的表头数据,都放置于 /var/cache/yum/ 目录下。

· 简单说明 RPM 与 SRPM 的异同?
RPM 文件是由程序打包者 (通常是由 distribution 的开发商) 藉由程序的原始码,在特定的平台上面所编译成功的 binary program 的数据,并将该数据制作成为 RPM 的格式,以方便相同软、硬件平台的用户之安装使用。 在安装时显的很简单,因为程序打包者的平台与使用者所使用的平台预设为相同。至于 SRPM 则是藉由与 RPM 相同的配置文件数据,不过将原始码直接包在 SRPM 文件当中,而不经过编译。 因为 SRPM 所内含的数据为原始码,所以安装时必须要再经过编译的行为才能成为 RPM 并提供使用者安装。

· 假设我想要安装一个软件,例如 pkgname.i386.rpm ,但却老是发生无法安装的问题,请问我可以加入哪些参数来强制安装他?
可以加入 --nodeps 等参数。例如 rpm -ivh --nodeps pkgname.i386.rpm

· 承上题,你认为强制安装之后,该软件是否可以正常执行?为什么?
一般来说,应该是『不能执行』的,因为该软件具有相依属性的问题, 某些时刻该软件的程序可能需要呼叫外部的函式库,但函式库可能未安装,因此当然无法执行成功。

· 有些人使用 CentOS 7.x 安装在自己的 Atom CPU 上面,却发现无法安装,在查询了该原版光盘的内容,发现里面的文件名为 ***.x86_64.rpm 。请问,无法安装的可能原因为何?
Atom 虽然也是属于 x86 的架构,但是某些 atom 是属于 32 位的系统。但是 CentOS 7 已经仅释出 64 位的版本,所以当然无法安装了!

· 请问我使用 rpm -Fvh *.rpm 及 rpm -Uvh *.rpm 来升级时,两者有何不同?
-Uvh 后面接的软件,如果原本未安装,则直接安装,原本已安装时,则直接升级;
-Fvh 后面接的软件,如果原本未安装,则不安装,原本已安装时,则直接升级;

· 假设有一个厂商推出软件时,自行处理了数字签名,你想要安装他们的软件所以需要使用数字签名,假设数字签名的档名为 signe, 那你该如何安装?
rpm --import signe
· 承上,假设该软件厂商提供了 yum 的安装网址为: http://their.server.name/path/ ,那你该如何处理 yum 的配置文件?
可以自行取个档名,在此例中我们使用『 vim /etc/yum.repos.d/their.repo 』,扩展名要正确! 内容有点像这样即可:
[their]
name=their server name
baseurl=http://their.server.name/path/
enable=1
gpgcheck=0
然后使用 yum 去安装该软件看看。


24、X Windows设定介绍

· 在 X 设定没问题的情况下,你在 Linux 主机如何取得窗口接口?
如果是在 multi-user.target 模式下,可以使用 startx 进入,至于 graphical.target ,则直接进入 tty1 即可使用 display manager 登
入 X Window 系统。

· 利用 startx 可以在 multi-user.target 的环境下进入 X Window 系统。请问 startx 的主要功能?
整个 X 窗口系统的重点在启动 X server 并加载 X client ,而执行 X server/X client 呼叫的任务为 xinit ,startx 只是一个较为亲和的脚本程序,可以搜寻系统上面的 X server / X client 设定值, 以提供 xinit 来执行而已。

· 如何知道你系统当中 X 系统的版本与计划?
最简单可以利用 root 的身份下达 X -version 或 Xorg -version 即可知道!

· 要了解为何 X 系统可以允许不同硬件、主机、操作系统之间的沟通,需要知道 X server / X client 的相关
知识。 请问 X Server / X client / Window manager 的主要用途功能?X Server 主要负责屏幕的绘制,以及周边输入设备如鼠标、键盘等数据的收集,并回报给 X Client ; X Client 主要负责数据的运算,收到来自 X Server 的数据后,加以运算得到图形的数据,并回传给 X Server, 让 X server 自行绘制图形。至于Window manager 是一个比较特殊的 X Client ,他可以管理更多控制元素, 最重要的地方还是在于窗口的大小、重迭、移动等等的功能。

· 如何重新启动 X
o 最简单在 X Window System 下,直接按下 [alt]+[ctrl]+[backspace<--] 即可
o 也可以 systemctl isolate multi-usertarget 再 systemctl isolate graphical.target
o 也可以关闭 X 后,再 startx 启动等等。

· 试说明 ~/.xinitrc 这个文件的用途?
当我们要启动 X 时,必须要启动 X Client 软件端。这个 ~/.xinitrc 即是在客制化自己的 X Client , 你可以在这个文件内输入你自己的 X Client 。若无此文件,则预设以 /etc/X11/xinit/xinitrc 替代。

· 我在 CentOS 的系统中,默认使用 GNOME 登入 X 。但我想要改以 KDE 登入,该怎么办?
o 首先你必须要已经安装 KDE 环境 (参考前一章的 yum grouplist 功能),
o 然后可以藉由修改 /etc/sysconfig/desktop 内的设定值即可。
o 但如果你不是 root 无法修订该文件时,亦可以在自己的家目录参考 /etc/X11/xinit/xinitrc 的内容自行制作 ~/.xinitrc 
文件来修改!

· X Server 的 port 预设开放在?
目前预设并不会启动 TCP 埠口。不过如果经过设定,则 X port 预设开放在 port 6000 ,而且称此一显示为 :0

· Linux 主机是否可以有两个以上的 X
是的!可以!第一个 X 通常在 tty1 ,第二个在 tty2 以后,依序类推。 第几个是以启动的顺序来定义,并非 :0 , :1 的意思~

· X Server 的配置文件是 xorg.conf,在该文件中, Section Files 干嘛用的?
相当重要!是设定显示字型用的。而字型一般放置目录在 /usr/share/X11/fonts/ 及 /usr/share/fonts/ 当中。

· 我发现我的 X 系统键盘所输入的字母老是打不出我所需要的单字,可能原因该如何修订?
应该是键盘符号对应表跑掉了。可以修改 xorg.conf 文件内, 关于 Keyboard 的 Option XkbLayout 项目,将他改为 us 即可!

· 当我的系统内有安装 GNOME 及 KDE 两个 X Widnow Manager ,我原本是以 KDE 为预设的 WM, 若
想改为 GNOME 时,应该如何修改?修改 /etc/sysconfig/desktop 内部,成为 GNOME 即可!


25、Linux核心编译与管理

· 简单说明核心编译的步骤为何?
1. 先下载核心原始码,可以从 http://www.kernel.org 或者是 distributions 的 SRPM 来着手;
2. 以下以 Tarball 来处理,解开原始码到 /usr/src/kernels 目录下;
3. 先进行旧数据删除的动作:『make mrproper』;
4. 开始挑选核心功能,可以利用『make menuconfig』、『make oldconfig』、『make gconfig』等等;
5. 清除过去的中间暂存盘资料:『make clean』
6. 开始核心文件与核心模块的编译:『make bzImage』、『make modules』
7. 开始核心模块的安装:『make modules_install』
8. 开始核心文件的安装,可以使用的方式有:『make install』或者是透过手动的方式复制核心文件到 /boot/ 当中;
9. 建立 initramfs 文件;
10. 使用 grub2-mkconfig 修改 /boot/grub2/grub.cfg 文件;
· 如果你利用新编译的核心来操作系统,发现系统并不稳定,你想要移除这个自行编译的核心该如何处理?
1. 重新启动,并使用旧的稳定的核心开机!
2. 此时才可以将新版核心模块删除: rm -rf /lib/modules/3.10.89vbird
3. 删除掉 /boot 里面的新核心: rm /boot/vmlinuz-3.10.89vbird /boot/initramfs-3.10.89vbird.img ...
4. 重建 grub.cfg: grub2-mkconfig -o /boot/grub2/grub.cfg

Linux——常见问题大全相关推荐

  1. JEECG常见问题大全征集

    大家还有什么问题,请跟帖,谢谢支持.. JEECG常见问题大全征集 1. jeecg没有数据库脚本问题 jeecg不需要数据库脚本,在数据库创建好数据库,项目配置好数据源链接,会自动建表,登录时候有初 ...

  2. JEECG 新手常见问题大全,入门必读

    大家还有什么问题,请跟帖,谢谢支持.. JEECG常见问题大全 原文地址:http://t.cn/RvYsEF6 1. jeecg数据库脚本问题 注意:jeecg3.5.2之前版本,不需要数据库脚本, ...

  3. Linux dn命令大全,linux命令大全完整版.doc

    Linux命令大全完整版 目 录 TOC \h \z \t "001,1,002,2" 目 录 I 1. linux系统管理命令 1 adduser 1 chfn(change?f ...

  4. Linux 指令大全(3)

    2019独角兽企业重金招聘Python工程师标准>>> Linux 指令大全(3) 名称:/etc/aliases 使用权限:系统管理者 使用方式: 请用 newaliases 更新 ...

  5. Linux 资料大全

    Hello all,给大家分享一些 Linux 学习资料,包含:社区网站.在线教程.命令大全.在线模拟器.经典书籍.镜像站点等 ... 从入门到进阶,应有尽有.无论你是小白,还是 Linux 高手,都 ...

  6. Linux命令大全搜索网站模板

    介绍: 一款Linux命令大全搜索网站模板,HTML静态模板,可搜索,点击查看详细内容. 当前共搜集了570 多个 Linux 命令,内容包含 Linux 命令手册.详解.学习,内容来自网络和网友的补 ...

  7. linux命令大全(持续更新)

    linux命令大全 linux vim linux -r 递归更改 1 sudo su 切换管理员状态 2 su ubuntu 切换回普通用户ubuntu 3 exit 退出管理员状态到普通用户状态 ...

  8. Linux 编辑doc,Linux命令大全(文档编辑).doc

    Linux命令大全(文档编辑) 文档编辑文档编辑-col 功能说明:过滤控制字符. 语 法:col [-bfx][-l] 补充说明:在许多UNIX说明文件里,都有RLF控制字符.当我们运用shell特 ...

  9. linux su命令位置,Linux命令大全su详解

    su允许某用户暂时成为另一个用户.它以真实有效的user ID.group ID和给定USER的附加组,执行一个命令,通常是一个交互式的shell.接下来是小编为大家收集的Linux命令大全su详解, ...

最新文章

  1. 2021年大数据Flink(四十八):扩展阅读  Streaming File Sink
  2. 初次转化max模型为3D Tiles失败、cesium加载一个obj格式的3D 机房模型
  3. 3P5 Industrial Engineering Lecture 1-2: Method of Study
  4. php循环输出url,PHP 输出URL的快捷方式的实现方法
  5. DataTables怎么给某一列加上click事件
  6. Android获取当前网络状态
  7. 新手入门HTML5开发,你必须先搞懂这6个问题
  8. 折叠屏究竟是不是智能手机的未来?| 畅言
  9. java类包装器有什么用_Java中的包装器类
  10. luarocks - 介绍
  11. K近邻算法(Python实现)
  12. 51单片机读取引脚值原理
  13. COSTDOWN版本的NRF51802和NRF51822的复位问题
  14. java: You aren‘t using a compiler supported by lombok, so lombok will not work and has been disabled
  15. 京东云引擎:免费好用的web应用托管平台
  16. 使用electron把vue项目打包成windows应用exe程序
  17. Flume 1.9.0用户指南
  18. [SHOI2008]仙人掌图
  19. VxWorks在zynq7020上bootrom
  20. Android实现QQ分享功能

热门文章

  1. 用互动的方式打开“11月全国气象短视频(快手、抖音)影响力榜单“
  2. C++ 求圆的周长和面积
  3. 微信小程序之将base64图片转为本地图片
  4. KTV 歌房如何实现伴奏与人声同步功能
  5. 俄亥俄大学计算机科学专业,美国计算机科学专业最新排名!
  6. 怎么从网上办大流量卡呢?具体步骤小编都给你写好的!
  7. 微信跳转到关注公众号万能链接
  8. 关于航空障碍灯的介绍
  9. ArrayList 重拳出击,把 LinkedList 干翻在地
  10. MobiCom2015阅读表(Poster)