2008年10月23日 星期四

Gnome設定工具:GConf 簡介

0 意見

昨晚修改一些bash shell script的時候,發現這個工具可以用命令列的方式修改gnome裡面的一些設定,蠻方便的。因此就來稍微寫個簡介。


gconf的運作方式類似Windows上面的登錄檔,使用一個具有目錄結構的視窗來編輯一些桌面環境的偏好配置。底下以ubuntu為例,簡單介紹一下gconf的一些功能以及配置方式。


gconf的運作包含以下幾項:
gconf各項設定值所儲存的文件
gconfd-2:背景執行的deamon
gconftool-2:命令列中的設定程式
gconf-editor:圖形化的gconf設定程式

gconf的文件路徑保存於/usr/share/gconf/default.path此一檔案中,可概略分為force settings, user performances, 以及system defaults 。force settings表示這些設定使用者不能變動,user performances則代表是使用者可以變動的。而系統的預設值則存於system defaults裡面。

gconf有一個圖形化介面的編輯器,是為gconf-editor。輸入gconf-editor即可用簡單易懂的方式來修改與存取gconf設定。


從上圖可以簡單的看到,gconf裡面主要有四個資料夾:apps、desktop、schemas、system。簡單描述如下:

apps:
主要是放各種在gnome環境下運作的應用程式偏好設定,例如nautilus、evolution等等。
desktop:
桌面環境的配置,諸如background、font_rendering、interface等等。
system:
關於系統方面的配置,裡面可以設定dns、proxy、samba等。

schemas:
主要放置其他設定值的資料文件,存取與設定方式和其他三者不同。裡面的資料夾apps、desktop、system剛好就是其他三個資料夾,其中的目錄樹也幾乎相同。schemas所儲存的值又可細分為設定鍵名稱(key name)、設定鍵擁有者(key owner)、簡短說明(short description)、詳細說明(long scription)。

schema檔案存放於/usr/share/gconf/default/裡面,以schemas結尾的就是schema的檔案。
schema檔案的內容舉例如下(以apps_nautilus_preferences.schemas為例,經過簡化):

< gconfschemafile>
< schemalist>
< !-- Keep the defaults in sync with the emergency fallbacks
in nautilus-global-preferences.c -->
< !-- General preferences -->
< schema>
< key> /schemas/desktop/gnome/file_views/show_hidden_files< /key>
< applyto> /desktop/gnome/file_views/show_hidden_files< /applyto>
< owner> nautilus< /owner>
< type> bool< /type>
< default> false< /default>
< locale name="C">
< short> Whether to show hidden files< /short>
< long>
If set to true, then hidden files are shown in
the file manager. Hidden files are either dotfiles or are
listed in the folder's .hidden file.
< /long>
< /locale>
< locale name="zh_TW">
< short> 是否顯示隱藏檔案< /short>
< long> 如設定為‘true’,所有隱藏檔案都會在檔案總管中顯示出來。所謂隱藏檔案即是任何第一個字元為一點‘.’的檔案,或者在某個資料夾的 .hidden 檔案內容之中。< /long>
< /locale>
< /schema>
< /schemalist>
< /gconfschemafile>

< locale name="zh_TW"> 指定了當系統的預設語言($LANG環境變數)為zh_TW時應該顯示的說明。

底下這兩行則代表了schema在GConf中的所在位置,以及對應到哪個值。
< key> /schemas/desktop/gnome/file_views/show_hidden_files< /key>
< applyto> /desktop/gnome/file_views/show_hidden_files< /applyto>

如果我們用gconf-editor去檢視/desktop/gnome/file_views/show_hidden_files這個值,就可以發現以下的說明:

設定鍵說明
設定鍵名稱: /desktop/gnome/file_views/show_hidden_files
設定鍵擁有者: nautilus
簡短說明: 是否顯示隱藏檔案
詳細說明: 如設定為‘true’,所有隱藏檔案都會在檔案總管中顯示出來。所謂隱藏檔案即是任何第一個字元為一點‘.’的檔案,或者在某個資料夾的 .hidden 檔案內容之中。

