跳到主要內容

Linux 操作不求人系列 - 參章之柒 - 系統管理(VII) - 系統紀錄與自訂核心編譯

@ 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
     寫到這裡,對有些讀者可能像唸經文〞一般,故我們整理一下思緒與上述紀錄檔的重點。若我們想了解使用者近/遠端登入/出狀況,請想起要看看 btmpwtmplastlog 與接下來要介紹的 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.

這個網誌中的熱門文章

Linux 操作不求人系列 - 貳章之貳 - Shell Script 程式設計(II) - BASH 與 TCSH / CSH

     在上章,我們介紹很多bash shell指令的應用方式,並讓它們變成 script,在這章此節,我們要承襲上節,繼續討論 bash shell script 的其它程式設計概念,與讓程式可重複使用的方法,就是利用函式(function)。      首先,我們來創作一個判斷是否為閏年的函數,script的名稱就取為 check_year.sh ,請自行將其設為可執行。程式碼如圖2-6,為了解說方便,筆者利用指令 nl check_year.sh 將程式碼包含行數印出(圖2-7),其他除顏色外,都與圖2-6同。以下 export 宣告環境變數,自訂變數無需加宣告保留字。(2021.10.07更正export說明,以下自訂變數宣告請直接去除export開頭) (圖2-6) (圖2-7)        圖2-7第2-6行,與之前的範例相似,皆有防堵參數個數輸入錯誤的判斷。第7-11行為接著判斷輸入的年分,是否為真的正整數,也就是大於零的數字。其中第7行可解釋為,利用正規表示式搜尋 $2 字串值得頭至尾部的字元,皆由 0-9 組成,若有,則為真(True)會進入 if 內的陳述執行, 但我們想要的,應該是僅要字串其中一字元為非正整數,便進入if 內的警告並跳出 。故,筆者在判斷式前多加一個 ! ,代表著當字元完全是正整數時,就不要執行  if  內陳述,而直接往第12行執行,但若其中有一個字元為非正整數,則會進入 if 內印出錯誤訊息並跳出 Script 。在此例使用者輸入非正整數等字串(如:12ab、cde、1a1b),便會出現錯誤訊息"Error Value",並跳出 Script 。而第8行的判斷式,效果跟第7行相同,但只能在BASH 3.0才能支援,故筆者故意保留,讓讀者可以學到另一種表示方式。         第12-28行,為宣告一個函式 leapyr () ,在 BASH Script內若要使用含式,必須在使用之前先建立函式的功能,如函式建立在第12-28行,則若要呼叫使用(Call)函式,則必須在第29行之後才能呼叫,並且可重複呼叫。第13行為定義函式呼叫時,一定會有一個外部參數, 此外部參數非該 Script 的外部參數 ,而是由程式撰寫者給入,故在此無設定防呆判斷。第14-

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia  的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。      首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60   (圖5-60) 接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable  要改為 no (圖5-61)      若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon  來調整,如以下: $ mkdir /tftpboot $ chcon  --reference /var/lib/tftpboot  /tftpboot 接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下: $ chkconfig  --level  235  xinetd on $ chkconfig  --level  235  tftp  on $ service xinetd restart 開放防火牆通行 $ iptables -A INPUT -p udp --dport 69 -j ACCEPT $ service iptables re