做一个小型的 Linux 系统来玩玩,自己安装、自己整理、自己管理等等,测试一下自己真的了解 Linux 了嘛?
从学期开始学到这边之后,如果每堂课后面的习题都有完成的话,那么你大概已经可以掌握 Linux 操作系统了。 接下来,我们将介绍如何使用最少软件的功能,来达成你所需要的服务器环境,注意喔,是『服务器』环境,而非桌面电脑。 其实重点在安装时的分割功能、软件最小安装、安装完毕的初始设置、系统的整理与简易调整,最终就是处理服务器的各项用途了。 我们还没有实际操作过服务器的各项设置,不过这章内容搞定之后,你大概也能够架设系统缺省的 Server 了!
你需要 Linux 做什么呢?以鸟哥来说,我的 Linux 大部分都用来做网络服务器、办公室防火墙系统、科学计算的基本操作系统、虚拟化的基本系统等等任务。 不同的任务所需要的硬件资源并不相同,同时,所需要提供的服务当然也差异相当大。所以,安装 Linux 之前,先确认你的用途为宜!
虽然说目前 PC 性能强大且便宜,所以 PC 作为 Linux server 的硬件资源应该是毋庸置疑的。不过,某些特别的状况下, PC 的资源要不是不够力,就是太过头了!
举例来说,现在的物连网 (Internet Of Things) 需要很多的侦测器 (sensors), 但这些侦测器可能需要一部小型 server 来汇整数据与传输数据,这个 server 恐怕是需要放在户外的、比较恶劣的工作环境下! 此时,买一部配备完整的 PC 看起来是性能太好,但是维护不易啊~光是电源怎么牵到户外来,就够伤脑筋的了。 这时,如果一台小小的树莓派可以处理的话,那应该使用树莓派会比较好,又省电、又便宜、又方便抽换的维护。
所以,设计你的服务器主机硬件时,应该要考量实际的需求,这样才会有较佳的搭配应用。底下鸟哥就自己的常见使用环境给予建议, 请读者们自行设计出适合自己的主机资源。
某些计算或者是服务需要较高等级的主机系统,此时可能需要购买到多内核服务器等级的 CPU,搭配高性能网卡 (最好内置 10G 网卡) 会比较适合。以鸟哥为例,鸟哥用来计算空气品质模式的系统 (2020 年),大多使用双 CPU 插槽的主机系统,目前最高端那部用了 16 内核 32 线程两颗, 一台会有总和 32 内核 64 线程。另一部则使用了单 CPU 的 AMD Ryzen 3990X CPU,这个消费型市场的 CPU 有 64 内核共 128 线程! 只是好烫啊~得要使用水冷式散热才行。
上面这几部系统都是为了高性能计算的环境所搭配的,一般的环境中,除非要作为虚拟化系统,否则这么多的 CPU 其实对 Server 一点帮助也没有! 鸟哥的模式运算时,可以依据 CPU 的个数来进行平行运算,可以具有相当程度的加速效果!因此,CPU 数量越高越好! 鸟哥甚至想要买超贵的 AMD EPYC 服务器产品,因为他们家的产品在 2020 年时,最多可以达到 64 内核双 CPU, 这样一口气就可以到达 128 颗实体内核,对模式计算来说,相当重要!
如果要做为数据库环境使用,那也应该要使用比较好的主机资源,因为数据库的运算通常会消耗很大量的 CPU 资源。 同时,内存最好也要大一些,可能的话,将某些数据库数据写入内存中,会更加速运算。 因此,繁重的数据库运算也需要较高性能的主机系统。
一般来说,底下的系统需要较高运算性能与较大内存容量:
某些高容量需要的服务,包括文件服务器 (如 Samba, FTP, HTTP 等等) 以及科学计算的结果输出 (例如空品模式、大气模式等等), 还有云端虚拟机的虚拟磁盘等,都会用到很大量的磁盘容量。这时,考量到高速还是高容量,都需要有磁盘容错的机制存在, 否则机器损坏不打紧,数据不见才烦恼。
实际上线的系统,最好还是使用较高规格的实体磁盘数组卡来协助比较妥当,除了支持热拔插的功能,磁盘数组卡上面的高速缓存, 也对读写性能有帮助。另外,如果只是数据存放 (如 Samba, FTP, 科学计算的结果输出) ,建议使用 RAID6 等级来处理即可, 以前鸟哥都用 RAID5,由于同时死掉两颗磁盘的几率还是存在的,因此现在都倾向于使用 RAID6 较佳。
如果是云端虚拟机所需要的磁盘,由于这些磁盘系统可能需要用在虚拟机的作业上,而不是单纯的数据存放, 因此如果能有 SSD 作为进一步缓存是最好,若没有的话,个人建议使用锯齿状的 RAID10 效果最好。 例如有八颗磁盘时,两两成对做成四个 RAID1 的系统,再将 4 个 RAID1 集成成一组 RAID0,实际使用的经验, 这样的读写效率会比 RAID5 好些,尤其是在随机访问的环境上。
此外,在目前 2020 年,市面上有许多容量、性能与使用寿命都还不错的 SSD 磁盘,因此,使用 SSD 磁盘作为磁盘数组的子组件也是可行的方案! 不过还是得要注意数据的备份,总之,数据的重要性还是比硬件来的需要注意!
一般的服务,包括 WWW 服务,以及非频繁读写的数据库环境 (包含在 WWW 系统内),或者是一般小型办公室的文件服务器, 大多使用 CPU 为 4 核 8 绪的 PC 等级产品即可。也就是说,绝大部分的中小企业,需要的就是一部 PC server 啦!
以物连网为例,一部树莓派就可以做很多事情,根本无须使用到 x86 架构的 PC。此外,若单纯作为用户端的接收设备, 树莓派或其他 Xapple pi 都可以符合这样的需求。最近学校单位若经费不足,在电脑教室内似乎也能够通过这种环境, 搭配共用的云端虚拟系统来组建一整间电脑教室,不但维护较为容易,经费支出应该也会比较节省。
不要怀疑,无论你是使用什么系统,有办法处理磁盘分割格式为 GPT,就以 GPT 为主!不要再用 MSDOS 的 MBR 模式。 再者,需要做什么样的分割,要分割成哪些目录的挂载,这就与你服务器的使用有关了。
如果是作为众多帐号使用的文件服务器 (一般中小型企业比较容易使用到的环境),建议 /home 一定要独自切出来, 此外,若可能的话,将这个 /home 做成 LVM 也是可行的方案 (但是备份方面请自行考量!),这样文件系统的缩放才有弹性。 而如果考量到未来可能会放大或缩小,那最好选用 EXT4 文件系统,因此目前 XFS 并不支持缩小文件系统的。
若有特殊需求需要用在非正规的目录底下,例如鸟哥经常介绍的 /data 目录,那么也请自行制作分割与文件系统的处置。
针对比较大容量的磁盘或分割,确实建议使用 XFS 文件系统,格式化会比较快,另外,XFS 在错误救援方面也颇为成熟, 对大文件来说,性能也不错,是可以考虑使用的文件系统。
若考虑都使用 CentOS 8 原本提供的服务与缺省的目录配置,则 /var 最好独自分割出来, 因为很多服务的数据产出都放置于 /var/lib 里面 (包括数据库系统),而邮件数据也是放置于 /var/spool/mail 里面的。
虽然磁盘分割还是依据服务器的用途而定,不过通常必须要有的分割大致有这些:
以学校的教学环境而言,若在无还原卡的环境下,要达到最大化资源应用,通常会在一个磁盘内进行多个磁盘分割,然后安装不同的操作系统, 最终以开机菜单来进入各个不同的操作系统,此即为多重开机环境的设计依据。
以前 CentOS 6 以前的 Linux 系统,缺省使用 EXT3/EXT4 这种 EXT 家族的文件系统,因此在进行 chainloader 的时候是不会出事的, 因为 CentOS 6 以前的系统,使用的 EXT 文件系统家族,都会预留出可以安装开机管理软件的区块 (boot sector)。不过新的 XFS 文件系统并没有预留! 所以 XFS 文件系统的 superblock 预留区块并没有包含 boot sector 的,因此无法安装开机管理程序。
因此,针对学校的一机多用途环境而言,若需要安装 Linux 操作系统与 Windows 操作系统共存的环境,建议 CentOS 的缺省文件系统最好修订为 EXT4 较佳。 而且较为有趣的是, CentOS 7 以后的系统,因为使用了 XFS 文件系统,因此开机过程中已经取消自动安装 boot loader 到 boot sector 的区块, 只会将 boot loader 安装到 MBR 区块而已。所以在安装完 CentOS 8 之后,可能需要手动安装 grub2 到 EXT4 的 boot sector 才行。
另外,读者应该知道安装操作系统的『顺序』是有关系的,因为最后安装的操作系统之开机管理程序会更新 MBR,因此最终的 MBR 是最后安装的那个操作系统所管理的。而在教学环境中,Linux 操作系统的开机管理程序可能会被胡乱修改, 因此可能造成无法顺利进入其他操作系统的窘境。根据经验,最好的方式是这样的:
其中,/dev/sda1 那个小 Linux 系统的目的是要维护整个单机系统的开机菜单,因此该系统一经安装就不要在更动他。 而根据上述流程的安排,最终开机菜单会被第三个 (也就是最后一个, /dev/sda3) 操作系统所管理。请依据正常流程开机, 然后在纯文本界面 (例如 tty2) 用 root 登录系统,之后使用底下的方法将 boot loader 安装到 boot setor 上面去。
若出现错误,可加入『--force --recheck --skip-fs-probe』等参数来处理看看。务必记得不要使用 XFS 文件系统才好。 处理完这部份之后,请拿出 CentOS 的原版光盘,进入本课程之前章节谈到的救援模式,然后 chroot 到第一个 /dev/sda1 的操作系统环境,接下来进行救援:
这样就可以完成整个多重操作系统的环境设置了。
读者会发现这个小章节中,无论是硬件还是初始环境的设置 (包括分割、文件系统选择、挂载资源的设计等等), 全部都与 Server 的用途有关。而无论硬件资源与初始环境设置,几乎都是一经确认就无法修改 (当然!), 因此,读者们在学习 Linux 之后,若有架设 Linux server 的需求,应该就您服务器的用途来考量, 将经费花在刀口上,会比较妥当。
此外,就如同 CentOS 每个版本的支持度都长达 5~7 年之久,你 Server 硬件的使用年限,最好也能够是 5~7 年以上。 所以,读者在设计这些硬件资源与初始环境配置时,需要缺省考量 5 年内的使用情况,预留升级空间 (包括 LVM 文件系统、 硬件的内存插槽是否有剩余、磁盘是否能够后续加挂、额外的插槽是否足够未来的设备使用等等), 这样才是较为完整的规划。
一般建议强迫系统用 GPT 分割格式,然后使用最小安装模式,安装完毕之后,再以文本模式的方式创建好网络, 持续使用纯文本模式进行各项设置工作,初始环境设置完成后,就能够开始处理你的服务器架设了。
假设这是一部通过网络芳邻提供的文件服务器,同时提供个人化网页设置的网页服务器,两者分别使用 Samba 与 httpd 服务。 另外,该服务器预计提供这些功能:
分析上面的数据,我们大概可以知道磁盘分割时,最好能够分割的目录应该有哪些?
目前可以使用的虚拟机硬件资源中,CPU 有两颗、内存仅有 2GB,磁盘也只有 40G 的容量而已,根据这样的系统,我们大致拟定了这样的分割:
之所以使用 LVM 是考量到未来的容量扩充之故。至于文件系统则除了 /boot 使用 ext4 之外,其他通通使用 XFS (因为不是多重操作系统之故)。
根据本章节的规划需求,在整体安装流程中,读者比较需要注意的安装流程项目有底下几个点:
要进入安装模式的话,你需要: (1)将原版光盘放入光盘或 USB 之后,系统重新开机,并选择光盘开机,如此则会进入安装模式。 (2)在此安装模式下会有 60 秒的等待时间,你在时间内请选择『Install CentOS Linux 8』的菜单, (3)按下 [tab] 按钮后,在出现的更改内核参数画面中,最后方加入 inst.gpt 的参数即可按下 [enter] 继续。
完成 GPT 的强迫使用后,准备进入图形界面的安装,我们先选择语系数据,你可以选择左侧最下方『中文』, 右侧的『繁体中文(台湾)』之后,即可按下右下角『继续』,就可以进入到如下的安装主画面:
上图中主要分为三个直行状态,左侧是本地化设置,包括键盘、语系与日期,中间是软件数据的部份,右侧则是系统设置。 本地化的设置上,语系支持与日期可能需要重新调整一下,软件选择也需要处理一下,还有一些系统设置份也处理一下:
回到安装主画面后,按下『安装目的地』选项,你会发现有一个 30~40G 左右的磁盘在虚拟机上,请勾选该磁盘,之后左下方会出现自动配置与自行配置, 请选择自行配置的项目,最终再按下左上角的完成,即可进入磁盘分割的画面了。
依序选择『标准分割』与『LVM』来创建起 15.2.1 小节所讨论的磁盘分割格式。最终磁盘分割完毕应该如下所示:
若一切都顺利处理完毕,则回到安装主画面,并且按下『开始安装』之后,就可以进入安装的阶段了! 在安装阶段时,可以选择创建 root 密码以及创建一个平时操作的一般帐号!请务必让 root 的密码变得严格一点!不要随便设置! 养成良好的习惯啊!最后很快的安装完毕,就会出现如下的画面,等待你重新开机了!
因为我们选择最小安装,因此在第一次安装妥当之后,并不会出现授权画面!直接就可以使用一般帐号登录系统操作了!相当方便! 此外,读者会发现,本章特意不在安装过程中设置好网络,原因是网络的设置还是需要一定的经验,因此建议还是安装完毕后再来设置, 印象会比较深刻。
假设这部服务器所在的环境之网络设置要求如下:
在你使用一般帐号登录此新安装的系统,并且 sudo su - 切换成为 root 之后,依旧可以使用 nmcli 指令来完成各项设置。 只是最小安装缺省并没有安装 bash-completion,因此无法使用 [tab] 来补齐各项参数,因此你得要自行手动输入参数才行。
最后也要记得让系统自动开机就启动的功能要加上去:
[root@station200 ~]# nmcli connection modify ens3 connection.autoconnect yes
本课程大多使用 vim 以及选项会自动补齐的功能,该功能主要通过 vim-enhanced 以及 bash-completion 软件所提供, 因此读者可以自行安装这两个软件来恢复自己常用的工作环境。
[root@station200 ~]# yum install vim-enhanced bash-completion [root@station200 ~]# source /etc/profile.d/bash_completion.sh [root@station200 ~]# yum install net-tools
此时 vim 立即可以使用了,但如果要在不注销的情况下立即让 bash-completion 生效,那就得要 source /etc/profile.d/bash_completion.sh 来加载环境才行。不过还是建议可以注销再登录来刷新操作环境较佳。另外,探索网络的工具如 netstat 等,是由 net-tools 所提供的, 所以也得要安装才好。
安装好系统的第一个动作,就是升级你的系统!要升级系统最好依据第 12 堂课的建议,选择最近的 yum server 设置, 这样软件安装速度才会快速。因此请自行处理如下的动作:
由于我们使用了最小安装,所以缺省有启动的网络服务相对少很多!不过,近期以来因为主机域名查找系统变得比较复杂, 因此 CentOS 8 缺省帮我们激活了 systemd-resolvd 这个服务!这个服务可以提供 DNS 的解析。不过,我们目前似乎不太用的到, 所以暂时先予以关闭,等到未来使用到之后,再来处理即可。因此,最终网络服务应该只会剩下 port 22 这个 ssh 而已!
[root@station200 ~]# systemctl stop systemd-resolved.service [root@station200 ~]# systemctl disable systemd-resolved.service [root@station200 ~]# netstat -tlunp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 991/sshd tcp6 0 0 :::22 :::* LISTEN 991/sshd
由于 CentOS 8 取消了 ntpdate 这个指令的支持,建议我们使用 chronyd 来进行网络校时啦!所以,请依据你的环境来设计好 chrony.conf 文件, 之后启动 chronyd 服务吧!只是,这个服务是用户端的功能,所以防火墙不需要放行 port 123 喔!
[root@station200 ~]# yum install chrony [root@station200 ~]# vim /etc/chrony.conf #pool 2.centos.pool.ntp.org iburst server ntp.ksu.edu.tw iburst [root@station200 ~]# systemctl start chronyd [root@station200 ~]# systemctl enable chronyd
sshd 毕竟还是不要对整个 internet 放行会比较好!所以请依据第 11 章介绍的 rich rule 进行设计,让 ssh 仅放行到 172.16.0.0/16 这个区网即可。 此外,将放行的服务减少到只剩下 http 与 https 即可!其他都不要喔!
[root@station200 ~]# firewall-cmd --permanent --remove-service=cockpit [root@station200 ~]# firewall-cmd --permanent --remove-service=dhcpv6-client [root@station200 ~]# firewall-cmd --permanent --remove-service=ssh [root@station200 ~]# firewall-cmd --permanent --add-service=http [root@station200 ~]# firewall-cmd --permanent --add-service=https [root@station200 ~]# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='172.16.0.0/16' service name='ssh' accept" [root@station200 ~]# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='172.16.0.0/16' service name='samba' accept" [root@station200 ~]# systemctl restart firewalld.service [root@station200 ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens3 sources: services: http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="172.16.0.0/16" service name="ssh" accept rule family="ipv4" source address="172.16.0.0/16" service name="samba" accept
请读者不要忘记了,firewall-cmd 的使用上,主要分为立即性与永久的设置值 (--permanent),读者们必须要将所有的设置写入设置值才行。
最后再来确认一下分割的状态是否吻合当初设计的情况:
[root@station200 ~]# df -Th -t xfs -t ext4
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 10G 1.4G 8.7G 14% /
/dev/mapper/centos-var xfs 5.0G 263M 4.8G 6% /var
/dev/mapper/centos-home xfs 17G 154M 17G 1% /home
/dev/mapper/centos-srv xfs 5.0G 68M 5.0G 2% /srv
/dev/vda2 ext4 976M 161M 749M 18% /boot
这应该是没问题的情况。不过,由于未来用户的文件容量是有限制的,因此在 /home 的文件系统挂载参数中,应该要加入 usrquota 才对。 因此最终使用 mount 去查阅 /home 的数据时,应该要出现如下的情况才对。
[root@station200 ~]# vim /etc/fstab /dev/mapper/centos-home /home xfs defaults,usrquota,grpquota 0 0 [root@station200 ~]# umount /home [root@station200 ~]# mount -a [root@station200 ~]# mount | grep '/home' /dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)
如前所述,这里假设你的服务器为一般企业内部的文件服务器及个人化首页之网页服务器,且为多人共用的服务器系统。 同时因应文件系统的适当分配,因此会加上磁盘配额的限制。因此这里就得要有一些帐号建置的相关注意事项才行。
本服务器假设要提供 http 的网络服务,同时提供区网内网芳服务。不过由于网芳 (Samba) 的设置较为复杂, 因此本章主要以 http 网页服务器作为简易的说明。
Web 服务使用的是 httpd 这只程序,请安装,然后启动即可顺利提供服务。
[root@station200 ~]# yum -y install httpd [root@station200 ~]# systemctl start httpd [root@station200 ~]# systemctl enable httpd
由于本服务器并没有安装任何的图形界面,因此无法使用图形界面的浏览器。不过 CentOS 上面有提供多种文本界面浏览器, 例如 elinks 就是其中一个颇为知名的文本界面浏览器之一。
[root@station200 ~]# yum --enablerepo=PowerTools install elinks [root@station ~]# yum -y install elinks [root@station ~]# links https://127.0.0.1
你可以在 links 的画面中,按下 [q] 来离开,方向键上下为在超链接项目中移动,左右键为前一个、后一个页面, [esc] 可以调用 links 菜单。
关于 httpd 你应该还需要知道的是:
假设 student 这个帐号需要管理 https://127.0.0.1/student/ 时,最简单的方法为使用如下的方式建置妥当:
[root@station200 ~]# useradd student [root@station200 ~]# passwd student [root@station200 ~]# cd /var/www/html [root@station200 html]# mkdir student [root@station200 html]# echo "I am student" > student/index.html [root@station200 html]# chown -Rv student student changed ownership of 'student/index.html' from root to student changed ownership of 'student' from root to student [root@station200 html]# ll -d student student/* drwxr-xr-x. 2 student root 24 6月 22 16:06 student -rw-r--r--. 1 student root 13 6月 22 16:06 student/index.html [root@station200 html]# links https://127.0.0.1/studnet
最终你应该会在 links 的画面中看到 I am student 的字样,那就代表成功了。
帐号的建置相当的简单,本训练教材第 10 堂课已有相当多的范例可以参考。现在本服务器除了要建置帐号之外,该帐号必须要能拥有 https://127.0.0.1/username/ 的网页子目录才行。同时,每个帐号在家目录最多仅能有 200MB 的容量,且超过 180MB 就需要提供警告。 此时,你可以使用底下的脚本来创建好每个用户,且提供用户缺省的帐密数据,同时强迫用户第一次使用系统时,需要变更密码才行。
[root@station200 ~]# vim account.sh #!/bin/bash for i in $(seq 1 20) do username="user${i}" password="${username}" useradd ${username} echo ${password} | passwd --stdin ${username} chage -d 0 ${username} xfs_quota -x -c "limit -u bsoft=180M bhard=200M ${username}" /home mkdir /var/www/html/${username} echo "I am ${username}" > /var/www/html/${username}/index.html chown ${username}:${username} -R /var/www/html/${username} done [root@station200 ~]# sh account.sh
同时,在不考虑资安的情境下,将整个用户的 quota 信息贴出于 /var/www/html/quota.html 底下, 同时列出目前每个用户在网页目录的磁盘使用量,最简易的方法可以这样做:
[root@station200 ~]# (echo "<pre>"; date; xfs_quota -x -c "report -ubh" /home; \ > du -sm /var/www/html/user*; echo "</pre>" ) > /var/www/html/quota.html [root@station ~]# links https://127.0.0.1/quota.html
顺利的话,你就能够看到系统上面每个用户的信息使用量。如果需要逐时分析该信息,请将上面的脚本写入 /etc/crontab 即可让系统自行更新。 最后,再考虑备份机制,这部简易的服务器就大致在可运作的情境下了。