剛好可以對應到我們剛才在schema檔案裡面的設定。


如果要新增設定鍵的話,在空白處按下右鍵選新增:


關於鍵值的設定,有分為整數(int)、邏輯值(bool)、字串(string)、浮點數(float)、以及清單(list)。若新增的為清單,則內容均需固定為整數、字串、邏輯值、浮點數的一種。

目前視窗化的gconf-editor中仍未找到新增資料夾(directory)的功能。


再來介紹文字化的編輯工具gconftool-2。gconftool-2可以在命令列環境中配置桌面環境,並且可以用於shell script中進行快速大量配置。

gconftool-2 [-?] [-?|--help] [--usage] [-s|--set] [-g|--get]
[--set-schema] [-u|--unset] [--recursive-unset] [-a|--all-entries]
[--all-dirs] [--dump] [--load=STRING] [--unload=STRING]
[-R|--recursive-list] [--dir-exists=STRING] [--shutdown] [-p|--ping]
[--spawn] [-t|--type int|bool|float|string|list|pair] [-T|--get-type]
[--get-list-size] [--get-list-element]
[--list-type=int|bool|float|string] [--car-type=int|bool|float|string]
[--cdr-type=int|bool|float|string] [--short-desc=描述] [--long-desc=描述]
[--owner=擁有者] [--install-schema-file=檔名] [--config-source=來源]
[--direct] [--makefile-install-rule] [--makefile-uninstall-rule]
[--break-key] [--break-directory] [--short-docs] [--long-docs]
[--get-schema-name] [--apply-schema] [--unapply-schema]
[--ignore-schema-defaults] [--get-default-source] [-v|--version]

底下列出一些常用的命令參數

-s, --set 設定特定key的value並且同步之。需與 --type 一起使用。
-t, --type=int|bool|float|string|list|pair 設定所欲存取的value type
-g, --get 顯示特定key的value。
-u, --unset 將鍵值還原為預設值(system defaults)。
-a, --all-entries 印出該目錄中所有鍵值。
--all-dirs 列出目錄中的子目錄
-R, --recursive-list 遞迴列出目錄中的所有項目
--dir-exists=STRING 測試目錄是否存在。0為存在目錄,2為不存在。
--set-schema 設置 schema 的屬性,與 --short-desc(簡短說明), --long-desc(詳細說明), --owner(設定鍵擁有者), 和 --type 同時使用。
--makefile-install-rule 從GCONF_CONFIG_SOURCE這個環境變數所指定的路徑中安裝 schema 文件到 GConf 中。
--makefile-uninstall-rule 從GCONF_CONFIG_SOURCE這個環境變數所指定的路徑中移除schema 文件。
--direct 直接寫入到資料庫中,必須在gconfd這個服務沒有啟用的時候才能執行。
--dump 將資料庫內容一次列出來

舉例來說,如果要設定連線均使用位址為wwwproxy.xyz.com:3128的proxy,可以輸入

$ gconftool-2 --type=bool --set /system/gnome-vfs/use-http-proxy "TRUE"
$ gconftool-2 --type=string --set /system/gnome-vfs/http-proxy-host "wwwproxy.xyz.com"
$ gconftool-2 --type=int --set /system/gnome-vfs/http-proxy-port "3128"
$ gconftool-2 --type=string --set /system/proxy/mode "manual"
$ gconftool-2 --type=bool --set /system/http_proxy/use_same_proxy "TRUE"
$ gconftool-2 --type=bool --set /system/http_proxy/use_http_proxy "TRUE"
$ gconftool-2 --type=string --set /system/http_proxy/host "wwwproxy.xyz.com"
$ gconftool-2 --type=int --set /system/http_proxy/port "3128"

若是將

$ gconftool-2 --type=string --set /system/http_proxy/host "wwwproxy.xyz.com"


改為

# gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory --type=string --set /system/http_proxy/host "wwwproxy.xyz.com"

