17.3.4 多重的重複設定方式:以 getty 為例
我們的 CentOS 7 開機完成後,不是說有 6 個終端機可以使用嗎?就是那個 tty1~tty6 的啊!那個東西是由 agetty 這個指令達成的。
OK!那麼這個終端機的功能又是從哪個項目所提供的呢?其實,那個東東涉及很多層面,主要管理的是 getty.target 這個 target unit ,
不過,實際產生 tty1~tty6 的則是由 getty@.service 所提供的!咦!那個 @ 是啥東西?
先來查閱一下 /usr/lib/systemd/system/getty@.service 的內容好了:
[root@study ~]# cat /usr/lib/systemd/system/getty@.service
[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
ConditionPathExists=/dev/tty0
[Service]
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
[Install]
WantedBy=getty.target
比較重要的當然就是 ExecStart 項目囉!那麼我們去 man agetty 時,發現到它的語法應該是『 agetty --noclear tty1 』之類的字樣,
因此,我們如果要啟動六個 tty 的時候,基本上應該要有六個啟動設定檔。亦即是可能會用到 getty1.service, getty2.service...getty6.service 才對!
哇!這樣控管很麻煩啊~所以,才會出現這個 @ 的項目啦!咦!這個 @ 到底怎麼回事呢?我們先來看看 getty@.service 的上游,亦即是 getty.target 這個東西的內容好了!
[root@study ~]# systemctl show getty.target
# 那個 show 的指令可以將 getty.target 的預設設定值也取出來顯示!
Names=getty.target
Wants=getty@tty1.service
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=multi-user.target
After=getty@tty1.service getty@tty2.service getty@tty3.service getty@tty4.service
getty@tty6.service getty@tty5.service
.....(後面省略).....
你會發現,咦!怎麼會多出六個怪異的 service 呢?我們拿 getty@tty1.service 來說明一下好了!當我們執行完 getty.target 之後,
他會持續要求 getty@tty1.service 等六個服務繼續啟動。那我們的 systemd 就會這麼作:
先看 /usr/lib/systemd/system/, /etc/systemd/system/ 有沒有 getty@tty1.service 的設定,若有就執行,若沒有則執行下一步;
找 getty@.service 的設定,若有則將 @ 後面的資料帶入成 %I 的變數,進入 getty@.service 執行!
這也就是說,其實 getty@tty1.service 實際上是不存在的!他主要是透過 getty@.service 來執行~也就是說, getty@.service 的目的是為了要簡化多個執行的啟動設定,
他的命名方式是這樣的:
原始檔案:執行服務名稱@.service
執行檔案:執行服務名稱@範例名稱.service
因此當有範例名稱帶入時,則會有一個新的服務名稱產生出來!你再回頭看看 getty@.service 的啟動腳本:
ExecStart=-/sbin/agetty --noclear %I $TERM
上表中那個 %I 指的就是『範例名稱』!根據 getty.target 的資訊輸出來看,getty@tty1.service 的 %I 就是 tty1 囉!因此執行腳本就會變成『 /sbin/agetty --noclear tty1 』!
所以我們才有辦法以一個設定檔來啟動多個 tty1 給用戶登入囉!
將 tty 的數量由 6 個降低到 4 個
現在你應該要感到困擾的是,那麼『 6 個 tty 是誰規定的』為什麼不是 5 個還是 7 個?這是因為 systemd 的登入設定檔 /etc/systemd/logind.conf 裡面規範的啦!
假如你想要讓 tty 數量降低到剩下 4 個的話,那麼可以這樣實驗看看:
# 1. 修改預設的 logind.conf 內容,將原本 6 個虛擬終端機改成 4 個
[root@study ~]# vim /etc/systemd/logind.conf
[Login]
NAutoVTs=4
ReserveVT=0
# 原本是 6 個而且還註解,請取消註解,然後改成 4 吧!
# 2. 關閉不小心啟動的 tty5, tty6 並重新啟動 getty.target 囉!
[root@study ~]# systemctl stop getty@tty5.service
[root@study ~]# systemctl stop getty@tty6.service
[root@study ~]# systemctl restart systemd-logind.service
現在你再到桌面環境下,按下 [ctrl]+[alt]+[F1]~[F6] 就會發現,只剩下四個可用的 tty 囉!後面的 tty5, tty6 已經被放棄了!不再被啟動喔!
好!那麼我暫時需要啟動 tty8 時,又該如何處理呢?需要重新建立一個腳本嗎?不需要啦!可以這樣作!
[root@study ~]# systemctl start getty@tty8.service
無須額外建立其他的啟動服務設定檔喔!
暫時新增 vsftpd 到 2121 埠口
不知道你有沒有發現,其實在 /usr/lib/systemd/system 底下還有個特別的 vsftpd@.service 喔!來看看他的內容:
[root@study ~]# cat /usr/lib/systemd/system/vsftpd@.service
[Unit]
Description=Vsftpd ftp daemon
After=network.target
PartOf=vsftpd.target
[Service]
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/%i.conf
[Install]
WantedBy=vsftpd.target
根據前面 getty@.service 的說明,我們知道在啟動的腳本設定當中, %i 或 %I 就是代表 @ 後面接的範例檔名的意思!
那我能不能建立 vsftpd3.conf 檔案,然後透過該檔案來啟動新的服務呢?就來玩玩看!
# 1. 根據 vsftpd@.service 的建議,於 /etc/vsftpd/ 底下先建立新的設定檔
[root@study ~]# cd /etc/vsftpd
[root@study vsftpd]# cp vsftpd.conf vsftpd3.conf
[root@study vsftpd]# vim vsftpd3.conf
listen_port=2121
# 2. 暫時啟動這個服務,不要永久啟動他!
[root@study vsftpd]# systemctl start vsftpd@vsftpd3.service
[root@study vsftpd]# systemctl status vsftpd@vsftpd3.service
vsftpd@vsftpd3.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd@.service; disabled)
Active: active (running) since Thu 2015-08-13 01:34:05 CST; 5s ago
[root@study vsftpd]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::2121 :::* LISTEN 16404/vsftpd
tcp6 0 0 :::555 :::* LISTEN 12672/vsftpd
tcp6 0 0 :::21 :::* LISTEN 12670/vsftpd
因為我們啟用了 vsftpd@vsftpd3.service ,代表要使用的設定檔在 /etc/vsftpd/vsftpd3.conf 的意思!所以可以直接透過 vsftpd@.service 而無須重新設定啟動腳本!
這樣是否比前幾個小節的方法還要簡便呢? ^_^。透過這個方式,你就可以使用到新的設定檔囉!只是你得要注意到 @ 這個東西就是了! ^_^
Tips
聰明的讀者可能立刻發現一件事,為啥這次 FTP 增加了 2121 埠口卻不用修改 SELinux 呢?這是因為預設啟動小於 1024 號碼以下的埠口時,
需要使用到 root 的權限,因此小於 1024 以下埠口的啟動較可怕。而這次範例中,我們使用 2121 埠口,他對於系統的影響可能小一些 (其實一樣可怕!),
所以就忽略了 SELinux 的限制了!