做一個小型的 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 http://localhost
你可以在 links 的畫面中,按下 [q] 來離開,方向鍵上下為在超連結項目中移動,左右鍵為前一個、後一個頁面, [esc] 可以呼叫 links 選單。
關於 httpd 你應該還需要知道的是:
假設 student 這個帳號需要管理 http://localhost/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 http://localhost/studnet
最終你應該會在 links 的畫面中看到 I am student 的字樣,那就代表成功了。
帳號的建置相當的簡單,本訓練教材第 10 堂課已有相當多的範例可以參考。現在本伺服器除了要建置帳號之外,該帳號必須要能擁有 http://localhost/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 http://localhost/quota.html
順利的話,你就能夠看到系統上面每個用戶的資訊使用量。如果需要逐時分析該資訊,請將上面的腳本寫入 /etc/crontab 即可讓系統自行更新。 最後,再考慮備份機制,這部簡易的伺服器就大致在可運作的情境下了。