則是代表將這個值設定為強制(force settings)並寫入到/etc/gconf/gconf.xml.mandatory這個設定檔中。


針對schema的操作又不大相同了。

在前面說過,schema檔案存放於/usr/share/gconf/default/裡面,以schemas結尾的就是schema的檔案。而schema檔案裡面已經寫好匯入的gconf目錄,因此無須特別指定。

如果想要從特定檔案目錄匯入,例如家目錄中的.gconf資料夾匯入Test.schemas,則執行

$ export GCONF_CONFIG_SOURCE="xml:readwrite:$HOME/.gconf"
$ gconftool-2 --makefile-install-rule Test.schemas

如果要自己設定,則執行

$ gconftool-2 --set-schema /schemas/apps/kiba/launchers/file --long-desc "這邊輸入詳細描述" --short-desc "這邊輸入簡短描述"
$ gconftool-2 --apply-schema /schemas/apps/kiba/launchers/file /apps/kiba/launchers/file

另外還有一個gconf-schemas的執行檔,可以對schema檔案做註冊或移除註冊的動作,不過實做方式目前仍不清楚。

gconf-schemas --[un]register file1.schemas [file2.schemas [...]]


參考資料


深入閱讀......

2008年10月13日 星期一

SELinux初探心得

0 意見

星期六聽了小州大哥講的SELinux後,發現SELinux真是個不錯的東西。
不過只要去Google一下SELinux,卻會出現這些東西:selinux關閉turn off selinux stop selinux ...

因此小弟就在這邊將小州老師上課提到的重點,加上cdchen老師所寫的RHEL5系統管理寶典中的重點整合在底下。

之前Linux中關於檔案存取的權限處理,有幾種方法:

基礎的權限:

[billy3321@localhost practice]$ ls -l
total 32
drwxrwxr-x  2 billy3321 billy3321 4096 Oct 13 15:33 directory
-rw-rw-r--  1 billy3321 billy3321   16 Oct 13 15:32 file
-rw-rw-r--+ 1 billy3321 billy3321   25 Oct 13 15:53 file_with_acl
-rwxrwxr-x  1 billy3321 billy3321   35 Oct 13 15:24 script

相關指令:
更改擁有者

chown [OPTION]... [OWNER][:[GROUP]] FILE...

更改rwx設定

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...

判斷方法:
首先判斷檔案的擁有者(user),擁有群組(group),以及其他人(other)。以這個方式來判別讀(r),寫(w),執行的權限(x)。在目錄上面則是讀取(r),修改(w),進入目錄(x)等方式。

附帶一提,檔案的刪除或更名是看目錄的w權限。在檔案系統中,目錄事實上只是一個文件,裡面列出了目錄含有的檔案名稱,以及該檔案的inode為何。因此刪除檔案,實際上就是去移除"目錄"文件裡面關於該檔案的資訊;更名檔案,則是更改該檔案的"檔案名稱"欄位。因此刪除與更名就是編輯並修改"目錄"這個文 件。而要可以編輯修改,就要擁有w屬性,因此檔案的刪除與更名,是看目錄的w權限。

延伸的權限:
Access control lists(ACL)

[billy3321@localhost practice]$ getfacl file_with_acl 
# file: file_with_acl
# owner: billy3321
# group: billy3321
user::rw-
user:sonnet77:rw-
group::rw-
group:users:r--
mask::rw-
other::r--

相關指令:
設定ACL

setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...

檢視ACL設定

getfacl [-dRLPvh] file ...

判斷方式:
讀取檔案時,權限判斷會由上往下依序讀取。因此判斷方式就會更改預設的判斷流程。
原本判斷順序是user > group > other ,這邊判斷順序就改為 user > user:sonnet77 > group > group:users > other 。

以上這兩種權限在判斷上,各位都可以發現,這種判斷方式幾乎都是以擁有者,擁有群組等來判斷存取與否。在行程擁有的權限上,則會看執行者身分或是該程式的擁有者與群組。

