@ System message log
CentOS6_x64 的系統紀錄檔,一般是放置於 /var/log 下。所以請讀者,來來來,哩來,哩來,來跨加,用指令 ls -lh /var/log | more,此章節亦記得請讀者要使用 root 權限來執行,在整個系統管理篇的操作,要時刻提醒自己這件事。我們把指令顯示的各頁面,合併在一起
,如圖3-86,來說明各 log 檔與其所屬的服務分類。而已經啟動與可供啟動的服務,亦可以用指令 chkconfig 來列出各個 init 的服務狀態,亦可利用指令 setup,接著選擇 System Services,或是直接使用指令 ntsysv,便可以對於現在系統的預設 init 狀態 開啟服務的啟用或取消,如圖3-87,筆者為了容易說明,已把分頁的圖拼成一張圖。指令 ntsysv 的服務設定介面,就如同在 MS Windows下,執行指令 services.exe ,來選擇要開啟與關閉的系統各項服務相似。CentOS6 的開機啟動流程,可參閱 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/ch-boot-init-shutdown.html
(圖3-86)
相信乍看到圖3-87的讀者,一定會覺得,哇!這服務也多到靠北,還有看不懂的服務名稱縮寫。但是,其實 MS Windows 開機後所啟動的服務也是很多,除了 services.exe 指令所看到的系統服務(圖3-88左圖),利用 msconfig.exe 指令(圖3-88右圖),再選擇啟動標籤,還可看到其他的啟動程式(圖3-88範例為 MS Windows 10 設定,與 MS Winodws 7 有些不同),或是在點選開始後,選擇程式集,點選啟動資料夾,裡面亦可放置啟動的程式,其實比較起來,也算是夭受骨的多,而這些服務,也跟開機後,剩餘實體記憶體容量息息相關,服務愈多,所剩餘的實體記憶體容量就愈少,剩餘記憶體愈少,則對於要接著要執行工作的大型程式或軟體,影響就很大,故在作業系統內,關閉不需要的服務是很重要的調校工作(tuning)。
圖3-86我們由上而下來介紹,第一群組分類為
anaconda.*(包含 anaconda.ifcfg.log、anaconda.log、anaconda.program.log、anaconda.storage.log、anaconda.syslog、anaconda.xlog、anaconda.yum.log 筆者在往後文章內,群組皆用服務名稱 . * 表示),而其代表為 CentOS6_x64的安裝管理服務軟體(https://en.wikipedia.org/wiki/Anaconda_(installer))。
audit 資料夾為用來記錄使用者登入操作系統與檔案,來作為往後若系統錯誤,此操作紀錄可供檢查與稽核(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/chap-system_auditing.html),要搭配啟動 auditd 服務。
boot.log 為系統開機時,所跑動的載入服務與步驟的清單,若開機跑太快沒看清楚,讀者可再用 cat /var/log/boot.log 來對照,此檔也可讓一般操作者了解開機載入步驟是否皆有執行成功。
btmp 為記錄有曾登入失敗的連線,而圖3-86下方的wtmp,則為記錄所有登入登出的資料,詳細說明如 https://en.wikipedia.org/wiki/Utmp,btmp檔案內容可搭配指令 last -df /var/log/btmp (注意 -f 後面要接檔案路徑,所以不能用 -fd )或 lastb -d (兩指令的參數 -d 皆為將 IP 轉換為 hostname 顯示,較容易看出來源機構 )來顯示,預設紀錄時間約一個月內,如圖3-89,為 btmp 在 2016.07.01 所備份的 btmp 記錄檔案,第1欄與第3欄分別為登入帳號與登入 hostname 或 IP,筆者已將敏感資料屏蔽,故僅看到 IP 第一個數字或 hostname 前頭字串。第2欄為登入方法,為 ssh 連線,第4、5、6欄分別為星期、月、日,第7至9欄為登入時間開始與結束,第10欄為總停留的時間,格式為天數 + 時數 : 分數。
ConsoleKit 資料夾為記錄 gnome 使用者登入,或是轉換其他使用者的活動記錄(https://wiki.gnome.org/Projects/ConsoleKit)。
cron 為使用 crond 服務的自動化排程後,所產生的紀錄,可用指令 crontab -e 來製作想排程的清單,清單檔內的排列格式為可分成六欄(每欄間要空格),為
minute hour day month day_of_week command ,如 15 02 * * * backup.bash 為每天的凌晨 2:15 執行 baskup.bash 這個 bash script ,來進行備份工作。列出排程清單可用指令 crontab -l 。crond 使用 /etc/cron.hourly 內的檔案來負責每小時排程,/etc/cron.daily 內的檔案負責每天排程,/etc/weekly內的檔案負責每週排程,/etc/cron.monthly內的檔案負責每月排程,詳細可參考https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-Automating_System_Tasks.html。
cups 為紀錄印表機的狀況的紀錄檔。
dmesg 為紀錄在系統開機時,Kernel偵測硬體過程所產生的資訊,如指令 dmesg 便是取用此紀錄,較早前的紀錄,就轉存程 dmesg.old,其他轉存檔案,名稱規則相同,或是檔名會加上轉存日期。
dracut.log 則是記錄系統開機在進入硬碟的 /root 檔案系統前,啟動 /init 所需的 initramfs 映像檔( https://en.wikipedia.org/wiki/Initrd,https://en.wikipedia.org/wiki/Initramfs ) ,來成為載入硬碟內的 /etc/rc.d 之 init 系統服務之前,預先載入SATA 或 RAID 驅動等驅動程式,確保先完成驅動硬碟或外接裝置,模組、韌體與所需的 Libraries (https://en.wikipedia.org/wiki/Library_(computing))的 initramfs loading 過程(https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html),才再進入啟動系統服務 rc.d/init 等階段。稍後編譯核心時,會利用指令 dracut 造出 initrd 要預先載入使用的 .img 檔 ,內容如圖3-86-1。
(圖3-86-1)
gdm 則是 GNOME Display Manager 所產生的使用X Windows的紀錄(https://en.wikipedia.org/wiki/GNOME_Display_Manager)。
glusterfs,則為記錄連結 RHCE 的 Gluster File System 過程(https://en.wikipedia.org/wiki/GlusterFS)。
httpd 為啟動網頁伺服器軟體的所有過程與紀錄,這於往後篇章,架設網頁伺服器軟體會再詳細說明。
lastlog 則記錄每個帳號最後一次登入的時間,為搭配指令 lastlog 來讀取。
libvirt 資料夾內紀錄檔,為用來實現 Linux 虛擬化技術的API軟體(http://libvirt.org/)之執行過程紀錄,有興趣建立虛擬化存儲系統的讀者,可參考https://libvirt.org/storage.html。
maillog 為使用伺服器軟體 postfix(SMTP,發信) 與 devoceot(POP/IMAP,收信)收發email的過程紀錄檔,若無法利用此機器的伺服器軟體收發email,這裡一定可查到錯誤訊息。
message 則是相當重要的系統紀錄檔,除了mail 、cron(紀錄檔已放置於/var/log/cron)與帳號登出/入認證( 已放置於/var/log/secure )之外,其他系統各種的 info 等級 (含以上,等級說明如https://en.wikipedia.org/wiki/Syslog),皆會記錄在 message,詳細記錄規則,讀者可用指令 cat /etc/rsyslog.conf 來了解,此紀錄方式主要由 rsyslogd 服務來控管,圖3-87。依日數來轉存的方式,為搭配指令 logrotate 與其設定檔 /etc/logrotate.conf。
寫到這裡,對有些讀者可能像〝唸經文〞一般,故我們整理一下思緒與上述紀錄檔的重點。若我們想了解使用者近/遠端登入/出狀況,請想起要看看 btmp、wtmp、lastlog 與接下來要介紹的 secure 紀錄檔。如果要看系統的錯誤,請看看 message 內的訊息,若要看檔案被更動的資訊,可能就要先利用指令 auditctl -w /home/,才能在 audit 內看到 /home 內,所有檔案更動的紀錄。
(圖3-87)
ntpstates 為使用指令 ntpdate 來校正系統時間的紀錄。
pm-powersave.log 為記錄電源管理。
ppp為用pppoe(https://en.wikipedia.org/wiki/Point-to-point_protocol_over_Ethernet)撥號連線的紀錄檔,如ADSL。
prelink 為 prelink 程式是用來調整共享 libraries 與 連結 binaries 來加速程式啟動速度,/var/prelink/prelink.log 記錄被prelink所調整的 .so (share object)檔資訊(http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html)
sa 內紀錄檔為使用者使用系統資源程度的統計檔。可以利用指令 sar -u (看CPU使用狀況),指令 sar -r (看RAM使用狀況,與指令 free 相似)。
samba 內為連線使用 CIFS 網路磁碟格式之紀錄檔。
secure 這個從字面上來看,就知道為超級重要的記錄安全性的檔案。在CentOS6_x64的所有使用到登入的行為,無論使用何種應用程式,皆會記錄在此檔案,包含 sudo ,所以如果有非法的想使用某個帳號,或是常被非法拿來用的 root 或 admin 此種帳號名稱,都可以從此紀錄檔案到,從哪個 IP 利用哪個帳號名稱來連線,試了多少次(次數要自己用指令來統計)。而我們便可以利用此統計量,看是否要加入拒絕連線的黑名單內。如圖3-90,可以看到有好幾個 IP試圖非法利用 ssh 連線到我的伺服器主機,若是非故意的嘗試,應該也不會在 10 分鐘內嘗試超過 10 次吧。故此時,就可以寫個 script 或手動輸入 ,把這些胡亂嘗試的 IP,加入黑名單內 ( iptables 的 -j REJECT 或 /etc/hosts.deny ),就可以形成簡易的阻擋機制。
spice-vdagent.log 此紀錄檔為記錄使用SPICE (http://www.spice-space.org/index.html,https://rhn.redhat.com/errata/RHEA-2011-0576.html)的訊息,如 Microsoft 的 RDP 遠端連線服務。
spooler 檔用於紀錄 news 傳遞的錯誤狀況,同樣可由 /etc/rsyslog.conf 來調整記錄方式。
sssd 資料夾內的紀錄檔,為sssd服務提供各種認證方式(SUDO、LDAP、Active Directory、Kerberos、OpenSSH 等 )的紀錄(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/SSSD-Introduction.html)
tallylog 為記錄Linux-PAM (https://en.wikipedia.org/wiki/Linux_PAM)的認證活動的錯誤,可以使指令 pam_tally2 與 man pam_tally2,其設定檔於 /etc/pam.d/ 內。
wpa_supplicant.log 為記錄 Wi-Fi Protected Access (WPA,https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access) 與 IEEE 802.1X (https://en.wikipedia.org/wiki/IEEE_802.1X) 連線狀況,搭配指令 wpa_supplicant ( https://wiki.centos.org/HowTos/Laptops/WpaSupplicant )。
Xorg.* ( Xorg 服務所組成的群組),主要為儲存 X Window System 服務軟體與使用硬體的錯誤訊息,可提供啟動 X Window 的障礙排除。
以上較常會使用到的為 secure 檔內的訊息,若被非法入侵,亦可以從此檔案找出跡證。有時亦會看看 Xorg*.log,來判斷啟動 X Windows的問題。一般來說,通常一個服務軟體,就會有自己的紀錄檔,安裝新的軟體時,在 /var/log/ 內或軟體指定儲存 log檔 的地方,就會出現不同的服務軟體紀錄檔,所以管理者要細看軟體的說明,並從說明去找紀錄檔與內容所紀錄的重點。
(圖3-88)
(圖3-89)
(圖3-90)
@ make Custom Kernel
接下來,筆者要來講解編譯核心的部分。首先,先進入 Kernel 的 source code 站, www.kernel.org (圖3-91),因CentOS6_x64之核心較舊但穩定,為 2.6.32-xxx 版本,故為了好的相容性,我們將目標定為2.6.XX 版本號的最新版。因沒有在首頁的清單上,但可從圖3-91黃框處進入,筆者接著 HTTP的部分進入 https://www.kernel.org/pub/linux/kernel/v2.6/,可看到2.6.XX的最新的版本號為2.6.39.4,筆者便選擇下載 linux-2.6.39.4.tar.bz2 來下載。下載後,我們將解開的資料夾(可用指令 tar jxvf 解開)放入 /usr/src/kernels/ ,並進入已解開的資料夾,如圖3-92。如何解開 .tar.bz2 與放入資料夾,前面章節有提過,就不在多贅述。
(圖3-91)
(圖3-92)
在開始 make 之前,CentOS原始開發團隊,不建議我們這麼編譯 Kernel,而是利用 .SRPM 檔來重編譯,且有提供較安全的方法,來建議如網頁 https://wiki.centos.org/HowTos/Custom_Kernel 來做。但筆者還是有無窮的好奇心,想要利用手動的 make ,並要承擔可能無法用新編譯的 Kernel 來開機。但若真的無法開機,我們就在 GRUB 選單,再選擇回到舊的 Kernel 版本來開機即可,不是嗎?現在不試試看,不知下次何時還有機會呢?這時,就要如海濤法師所說的法,團隊的建議都是假的,假的,是筆者眼睛業障重 XD。但很重要的一點,若有重要資料在伺服器之讀者,還是要再三考慮再進行編譯(真的想要使用新 Kernel,可退而求其次,用指令 yum update kernel 來更新,但可能更新不到 kernel.org 內的最新 ),千萬不要拿來當試驗機器,現在有很多 Virtual Machine 軟體或是便宜的機器可供試驗與研究,不要想不開拿來做試驗喔。
首先,確認您在剛剛解壓縮的資料夾內,如圖3-92。若不想建立自己第一次的編譯 Kernel 設定,直接接續現有設定參數,可先利用以下指令來變成編譯前的參數。
$ cp /boot/config-`uname -r` /usr/src/kernels/linux-2.6-39.4/.config
/* 需確認位置在剛解開的資料夾內,如上要被 compile 的 kernel 位置為 /usr/src/kernels/linux-2.6.39.4 。 */
接著執行指令 make menuconfig 使用文字選單,進入後,選擇 Load an Alternate Configureation File,如圖3-93,或執行指令 make oldconfig 一步步的文字互動方式選擇( https://en.wikipedia.org/wiki/Menuconfig ),可以從現有設定參數基礎,再修改設定參數後重編譯。若您僅想清除之前有編譯過的中繼檔,請使用 make clean。
若您想創造為第一次編譯的環境,請使用以下指令:
$ make mrproper # 清除資料夾下已經有參數設定的 .config 隱藏檔
接著輸入以下指令:
$ make menuconfig # 使用選單選擇方式設定參數
進入後,請先閱讀選單上方的詳細說明,包含空白鍵選擇與取消,進入與按鍵盤Esc鍵兩次回到上一選單,以及可選擇的選項載入的方法有哪些,利用鍵盤左右鍵或是tab鍵,可選擇下方的 < Help >,便可以看到上方藍光條參數選項的說明。
(圖3-93)
General setup --->,的內容為圖3-94,一般很少會更動這裡,但我們為了好玩,可試著將一些有 EXPERIMENTAL 或 DEPRECATED 註解的功能取消。或是把一些有 NEW 註解的功能加上,為調整的方向。Enable loadable module support ---> 與 Enable the block layer ---> ,亦無需調整,接著是 Processor type and features --->,如圖3-95
(圖3-94)
圖3-95為處理器的選擇,因筆者皆為 Intel CPU,故目標為僅留下與 Intel CPU有關係的設定,AMD的設定便將其取消選取,Processor family 則看換成 Intel core/newer 或是 Generic x86-64。有些沒有看過的規格,讀者可以利用wikipedia來查閱( 如x2apic,https://en.wikipedia.org/wiki/X2APIC )
(圖3-95)
接著的 Power Management and ACPI option 的部分,筆者僅調整 CPU Frequency scaling有AMD的部分,若您不需要關心節能的問題,亦可取消 CPU Frequency scaling,或是改變 scaling 的預設為 performance,這與效能有相當的影響,,但北極熊可能很快就沒有家可住了(圖3-96)。
(圖3-96)
Bus options 的部分,因為筆者非使用 Laptop / Notebook,故僅取消 PCCard的設定。Executable file formats /Emulations 的部分,就不變更。Networking support 的部分,就取消僅會出現在行動裝置的部分,如Wireless、WiMAX、Bluetooth、RF switch(圖3-98)。
(圖3-97)
(圖3-98)
緊接著的 Device Drivers 是可以改變較多的部分,因 Linux Kernel 為了要方便抓取各項硬體裝置,預先載入很多驅動程式,但有些並非現在、或往後會用到,有些又為了相容性,放了較舊的驅動,所以我們可以在編譯前,先將其移去,或改為 M (載入模組) 的方式來執行。例如很明顯的 Tablet 與 Touchscreens 的驅動,在我們的運用範圍內也不需要。InfiniBand support亦不在我們使用的範圍(筆者也買不起XD),故取消選取。Xen (http://www.xenproject.org/users/why-the-xen-project.html) 的附屬選項也有很多,有興趣玩虛擬化的請選取,若無興趣可取消選取。X86 Platform Specific Device Drivers,也可以刪除無用的Laptop driver。
(圖3-99)
Firmware Drivers 的部分,便不更動。File systems 的部分,有興趣研究其他檔案系統的讀者,可無須更動,但筆者僅選取使用較普遍使用的,Ext、XFS等,與 Network File Systems、CD-ROM/DVD Filesystems、DOS/FAT/NT Filesystems、Pseudo filesystems 之檔案系統,故,其他的 GFS2 等雲端用的檔案系統,便將其取先選取。在這裡可以看到,Linux相當受推崇與 UNIX 的 ZFS 檔案系統相提並論的 Btrfs ( https://en.wikipedia.org/wiki/Btrfs ),在此說明依然為 Unstable disk format。在此選單,亦可在DOS/FAT/NT Filessystems 內,加入對 NTFS 的支援。(圖3-100)
(圖3-100)
Kernel hacking 的部分,這是很重要的一個選單,裡面有一些開啟紀錄和芯運作的設定,但因需要一些作業系統的知識,故筆者建議可以維持預設,不更動。Security option 與 Cryptographic API的部分,皆可不更動。Virtualization 若不需要玩虛擬化,則直接將其取消選取。最後的 Library routines 亦不更動。更改確認後,記得要選擇移至 Save an Alternate Configuration File,再連按兩次鍵盤 Esc鍵離開。
離開後,再輸入以下指令:
$ make -j 2 bzImage
/* 先將核心編譯好,參數 -j 代表要同時執行幾個編譯的工作,若無設定,則預設為1,端看您的 CPU 核心數目,因筆者使用虛擬環境下來編輯,故最多雙核心可使用。編譯好的核心 bzImage,位置會在 ./arch/x86_64/boot/bzImage ,他真正還是指向 ./arch/x86/boot/bzImage 檔案*/
$ make -j 2 modules # 再編譯模組,亦可直接使用 make -j 2 bzImage modules
上述兩指令的編譯過程,會花相當多的時間,故讀者可趁此時沖個涼或泡杯茶,再來就是要進入 make install 的步驟。
接下來,我們做以下指令,來載入建立好的模組
$ make -j 2 modules_install /* 將模組載入至 /lib/modules,如圖3-101
/* p.s. 以上三個指令,我們亦可以用懶惰的方法將它們串在一起輸入,就可省略時間,並開始編譯前先做指令 make clean, 如以下,利用符號 && 串接,可以判斷其中一個編譯過程有錯誤停止編譯,便會中斷進行下一個串接的指令,讓您可以除錯:
$ make clean && make -j 2 bzImage && make -j 2 modules && make -j 2 modules_install */
(圖3-101)
接著利用指令
$ cp /usr/src/kernels/linux-2.6.39.4/arch/x86/boot/bzImage /boot/vmlinuz-2.6.39.4.el6.x86_64
$ chmod 644 /boot/vmlinuz-2.6.39.4.el6.x86_64 # 修改權限允許僅root來讀寫,其他權限只能讀
與
$ cp /usr/src/kernels/linux-2.6.39.4/System.map /boot/System.map-2.6.39.4
接著再建立開機的ramdisk預儲機制 initrd 要用的 img 檔。(https://en.wikipedia.org/wiki/Linux_startup_process)
$ dracut -v /boot/initramfs-2.6.39.4.img 2.6.39.4
/* 注意 Kernel 版本號要與 vmlinuz 相同,要看 /lib/modules/ 下的版本資料夾名稱,參數 -v 為顯示過程。CentOS2/3/4版為使用 mkinitrd -v -f /boot/initrd-2.6.39.4.img 2.6.39.4,若是要加入其他驅動模組,至 initramfs 當開機即載入使用,則若模組編譯後名稱為 myscsi.ko ,並已放在 /lib/modules/2.6.29.4 內,則使用指令 dracut -v --add-drivers myscsi -f /boot/initrd-2.6.39.4.img 2.6.39.4 載入即可。可利用指令 lsinitrd /boot/initramfs-2.6.39.4.img | grep myscsi , 來列出開機即載入的驅動模組 */
再利用 vim 編輯 GRUB ( https://www.gnu.org/software/grub/,https://en.wikipedia.org/wiki/GNU_GRUB)開選單 /etc/grub.conf ,如圖3-102黃框處,可複製原本選項,如黃框下方,再修改版本號與檔案名稱對應,並儲存後離開,接著輸入指令 shutdown -r now 或 reboot,重開機後,我們便可以看到如圖3-103之比較,重開機前,可執行指令 sync,來將記憶體內暫存資料同步寫入硬碟。
(圖3-102)
(圖3-103)
圖3-103可以看出,我們的 Kernel 已經用到 2.6 的最新版 2.6.39.4,因新版原則上功能會較多原始檔案也較大,若只用預設設定,一定比舊版占用更大的記憶體,但因為取消選取裡面不需要的模組放入,可以從兩個開機主要的映像檔 vmlinuz-2.6.39.4.el6_x86_64、 initramfs-2.6.39.4.img 來與舊的 vmlinux-2.6.32-642.el6.x86_64、initramfs-2.6.32-642.el6.x86_64.img比較,可以發現,反而新版本的 Kernel還比較舊的 Kernel 版本所需容量小,想必占用記憶體的部分,也是變得較少,達到我們要的最佳化效果 (當然可能不是真的最佳,中國稱此為優化兒 )。確認我們選擇的Kernel參數編譯後,重開機正常啟動後,就可以利用已下指令備份到家目錄下:
$ cp /usr/src/kernels/linux-2.6.39.4/.config ~/mykernel-2.6.39.4-2016.8-try-1.config
/* 用檔名標示版本與日期,或也可加上第幾嘗試版本,以利再重選取 menuconfig 後,來區別試驗 */
以上的 Kernel 參數設定,若還不是很滿意,可再用指令
$ make clean
$ make menuconfig # 進入重調整後
$ make bzImage && make modules
$ make modules_install
重作後,再進行
$ cp /usr/src/kernels/arch/x86/boot/bzImage /boot/vmlinuz-2.6.39.4.el6.x86_64
$ chmod 644 /boot/vmlinuz-2.6.39.4.el6.x86_64
$ dracut -v -f /boot/initramfs-2.6.39.4.img 2.6.39.4
/* 參數 -f 為強制覆蓋同檔名之舊 .img 檔 */
以上為基本的手動核心編譯方式。下一篇,筆者要來介紹重點中的重點,就是備份與資料救援。因為好的備份,可以讓您上天堂(好看的不會不見),不好的備份,可以讓您住牢房(有些東西備的太好被查到,可能才會住牢房XD)。以上當然是開玩笑的話。總而言之,成語有云,有備無患。有備份,就無需資料救援,但資料救援的技能,我們也是有備無患,學起來,等機會來了,總有出頭天的一天。
If you have any feedback or question, please go to my forum to discuss.
CentOS6_x64 的系統紀錄檔,一般是放置於 /var/log 下。所以請讀者,來來來,哩來,哩來,來跨加,用指令 ls -lh /var/log | more,此章節亦記得請讀者要使用 root 權限來執行,在整個系統管理篇的操作,要時刻提醒自己這件事。我們把指令顯示的各頁面,合併在一起
,如圖3-86,來說明各 log 檔與其所屬的服務分類。而已經啟動與可供啟動的服務,亦可以用指令 chkconfig 來列出各個 init 的服務狀態,亦可利用指令 setup,接著選擇 System Services,或是直接使用指令 ntsysv,便可以對於現在系統的預設 init 狀態 開啟服務的啟用或取消,如圖3-87,筆者為了容易說明,已把分頁的圖拼成一張圖。指令 ntsysv 的服務設定介面,就如同在 MS Windows下,執行指令 services.exe ,來選擇要開啟與關閉的系統各項服務相似。CentOS6 的開機啟動流程,可參閱 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/ch-boot-init-shutdown.html
(圖3-86)
相信乍看到圖3-87的讀者,一定會覺得,哇!這服務也多到靠北,還有看不懂的服務名稱縮寫。但是,其實 MS Windows 開機後所啟動的服務也是很多,除了 services.exe 指令所看到的系統服務(圖3-88左圖),利用 msconfig.exe 指令(圖3-88右圖),再選擇啟動標籤,還可看到其他的啟動程式(圖3-88範例為 MS Windows 10 設定,與 MS Winodws 7 有些不同),或是在點選開始後,選擇程式集,點選啟動資料夾,裡面亦可放置啟動的程式,其實比較起來,也算是夭受骨的多,而這些服務,也跟開機後,剩餘實體記憶體容量息息相關,服務愈多,所剩餘的實體記憶體容量就愈少,剩餘記憶體愈少,則對於要接著要執行工作的大型程式或軟體,影響就很大,故在作業系統內,關閉不需要的服務是很重要的調校工作(tuning)。
圖3-86我們由上而下來介紹,第一群組分類為
anaconda.*(包含 anaconda.ifcfg.log、anaconda.log、anaconda.program.log、anaconda.storage.log、anaconda.syslog、anaconda.xlog、anaconda.yum.log 筆者在往後文章內,群組皆用服務名稱 . * 表示),而其代表為 CentOS6_x64的安裝管理服務軟體(https://en.wikipedia.org/wiki/Anaconda_(installer))。
audit 資料夾為用來記錄使用者登入操作系統與檔案,來作為往後若系統錯誤,此操作紀錄可供檢查與稽核(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/chap-system_auditing.html),要搭配啟動 auditd 服務。
boot.log 為系統開機時,所跑動的載入服務與步驟的清單,若開機跑太快沒看清楚,讀者可再用 cat /var/log/boot.log 來對照,此檔也可讓一般操作者了解開機載入步驟是否皆有執行成功。
btmp 為記錄有曾登入失敗的連線,而圖3-86下方的wtmp,則為記錄所有登入登出的資料,詳細說明如 https://en.wikipedia.org/wiki/Utmp,btmp檔案內容可搭配指令 last -df /var/log/btmp (注意 -f 後面要接檔案路徑,所以不能用 -fd )或 lastb -d (兩指令的參數 -d 皆為將 IP 轉換為 hostname 顯示,較容易看出來源機構 )來顯示,預設紀錄時間約一個月內,如圖3-89,為 btmp 在 2016.07.01 所備份的 btmp 記錄檔案,第1欄與第3欄分別為登入帳號與登入 hostname 或 IP,筆者已將敏感資料屏蔽,故僅看到 IP 第一個數字或 hostname 前頭字串。第2欄為登入方法,為 ssh 連線,第4、5、6欄分別為星期、月、日,第7至9欄為登入時間開始與結束,第10欄為總停留的時間,格式為天數 + 時數 : 分數。
ConsoleKit 資料夾為記錄 gnome 使用者登入,或是轉換其他使用者的活動記錄(https://wiki.gnome.org/Projects/ConsoleKit)。
cron 為使用 crond 服務的自動化排程後,所產生的紀錄,可用指令 crontab -e 來製作想排程的清單,清單檔內的排列格式為可分成六欄(每欄間要空格),為
minute hour day month day_of_week command ,如 15 02 * * * backup.bash 為每天的凌晨 2:15 執行 baskup.bash 這個 bash script ,來進行備份工作。列出排程清單可用指令 crontab -l 。crond 使用 /etc/cron.hourly 內的檔案來負責每小時排程,/etc/cron.daily 內的檔案負責每天排程,/etc/weekly內的檔案負責每週排程,/etc/cron.monthly內的檔案負責每月排程,詳細可參考https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-Automating_System_Tasks.html。
cups 為紀錄印表機的狀況的紀錄檔。
dmesg 為紀錄在系統開機時,Kernel偵測硬體過程所產生的資訊,如指令 dmesg 便是取用此紀錄,較早前的紀錄,就轉存程 dmesg.old,其他轉存檔案,名稱規則相同,或是檔名會加上轉存日期。
dracut.log 則是記錄系統開機在進入硬碟的 /root 檔案系統前,啟動 /init 所需的 initramfs 映像檔( https://en.wikipedia.org/wiki/Initrd,https://en.wikipedia.org/wiki/Initramfs ) ,來成為載入硬碟內的 /etc/rc.d 之 init 系統服務之前,預先載入SATA 或 RAID 驅動等驅動程式,確保先完成驅動硬碟或外接裝置,模組、韌體與所需的 Libraries (https://en.wikipedia.org/wiki/Library_(computing))的 initramfs loading 過程(https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html),才再進入啟動系統服務 rc.d/init 等階段。稍後編譯核心時,會利用指令 dracut 造出 initrd 要預先載入使用的 .img 檔 ,內容如圖3-86-1。
(圖3-86-1)
gdm 則是 GNOME Display Manager 所產生的使用X Windows的紀錄(https://en.wikipedia.org/wiki/GNOME_Display_Manager)。
glusterfs,則為記錄連結 RHCE 的 Gluster File System 過程(https://en.wikipedia.org/wiki/GlusterFS)。
httpd 為啟動網頁伺服器軟體的所有過程與紀錄,這於往後篇章,架設網頁伺服器軟體會再詳細說明。
lastlog 則記錄每個帳號最後一次登入的時間,為搭配指令 lastlog 來讀取。
libvirt 資料夾內紀錄檔,為用來實現 Linux 虛擬化技術的API軟體(http://libvirt.org/)之執行過程紀錄,有興趣建立虛擬化存儲系統的讀者,可參考https://libvirt.org/storage.html。
maillog 為使用伺服器軟體 postfix(SMTP,發信) 與 devoceot(POP/IMAP,收信)收發email的過程紀錄檔,若無法利用此機器的伺服器軟體收發email,這裡一定可查到錯誤訊息。
message 則是相當重要的系統紀錄檔,除了mail 、cron(紀錄檔已放置於/var/log/cron)與帳號登出/入認證( 已放置於/var/log/secure )之外,其他系統各種的 info 等級 (含以上,等級說明如https://en.wikipedia.org/wiki/Syslog),皆會記錄在 message,詳細記錄規則,讀者可用指令 cat /etc/rsyslog.conf 來了解,此紀錄方式主要由 rsyslogd 服務來控管,圖3-87。依日數來轉存的方式,為搭配指令 logrotate 與其設定檔 /etc/logrotate.conf。
寫到這裡,對有些讀者可能像〝唸經文〞一般,故我們整理一下思緒與上述紀錄檔的重點。若我們想了解使用者近/遠端登入/出狀況,請想起要看看 btmp、wtmp、lastlog 與接下來要介紹的 secure 紀錄檔。如果要看系統的錯誤,請看看 message 內的訊息,若要看檔案被更動的資訊,可能就要先利用指令 auditctl -w /home/,才能在 audit 內看到 /home 內,所有檔案更動的紀錄。
(圖3-87)
ntpstates 為使用指令 ntpdate 來校正系統時間的紀錄。
pm-powersave.log 為記錄電源管理。
ppp為用pppoe(https://en.wikipedia.org/wiki/Point-to-point_protocol_over_Ethernet)撥號連線的紀錄檔,如ADSL。
prelink 為 prelink 程式是用來調整共享 libraries 與 連結 binaries 來加速程式啟動速度,/var/prelink/prelink.log 記錄被prelink所調整的 .so (share object)檔資訊(http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html)
sa 內紀錄檔為使用者使用系統資源程度的統計檔。可以利用指令 sar -u (看CPU使用狀況),指令 sar -r (看RAM使用狀況,與指令 free 相似)。
samba 內為連線使用 CIFS 網路磁碟格式之紀錄檔。
secure 這個從字面上來看,就知道為超級重要的記錄安全性的檔案。在CentOS6_x64的所有使用到登入的行為,無論使用何種應用程式,皆會記錄在此檔案,包含 sudo ,所以如果有非法的想使用某個帳號,或是常被非法拿來用的 root 或 admin 此種帳號名稱,都可以從此紀錄檔案到,從哪個 IP 利用哪個帳號名稱來連線,試了多少次(次數要自己用指令來統計)。而我們便可以利用此統計量,看是否要加入拒絕連線的黑名單內。如圖3-90,可以看到有好幾個 IP試圖非法利用 ssh 連線到我的伺服器主機,若是非故意的嘗試,應該也不會在 10 分鐘內嘗試超過 10 次吧。故此時,就可以寫個 script 或手動輸入 ,把這些胡亂嘗試的 IP,加入黑名單內 ( iptables 的 -j REJECT 或 /etc/hosts.deny ),就可以形成簡易的阻擋機制。
spice-vdagent.log 此紀錄檔為記錄使用SPICE (http://www.spice-space.org/index.html,https://rhn.redhat.com/errata/RHEA-2011-0576.html)的訊息,如 Microsoft 的 RDP 遠端連線服務。
spooler 檔用於紀錄 news 傳遞的錯誤狀況,同樣可由 /etc/rsyslog.conf 來調整記錄方式。
sssd 資料夾內的紀錄檔,為sssd服務提供各種認證方式(SUDO、LDAP、Active Directory、Kerberos、OpenSSH 等 )的紀錄(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/SSSD-Introduction.html)
tallylog 為記錄Linux-PAM (https://en.wikipedia.org/wiki/Linux_PAM)的認證活動的錯誤,可以使指令 pam_tally2 與 man pam_tally2,其設定檔於 /etc/pam.d/ 內。
wpa_supplicant.log 為記錄 Wi-Fi Protected Access (WPA,https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access) 與 IEEE 802.1X (https://en.wikipedia.org/wiki/IEEE_802.1X) 連線狀況,搭配指令 wpa_supplicant ( https://wiki.centos.org/HowTos/Laptops/WpaSupplicant )。
Xorg.* ( Xorg 服務所組成的群組),主要為儲存 X Window System 服務軟體與使用硬體的錯誤訊息,可提供啟動 X Window 的障礙排除。
以上較常會使用到的為 secure 檔內的訊息,若被非法入侵,亦可以從此檔案找出跡證。有時亦會看看 Xorg*.log,來判斷啟動 X Windows的問題。一般來說,通常一個服務軟體,就會有自己的紀錄檔,安裝新的軟體時,在 /var/log/ 內或軟體指定儲存 log檔 的地方,就會出現不同的服務軟體紀錄檔,所以管理者要細看軟體的說明,並從說明去找紀錄檔與內容所紀錄的重點。
(圖3-88)
(圖3-89)
(圖3-90)
@ make Custom Kernel
接下來,筆者要來講解編譯核心的部分。首先,先進入 Kernel 的 source code 站, www.kernel.org (圖3-91),因CentOS6_x64之核心較舊但穩定,為 2.6.32-xxx 版本,故為了好的相容性,我們將目標定為2.6.XX 版本號的最新版。因沒有在首頁的清單上,但可從圖3-91黃框處進入,筆者接著 HTTP的部分進入 https://www.kernel.org/pub/linux/kernel/v2.6/,可看到2.6.XX的最新的版本號為2.6.39.4,筆者便選擇下載 linux-2.6.39.4.tar.bz2 來下載。下載後,我們將解開的資料夾(可用指令 tar jxvf 解開)放入 /usr/src/kernels/ ,並進入已解開的資料夾,如圖3-92。如何解開 .tar.bz2 與放入資料夾,前面章節有提過,就不在多贅述。
(圖3-91)
(圖3-92)
在開始 make 之前,CentOS原始開發團隊,不建議我們這麼編譯 Kernel,而是利用 .SRPM 檔來重編譯,且有提供較安全的方法,來建議如網頁 https://wiki.centos.org/HowTos/Custom_Kernel 來做。但筆者還是有無窮的好奇心,想要利用手動的 make ,並要承擔可能無法用新編譯的 Kernel 來開機。但若真的無法開機,我們就在 GRUB 選單,再選擇回到舊的 Kernel 版本來開機即可,不是嗎?現在不試試看,不知下次何時還有機會呢?這時,就要如海濤法師所說的法,團隊的建議都是假的,假的,是筆者眼睛業障重 XD。但很重要的一點,若有重要資料在伺服器之讀者,還是要再三考慮再進行編譯(真的想要使用新 Kernel,可退而求其次,用指令 yum update kernel 來更新,但可能更新不到 kernel.org 內的最新 ),千萬不要拿來當試驗機器,現在有很多 Virtual Machine 軟體或是便宜的機器可供試驗與研究,不要想不開拿來做試驗喔。
首先,確認您在剛剛解壓縮的資料夾內,如圖3-92。若不想建立自己第一次的編譯 Kernel 設定,直接接續現有設定參數,可先利用以下指令來變成編譯前的參數。
$ cp /boot/config-`uname -r` /usr/src/kernels/linux-2.6-39.4/.config
/* 需確認位置在剛解開的資料夾內,如上要被 compile 的 kernel 位置為 /usr/src/kernels/linux-2.6.39.4 。 */
接著執行指令 make menuconfig 使用文字選單,進入後,選擇 Load an Alternate Configureation File,如圖3-93,或執行指令 make oldconfig 一步步的文字互動方式選擇( https://en.wikipedia.org/wiki/Menuconfig ),可以從現有設定參數基礎,再修改設定參數後重編譯。若您僅想清除之前有編譯過的中繼檔,請使用 make clean。
若您想創造為第一次編譯的環境,請使用以下指令:
$ make mrproper # 清除資料夾下已經有參數設定的 .config 隱藏檔
接著輸入以下指令:
$ make menuconfig # 使用選單選擇方式設定參數
進入後,請先閱讀選單上方的詳細說明,包含空白鍵選擇與取消,進入與按鍵盤Esc鍵兩次回到上一選單,以及可選擇的選項載入的方法有哪些,利用鍵盤左右鍵或是tab鍵,可選擇下方的 < Help >,便可以看到上方藍光條參數選項的說明。
(圖3-93)
General setup --->,的內容為圖3-94,一般很少會更動這裡,但我們為了好玩,可試著將一些有 EXPERIMENTAL 或 DEPRECATED 註解的功能取消。或是把一些有 NEW 註解的功能加上,為調整的方向。Enable loadable module support ---> 與 Enable the block layer ---> ,亦無需調整,接著是 Processor type and features --->,如圖3-95
(圖3-94)
圖3-95為處理器的選擇,因筆者皆為 Intel CPU,故目標為僅留下與 Intel CPU有關係的設定,AMD的設定便將其取消選取,Processor family 則看換成 Intel core/newer 或是 Generic x86-64。有些沒有看過的規格,讀者可以利用wikipedia來查閱( 如x2apic,https://en.wikipedia.org/wiki/X2APIC )
(圖3-95)
接著的 Power Management and ACPI option 的部分,筆者僅調整 CPU Frequency scaling有AMD的部分,若您不需要關心節能的問題,亦可取消 CPU Frequency scaling,或是改變 scaling 的預設為 performance,這與效能有相當的影響,,但北極熊可能很快就沒有家可住了(圖3-96)。
(圖3-96)
Bus options 的部分,因為筆者非使用 Laptop / Notebook,故僅取消 PCCard的設定。Executable file formats /Emulations 的部分,就不變更。Networking support 的部分,就取消僅會出現在行動裝置的部分,如Wireless、WiMAX、Bluetooth、RF switch(圖3-98)。
(圖3-97)
(圖3-98)
緊接著的 Device Drivers 是可以改變較多的部分,因 Linux Kernel 為了要方便抓取各項硬體裝置,預先載入很多驅動程式,但有些並非現在、或往後會用到,有些又為了相容性,放了較舊的驅動,所以我們可以在編譯前,先將其移去,或改為 M (載入模組) 的方式來執行。例如很明顯的 Tablet 與 Touchscreens 的驅動,在我們的運用範圍內也不需要。InfiniBand support亦不在我們使用的範圍(筆者也買不起XD),故取消選取。Xen (http://www.xenproject.org/users/why-the-xen-project.html) 的附屬選項也有很多,有興趣玩虛擬化的請選取,若無興趣可取消選取。X86 Platform Specific Device Drivers,也可以刪除無用的Laptop driver。
(圖3-99)
Firmware Drivers 的部分,便不更動。File systems 的部分,有興趣研究其他檔案系統的讀者,可無須更動,但筆者僅選取使用較普遍使用的,Ext、XFS等,與 Network File Systems、CD-ROM/DVD Filesystems、DOS/FAT/NT Filesystems、Pseudo filesystems 之檔案系統,故,其他的 GFS2 等雲端用的檔案系統,便將其取先選取。在這裡可以看到,Linux相當受推崇與 UNIX 的 ZFS 檔案系統相提並論的 Btrfs ( https://en.wikipedia.org/wiki/Btrfs ),在此說明依然為 Unstable disk format。在此選單,亦可在DOS/FAT/NT Filessystems 內,加入對 NTFS 的支援。(圖3-100)
(圖3-100)
Kernel hacking 的部分,這是很重要的一個選單,裡面有一些開啟紀錄和芯運作的設定,但因需要一些作業系統的知識,故筆者建議可以維持預設,不更動。Security option 與 Cryptographic API的部分,皆可不更動。Virtualization 若不需要玩虛擬化,則直接將其取消選取。最後的 Library routines 亦不更動。更改確認後,記得要選擇移至 Save an Alternate Configuration File,再連按兩次鍵盤 Esc鍵離開。
離開後,再輸入以下指令:
$ make -j 2 bzImage
/* 先將核心編譯好,參數 -j 代表要同時執行幾個編譯的工作,若無設定,則預設為1,端看您的 CPU 核心數目,因筆者使用虛擬環境下來編輯,故最多雙核心可使用。編譯好的核心 bzImage,位置會在 ./arch/x86_64/boot/bzImage ,他真正還是指向 ./arch/x86/boot/bzImage 檔案*/
$ make -j 2 modules # 再編譯模組,亦可直接使用 make -j 2 bzImage modules
上述兩指令的編譯過程,會花相當多的時間,故讀者可趁此時沖個涼或泡杯茶,再來就是要進入 make install 的步驟。
接下來,我們做以下指令,來載入建立好的模組
$ make -j 2 modules_install /* 將模組載入至 /lib/modules,如圖3-101
/* p.s. 以上三個指令,我們亦可以用懶惰的方法將它們串在一起輸入,就可省略時間,並開始編譯前先做指令 make clean, 如以下,利用符號 && 串接,可以判斷其中一個編譯過程有錯誤停止編譯,便會中斷進行下一個串接的指令,讓您可以除錯:
$ make clean && make -j 2 bzImage && make -j 2 modules && make -j 2 modules_install */
(圖3-101)
接著利用指令
$ cp /usr/src/kernels/linux-2.6.39.4/arch/x86/boot/bzImage /boot/vmlinuz-2.6.39.4.el6.x86_64
$ chmod 644 /boot/vmlinuz-2.6.39.4.el6.x86_64 # 修改權限允許僅root來讀寫,其他權限只能讀
與
$ cp /usr/src/kernels/linux-2.6.39.4/System.map /boot/System.map-2.6.39.4
接著再建立開機的ramdisk預儲機制 initrd 要用的 img 檔。(https://en.wikipedia.org/wiki/Linux_startup_process)
$ dracut -v /boot/initramfs-2.6.39.4.img 2.6.39.4
/* 注意 Kernel 版本號要與 vmlinuz 相同,要看 /lib/modules/ 下的版本資料夾名稱,參數 -v 為顯示過程。CentOS2/3/4版為使用 mkinitrd -v -f /boot/initrd-2.6.39.4.img 2.6.39.4,若是要加入其他驅動模組,至 initramfs 當開機即載入使用,則若模組編譯後名稱為 myscsi.ko ,並已放在 /lib/modules/2.6.29.4 內,則使用指令 dracut -v --add-drivers myscsi -f /boot/initrd-2.6.39.4.img 2.6.39.4 載入即可。可利用指令 lsinitrd /boot/initramfs-2.6.39.4.img | grep myscsi , 來列出開機即載入的驅動模組 */
再利用 vim 編輯 GRUB ( https://www.gnu.org/software/grub/,https://en.wikipedia.org/wiki/GNU_GRUB)開選單 /etc/grub.conf ,如圖3-102黃框處,可複製原本選項,如黃框下方,再修改版本號與檔案名稱對應,並儲存後離開,接著輸入指令 shutdown -r now 或 reboot,重開機後,我們便可以看到如圖3-103之比較,重開機前,可執行指令 sync,來將記憶體內暫存資料同步寫入硬碟。
(圖3-102)
圖3-103可以看出,我們的 Kernel 已經用到 2.6 的最新版 2.6.39.4,因新版原則上功能會較多原始檔案也較大,若只用預設設定,一定比舊版占用更大的記憶體,但因為取消選取裡面不需要的模組放入,可以從兩個開機主要的映像檔 vmlinuz-2.6.39.4.el6_x86_64、 initramfs-2.6.39.4.img 來與舊的 vmlinux-2.6.32-642.el6.x86_64、initramfs-2.6.32-642.el6.x86_64.img比較,可以發現,反而新版本的 Kernel還比較舊的 Kernel 版本所需容量小,想必占用記憶體的部分,也是變得較少,達到我們要的最佳化效果 (當然可能不是真的最佳,中國稱此為優化兒 )。確認我們選擇的Kernel參數編譯後,重開機正常啟動後,就可以利用已下指令備份到家目錄下:
$ cp /usr/src/kernels/linux-2.6.39.4/.config ~/mykernel-2.6.39.4-2016.8-try-1.config
/* 用檔名標示版本與日期,或也可加上第幾嘗試版本,以利再重選取 menuconfig 後,來區別試驗 */
以上的 Kernel 參數設定,若還不是很滿意,可再用指令
$ make clean
$ make menuconfig # 進入重調整後
$ make bzImage && make modules
$ make modules_install
重作後,再進行
$ cp /usr/src/kernels/arch/x86/boot/bzImage /boot/vmlinuz-2.6.39.4.el6.x86_64
$ chmod 644 /boot/vmlinuz-2.6.39.4.el6.x86_64
$ dracut -v -f /boot/initramfs-2.6.39.4.img 2.6.39.4
/* 參數 -f 為強制覆蓋同檔名之舊 .img 檔 */
以上為基本的手動核心編譯方式。下一篇,筆者要來介紹重點中的重點,就是備份與資料救援。因為好的備份,可以讓您
If you have any feedback or question, please go to my forum to discuss.