這種判斷方式是稱為Discretionary Access Comtrol(DAC)的方式,只要你是檔案擁有者,就擁有至高無上的權力;若你還是root的話,更可以任意存取任何檔案。

舉一個之前的例子,之前OuTian大大在HITCON有揭露一個Tomcat的漏洞。由於Tomcat須以root身分執行,並bind上80 port去listen,經由這個漏洞,Tomcat可以以root身分對檔案系統為所欲為,甚至去觀看/etc/shadow密碼檔案。這就是DAC機制很大的問題,只要入侵任何Deamon行程並獲取控制權,cracker就可以觀看/etc/passwd檔案進行下一步的入侵,甚至去尋找一些設定檔案。

後來有發展出一個機制,可以將deamon行程關在一個特定目錄中,稱為chroot。若是cracker入侵該行程,也只能在該目錄中活動而無法看到重要的系統檔案。不過chroot只針對某些行程有效果,不能防範來自其他行程的攻擊。

chroot執行方式:

chroot NEWROOT [COMMAND...]
chroot OPTION


有鑒於這些設定已經無法因應目前的資訊安全要求,因此美國國家安全局(NAS)就在Linux中實作一個機制,稱為SELinux,利用資料庫查詢的方式來維護作業系統的安全。SELinux採用Mandatory Access Control(MAC)機制,會對所有的檔案、行程、用戶給予一個Security content,用戶端通過傳統DAC認證後,SELinux會進一步的去檢視Security content,並決定是否授與權限。SELinux後來在RedHat的支持下,得到了長足的進步,且收錄於2.6的核心之中。可再編譯時選擇是否將SELinux功能編入kernel之中。

下面就來簡介SELinux的運作機制及各項指令。

SELinux是由核心實作的功能,因此若是需要SELinux功能,要先確定核心中是否已將SELinux編譯進去。SELinux的啟動與否可由開機參數加以指定(selinux = [0|1])

SELinux的設定檔案可編輯/etc/sysconfig/selinux這個檔案,這是/etc/selinux/config之Symbolic Link。其中含有兩種主要的設定:

1.SELinux執行模式(SELINUX=STATUS),可分為強制(enforce)、寬容(permissive)、以及停用(disable)。除了停用、啟用需重開機外,強制與寬容模式的切換可以setenforce來設定。要觀看目前執行模式則可以用getenforc以及較為廣域的sestatus來觀看。在強制模式中,只要SELinux不允許,就會無法執行;但在寬容模式中,只會將事件紀錄下來,依然允許執行。因此若是懷疑是SELinux造成的問題,可以將SELinux切換為寬容模式,若是依然無法執行,那麼問題就不是在SELinux上。

切換強制與寬容模式

setenforce [ Enforcing | Permissive | 1 | 0 ]

觀看目前SELinux執行模式

getenforce
sestatus [-v] [-b]

2.所使用的安全原則名稱(SELINUXTYPE=POLICY),可概分為targeted、strict、與mls。targeted保護常見的網路服務,為預設的policy。strict提供符合Role-based-Access Control(RBAC)之policy,而mls則提供符合Multi-Level Security(MLS)的policy。這些policy放置於/etc/selinux/以policy為名的資料夾中,只有在開機時會載入。

如果想要改變policy,就得要重開機,才能重新載入policy。如果更換policy,物件的security context也要重新產生,因此在重開機前一定要記得在根目錄下放置.autorelabel檔案,這樣所有的security context才會重新產生。為了避免在開機期間因為錯誤的security context導致開機失敗,請先將selinux的執行模式更改為permissive。如果忘記更改導致開機時的kernel panic,開機時對核心參數加上selinux=0的選項暫時性的關閉SELinux系統,待其產生完畢後,再一次的重開機以打開SELinux。

對於policy的檢視,有以下方法
檢視policy規則

seinfo [OPTIONS] [POLICY_FILE]

搜尋policy規則

sesearch [OPTIONS] [POLICY_FILE]

3.但是如果SELinux只有policy可以選擇,不是太沒彈性了?因此在決定好policy後,可以使用SELinux Boolean來變更一些細項。
比如說,大家最容易為SELinux困擾的一樣設定就是Apache的home_dir設定。
只要更改httpd_enable_homedirs這項SELinux Boolean,就可以允許Apache顯示各使用者的public_html資料夾了。

以下是一些設定管理SELinux Boolean的方式

顯示指定或全部的SELinux Boolean

getsebool [-a] [boolean]

設定指定的SELinux Boolean

setsebool [ -P ] boolean value | bool1=val1 bool2=val2 ...

4.在SELinux中,每個登入的使用者根據登入的方式不同,會由PAM子系統中的pam_selinux.so模組設定該使用者執行行程的security context。此後,除非特別要求,否則子行程預設會繼承父行程的security context。在檔案的部分,由rpm所安裝的檔案會依照儲存於rpm中的紀錄來設定security context,若是手動建立,則依照policy中所制定的security context來設定。另外,如果是cp(複製),會以新建檔案的方式重新配置security context,若是mv(搬移),則會保留。

針對security context的操作,有以下幾種方法

檢視帳號的security context

id -Z 

檢視行程的security context

ps -Z

檢視檔案的security context

ls -Z

變更security context

chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... --reference=RFILE FILE...

修復security context,可修復來自套件的檔案

fixfiles  [-F]  [  -R  rpmpackagename[,rpmpackagename...] ] [ -C PREVI-
       OUS_FILECONTEXT ] [-l logfile ] [-o outputfile ] { check  |  restore  |
       [-F] relabel | verify }"
fixfiles  [-F]  [-l  logfile  ] [-o outputfile ] { check | restore|[-f]
       relabel | verify } [[dir/file] ... ]

還原security context,可還原原先設定的security context。

restorecon [-o outfilename ] [-R] [-n] [-v] [-e directory ] pathname...
restorecon -f infilename [-o outfilename ] [-e directory  ]  [-R]  [-n]
       [-v] [-F]

在開機時重新產生所有的security context

# touch /.autorelabel
其他設定工具
圖形化的SELinux設定工具:

system-config-selinux


了解了security context以及policy以後,我們就可以重新看SELinux究竟是怎麼運作。

當一個行程(object)去存取檔案(subject)時,Linux核心會先判斷先前提到的權限判定,若是通過了,就會進入到SELinux的判斷流程中。
1.以object與subject之security context,判斷policy中是否已有符合之規則。
2.若不符合任何規則,則傳回禁止;若符合規則,則查看規則為允許(Allow)或拒絕(Deny)。
3.若規則為拒絕(Deny),則存取失敗;若規則為允許(Allow),則存取成功。

以上狀況如果在enforce模式下,只有規則為允許者才可存取;若為permissive模式,所有被SELinux所拒絕的依然可以存取,只是會顯示錯誤訊息到log檔案中。

如果要檢視SELinux的錯誤訊息,可以看以下兩個檔案

/var/log/messages
/var/log/audit/audit.log

由於audit.log較不易閱讀,因此SELinux有提供工具來轉換為適合人類閱讀的模式

# audit2why < /var/log/audit/audit.log

另外也有圖形化的工具setroubleshoot,除了顯示deny的message以外,還會給予不少實用的建議。

# sealert -b


如果好好的使用,SELinux將是個強大的工具,捍衛伺服器的安全。
以後大家不要在安裝完系統就關閉SELinux啦!

參考資料:
小州老師上課講義:
RHEL5系統管理寶典:

深入閱讀......

2008年10月7日 星期二

在Mac OS X 10.5 中打開PHP支援

0 意見

Mac OS X 10.5原本就內建Apache 2.2.6 與PHP 5.2.4
不過預設分享網頁後(也就是啟動Apache之後),PHP的module並沒有掛上
以下就來說明要如何掛上。

由於小弟比較習慣用終端機,因此底下的操作都在終端機底下執行,並以root權限配合vim編輯。

首先打開/etc/apache2/httpd.conf
此為Apache主要設定檔。找到關於PHP的設定:

113 LoadModule bonjour_module     libexec/apache2/mod_bonjour.so
114 #LoadModule php5_module        libexec/apache2/libphp5.so      #就是這行
115 #LoadModule fastcgi_module     libexec/apache2/mod_fastcgi.so

移除開頭的註解(#)後,使該行成為

114 LoadModule php5_module        libexec/apache2/libphp5.so

修改並存檔後,回到/etc中,將php.ini.default複製為php.ini。

# cp /etc/php.ini.default /etc/php.ini

預設是只有比較重大的錯誤才會回報,可提升效能。
如果希望每個錯誤都回報的話,請編輯第305行的

305 ;error_reporting  =  E_ALL & ~E_NOTICE

改為

305 error_reporting  =  E_ALL


存檔之後就可以了。

最後進入系統偏好設定中,打開分享中的網頁分享,你的網頁伺服器就開始運作囉!
如果懶的話,也可以利用Apache提供的工具

# apachectl -k restart

如果您要測試的話,那麼就在/Libary/WebServer/Documents/新增一個測試的檔案test.php
內容為


用瀏覽器打開
http://127.0.0.1/test.php

如果出現PHP模組的各種資訊,就代表網頁伺服器已經可以支援PHP囉!

另外,如果希望可以將網頁存放於個人資料夾中的Sites資料夾的話
確定/etc/apache2/users/中含有已你的使用者名稱為名的$USER.conf

若無,則從/etc/httpd/users中複製到/etc/apache2/users/即可。

cp /etc/httpd/users/$USER.conf /etc/apache2/users/

本頁面參考

深入閱讀......

2008年10月6日 星期一

Python中的Unicode問題

1 意見

這幾天拿了一個題目自己練習寫python,才發現cpython是使用ascii來處理字串,對於unicode處理較不拿手。在這邊介紹一些python中使用unicode的方法。

首先要先確認使用的是script或是直譯器
script就要確認文件的編碼,直譯器則要確定所使用的shell的環境。

使用script的話,在一開始文件編輯列,要先加入宣告,文件編輯軟體(如vi等)才會儲存為UTF-8字元。

# -*- coding: <encoding_name>-*-

例如下面這行就可以宣告本文件應以UTF-8格式儲存:

# -*- coding: utf-8 -*-

這邊可以參考以下網址
http://www.python.org/dev/peps/pep-0263/

若是使用直譯器,就要確定shell的環境變數LANG。

配置字串的時候,將字串配置為unicode格式:
如果LANG=zh_TW.UTF-8:

unicode_str =  unicode('這是中文', 'utf-8')


如果LANG=zh_TW.BIG5:

unicode_str = unicode('這是中文', 'big5')


windows中則shell的環境一定為big5:


也有比較簡單的方法,無論LANG變數為何都可以運作:

unicode_str =  u'這是中文'

之後檢查

>>> type(unicode_str)
(type 'unicode')

如果想要用big5顯示,可以這樣做

print unicode('這是中文', 'utf-8').decode('big5')


另外,raw_input()這個功能也有一些問題

raw_input(u'Please input')
raw_input(u'請輸入')

前者會成功,後者卻會失敗
筆者猜想可能是raw_input依然使用ascii來處理字串的關係。
唯一解決方法就是不要讓raw_input裡面塞入unicode的中文了。


在網站上也另外看到一個文件:

http://czug.org/blog/eishn/sqlobject-dezhongwenbianmawentijijiejuefangan

簡單來說,sys這個module原本有setdefaultencoding這個function,但在啟動腳本setting.py中卻被刪除了。而這個功能可以經由reload(sys)來啟用。

因此可以在script開始時這樣寫入:

import sys
if sys.getdefaultencoding() != 'utf-8':
    reload(sys)
    sys.setdefaultencoding('utf-8')

很多問題就可以解決囉!

參考網址:
http://evanjones.ca/python-utf8.html

深入閱讀......

2008年10月3日 星期五

台灣的民主包袱

0 意見

前幾日看到蘋果日報上關於競選活動宗教化之社論,甚是感慨。臺灣人民一向重視信仰,我們的競選活動宗教化亦是不爭的事實。但筆者認為,宗教化並非藍綠紛爭的亂源,而僅是表象。藍綠紛爭真正的根源,乃是來自於"傳統價值"

眾所皆知,華人社會的傳統價值乃是來自於中國文化。而中國自古以來便是一個單一政權之政體。雖有戰國,三國,或民國初年等群雄割據之年代,但在很短的時間內很快又回復到單一政權。觀察對岸領導人之言行便可發現,對方的思維跳脫不出"成王敗寇",一味打壓,抹黑台灣及西藏等地。筆者認為,這顯示出中國傳統價值最大的弊病-即對於多元價值與文化之尊重。

這種中國文化弊病起源於漢武帝獨尊儒術。漢武帝之所以獨尊儒術,重要的一點恐怕是由於儒家鼓吹"倫理",講求輩分,限制非既得利益者之權力(如婦德限制婦女部份自由)這些規則非常方便既得利益者行使統治權。在現代社會中也就是方便父母管理兒女,方便老闆管理員中,方便部會首長管理下屬。既得利益者在有能力主導社會價值觀的同時,當然大力推行此種思維。在管理之過程中,只有既得利益者才有決定之權力,非既得利益者是沒有置喙的餘地(有耳無嘴)

深入閱讀......

如何修改Ubuntu的開機流程?

0 意見

在Red Hat/SUSE的環境中,修改開機時開啟的服務是經由
chkconfig
這個命令來達到的,而開機的level則是修改/etc/inittab這個檔案裡面有一行

id:5:initdefault:
....^
這是預設的runlevel

以上是redhat/suse的方式
若要開機執行script,
Red Hat 版本請將script加入
/etc/rc.d/rc.local
SUSE則請將script加入
/etc/init.d/boot.local


目前ubuntu7.04已經不是使用上述的方式來管理開機,啟動方式是用upstart

各種設定檔案放在/etc/event.d底下

其中的rc-default檔案內容如下

=========================

#
# This task guesses what the "default runlevel" should be and starts the
# appropriate script.

start on stopped rcS

script
runlevel --reboot || true

if grep -q -w -- "-s\|single\|S" /proc/cmdline; then
telinit S
elif [ -r /etc/inittab ]; then
RL="$(sed -n -e "/^id:[0-9]*:initdefault:/{s/^id://;s/:.*//;p}" /etc/inittab || true)"
if [ -n "$RL" ]; then
telinit $RL
else
telinit 2
fi
else
telinit 2
fi
end script

============================

仔細觀察可以發現裡面會先檢查/etc/inittab中有沒有
id:5:initdefault:
這行文字

如果沒有的話,則預設啟動為runlevel 2

如果想要修改預設的runlevel,可以有以下方法

1.增加/etc/inittab並寫入
id:5:initdefault:

2.將/etc/event.d/rc-default裡面最後的
telinit 2
都改成
telinit *

由於ubuntu的其他runlevel有什麼功能並不是十分清楚
個人查看rc3.d到rc5.d其中的內容幾乎都是相同
跟rc2.d的內容僅有差在S99stop-readahead以及S10powernowd.early
如果您只是不想要圖形介面的話,可以自行將rc2.d的資料夾內容中的
S13gdm
改名為
_S13gdm
即可

如果還是想要執行圖形介面的話
執行
#/etc/init.d/gdm
即可

以上方法個人沒有實際測試過,僅有根據手上的7.04 LiveCD及以下網誌推論
http://www.wretch.cc/blog/kenshinn&article_id=2536325
http://ku777.blogspot.com/
http://blog.mypapit.net/2007/03/where-can-i-find-inittab-in-ubuntu-edgy-eft-or-feisty-fawn.html


深入閱讀......