2007年10月23日 星期二

網吧XP無盤系統集成優化及母盤封裝

一、安裝設置
  
  1、 以正常方式安裝WINXP,安裝完之後即刻打上沖擊波、震蕩波補丁,然後安裝DIX9。0C,安裝五筆輸入法(無需安裝輸入法補丁),接著升級WMP10。0,安裝REALONE10。0,安裝暴風音影XP版,複制其他機上的WINRAR安裝目錄到系統中,以備不時之需(記住,不是安裝,是複制,安裝的話它會關聯所有壓縮文件),此時軟件部份安裝完畢。
  
  
  2、 安裝XPLITE,去掉不常用的附件
  
  
  1) 操作系統選項中保留:CLI OOK、DLLCACHE文件夾、ODBC數據源管理器、TWAIN圖像獲取驅動、幫助和支持中心、程序兼容工個、程序兼容性向導、核心字體、啟動預讀緩存、驅動緩存、升級包源文件
  
  2) 多媒體選項中保留:ATI I驅動程序、DIRECTSHOW VIDEO、ICM色彩配置文件、OPENGL圖形庫、WINDOWS MEDIA PLAYER、視頻解碼器、音量控制器、音頻解碼器
  
  3) 服務器組件保留選項:索引服務、在索引服務語言資源中保留繁體中文、簡體中文、美國英語、英國英語
  
  4) 通讀和消息中保留:USR/3COM調制解調器驅動、超級終端、傳真服務、電話撥號程序、無線連接配置
  
  5) 網絡實用程序保留選項:IE HTML RENDERING ENGINE、INTERNET EXPLORER、JAVA SCRIPT、JAVA虛擬機、TCP/IP命令行工具、VB SCRIPT、網絡連接管理
  
  6) 系統服務中保留:通用即插即用服務、智能卡服務
  
  7) 系統工具和實用程序中保留:BRIEFCASE、REMOTE A ISTANCE、WINDOWS腳本宿主
  
  8) 我沒寫上的全部去掉。
  
  
  二、注冊表優化
  
  
  1、 加速XP的開關機
  
  開啟注冊表編輯器,找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control,
  
  將 WaitToKillServiceTimeout 設為:500 ( 原設定值:20000 找到
  
  HKEY_CURRENT_USER\Control Panel\Desktop 鍵,將右邊視窗的
  
  WaitToKillA Timeout 改為 500, ( 原設定值:20000 即關閉程序時僅等待1秒。將 HungA Timeout 值改為:200( 原設定值:5000 , 表示程序出錯時等待0.5秒。
  
  
  2、 讓系統自動關閉停止回應的程式。
  
  
  打開注冊表 HKEY_CURRENT_USER\Control Panel\Desktop 鍵,
  
  將 AutoEndTasks 值設為 1。 ( 原設定值:0
  
  
  3、 加快Win XP瀏覽速度!
  
  
  打開注冊表點擊到:
  
  HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/Explorer/RemoteComputer/Name ace。刪除下面所有的值如:{D6277990-4C6A-11CF-87-00AA0060F5BF}
  
  
  4、 不加載DLL文件  
  
  
  瀏覽器在使用之後往往會有部分DLL文件在內存中緩存好長一段時間,相當大一部分內存會被不用的DLL文件點用。為了防止這種事情發生,找到注冊表如下位置:
  
  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorer
  
  接下來建立一個名為AlwaysUnloadDLL,值為1的雙字節值。
  
  如果想要去除這項優化,只需把該鍵值設為0(也可以幹脆把鍵刪掉)。注意:該項優化要在Windows重新啟動後才生效。
  
  
  5、 完全關閉Windows XP文件保護功能。此招慎用
  
  
  從注冊表中找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon,修改&ldquo FCDisable」鍵值為「FFFFFF9D」,如果需要重新啟用該功能,重新設置為「0」就可以了。
  
  
  6、 加快菜單顯示速度
  
  
  在[開始][運行]鍵入[Regedit][HKEY_CURRENT_USER][Control Panel][Desktop],將字符串值[MenuShowDelay]的數值數據更改為[0],調整後如覺得菜單顯示速度太快而不適應者可將[MenuShowDelay]的數值數據更改為[200],重新啟動即可
  
  
  7、 加快預讀能力改善開機Windows XP預讀設定可提高系統速度,加快開機速度。按下修改可進一步善用CPU的效率:在[開始][運行]鍵入[Regedit][HKEY_LOCAL_MACHINE][SYSTEM][CurrentControlSet][Control][Se ionManager][MemoryManagement],在[PrefetchParameters]右邊窗口,將[EnablePrefetcher]的數值數據如下更改,如使用PIII 800MHz CPU以上的建議將數值數據更改為4或5,否則建議保留數值數據為默認值即3
  
  
  8、 和Windows 2000一樣,XP在瀏覽局域網時也存在煩人的延遲問題,但介紹這個問題的資料卻很難找到。如果你瀏覽一台Win 9x的機器,例如,在網上鄰居的地址欄輸入「\computername」,XP的機器會在它正在連接的機器上檢查「任務計劃」。這種搜索過程可能造成多達30秒的延遲。如果你直接打開某個共享資源,例如在網上鄰居的地址欄輸入「\computernameshare」,就不會有這個延遲過程。要想避免XP搜索「任務計劃」的操作,提高瀏覽網絡的速度,你可以刪除HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorer
  
  RemoteComputerName ace{D6277990-4C6A-11CF-8D87-00AA0060F5BF}子鍵。該鍵的類型是REG_SZ。
  
  
  9、 XP中讓程序開機即運行的新方法   
  
  
  點擊「開始」菜單中的「運行」,在打開的「運行」對話框中輸入「Regedit」,打開注冊表編輯器。順次展開注冊表到HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows下,在這裏新建一個字符串值,方法是右擊主鍵「Window rdquo;,在彈出的菜單中選擇「新建&rdquo rarr ldquo;串值」,把該字符串值命名為「load」。然後,雙擊「load」,在彈出的窗口中將它的鍵值改為你想開機就自動運行的程序路徑。要注意的是應該使用文件的短文件名,即「C:\Program File rdquo;應該寫為「C:\Progra~1」。

  
  10、 關閉不用的共享   
  
  
  安全問題一直為大家所關注,為了自己的系統安全能夠有保證,某些不必要的共享還是應該關閉的。用記事本編輯如下內容的注冊表文件,保存為任意名字的.Reg文件,使用時雙擊即可關閉那些不必要的共享:   
  
  Windows Registry Editor Version 5.00   
  
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
  
  \lanma erver\parameters]   
  
  "AutoShareServer"=dword:00000000   
  
  "AutoSharewk quot;=dword:00000000   
  
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]   
  
  "restrictanonymou quot;=dword:00000001
  
  
  11、 取消磁盤空間不夠警告提示   
  
  
  Windows XP會自動監控磁盤空間剩餘量,一旦磁盤空間不足的話,會提示你並掛起系統還原功能。如果要取消的話,就打開注冊表編輯器,找到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies
  
  \Explorer,新建一個Dword值NoLowDisk aceChecks,然後修改為1即可。
  
  
  12、 讓WINDOWS XP自動登陸  
  
  
  打開:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon,在右邊的窗口中的新建字符串"AutoAdminlogo quot;,並把他們的鍵值為"1",並且把「DefaultUserName」的值設置為用戶名,並且另外新建一個字符串值「DefaultPa word」,並設其值為用戶的密碼。
  
  
  三、服務優化(我在這裏只提幾個重要的服務,在保證啟動速度和正常使用下要啟用的服務)
  
  
  1、 cryptogr aphic services:這個服務到底做什麼用的很多人不明白,其實它就是用來檢測你所安裝的軟件及硬件驅動是否通過了微軟認證,停止它也可以正常使用,但是如果大家要做萬能GHOST封裝的時候就會有麻煩了,當你把GHOSTXP重新GHOST到其他機時,裝任何一個驅動,都會不停的提示是否安裝驅動,很麻煩,所以建議大家做母盤時不停用它,當安裝完所有硬件及軟件之後再停用它。
  
  
  2、 EVENT LOG:這個相信大家都清楚是用來做什麼的,是用來記錄事件的,雖然也在其他論壇上看到過說可以停用它,因本人技術有限,無法告之大家如何停用它且不出現服務出錯的問題。
  
  
  3、 PLUG AND PLAY:這個我就不說了,只能啟用不可停
  
  
  4、 Remote Procedure call(RPC):這個服務想必也不用我說了
  
  
  5、 SERVER:停止了它局域網就用不了
  
  
  6、 Shell hardware Detection:這個服務是最令我鬱悶的服務,我自已精簡的包如果停用它最少要12秒才能啟動,啟用它就啟動一閃而過,這個服務是用來檢測硬件改動的,停用也能正常使用,但本人為了保持啟動速度,不禁用它
  
  
  7、 Themes:主題服務,停用它界面就變成2000了,既然用XP,一定的漂亮還是要的。
  
  
  8、 WINDOWS AUDIO:聲音嘛,當然都要聽了
  
  
  9、 WORKSTATION:這個是用來創建和維護網絡連接的,如果我們不安裝BXP的話也可以停止,局域網其實也能正常使用的,但是BXP要用它,沒辦法。
  
  
  10\Logical disk manager:這個是用來管理磁盤的,安裝BXP的時候要用到它,做母盤是先不禁用它,等安裝完一切之後才禁用它。
  
  
  四、系統設置
  
  
  1、 系統優化設置。
  
  1、刪除Windows強加的附件:
  
  a . 用記事本NOTEPAD修改\wi t\inf\sysoc.inf,用查找/替換功能,在查找框中輸入,hide(一個英文逗號緊跟hide),將「替換為」框設為空。並選全部替換,這樣,就把所有的,hide都去掉了,
  
  b. 存盤退出,
  
  c. 再運行「添加-刪除程序」,就會看見「添加/刪除 Windows 組件」中多出了好幾個選項;這樣你可以刪除好些沒有用的附件
  
  2、 2.關掉調試器Dr. Watson;
  
  運行drwt 32,把除了「轉儲全部線程上下文」之外的全都去掉。否則一旦有程序出錯,硬盤會響很久,而且會占用很多空間。如果你以前遇到過這種情況,請查找user.dmp文件並刪掉,可能會省掉幾十M的空間。這是出錯程序的現場,對我們沒用。另外藍屏時出現的memory.dmp也可刪掉。可在我的電腦/屬性中關掉 OD時的DUMP
  
  3.關閉「系統還原」:鼠標右健單擊桌面上的「我的電腦」,選擇「屬性」,找到「系統還原」,如果你不是老劈裏啪啦安裝一些軟件(難道你比我還厲害??),你也可以去掉,這樣可以節省好多空間
  
  4.關閉「休眠支持」:因為休眠功能占的硬碟空間蠻大的, 所以關閉比較好,
  
  控制台電源選項休眠(不要打勾)
  
  注:我覺得休眠還是很有用的。藍調。
  
  3、 壓縮文件夾
  
  這是一個相當好的優化,Windows XP內置了對.ZIP文件的支持,我們可以把zip文件當成文件夾瀏覽。不過,系統要使用部分資源來實現這一功能,因此禁用這一功能可以提升系統性能。實現方法非常簡單,只需取消zipfldr.dll的注冊就可以了,點擊開始&mdash gt;運行,敲入: regsvr32 /u zipfldr.dll 。然後回車即可。
  
  4、 關閉錯誤回報
  
  控制台--系統--進階--右下角-錯誤報告--關閉
  
  5、 )"我的電腦"-> quot;屬性"-> quot;高級"-> quot;啟動和故障修複"中,點"錯誤報告",選擇"禁用錯誤彙報"、"但在發生嚴重錯誤時通知我"。
  
  (3)點擊"編輯",在彈出記事本文件中:
  
  [Operating Systems] Ed
  
  timeout=30 //把缺省時間 30 秒改為 0 秒 =
  
  multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Profe ional" /fastdetect //把缺省 fastdetect 改為 nodetect 2r
  
  注冊表修改方法:"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control" ,SystemStartOptio 鍵值改為NODETECT。
  
  6、 優化「啟動和故障恢複」設置:   
  右鍵單擊「我的電腦」,點擊屬性,點擊「高級」,在「啟動和故障恢複」6L
  
  一欄中,點擊「設置」,其中的「系統失敗」一欄中,只選擇「自動重新啟動」,寫入調試信息選擇「無」
  
  7、 關閉「Internet時間同步」功能:如果啟用了同步,你的計算機時鍾每周就會和 Internet 時間服務器進行一次同步,建議關掉它(一個沒多大用的功能)。請依次單擊「開始」
  
  &rarr ldquo;控制面板&rdquo rarr ldquo;日期、時間、語言和區域選項」,然後單擊「日期和時間&rdquo rarr ldquo;Internet時間」。
  
  8、 取消對zip文件的支持:
  
  運行,敲入:regsvr32 /u zipfldr.dll 然後回車即可
  
  9、 關掉快速切換功能:方法如下:控制面板用戶帳戶,點擊「更改用戶登陸或注銷方式」,去掉「使用快速用戶切換」就可以了。
  
  10、 減少磁盤掃描等待時間
  
  在dos下,鍵入「chkntfs/t:0」



  
  11、 .解除帶寬限制 >
  
  運行----gpedit.msc-----管理模版-----網絡----QoS數據包調度程序---限制可保留帶寬---啟動-----下面輸入 0 ----確定---------在你的撥號圖標右健屬性找到網絡-----看看有沒有QoS
  
  數據包調度程序-------如果沒有點安裝-----服務------添加----選QoS數據包調度程序----看看有沒有打勾----有就代表成功了--------重啟---ok! #
  
  12、 .取消系統休眠支持8
  
  右鍵屬性-屏幕保護程序-電源-休眠-取消
  
  13、關掉視頻預覽ee
  
  運行一下這個命令:「REGSVR32 /U SHMEDIA.DLL」
  
  
  五、封裝前收尾工作
  
  
  1、 刪除c:\windows\font裏面所有字體顯示為0字節的字體文件
  
  2、 刪除c;\windows\help下面的所有文件
  
  3、 刪除C盤WINDOW文件夾下面IME、MEDIA、MSAGENTS、TEMP、CURSORS下面的所有文件
  
  4、 清理IE緩存
  
  5、 打開我的電腦中的文件夾選項,點擊查看,把其中的自動搜索網絡文件夾和打印機、記住每個文件夾的視圖設置的勾去掉,然後在查看欄中點擊列表顯示,
  
  6、 點擊C盤右鍵,再點屬性,把允許索引服務編制該磁盤的索引以快速搜索文件的勾去掉
  
  7、 刪除C盤WINDOW下面PREFETCH文件夾中的所有文件。
  
  8、 搜索*。TMP文件,全部刪除
  
  9、 把頁面文件設成無
  
  10、 最後一步,用磁盤整理工具整理碎片,至此結束對XP的整體優化
  
  
  六、封裝打包
  
  
  制作純淨版的主導思想:盡量兼容各種機子、盡量不要減肥、盡可能幹淨。
  
  a) 在XP安裝光盤中打開\SU ORT\TOOLS\DEPLOY.CAB文件,先在 C:盤根目錄下建議一個名為Sy rep 的文件夾,並將DEPLOY.CAB壓縮包文件用Winrar全部解壓縮到 c:\sy rep目錄。
  
  b) 複制「死性不改「的最新電源判斷程序。及DLLCACHE備文程序到C:\sy rep文件夾中。
  
  一)、刪除硬件驅動
  
  1、更改 IDE ATA/ATAPI控制器, 這一步就是XP系統萬能GHOST的主要步驟所在!為了適應現在各種不同的主板,(如Inter 主板,VIA主板,SIS主板)則必須將你本機的IDE 控制器改成 標准的雙通道 PCI IDE控制器
  
  二)、再把計算機的改為Standard PC,方法和上面的一樣!
  
  三)、盡可能避免幽靈硬件及2個Standard PC出現:
  
  幽靈硬件是指GHO鏡像制作好後,重新恢複到新機上,經常會發現出現「幽靈硬件」,即在設備管理器中,查看-顯示隱藏設備時,會發現有不少灰色的設備或者同一個設備有2份。目前仍然是GHOST的大難題之一。
  
  a) 把把計算機的改為Standard PC後,執行至少3-5次的DEL_DRIVER.BAT,然後第1次重新啟動計算機!
  
  b) 第1次重新啟動計算機後,到設備管理器中,點擊查看-顯示隱藏的設備,然後把顯示為灰色的右鍵點擊設備,一一卸載刪除,如果出現2個Standard PC,則一定要卸載刪除一個Standard PC,只保留一個。然後再第2次重新啟動計算機。
  
  c) 第2次重新啟動計算機後再次進入系統後,執行執行至少3-5次的DEL_DRIVER.BAT!
  
  d) 到設備管理器中,點擊查看-顯示隱藏的設備,然後,會發現剩下的設備已經不多了。把顯示為灰色的右鍵點擊設備,一一卸載刪除。一般情況下是沒有可卸載刪除的硬件的了。
  
  四)、避免出現本地連接2的方法:
  
  有時做出來的GHO鏡像,恢複到只有一塊網卡的機子上時,會出現本地連接2,卻沒發現本地連接,很不爽也!處理方法如下:
  
  開始-運行-REGEDIT,然後編輯-查找,輸入「本地連接」,找著後,把它的上一級分支一並刪除。按F3繼續查找&helli helli helli
  
  五)、系統封裝過程
  
  1、制作sy rep.inf. 這裏有一份我做好的,大家只要複制下來就行,有些內容是經過本人更改的,內容如下:
  
   etupMgrTag
  
  [Unattended]
  
  OemSkipEula=Yes
  
  [GuiUnattended]
  
  Admi a word=*
  
  EncryptedAdmi a word=NO
  
  OEMSkipRegional=1
  
  TimeZone=210
  
  OemSkipWelcome=1
  
  [UserData]
  
  ProductKey=DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G
  
  FullName="藍貓"
  
  OrgName="藍貓工作室"
  
  ComputerName=*
  
  [RegionalSettings]
  
  LanguageGroup=10
  
  [GuiRunOnce]
  
  Command0="C:\WINDOWS\DllCacheManager.exe /restore"
  
  [Identification]
  
  JoinWorkgroup=WORKGROUP
  
  [Networking]
  
  I tallDefaultComponents=Yes
  
  3、DllCache文件的刪除與恢複:
  
  複制我提供的DllCacheManager.exe到C:\WINDOWS目錄下面,點擊備份,備份完之後退出 1、 安裝電源自動判斷程序。
  
  運行死性不改最新電源程序,選擇完整安裝,安裝完之後退出,運行M REP,在等待時間中寫10,然後點擊確定,等它運行完畢之後顯示重啟後制作GHOST包,然後關機,把C盤做成映像即可。

無盤遠程引導技術

  無盤工作的原理

  1、當客戶機啟動後,其網卡上的Boot Rom 會發送一個FIND幀,server端遠程啟動服務收到客戶機廣播的FIND幀後,根據幀中所帶的網卡ID號,檢查遠程啟動數據庫中是否有該卡號的配置記錄:如果不存在這個記錄,引導過程不能繼續;如果此工作站的記錄已經存在,遠程啟動服務發送一個FOUND幀,同樣,這個幀中包含了服務器的網卡ID。

  2、工作站收到第一個響應後(當網絡上有不止一台的Sever在運行遠程啟動服務,工作站只對收到的第一個FOUND幀響應),則發送一個SEND.FILE.REQUEST Frame給第一個響應的遠程啟動服務器,以請求傳送啟動所需的文件。

  3、當遠程啟動服務器收到SEND.FILE.REQUEST Frame的要求後,會根據其遠程啟動數據庫中的工作站記錄查找對應的啟動塊,就是boot block,將工作站所需的啟動文件傳送給工作站,即給工作站一個FILE.DAT.RESPONSE幀,這個幀包含了工作站啟動所需的啟動塊。

  4、工作站接收到完整的啟動文件後,就開始執行文件中的啟動程序,將執行點轉向啟動塊的入口,啟動工作站。當然不同的操作系統有不同的引導方式。

  早期無盤工作站的缺點
  1、早期的無盤工作站多為手工拼湊,價格便宜,經常和鼠標發生沖突。
  2、組網多選用Novell,其命令繁多,安裝配置必須是專業人士。
  3、支持WIN95遠程引導的RPL技術通用性差,技術不成熟。
  4、 配合Windows CE而設計的Terminal技術,雖克服RPL的許多不足,但Windows CE與Win9X相比有明顯不足。

  PXE原理及優點

  1、PXE簡介

  正當市場上對新技術的推出有迫切需求的同時,Intel不失時機地推出了PXE遠程無盤引導技術,其配合Qualystem公司的LiteNet,並選用台灣DTK公司的E-Terminal,以實現Windows 98的遠程啟動和執行,使得可靠性和穩定性都大大提高。Win 98的各種應用軟件只需通過簡單的幾個步驟即可加到終端上,並可隨時升級和擴充。

  2、PXE工作原理

  (1)DTK專門設計的 E-Terminal主機BIOS中包含PXE遠程引導模塊,開機啟動後,會通過DHCP服務器得到本機IP地址,並將PXE Boot Server的內容下載到本機內存中執行。

  (2)通過LiteNet,遠程引導Windows 98,並根據設好的用戶名登錄上NT服務器,以後就可像有盤PC一樣自由地操作電腦了。

  3、PXE優點

  (1)因為其能支持Windows、Linux遠程啟動,所以現有的各種應用軟件都能得到非常好的應用。由於系統本機內存為64MB,虛擬內存大小可在服務器自由設定,另具有3D圖形視覺增強和AC97 CODEC軟件音頻功能,進行3D處理和玩遊戲也就是小菜一碟了。

  (2)PXE還有一個最大的優點就是安全性,不管多少個終端——10台還是100台,系統和應用軟件就只有一套 ,對用戶的權限是在服務器上設定的,用戶可以在自己的目錄下隨便操作,若有了誤操作,重新啟動便可以完全恢複。因為本機軟盤硬盤統統沒有,原先一直擔心的硬盤數據出錯、感染病毒等問題就再也不會困擾您了!

  (3)操作維護簡便:想升級軟件嗎?只需給服務器重新傳一遍LiteNet,最多半小時,所有終端便已全部升級了。電腦壞了換新的也很簡單:插上網線,記下網卡號,在服務器上只需修改一句話就可以了。想給所有終端升級BIOS也只需將服務器的 Boot Server重建一遍就行了。

  綜上所述,在以上所述的方案中,PXE作為一個新興的技術,相信在不久的將來,必將被推廣到市場的方方面面,也必定能成為遠程引導技術的主流。

pxe 網路開機

最近突想做pc的網路開機,整整再google找了兩,三天,總算有幾篇教導利用 pxelinux 做開機的方式,我的做法如下

原網站網址:http://ms7.fhsh.tp.edu.tw/blog/shyong/archives/27

2007年10月22日 星期一

[備忘]EBS1.6x updata 1.63x

[下載] EBS1.6x updata 1.63x
EBS 1.6 by ek9 (http://k1.4.to)

檔案 :
buy (777)
└rireki.dat (666)
depot (777)
└depot.db (666)
ebs_log (777)
└_bougu.data (644)
_ex.data (644)
_hash.data (644)
_hash2.data (644)
_hash3.data (644)
country_data.dir (666)
country_data.pag (666)
country_data1.dir (666)
country_data1.pag (666)
dellistdb.dir (666)
dellistdb.pag (666)
gouseidb.dir (666)
gouseidb.pag (666)
history_data.dir (666)
history_data.pag (666)
logdata.dir (666)
logdata.pag (666)
loginlist.dir (666)
loginlist.pag (666)
memdata.dir (666)
memdata.pag (666)
message.dir (666)
message.pag (666)
newlists.dir (666)
newlists.pag (666)
log (777)
└kaigisitu.log (666)
log2 (777)
logfolder (777)
miuler2 (777)
└_bougu.data (666)
souko (777)
wea (777)
└bukidb.db (666)
wea.dir (666)
wea.pag (666)
zhi (777)
└_hash.data
images (755)
└img1 (系統圖)
└img2 (機體圖)
└img3 (機師圖)
admin.cgi (755) (管理)
admin2.cgi (755) (管理)
config.cgi (755) (設定)
ballance.cgi (755)
bbs.cgi (755)
bbs.dat (666)
bukikodb.dir (666)
bukikodb.pag (666)
buy.cgi (755)
dellistdb.dir (666)
dellistdb.pag (666)
depot.cgi (755)
ebs_log.dir (666)
ebs_log.pag (666)
ebsmake.cgi (755)
factory.cgi (755)
fdp.cgi (755)
gm.js (644)
gm.js1 (644)
go.htm (644)
gousei.cgi (755)
gouseidb.dir (666)
gouseidb.pag (666)
history.cgi (755)
hukubiki.cgi (755)
kaigisitu.cgi (755)
kaigisitu.log (666)
kunijyouhou2.cgi (755)
kunijyouhou.cgi (755)
master.cgi (755)
member3.cgi (755)
member.cgi (755)
members.cgi (755)
message.cgi (755)
miulerfactory.cgi (755)
name.cgi (755)
newlistdb.dir (666)
newlistdb.pag (666)
news_detail2.htm (644)
news_detail.htm (644)
not1.htm (644)
not.htm (644)
oneli.cgi (755)
ranking.cgi (755)
restore.cgi (755)
souko.cgi (755)
wea.cgi (755)
weapon.htm (644)
weaponlist.cgi (755)
zhi.cgi (755)
zhidb.dir (666)
zhidb.pag (666)
ebs.cgi (755)
ebs_sub1.cgi (755)
ebs_sub2.cgi (755)
ebs_sub3.cgi (755)
ebs_sub4.cgi (755)
ebs_sub5.cgi (755)
ebs_sub6.cgi (755)
ebs_sub7.cgi (755)
說明.txt

http://skyfung.kilu.de/ebs1 6 zip

--------------------------------------------------
up 1.63x

檔案 :
admin2.cgi (755)
gousei.cgi (755)
ranking.cgi (755)
miulerfactory.cgi (755)
config.cgi (644)
ebs_sub1.cgi (755)
ebs_sub2.cgi (755)
member3.cgi (755)
not1.cgi (755)
not2.cgi (755)
pass.cgi (755)
說明.txt

http://skyfung.kilu.de/up1 63x zip

2007年10月19日 星期五

由日本發起、新的開放系統Mona OS

自由軟體 : 由日本發起、新的開放系統Mona OS
發表人 droger 於 2007/10/9 0:11:09 (1591 人讀取)
新聞來自 http://www.osnews.com/
Mona OS是一個由C++寫成的一個MicroKernel的系統,在另一個部落格當中看到
是從日本一個使用度相當高的web討論版2ch所聚眾發起的,主要特色在於系統簡潔
適合讓學校或寫程式針對作業系統方面來教學使用,Mona OS是採MIT授權發行
以下是新聞擷取
引言:

MonaOS is a free operating system. It's new, small, simple, open source and well structured. So, MonaOS may be suitable for education of operating system and program at school." It's a microkernel-based operating system, MIT-licensed, and available for IA-32.

全文網址
http://www.osnews.com/story.php/18732/Introducing-MonaOS

http://monaos.org/about.html

Zenity - 對話框產生器

Zenity - 對話框產生器
Cat.: 小工具, 爬網探險
18. October 2007
zenity 這東西真的很好用,可以快速產生一些有用的 dialog,像是為了快速在網路上抓一些 0rz 的謎物,以下 script 就很方便 :p

#!/bin/sh
URL="http://0rz.tw/"
NUM=`zenity --entry --text $URL`
if [ $NUM != "" ]; then
wget -P ~/Desktop $URL$NUM 2>&1 | \
sed -u 's/.*\ \([0-9]\+%\)\ \+\([0-9.]\+\ [KMB\/s]\+\)$/\1\n# Downloading \2/' | \
zenity --progress --title="Downloading File..." --auto-close
fi

遠端安裝 Fedora Core Linux

發表人 ceasar _POSTON 2006/12/4 14:46:12 (394 人讀取)
Reference:
http://cha.homeip.net/blog/archives/2006/11/_fedora_core_li.html

引言:


遠端機房裡的 Linux Server 掛點了, 當地技術人員並不熟悉 Linux, 幸好還有這一招 :)

* VNC 遠端連線安裝
* Telnet 遠端連線安裝



VNC 遠端連線安裝

方式一: 安裝時啟動 VNC Server, 允許遠端 VNC Client (vncviewer) 連入操作安裝步驟

光碟開機後, 輸入以下指令:

linux vnc

待畫面出現:

The VNC server is now runing.
Please connect to xx.xx.xx.xx:1 to begin the install...
Starting graphical installation...

從其他電腦以 vncviewer 連入 xx.xx.xx.xx:1 即可

預設沒有連線密碼, 欲設置 VNC 連線密碼可加上 vncpassword 參數:

linux vnc vncpassword=your_password

若想使用固定 IP, 可加上 ip 參數:

linux vnc ip=192.168.1.100 netmask=255.255.255.0 getway=192.168.1.254

方式二: 由 VNC Server 直接推送連線訊號給 VNC Client (vncviewer listen mode)

先在 VNC Client 電腦上啟用 VNC Viewer Listen Mode: (預設 tcp port 5500)

* RealVNC @ Windows:
程式集 → RealVNC → VNC Viewer 4 → Run Listening VNC Viewer
 
* UltraVNC @ Windows:
程式集 → UltraVNC → UltraVNC Viewer → Run UltraVNC Viewer (Listen Mode)
 
* VNC @ Linux:
vncviewer -listen

光碟開機後, 輸入以下指令:

linux vnc vncconnect=vnc.client.ip.address


Telnet 遠端連線安裝

光碟開機後, 輸入以下指令:

linux text telnet

待畫面出現:

Waiting for telnet connection...

按 Alt + F3 查看 IP Address: (若搭配 ip 參數指定固定 IP 則免此步驟)

* going to beTelnet for xx.xx.xx.xx

從另一台電腦以 telnet 連入:

Linux: telnet xx.xx.xx.xx

Windows: putty -telnet xx.xx.xx.xx (putty 下載頁面)


其他參數:

* lang=指定安裝時的語言, 預設為英文: en_US; 繁體中文為 zh_TW
* keymap=指定鍵盤類型, 一般為 us
* ks=載入 kickstart 安裝設定檔, 詳見 Fedora 官方說明

後記:

* Fedora Core 3 無法以 telnet 連入 (會發生 "Cannot open /dev/ttyp0" 的錯誤); 而 Fedora Core 6 就沒問題.
* telnet 連線操作時, 若中途中斷連線, 被控端電腦會自動重新啟動.
* 以 GRUB4DOS 安裝時, 在 vmlinuz 後面加上 vnc 或 telnet 參數, 即可進行遠端安裝.
* yum install system-config-kickstart 可安裝 kickstart 設定程式

References:

* Fedora Installation Guide - Boot Options
* 經由 VNC 安裝 Redhat Linux

Related Links:

* 網路安裝 Linux
* 利用 GRUB4DOS 安裝 Linux

Linux 系統裁減指南(LiPS) (繁體中文版) --(二)

Linux 系統裁減指南(LiPS) (繁體中文版) --(一)
http://www.ceasar.tw/modules/news/article.php?storyid=191

Linux 系統裁減指南(LiPS) (繁體中文版) --(二)
http://www.ceasar.tw/modules/news/article.php?storyid=192


5 根文件系統

  創建根文件系統比編譯內核要複雜的多,也更難理解。這裡的關鍵是掌握init
rd(初始化RAM盤)的使用方法。
5.1 根文件系統
  這裡我們將要創建的根文件系統與通常Linux主機的根文件系統類似,只是它應
該僅僅包括系統運行所必須的應用程序、庫和相關文件的最小集合。根文件系統的
尺寸大小是一個重要的指標。
5.2 文件系統的內容
5.2.1 應用程序(applications)
  /bin,/sbin,/usr/bin,/usr/sbin
  應用程序大致可以分為3部分,第一是操作系統正常運行所需的基本工具軟件,
比如bash,cp,rm等;第二是提供某項服務的服務器軟件,比如httpd,telnetd,
proftpd等;第三是我們所開發的應用程序。其實後面講的配置文件等也可以粗略按
照這個原則來分類。
  到底需要複製哪些軟件,彈性是比較大的,很多軟件都是可要可不要,可以實
際情況靈活選擇。這個列表可能很長,並且變化也比較大,因此不在這裡列出。
  為了進一步減小所創建的根文件系統的尺寸,可以考慮使用下列工具包軟件來
替代某些標準的工具:
O BusyBox(http://www.busybox.net)
O TinyLogin(http://tinylogin.busybox.net)
O Embutils(http://www.fefe.de/embutils/)
  其詳細使用方法請參考相關資料,此處不再贅述。LIPS的實現目前沒有使用這
些軟件包。
5.2.2 設備文件(device files)
  /dev
  設備文件也可以稱作設備節點(device node)。設備文件非常重要,缺少某些
有些設備文件可能導致系統不能正常運行甚至不能引導。有些設備文件是必須的,
而更多的是根據具體目標系統的硬件配置來進行取捨。
  比如硬盤的設備文件,在完整的系統中一般有hda,hdb,……,hdt,即最多支
持20個IDE硬盤,每個硬盤有hdX1,hdX2,……,hdX32,(其中X表示a-t),即支
持32個分區,另外還有表示SCSI硬盤的節點。根據實際情況,如果只需要支持少量
的硬盤、少量的分區,這些節點可以被大大簡化。如果目標系統中沒有的設備,其
對應的設備文件也可以省掉。
設備文件
描述
/dev/console
系統控制台設備,非常重要。
/dev/fd0
第一個軟驅
/dev/hda
/dev/hda[1-8]
IDE硬盤及分區
/dev/initctl
實際上是一個FIFO設備,跟init有關(切換運行級別時用於新init與原init通信)

/dev/initrd
Initial RAM disk
/dev/input
(目錄)Input core(包括遊戲桿、鼠標等)
/dev/kmem
內核虛擬內存
/dev/loop[0-7]
Loopback設備
/dev/mem
訪問物理內存
/dev/null
NULL設備
/dev/psaux
PS/2鼠標
/dev/ptmx
UNIX98 PTY master
/dev/pts
(目錄)UNIX98 PTY slaves
/dev/ptyp[0-7]
偽終端主設備(遠程登錄使用)
/dev/ram[0-7]
/dev/ramdisk
/dev/ram
RAM Disk設備。至少/dev/ram0是應用initrd機制所必須的。
/dev/ramdisk鏈接到/dev/ram0,是為了兼容老版本內核而保留的。
/dev/ram鏈接到/dev/ram1。
/dev/random
隨機數發生器
/dev/sda
/dev/sda[1-8]
SCSI磁盤及分區設備
/dev/shm
共享內存設備
/dev/systty
指向系統tty設備的符號鏈接,一般是tty0。
/dev/tty
當前TTY設備
/dev/tty[0-7]
虛控制台(Virtual console)
/dev/ttyp[0-7]
偽終端從設備
/dev/ttyS0
/dev/ttyS1
串口(COM1和COM2)
/dev/urandom
速度更快、安全性較差的隨機數發生器
/dev/zero
零設備,只能讀0出來
  設備節點的主設備號(Major)、次設備號(Minor)的文檔是內核源代碼中的
/Documentation/device.txt,如果有疑問可以查看這個文件[8]。
5.2.3 腳本和配置文件(scripts and configuration files)
  /etc
  /etc/rc.d目錄下的啟動腳本是系統的重要部分。必須對啟動腳本做相應的修改
以簡化系統的啟動過程。
  系統和各種應用程序用到的幾乎所有的配置文件都位於/etc目錄,是裁減Linu
x最麻煩的部分,最容易出問題。配置文件的選擇需要綜合很多方面的信息,需要對
系統有比較全面、深入的瞭解,並結合經驗才能做出正確的判斷。
配置文件
描述
/etc/default
(目錄)某個命令(比如useradd)的缺省設置(man useradd(8))
/etc/ld.so.cache
由ldconfig命令根據/etc/ld.so.conf文件產生
/etc/ld.so.conf
庫文件路徑配置文件,ldconfig命令根據該配置文件生成/etc/ld.so.cache
/etc/localtime
本地時間、時區設置
/etc/login.defs
全局缺省設置
/etc/fstab
文件系統列表(man fstab(5))
/etc/group
組文件(man group(5))
/etc/hosts
列出主機名和IP地址(man hosts(5))
/etc/init.d
符號鏈接到/etc/rc.d/init.d
/etc/initlog.conf
Initlog日誌配置文件(man initlog(8))
/etc/inittab
Init配置文件(man inittab(5))
/etc/ioctl.save
該文件包含了用於單用戶模式的串口和終端參數,因為這些參數是由getty設置的,
而在單用戶模式時沒有運行getty,所以用該文件保存參數。單用戶模式對系統安全
是個威脅,我們應該禁止使用單用戶模式,因此這個文件實際上並沒有必要複製過
來。
/etc/issue
登錄信息和標識文件(man issue(5))
/etc/modules.conf
模塊的配置文件(man modules.conf(5))
/etc/mtab
已經掛載的文件系統列表(man mount(8))
/etc/nsswitch.conf
Name Service Switch的配置文件(配置名稱服務數據源和查詢的順序)(man nss
witch.conf(5))
/etc/pam.d
放置PAM配置文件的目錄(有關PAM請參考5.5節)
/etc/passwd
用戶口令文件(man passwd(5))
/etc/profile
系統環境變量和登錄配置文件
/etc/rc.d
放置啟動腳本的目錄
/etc/services
列出可用的網絡服務及其端口(man services(5))
/etc/termcap
終端(terminal)功能數據庫(man termcap(5))
  還有那些跟特定應用程序相關的配置文件,比如apache服務器需要的/etc/htt
pd/conf/httpd.conf 等,此處不再一一列出。
5.2.4 庫文件(libraries)
  /lib,/usr/lib,/usr/share
  庫文件也是系統運行所必需的。到底需要哪些庫文件,是根據所複製的可執行
程序用 ldd 工具來確定的。比如,要知道/bin/bash需要哪些庫文件,使用如下命
令:
[root@lips xmdong]# ldd /bin/bash
libtermcap.so.2 => /lib/libtermcap.so.2 (0x40020000)
libdl.so.2 => /lib/libdl.so.2 (0x40024000)
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
  對複製到新的根文件系統的每個可執行程序,都要使用這種方法來確定其所需
要的庫,然後把這些庫文件也複製過來。
  需要注意的是,有些庫文件使用上述方法是找不出來的,但是卻是系統必須的
。比如:
庫文件
描述
/lib/libnss_files*
這個庫是跟/etc/nsswitch.conf有關的,必不可少,否則系統不能正常使用。(ma
n nsswitch.conf(5))
/lib/security/pam_unix.so
這個庫跟PAM有關,是安全、認證方面的,必不可少,否則系統無法登錄。
  
  
5.2.5 必要的目錄
  /home,/mnt,/proc,/root,
  /var,/var/log,/var/run,/var/lock/subsys
  
  
5.3 初始化RAM盤(initrd)
  (參考資料[5])
  初始化RAM盤(initrd)提供了引導器加載RAM盤的能力。這個RAM盤可以被掛載
(mount)成根文件系統,並執行其上的程序。然後,可以從另一個設備掛載一個新
的根文件系統,而原來的根文件系統(也就是initrd)會被移到一個目錄裡並卸載

  initrd技術主要設計用來讓系統啟動過程可以分兩個階段進行,首先讓內核以
一組最小的、被編譯進內核裡的驅動程序來啟動,然後從initrd中加載其他的模塊

5.3.1 操作步驟
  使用initrd時,系統典型的引導步驟如下:
1) 引導器加載內核和初始化RAM盤;
2) 內核把initrd轉到一個一般的RAM盤中,並且釋放原來被initrd佔用的RAM;
3) initrd以可讀寫模式被掛載到根目錄;
4) 執行/linuxrc(linuxrc可以是任何可執行文件,包括shell腳本在內;它具有u
id 0即超級用戶的權限,基本上可以做init程序中能夠做的任何事情);
5) 在linuxrc中掛載真正的根文件系統;
6) linuxrc使用pivot_root系統調用,把真正使用的根文件系統掛載到根目錄;
7) 在根文件系統上執行通常的引導過程(比如執行/sbin/init);
8) initrd文件系統被刪除。
  注意,改變根目錄並不包括卸載舊的根文件系統,因此有可能在轉變過程中仍
有進程在initrd上運行。另外,掛載在initrd目錄下的根文件系統仍然是可用的。

5.3.2 引導選項
  initrd技術增加了下列引導選項:
initrd=
  裝入指定的文件作為初始化RAM盤。當使用 LILO 當引導器時,你可以用/etc/
lilo.conf 文件中 INITRD 這個配置參數,來指定初始化RAM盤文件。
noinitrd
  initrd的數據仍會保留,但不會裝入到一個RAM盤裡,真正使用的根文件系統將
會被掛載。initrd的數據能夠從 /dev/initrd 這個設備中被讀出來。注意,initr
d的數據可以是任何結構,並不一定必須是一個文件系統的映像,這個選項主要用來
進行debug。
  注意:/dev/initrd 是一個只讀並且只能使用一次的設備,最後一個程序一旦
關閉它, 所有數據將被釋放,而且設備也不能再被打開。
root=/dev/ram0
  initrd 先被掛載成根目錄,接著進行正常的啟動過程(這時RAM盤仍被掛載成
根)。
5.3.3 安裝
  首先:我們要在正常的根文件系統中創建一個容納initrd文件系統的目錄,例
如:
# mkdir /initrd
  對目錄名稱並沒有特別的限制,在pivot_root(2)的man手冊頁中有更詳細的說
明。
  如果根文件系統是在引導程序時被建立的(例如,你在製作安裝軟盤),在建
立根文件系統的同時應該創建 /initrd 目錄。
  在某些情況下initrd雖然未被掛載,只要有下列設備存在,它的內容仍是可被
訪問的。(注意:這個設備無法在 devfs 下使用)
# mknod /dev/initrd b 1 250
# chmod 400 /dev/initrd
  第二:支持初始化RAM盤的能力,及所有執行格式和文件系統模塊,都必須直接
編譯進內核,不能採用可加載模塊的方式。
  第三:必須製作一個RAM盤映像文件。大概的步驟是,在一個塊設備上創建一個
文件系統,把需要的文件複製進去,然後把這個塊設備的內容輸出成一個initrd文
件。目前至少有3種設備適合作為這種塊設備:
O 軟盤(能拿到任何地方試驗,但速度太慢);
O RAM盤(最快,但浪費內存);
O Loopback設備(比較合適的解決方案)。
  
  下面,我們將討論使用loopback設備創建initrd文件的方法。
  1)
  確認lookback設備已經配置到內核裡。
  2)
  創建一個適當大小的空白文件系統,例如:
# dd if=/dev/zero of=initrd bs=300k count=1
# mke2fs -F -m0 initrd
  3)
  把這個文件系統掛載進來,例如:
# mount -t ext2 -o loop initrd /mnt
  4)
  創建控制台設備。
# mkdir /mnt/dev
# mknod /mnt/dev/console c 5 1
  5)
  複製所有可能在initrd環境中用到的文件到/mnt目錄中。(別忘了/linuxrc文
件)
  6)
  initrd執行環境的測試需要反覆進行修正,為了避免不斷的重新啟動,可以使
用下列命令:
# chroot /mnt /linuxrc
  當然這樣啟用initrd還是有限制的,就是不能干擾正常系統的執行狀態(比如
重新配置網絡接口等等。如果在一個用pivot_root指令轉換根目錄的執行環境中,
就可以做這些事情了)。
  7)
  卸載這個文件系統:
# umount /mnt
  8)
  這時,初始化RAM盤系統就在「initrd」這個文件中了。可以把它壓縮小一點:

# gzip -9 initrd
  最後,必須啟動內核並載入initrd系統。需要設置下列引導參數:
root=/dev/ram0 init=/linuxrc rw
  (只有需要寫入initrd文件系統時才需要附加rw參數)。
  使用 LOADLIN 當引導器時,可以執行:
LOADLIN C:\LINUX\BZIMAGE initrd=C:\LINUX\INITRD.GZ root=/dev/ram0 i
nit=/linuxrc rw
  使用 LILO當引導器時,可以在 /etc/lilo.conf 中如下設置:
image = /boot/bzImage
initrd = /boot/initrd.gz
append = "root=/dev/ram0 init=/linuxrc rw"
  如果使用其他引導器,請參考相關文檔。
5.3.4 改變根目錄設備
  在執行完重要任務的尾聲,linuxrc一般會執行改變根目錄設備的動作,並讓所
有程序在真實的根文件系統中展開。這個過程包括下列步驟:
O 掛載新的根文件系統
O 把initrd自己轉到這個根文件系統中
O 結束所有舊的對initrd根文件系統的存取動作
O 卸載initrd文件系統並釋放RAM盤內存
  掛載新的根文件系統很簡單:只需要把它掛載到當前根文件系統中的一個目錄
下即可。例如:
# mkdir /new-root
# mount -o ro /dev/hda1 /new-root
  最終改變根文件系統由pivot_root()系統調用或者pivot_root工具來完成(參
考手冊頁pivot_root(8))。pivot_root可以把當前根文件系統轉移到新根的一個目
錄中,然後把指定的目錄當作新的根。在調用pivot_root之前,必須先為舊根準備
目錄,例如:
# cd /new-root
# mkdir initrd
# pivot_root . initrd
  現在,linuxrc仍然可以訪問舊的根文件系統。執行下列指令將完全結束與舊根
的聯繫:
# exec chroot . what-follows dev/console 2>&1
  其中what-follows是新根下面的一個程序,比如/sbin/init。(注意,這時如
果沒有/dev/console,系統不能啟動)。同時,為了保持不同版本之間的兼容性,
需要特別注意下列事項:
O 在調用pivot_root之前,當前目錄應該是新的根目錄;
O 使用「.」(當前目錄)作為pivot_root的第一個參數(新根),為舊根指定目錄
的第二個參數也要用相對路徑;
O chroot這個命令應該在新、舊根系統當中都能使用;
O 然後調用chroot轉移根文件系統;
O 在exec命令中使用象 dev/console 這樣的相對路徑。
  特別提示:讓initrd文件系統的目錄結構與新根文件系統的結構一致,有利於
轉換過程的順利。
  這時,initrd可以卸載,RAM盤也可以釋放:
# umount /initrd
# blockdev --flushbufs /dev/ram0
  注意:如果linuxrc或者它調用的其他程序的執行因為某種原因中斷,則會啟用
舊的change_root機制。
5.3.5 使用場合
  實現initrd的主要動機是允許系統安裝時模塊化的內核配置。這個過程大致如
下:
1) 系統可以用一個最小配置的內核從軟盤或者其他存儲媒體啟動,然後載入initr
d系統;
2) /linuxrc來決定需要什麼來進一步掛載真實的根文件系統(如設備類型、驅動程
序等)或者支持發行版媒體(如CD-ROM,網絡,磁帶等);
3) /linuxrc載入必須的內核模塊;
4) /linuxrc建立並安裝根文件系統;
5) /linuxrc調用pivot_root改變根文件系統,並通過chroot一個程序(繼續安裝過
程);
6) 安裝引導器;
7) 引導器被配置成裝入initrd以及相關的模塊,建立起系統環境;
8) 現在,系統可以引導,並執行其他的安裝任務。
  Initrd的關鍵作用是能夠多重配置一個正常操作的系統,而不需要用一個龐大
的內核,或者重新編譯、連接內核。在製作Linux發行版(光盤等)、系統恢復盤等
方面有廣泛的應用。
5.3.6 淘汰的根轉換機制(change_root)
  可以通過改寫/proc/sys/kernel/real-root-dev這個文件的數字值來改變真實
的根設備。例如:
# echo 0x301 >/proc/sys/kernel/real-root-dev
  但是這個機制已經被淘汰,雖然目前的內核仍然支持,不能保證以後的內核會
支持。所以不要使用。

5.4 系統初始化(init)
  (參考資料[10])
5.4.1 init的任務
  UNIX的init指的不是一個程序、而是一類程序。Init一般是指系統引導時執行
的第一個進程,也是唯一的進程。當內核完成計算機硬件的設置之後,就把控制權
交給init。內核只產生init這一個進程,而系統中其他所有進程都是由init負責產
生(spawn),主要包括各種系統服務進程,比如控制台的登錄會話(getty)。主
要任務包括:
O 產生其他進程;
O 重新啟動已經退出的進程;
O 負責清理系統中的「殭屍」進程(init是所有其他進程的祖先);
O 處理系統關機(stop所有進程,unmount文件系統);
  內核並不關心拿什麼來作為系統的init,可以是下列幾種選擇之一:
O SysVinit (作者:Miquel van Smoorenburg),或者
O simpleinit (作者:Peter Orbaek),或者
O 一個shell腳本,或者
O 嵌入式系統中你的應用程序。
  不過路徑名字必須是/sbin/init,/etc/init,或/bin/init(因為已經編譯到
內核裡面了)。如果這幾個路徑都找不到,系統就完蛋了。為了增加靈活性,內核
提供了命令行選項可以指定init路徑:「init=」。
5.4.2 SysVinit
/etc/inittab
/etc/rc.d
  大多數Linux發行版使用的init是SysVinit,也就是System V UNIX的實現。其
主要思想是規定了不同的「運行級別(runlevel)」。通過配置文件/etc/inittab
,定義了系統引導時做什麼,進入或者切換到一個運行級別時做什麼。配置文件每
一行的語法為:
id:runlevel:action:command
  細節請參考手冊頁inittab(5)。
  整個過程中用到的腳本都放在/etc/rc.d目錄。
5.4.3 兩種風格:Slackware vs. Debian
  關於配置文件/etc/inittab和腳本/etc/rc.d的實現和組織主要有兩種不同的風
格,其有代表性的發行版分別為Slackware和Debian(Redhat同Debian)。這兩種風
格之間有幾個明顯的區別,可以比較容易的識別。
  例如在/etc/inittab中,定義進入運行級別0時運行的腳本分別為/etc/rc.d/r
c.0和/etc/init.d/rc 0(在Redhat中/etc/init.d是指向/etc/rc.d/init.d的一個
符號鏈接,注意這裡0是腳本rc的命令行參數)。因此,Slackware風格的/etc/rc.
d中應該是一系列相對獨立的腳本,對應於配置文件中每個動作的定義(我沒有見過
Slackware哦)。
  在我們所熟悉的Redhat中,/etc/rc.d的組織要複雜的多,每個運行級別對應一
個子目錄/etc/rc.d/rcX.d(X表示運行級別0~6),下面放的是一系列形如SXXfoo
和KXXbar(S表示Start某個服務,K表示Kill某個服務,XX是兩位數字,決定了該腳
本執行的順序)的符號鏈接,指向/etc/rc.d/init.d中的腳本,每個腳本對應一項
服務程序。
  另外,還有兩個重要腳本值得一提:/etc/rc.d/rc.sysinit是系統引導時首先
要執行的(完成系統初始化的各項工作),而/etc/rc.d/rc.local在最後執行(類
似DOS的autoexec.bat)。
  讀一下/etc/rc.d/rc.sysinit,/etc/rc.d/rc和/etc/rc.d/init.d/中的某個腳
本,就會對Redhat的啟動過程和風格有比較清晰的瞭解。
  據說Slackware風格比Debian的速度要快一些。可能是後者的組織結構比較複雜
的緣故吧。

5.5 PAM
  (參考資料[11]?a href="Ahttp://www.kernel.org/pub/linux/libs/pam/,手冊頁pam" target="_blank">Ahttp://www.kernel.org/pub/linux/libs/pam/,手冊頁pam
(8))
5.5.1 什麼是PAM
  PAM(Pluggable Authentication Modules)是為瞭解決計算機系統中用戶認證
的問題而引入的一種實現方案。PAM的目標為:
O 將認證功能從應用中獨立出來,單獨進行模塊化設計、實現和維護(而不是象以
前那樣,將認證功能的代碼跟應用程序編譯在一塊);
O 為這些認證模塊建立標準API,以便各應用程序能方便的使用它們提供的各種功能

O 認證機制對其上層用戶(包括應用程序和最終用戶)是透明的。
  PAM機制由SUN設計並首先在Solaris 2.3上部分實現,後來逐漸在其他UNIX平台
上實現,包括Linux(其實現稱為Linux-PAM)。
5.5.2 PAM的結構
  PAM採用分層的體系結構。最下面是模塊層,負責實現具體的認證功能,包括帳
戶管理(account)、口令鑑別(auth)、口令管理(password)和會話管理(ses
sion)4個模塊。
  應用接口層位於模塊層之上,調用下層提供的服務,並向上(應用程序)隱藏
PAM實現的細節。
5.5.3 配置文件
/etc/pam.conf
/etc/pam.d (如果存在這個目錄,則忽略/etc/pam.conf)
  配置文件是應用接口層的另一個重要組件。其作用主要是為應用選定具體的鑑
別模塊,模塊間的組合以及規定模塊的行為。
  /etc/pam.conf的語法為每行5項(在Linux-PAM的手冊頁pam(8)中有更詳細的描
述):
service type control module-path module-arguments
  Service是服務的名字,比如login,su等。注意,/etc/pam.d目錄下面有許多
配置文件,分別對應某項系統服務,文件名即等於service,因此每行只有4項。
  Type為account,auth,password,session之一,即要使用的認證模塊。每個
應用可以使用多個認證模塊,或者說可以將模塊「堆疊」使用,但是每一行只能定
義一個,因此一項服務可以有多行配置。
  Control規定了如何處理模塊認證失敗或成功,可以是requisite、required、
sufficient或optional。
  Module-path是PAM庫文件的文件名。缺省路徑是/lib/security/。
  Module-arguments是可以傳給模塊的參數。
5.5.4 other
  特別需要指出的是,有一個特殊的服務名字——other。如果沒有明確指明應用
於某項服務的規則,就用other的定義來處理。因此,我們可以想到,系統中PAM的
最簡配置為,只有/etc/pam.d/other這一個配置文件,即可處理所有的認證請求。
下面是我們用過的一個other配置文件的例子:
[xmdong@lips pam.d]$ cat other
#%PAM-1.0
auth required /lib/security/pam_unix.so
account required /lib/security/pam_unix.so
password required /lib/security/pam_unix.so
session required /lib/security/pam_unix.so
  當然,這樣處理對系統的安全性來說是不利的,最好還是給每項服務定義單獨
的配置文件。這不過是一種簡化問題的臨時方案。

5.6 再論initrd
  在前面的5.3節中,對initrd機制已經有了比較詳細的討論。準確的說,該部分
內容來自linux-2.4/Documentation/initrd.txt 文件。但是在實踐中,我們發現其
中描述的有些方法並不適用。是新版本內核的變化造成的(內核實現與文檔不同步
),還是2.4版內核的bug,不得而知。在我查證的過程中,看到網上有不少相關的
問題和討論。遺憾的是至今我還不能確認到底是什麼原因。
  後來我又專門讀了2.2版內核中所附帶的 initrd.txt 文件。我感覺實際的情況
似乎更接近於這個老文檔的描述。我還看到一個有關的patch文件,從該文件中可以
明確看到新的initrd.txt文檔的改變。下面是該文件的開始部分(行首的-表示老文
檔有而新文檔中已經刪除,+表示新文檔中增加的內容)。
  Using the initial RAM disk (initrd)
   ===================================
  
  -Written 1996 by Werner Almesberger and
  - Hans Lermen
  +Written 1996,2000 by Werner Almesberger > and
  + Hans Lermen
  
  
  -initrd adds the capability to load a RAM disk by the boot loader. T
his
  -RAM disk can then be mounted as the root file system and programs c
an be
  -run from it. Afterwards, a new root file system can be mounted from
a
  -different device. The previous root (from initrd) is then either mo
ved
  -to the directory /initrd or it is unmounted.
  +initrd provides the capability to load a RAM disk by the boot loade
r.
  +This RAM disk can then be mounted as the root file system and progr
ams
  +can be run from it. Afterwards, a new root file system can be mount
ed
  +from a different device. The previous root (from initrd) is then mo
ved
  +to a directory and can be subsequently unmounted.
  下面我試圖將我遇到的問題和能夠確認的東西記錄一下。(後面我們分別稱新
、老文檔為initrd.txt-2000和initrd.txt-1996)
5.6.1 根到底在哪裡
  在配置使用initrd之前,首先你要清楚,系統正常運行時,根文件系統掛載在
什麼設備上(也就是說,root device是什麼——root在哪裡?)。
  我們知道,使用initrd機制的話,系統啟動時先以RAM Disk(/dev/ram0)作為
根,然後通過某種方法將根轉換到「真實的根(real-root-dev)」(之所以說rea
l,是與前面的RAM裡臨時的根比較而言)。一種常見的情形是啟動時用initrd,然
後切換到一個硬盤分區,比如/dev/hda1。
  事實上,這個根轉換不是必須的。我們完全可以就把/dev/ram0作為我們真實的
根設備。這時,系統啟動之後所有的操作都在RAM Disk中進行。當然這樣做也有一
個明顯的缺點,即無法保存數據。比如對系統配置進行的修改(象IP地址),重新
啟動之後就丟掉了。如果要保存數據,就要想別的辦法。
  LiPS目前的做法就是這一種(沒有根轉換,initrd就是真實的根)。為了在重
新啟動之後保持配置文件的修改,我們將目錄/etc鏈接到了其他非易失存儲器(例
如,一個硬盤分區,或者USB盤的分區)。
  指定根設備是通過內核參數「root=」來完成的。以GRUB引導器的配置為例:
kernel /boot/bzImage ro ramdisk_size=65536 root=/dev/ram0
initrd /boot/initrd.img
  其中 ramdisk_size=65536 說明初始RAM盤的大小為64MB,root=/dev/ram0 說
明根的位置。下面第二個例子來自一台在hda1安裝了Redhat 9的機子:
kernel /boot/vmlinuz-2.4.20-8 ro root=/dev/hda1
initrd /boot/initrd-2.4.20-8.img
  很明顯,這裡 root=/dev/hda1 指定了真實的根,其啟動過程包含根的轉換。
但是這裡沒有指定 ramdisk_size,因為initrd的缺省大小是4MB,而initrd-2.4.2
0-8.img比較小,所以用缺省值即可。
  (我們多次提到root, root filesystem, root device, 自己體會吧。)
5.6.2 linuxrc
  在initrd機制的設計中,初始RAM盤只是作為一個過渡性質的根設備,由/linu
xrc來完成操作環境準備(比如加載一些不常用的、沒有編譯進內核的驅動程序模塊
)和根轉換工作。
  Linuxrc的執行是自動的,即內核掛載initrd盤作為根,如果根下面有這個文件
(也就是/linuxrc),就執行它。(如果沒有呢?當然什麼也不做。所以linuxrc也
並不是必不可少的。)
  接下來說說linuxrc的內容。下面的例子是從initrd-2.4.20-8.img中釋放出來
的:
[root@lips initrd]# cat linuxrc
#!/bin/nash

echo "Loading jbd.o module"
insmod /lib/jbd.o
echo "Loading ext3.o module"
insmod /lib/ext3.o
echo Mounting /proc filesystem
mount -t proc /proc /proc
echo Creating block devices
mkdevices /dev
echo Creating root device
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
pivot_root /sysroot /sysroot/initrd
umount /initrd/proc
  該腳本中首先加載了支持ext3文件系統所需的模塊,然後掛載真實的根文件系
統,並進行轉換。特別需要注意的是,linuxrc腳本一般是用nash解釋執行的,而不
是通常的bash。有關nash的詳情請看手冊頁nash(8)。簡單說,nash內置實現了多數
在執行linuxrc這個階段可能用到的命令,比如mount, pivot_root, umount;而如
果使用bash,象mount等都是「外部命令」,就需要複製/bin/mount到initrd映像文
件中。實際上,在initrd-2.4.20-8.img的/bin中只有insmod和nash兩個程序(mod
probe符號鏈接到insmod):
[root@lips initrd]# ls bin/
insmod modprobe nash
  當我按照5.3.4節描述的方法測試linuxrc的時候發現,我的腳本頭兩句執行就
報錯。
mount –o ro /dev/hda11 /sysroot
cd /sysroot
  這裡我的真實的根設備是/dev/hda11,/sysroot是initrd映像中存在的一個目
錄。這兩句完全是按照該文檔的要求寫的。後來經過多次試驗才發現問題之所在。
第一,nash實現的mount命令語法與我們常用的/bin/mount並不完全兼容;第二,n
ash根本沒有實現cd命令。
  因此,可以推斷initrd.txt-2000中講linuxrc時所舉例子不是用的nash。實際
上在該文檔中根本沒有指明用什麼shell。再回頭仔細看才發現,所有例句都是在r
oot的shell命令提示符「#」後面的,那麼它用的是bash之類了。但是令人迷惑的是
,同樣在該小節中稍後出現如下例句: # exec chroot . what-follows /console >dev/console 2>&1
  為什麼用exec執行chroot呢?chroot可以在命令行直接用啊。文檔中講到,wh
at-follows可以是/sbin/init。我用nash試了下面這個句子(nash中用exec執行外
部命令):
exec chroot . /sbin/init dev/console 2>&1
  還是不行。錯誤信息:
Usage: init 0123456SsQqAaBbCcUu
  開始我還以為後面那一串是個「magic number」,後來想以Usage開頭應該是講
使用這個命令的語法。看init(8)手冊頁,果然要求給一個參數,0~6當然是運行級
別啦,試了一個init 3也還是不行。尤其搞不明白後面那些個console什麼意思。
5.6.3 根轉換機制:新的?舊的?
  前面我們多次提到了根的轉換。在initrd.txt的兩個版本中,分別描述了兩種
根轉換機制,其中2000版中稱1996版的內容已經「過時」,不推薦使用。然而事實
上要麻煩的多,事情並不總是按照預期(如文檔所述)運行。
  為了弄清楚這個問題,我進行了一系列測試。環境是這樣的:
O 使用initrd機制,已經準備好了根文件系統映像文件initrd.img,準備好了內核
bzImage;
O initrd.img的所有內容釋放到一個硬盤分區/dev/hda11,ext2文件系統;
O 在/dev/hda11上面增加一個/boot目錄,存放bzImage和initrd.img文件;
O 以/dev/ram0作為根啟動,然後以某種機制轉換到「真實的根」/dev/hda11。
  系統的引導器是GRUB,安裝在硬盤MBR,grub.conf位於/dev/hda1(也就是做測
試的實際的根文件系統)。按照上述環境配置,在grub.conf中增加如下內容:
title lips (testing ......)
root (hd0,10)
kernel /boot/bzImage ro root=/dev/hda11 ramdisk_size=65536
initrd /boot/initrd.img
  下面我們分別使用不同的/linuxrc進行了測試,以確認到底哪種機制是可行的

  第一,如果沒有/linuxrc會怎麼樣呢?
  結果是系統能夠成功啟動到以/dev/hda11作為根,並且把initrd(也就是舊根
文件系統)的內容移到了/initrd目錄。這是符合initrd.txt-1996文檔中第一段的
描述的。所以只要你使用了initrd,指定了新的根,並且準備好了/initrd目錄(已
經在/dev/hda11創建了/initrd),內核可以自動完成根的轉換工作。終端上面有如
下輸出信息:
Trying to move old root to /initrd ... okay
  這裡有個小問題,即最後/initrd沒有卸載,這意味著initrd所分配內存也沒有
釋放。因此umount /initrd不是內核自動完成的,而應該在/linuxrc中的某個位置
進行。如果linuxrc僅包含卸載/initrd的命令,如下:
#!/sbin/nash
umount /initrd
  則執行情況是這樣的:umount命令報錯(返回錯誤碼22),然後出現前面所示
Trying…的信息。結果跟前面是一樣的。因為linuxrc執行在先,當時舊根還沒有被
轉移到/initrd中來。
  如果沒有/initrd目錄會怎樣?我們把/dev/hda11上面的/initrd目錄刪除,重
新啟動(沒有/linuxrc),結果是可以啟動到以/dev/hda11為根,且看不到原來的
initrd。該過程中出現如下信息:
Trying to move old root to /initrd ... failed
Unmouting old root
Trying to free ramdisk memory ... okey
  
  第二,pivot_root可以用,但是chroot不能用。
  pivot_root是在initrd.txt-2000文檔中引入的新機制。在測試pivot_root的過
程中,除了在nash中不能用cd命令造成的困惑(這個問題前面已經說明)之外,使
用pivot_root基本上是成功的。/linuxrc腳本的主要內容如下:
#!/sbin/nash
mount -o defaults --ro -t ext2 /dev/hda11 /sysroot
pivot_root /sysroot /sysroot/initrd
  但是,用這個腳本不能啟動,造成系統掛起:
VFS: Cannot open root device 「hda11」 or 03:0b
Please append a correct 「root=」 boot option
Kernel panic: VFS: Unable to mount root fs on 03:0b
  如果按照initrd.txt-2000的指導,pivot_root之後應該執行chroot,但是我始
終沒有辦法使chroot成功執行(有關情況前面已經說明)。不過可以肯定的是,pi
vot_root執行成功之後,當前目錄就是新的根目錄。
  第三,/proc/sys/kernel/real-root-dev
  initrd.txt的新版本中最後一節專門指出,向/proc/sys/kernel/real-root-d
ev文件中echo數字的方法(稱為change_root機制)是過時的。然而令人迷惑的是,
Redhat 9的缺省安裝產生的initrd-2.4.20-8.img中(前面已經列出了其/linuxrc文
件內容),同時使用了pivot_root和change_root機制。
  測試下列/linuxrc腳本,系統可以啟動到/dev/hda11,但是/initrd沒有卸載。
如果在腳本末尾umount /initrd,會返回錯誤碼16。
#!/sbin/nash
mount -t proc /proc /proc
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
#echo 0x030b > /proc/sys/kernel/real-root-dev
mount -o defaults --ro -t ext2 /dev/hda11 /sysroot
pivot_root /sysroot /sysroot/initrd
umount /initrd/proc
  雖然這樣可以啟動,但是有關real-root-dev還有幾個沒有弄清楚的問題:
  real-root-dev的值到底是什麼?
  目前我還沒有看到解釋real-root-dev的值是什麼東西的正式文檔,根據情況判
斷的話,我認為應該是該設備的「major-minor」(主、次設備號)。
  為什麼用0100而不是030b?
  如果上述判斷準確的話,那麼寫入0100就表示/dev/ram0。這就奇怪了,「真實
的根設備」應該是/dev/hda11呀,那麼是不是應該寫030b呢?但是測試發現用030b
同樣會導致不能啟動。
Kernel panic: VFS: Unable to mount root fs on 03:0b
  
5.7 提示
5.7.1 文件系統目錄層次結構
  根文件系統的目錄結構最好符合「Filesystem Hierarchy Standard(文件系統
層次標準)」[7],而不能自己隨意創建。
  順便說一下,像這種情況:/bin, /sbin, /usr/bin, /usr/sbin 這4個目錄都
可以放應用程序,具體放在哪個目錄,則要根據該應用程序在系統中的作用來確定
。一般地,系統的關鍵應用程序放在/bin,只能給超級用戶root訪問的關鍵應用程
序放在/sbin,相比之下比較次要的應用程序和root應用程序分別放在/usr/bin和/
usr/sbin。
5.7.2 mklips.sh(製作LiPS的腳本)
  複製文件的工作全部可以手工進行,但是做一個shell腳本來完成所有工作顯然
是一個更好的辦法。
  在我們的項目中,製作LiPS(也就是完成裁減Linux)的工作,除了編譯內核之
外,都可以通過mklips.sh腳本完成。
5.7.3 lips.conf(LiPS配置文件)
  lips.conf是LiPS的配置文件,由mklips.sh腳本使用,主要用來控制所製作的
LiPS系統包括哪些可選的模塊,例如:
INCLUDE_APACHE=no
INCLUDE_IPTABLES=no
INCLUDE_PROFTPD=yes
INCLUDE_NFSD=no
INCLUDE_SAMBA=yes
  通過一系列的INCLUDE_?=yes或者no,可以實現LIPS的模塊化。在mklips.sh腳
本中,判斷每個INCLUDE的值,來確定是否複製某個模塊相關的文件。
  配置文件中還可以包括其他可配置的信息。
5.7.4 cp –dpR
  複製文件請使用「cp –dpR」命令,可以保留文件的屬性(特別是對於設備節
點和符號連接等特殊文件),還可以複製整個目錄。
5.7.5 如何判斷一個程序依賴哪些文件
  除了庫文件外,關鍵是找出相關的配置文件。man手冊頁是判斷應用程序配置文
件的重要依據。我們以安裝Apache Server為例來說明判斷複製哪些文件的過程。
  首先確定其可執行文件是/usr/sbin/httpd。然後看httpd的手冊頁,即
[root@lips lips]# man httpd
httpd(8)
httpd(8)
NAME
httpd - Apache hypertext transfer protocol server
…………(略)
FILES
/etc/httpd/conf/httpd.conf
/etc/mime.types
/etc/httpd/conf/magic
/var/log/httpd/error_log
/var/log/httpd/access_log
/var/run/httpd.pid
February 1997
httpd(8)
(END)
  這時關鍵看最後一段FILES,列出了有關的配置文件、日誌文件和進程文件,那
麼我們就知道了httpd要在目標系統中運行,這幾個配置文件是必不可少的。
  把httpd和用ldd找出的庫文件以及上述配置文件複製到目標系統,運行httpd試
一下,看看是否正常。一般情況下應該沒有問題。但是httpd比較特殊,除了ldd找
出的庫文件外,它還需要很多可加載的模塊(庫)。怎麼發現呢?重要的一點是看
出錯信息(有時候還要查看日誌中的信息,/var/log/messages或者應用程序日誌)
,看httpd報告缺少什麼;還可以看看相關的配置文件httpd.conf,也能找到有用的
信息。然後我們發現需要/usr/lib/httpd這個目錄下的庫,把它也複製過去即可。

5.7.6 帶庫文件複製——lcp()
  在複製可執行文件(軟件)的過程中,如果沒有正確複製相關的庫文件,該軟
件肯定不能在目標系統中正常運行。而通過ldd命令手工確定每個軟件的庫文件,是
一個繁瑣且費時的任務。另一個隱含的缺陷是,當你不再需要某個軟件時,刪掉可
執行文件之後,相應的庫文件是否需要刪除呢?如果刪除了,而該庫文件是其他軟
件也需要的,會導致其他軟件不能用;如果不刪除,就有可能留一些垃圾庫文件在
目標根文件系統中。
  因此,最好是能夠保證每次複製可執行文件的同時自動複製相關聯的庫文件。
我寫了一個腳本函數 lcp() 來解決這個問題。語法和主要代碼如下(以#開頭的行
為註釋):
# lcp BIN BINPATH LIBPATH
# BIN:可執行文件路徑
# BINPATH:可執行文件的目標路徑(複製到哪裡)
# LIBPATH:相關庫文件的目標路徑
lcp()
# run()是另一個函數,執行它後面的shell命令,並在遇到錯誤時報錯、寫錯
誤日誌
# 首先複製BIN到BINPATH
run "$CP $BIN $BINPATH"
# 使用ldd找出與BIN相關的庫文件,把ldd的輸出送給LDDSTR
LDDSTR=`ldd $BIN`
# 循環檢查LDDSTR字符串的每一項
for STR in $LDDSTR; do
# 判斷出庫文件路徑
LIB=`echo $STR | grep "/lib/" `
if [ -z "$LIB" ]; then
continue
fi
# 複製LIB到LIBPATH,除非要複製的庫文件在目標路徑中已經存在
LIBNAME=`basename $LIB`
if [ ! -f "$LIBPATH/$LIBNAME" ]; then
run "$CP $LIB $LIBPATH"
run "cp $LIB $LIBPATH"
else
log "Warning: File "$LIBPATH/$LIBNAME" exis
t."
fi
done
}
5.7.7 庫文件的命名
  (參考資料[9]之6.2節)
  我們這裡所說的「庫」都是指的GNU C Library,也就是glibc。
  在/lib下面可以看到很多庫文件,主要分為4類:
O 實際的共享庫(Actual shared libraries)
文件名格式為 libLIBRARY_NAME-GLIBC_VERSION.so,其中LIBRARY_NAME是庫的真正
名稱,GLIBC_VERSION是glibc包的版本號。比如glibc 2.2.3版math(數學)庫的文
件名為libm-2.2.3.so。
O 主修訂版本符號鏈接(Major revision version symbolic links)
庫的主修訂版本號與glibc版本號不同。比如,glibc 2.2.3的C共享庫libc-2.2.3的
主修訂版本號為6,libdl-2.2.3為2。主修訂版本符號鏈接的命名格式為 :libLIB
RARY_NAME.so.MAJOR_REVISION_VERSION,那麼C共享庫的符號鏈接即 libc.so.6。
一個程序連接到一個庫之後,它在運行時訪問的就是這個符號鏈接。
O 版本無關的符號鏈接(Version-independent symbolic links to the major re
vision version symbolic links)
這些符號鏈接的作用是為用到某個庫的所有程序提供一個統一的入口,而不管實際
上glibc的版本或者該庫的主修訂版本。其命名格式為 libLIBRARY_NAME.so。比如
,libm.so鏈接到libm.so.6,libm.so.6又鏈接到libm-2.2.3.so。唯一的例外是li
bc.so,是個腳本。連接一個程序時用的是這個符號鏈接。
O 靜態庫文件(Static library archives)
這些庫是應用程序靜態連接用的。格式為 libLIBRARY_NAME.a.
  
  


6 引導

6.1 引導過程概述
6.2 幾種引導方式
  幾種引導方式的粗略比較如下表所示。
優點
缺點
DOC
DOM
FLOPPY
HARDDISK
NETWORK
USB-HDD
容量大,讀寫可靠
  
6.3 grub引導器
  有了前面生成的Linux內核和根文件系統映像文件後,製作引導盤非常簡單。在
動手製作引導盤之前,最好先瞭解一下grub引導器。
  Grub是一個通用的多引導加載軟件,與較早期多數Linux發行版本提供的另一個
引導器lilo相比,grub的功能更強大、設置更方便、更靈活。因此本項目選用grub
作為引導器軟件。
  本文檔不是grub的教學文檔,所以有關grub的詳細用法,請參考其他有關文檔
。這裡僅強調幾點:
O 引導盤的文件系統可以是ext2,ext3,msdos (FAT),vfat (FAT32),等等;
O grub表示硬盤、分區的方式與Linux的方式不同。Linux系統的IDE硬盤表示為/de
v/hd{a,b,c,d},SCSI設備表示為/dev/sd{a,b,c,d,…},分區從1開始編號,比如P
rimary Master IDE硬盤的第二個分區是/dev/hda2;而grub的硬盤(包括IDE和SCS
I)統一從0開始編號,分區也是從0開始編號,比如系統中的第一個硬盤是(hd0),
其第一個分區是(hd0,0)。
O 在grub的提示符下面輸入命令和參數時,按TAB鍵可以自動補全。
6.4 USB引導
  使用USB引導盤有很多好處,比如說,容量大、讀寫可靠,不佔用IDE接口,攜
帶方便等等。
6.4.1 製作步驟
6.4.1.1 創建文件系統
  首先,必須在USB盤上面創建文件系統(也就是格式化)。你幾乎可以使用gru
b支持的所有文件系統,包括常見的各種文件系統,比如ext2,ext3,FAT,FAT32等
。但是根據我的經驗,需要注意的是:
O 最好不要使用FAT,即msdos,因為FAT的文件名有「8.3」的限制,所以象「grub
.conf」這種文件名就被截斷成了「GRUB.CON」。
O FAT和FAT32都不能表示符號鏈接文件,雖然有變通的方法,即將文件再複製一份

  順便說一下在Linux下面怎麼訪問USB盤。
  如果系統中沒有其他的SCSI設備,那麼插在USB 1接口上面的USB盤的設備名為
/dev/sda,其分區為/dev/sda1。依此類推。一般插入USB盤後,窗口中會出現驅動
程序輸出的一些信息,其中有sd?的字眼。接下來就跟訪問普通的硬盤分區沒有什麼
兩樣了。
#mke2fs /dev/sda1
#mount –t ext2 /dev/sda1 /mnt
  注意:Redhat 7.3不支持Intel 845系列芯片組的主板。
6.4.1.2 複製文件
  按照下面的列表,複製文件(包括目錄結構)到USB引導盤:
備註
/boot/
bzImage
或者vmlinuz
initrd.img
/grub/
grub.conf
menu.lst
符號鏈接
stage1
stage2
6.4.1.3 安裝grub
  安裝grub到USB盤的引導扇區。假設系統有一塊IDE硬盤,這時USB盤是grub看到
的第二塊「硬盤」,所以表示為(hd1)。
#grub
grub> root (hd1,0)
grub> setup (hd1)
  root命令告訴grub,內核文件所在的位置。Setup命令安裝grub到hd1的引導扇
區,如果是setup (hd1,0),則安裝到第一個分區(即/dev/sda1)。
  上述命令序列也可以通過執行腳本完成。
6.4.1.4 用USB盤引導系統
  在用新製作的USB引導盤引導之前,還需要確認BIOS的一個設置,即第一個啟動
設備應該設置為「USB-HDD」。
  OK,插上USB盤,試一試。
6.5 提示
6.5.1 版本問題?
  我們的項目開始的時候用Redhat 7.3,但是後來做USB引導盤時發現,我們的環
境不支持USB盤。我想Redhat 7.3應該是支持USB盤的,因為我以前在7.1下面就用過
。那麼有可能是主板的問題,i845的芯片組比Redhat 7.3要新,也許是沒有該芯片
組的正確驅動。
  後來在Redhat 7.3下更新了內核,使用2.4.20版本的Linux內核即可正常支持U
SB盤。
  然而還有一個問題,Redhat 7.3的GRUB版本是0.91,在使用中發現,製作USB引
導盤沒有問題,但是一旦你改變USB盤的文件(比如複製一個新的文件上去),本來
可以引導的USB盤就不行了。
  而Redhat 9.0使用的是GRUB 0.93,就沒有上述問題,並且使用USB盤也沒有問
題。也就是說,使用Redhat 9就可以了。不過Redhat 9集成的其他很多軟件也有變
化,比如Apache升級到了2.0版本,以前的httpd.conf配置文件要修改過之後才能正
常使用;另外quota接口也有變化。
  因此改變版本需要一定的代價,究竟使用什麼版本應該綜合考慮,最好在項目
開始時就做出正確的選擇,並保持穩定。
  
  


7 遠程串口控制台

7.1 概述
  
7.2 配置方法
7.3 提示
7.4 Linux 遠程串口控制台指南
  (這是我以前寫的一份簡單的文檔,曾經貼到網上,附在這裡供參考)
  Linux 遠程串口控制台指南
  
  dot
  Dec 27, 2002
  
  2002年聖誕節期間,我在 Redhat Linux 7.0 (kernel 2.2.16-22) 平台上配置
了遠程串口終端,整個過程基本順利,但是也經歷了一些意想不到的波折,幸好最
終是成功了的。乘著記憶還比較清晰的時候,寫下這篇文檔,以供自己和他人參考

  
  首先參考 "Linux-Remote-Serial-Console-HOWTO",該文檔已經足夠詳盡,按
要求一步步地做即可。該文檔描述的是 Redhat 7.2 平台,個別地方跟 7.0 有些差
異,不過問題不大。
  
  要注意的問題主要是:
  
  * 串口直連電纜
  
  開始我並沒有在意這個問題,我手頭上有一根以前做的直連電纜,是只用了3根
線的那種(2、3交叉,5對接),因此 HOWTO 文檔中講電纜製作的章節我就跳過去
了,沒有仔細看,以為我這根電纜就可以了。事實也給人以這種假相:當我按照文
檔的說明完成了配置文件的修改,重新引導 Linux 機子,這時在 Windows 的超級
終端中確實顯示了所有該顯示的信息,看起來沒問題。然而接下來配置 getty 時就
不行了,應該出現在超級終端中的 login: 提示符死活不肯出現。以為是 getty 軟
件的問題,先後測試了 getty 和 mgetty,都不行。後來在 quickmouce 的提醒下
,又仔細看文檔,按照 11.3 節的圖 11-1 重新製作了串口直連電纜,才解決問題

  
  * getty 軟件
  
  HOWTO 文檔中已經指出,mingetty 不支持串口終端,所以這個軟件要首先排除
(mingetty 的手冊頁中也有相關說明)。而 Redhat 缺省安裝的就是這個軟件,所
以要重新下載安裝其他的 getty 類軟件。文檔中也已經列出了幾種常用的 getty
的變種。
  
  來說說 mgetty 先。為什麼我先使用了這個軟件呢,一是因為 Redhat 7.0 的
安裝盤上面有它的 RPM 包,直接拿來裝很方便,另外是因為 mingetty 的手冊頁中
推薦使用 mgetty 。結果是 mgetty 運行後在日誌文件中報告大量錯誤,莫名其妙
。我想可能是這個光盤上的版本老了,於是上網下載了比較新的版本 mgetty-1.1.
25-5.i386.rpm ,運行之後情況好多了,似乎要成功的樣子。在沒有使用新的串口
線之前,login: 出不來,但是在超級終端中敲的字符 mgetty 可以收到(從日誌中
看的出來);換了新製作的串口線之後,第一次!成功了,一切都像預期的那樣,
我可以從超級終端登錄。可是當我退出想再登錄一次,就不行了,甚至我把兩台機
子全部重啟也不行啦。我又試用 Linux 的 minicom 終端來連接,也是只成功了一
次,就再也不行了。真是怪哉,腦袋都快想破了,也不知道是為什麼。後來終於懷
疑 mgetty 有問題,換了其他的,天哪,終於解脫了。不知道後面更新的版本是否
可以,我是沒有勁去試了。
  
  再來說說 agetty 。其實沒有什麼好說的,因為我根本沒有用過這個。我本來
想試一下的,但是從網上下載安裝太麻煩了。下載了 agetty-2.11w-2.i386.rpm ,
安裝時 RPM 說要先安裝 login 包,然後又要求什麼 pam 包,然後又需要 awk ,
真是 faint 了,太麻煩了,所以最終我也沒有安裝它。
  
  最後說 getty 啦。也就是 HOWTO 文檔中所謂的 「傳統」 getty 。我下載的
RPM 包的名字叫 getty_ps-2.0.7j-9.i386.rpm 。當我正在為 mgetty 的問題頭疼
的時候,換成它之後就一切 OK 了。
  
  * 終端軟件
  
  Windows 下面可以用超級終端、NetTerm,Linux 下面有 Minicom 。都比較好
用,注意參數配置與目標機的串口一致。
  
  * 修改過的配置文件列表
  
  /etc/lilo.conf
  /etc/inittab
  /etc/gettydefs
  /etc/securetty
  /etc/makedev.d/linux-2.2.x
  /etc/security/console.perms
  /etc/sysconfig/init
  /etc/sysconfig/kudzu
  
  * 再談串口直連電纜
  
  這次調試在串口直連電纜上面花費了不少力氣,對它們的瞭解也增加了不少。
以前以為直連電纜就是接 3 根線,其實不然。只用了 2、3、5 引腳的直連電纜不
能提供握手信號,因此如果軟件需要使用 CTS/RTS 或者 DTR/DSR 流控,就需要連
接更多的引腳。
  
PC DB9 DB9
-------------------- -----------------------
RxD Receive Data 2 <----- 3 TxD Transmit Data
TxD Transmit Data 3 -----> 2 RxD Receive Data
|--> 6 DSR Data Set Ready
DTR Data Terminal Ready 4 --|--> 1 DCD Carrier Detect
GND Signal Ground 5 ------ 5 GND Signal Ground
DCD Carrier Detect 1 <--|
DSR Data Set Ready 6 <--|-- 4 DTR Data Terminal Ready
RTS Request To Send 7 -----> 8 CTS Clear To Send
CTS Clear To Send 8 <----- 7 RTS Request To Send
RI Ring Indicator 9 (not used)
  
  上面是兩端都是 DB9 接頭的標準 NULL MODEM 電纜的接線圖,可以提供全部握
手信號。這也是 Remote-Serial-Console-HOWTO 中要求的直連電纜做法。我做通串
口控制台使用的就是這種電纜。
  
  如果你打算自己製作電纜,就會發現一些問題。我們一般利用網線(雙絞線)
來做,這種雙絞線是 8 芯的,而按照圖示的連接方法則需要 9 根線。因此最簡單
的方法是用那種很多芯的排線來做,需要多少根割多少根(最好是彩色的,不容易
弄混)。後來我想,我們用到的其實就是 CTS/RTS 流控信號,到 2000 年為止 Li
nux 還不支持 DTR/DSR 流控,應該用不了這麼多線。於是我就用網線做了根不完整
的直連電纜:2、3 交叉,5 對接,7、8 交叉,還空 3 根線,就把 1、4 也交叉連
上了,結果是用了 7 根線,還空 1 根,與上面比只是少了 4、6 交叉,也就是沒
有 DTR/DSR 信號。事實證明這樣也是通的。我猜想 1、4 交叉不要應該也是通的,
只是沒有試過,已經焊上去懶得再弄了。
  
  關於串口方面的更多內容可以參考 "Linux-Text-Terminal-HOWTO" 和 "Linux
-Serial-HOWTO" 文檔。
  
  * 為什麼要用串口終端(控制台)?
  
  為什麼費勁做這個 Serial Console 呢?最容易想到的理由是省錢,呵呵,省
掉了顯卡、顯示器、鍵盤,只剩下一個 "Box",多好玩。
  
  說正經的,這種做法在嵌入式系統的開發中也是很有價值的。現在很多人都在
利用 X86 平台做嵌入式系統開發,甚至做產品。我曾經測試過清華某某做的 foob
ar 服務器,鏡像光盤用的,賣給你的就是一個主機,我自己給接上顯示器、鍵盤,
開機就是 Linux ,還可以進入單用戶模式,兩分鐘就把 root 口令改了,你說這樣
的服務器有什麼安全性可言?如果能夠屏蔽本地控制台,配置串口終端,不是更「
象」一個產品嗎?
  (完)




8 系統安裝光盤

8.1 概述
  本節介紹一種系統安裝光盤的製作方法。安裝光盤用於產品階段的生產安裝。
因此該安裝光盤必須是可引導的、簡單好用,並且一般不包含源代碼。
  製作可引導光盤的方法有很多種,我們用了一種最簡單的方法,就是拿來一個
可引導光盤的ISO映像,然後做必要的修改以滿足我們的要求。
  請準備Redhat 9的第一張安裝光盤,我們將要用到的文件是 /images/boot.is
o。(其他發行版本應該也可以,只要原理是一樣的。)
  另外如果你的工作平台是Windows,請準備WinISO 5.3軟件,用來編輯光盤ISO
映像文件。
  當然如果你要燒盤測試的話,還要準備刻錄機和CD-RW或者CD-R光盤。
8.2 boot.iso光盤的文件結構分析
  用WinISO打開boot.iso即可看到該光盤的文件(其實Redhat 9第一張安裝光盤
的/isolinux目錄就是boot.iso解開後的內容)。下面是文件列表:
[xmdong@lips isolinux]$ ls
boot.cat initrd.img options.msg snake.msg vmlinuz
boot.msg isolinux.bin param.msg splash.lss
general.msg isolinux.cfg rescue.msg TRANS.TBL
  其中關鍵的文件是boot.cat,initrd.img,isolinux.bin,isolinux.cfg和vm
linuz;isolinux.cfg是如何引導的配置文件,我們主要修改這個文件即可;initr
d.img和vmlinuz分別是初始化RAM盤和內核,其作用在前面章節中已經詳細描述過;
另外兩個文件是光盤引導需要的,不動它。
  其餘的*.msg文件是一些引導過程中可能會顯示的文本信息,可以不管;splas
h.lss是引導時顯示的一個圖片,也可以不管。
  下面來看看isolinux.cfg的內容。
default linux
prompt 1
timeout 600
display boot.msg
F1 boot.msg
F2 options.msg
F3 general.msg
F4 param.msg
F5 rescue.msg
F7 snake.msg
label linux
kernel vmlinuz
append initrd=initrd.img
label text
kernel vmlinuz
append initrd=initrd.img text
label expert
kernel vmlinuz
append expert initrd=initrd.img
label ks
kernel vmlinuz
append ks initrd=initrd.img
label lowres
kernel vmlinuz
append initrd=initrd.img lowres
  這個配置文件的語法結構跟其他引導器的配置文件,比如grub.conf或者lilo.
conf,非常類似,比較好懂。如果再對照光盤引導安裝Redhat的實際過程看一下,
基本上不需要什麼解釋就可以理解。其中以label開頭的每個小節是一種引導配置,
缺省(或者timeout後)以label linux引導。每個配置的第一句,kernel指定引導
所用的內核,第二句append指定內核引導參數(主要說明initrd文件的位置,以及
其他參數)。
8.3 製作步驟
1) 複製boot.iso,用WinISO打開;
2) 解放出isolinux.cfg文件,並從光盤映像中刪除之;
3) 修改配置文件isolinux.cfg;
4) 製作bzImage和initrd.img,這兩個文件用於光盤引導至一個比較正常的Linux系
統下,包括常用的工具軟件和服務,我們要在這個環境下進行產品的安裝;
5) 將修改後的isolinux.cfg以及initrd.img,bzImage加入光盤;
6) 準備一個setup目錄,將產品安裝需要的文件和腳本放在這個位置,然後將setu
p目錄加入光盤;
7) 刪除沒有用到的文件,也可以不管,除非加入文件時遇到衝突,必須先把原來光
盤上的文件刪除或者改名;
8) 存盤退出,刻錄光盤。
  下面是一個修改後的isolinux.cfg配置文件的例子,很簡單:
default linux
prompt 1
timeout 600
label linux
kernel bzImage
append initrd=initrd.img ramdisk_size=65536 root=/dev/ram0
  
  
9 源代碼(配置文件和腳本)
9.1 lips.conf
9.2 mklips.sh

Linux 系統裁減指南(LiPS) (繁體中文版) --(一)

Linux 系統裁減指南(LiPS)
Reference: http://grid.tsinghua.edu.cn/home/liulk/publish/computer/LinuxReduce.html


目 錄
1 引言 6
1.1 編寫目的 6
1.2 背景 6
1.3 定義 6
1.4 參考資料 6
2 總體描述 8
2.1 硬件環境 8
2.2 軟件環境 8
2.3 需求規定和約束 8
3 總體設計 9
3.1 基本設計概念 9
3.2 軟件結構 9
4 內核 10
4.1 創建內核的方法 10
4.2 內核配置 10
4.2.1 概述 10
4.2.2 Loadable module support 11
4.2.3 Processor type and features 11
4.2.4 General setup 12
4.2.5 Plug and Play configuration 12
4.2.6 Block devices 12
4.2.7 Multi-device support (RAID and LVM) 13
4.2.8 Networking options 13
4.2.9 ATA/IDE/MFM/RLL support 14
4.2.10 SCSI support 15
4.2.11 Network device support 15
4.2.12 Character devices 16
4.2.13 File systems 17
4.2.14 Console drivers 18
4.2.15 USB support 18
4.3 提示 19
4.3.1 EXTRAVERSION 19
4.3.2 .config 19
5 根文件系統 21
5.1 根文件系統 21
5.2 文件系統的內容 21
5.2.1 應用程序(applications) 21
5.2.2 設備文件(device files) 21
5.2.3 腳本和配置文件(scripts and configuration files) 22
5.2.4 庫文件(libraries) 23
5.2.5 必要的目錄 24
5.3 初始化RAM盤(initrd) 24
5.3.1 操作步驟 24
5.3.2 引導選項 24
5.3.3 安裝 25
5.3.4 改變根目錄設備 26
5.3.5 使用場合 27
5.3.6 淘汰的根轉換機制(change_root) 27
5.4 系統初始化(init) 27
5.4.1 init的任務 28
5.4.2 SysVinit 28
5.4.3 兩種風格:Slackware vs. Debian 28
5.5 PAM 29
5.5.1 什麼是PAM 29
5.5.2 PAM的結構 29
5.5.3 配置文件 29
5.5.4 other 29
5.6 再論initrd 30
5.6.1 根到底在哪裡 31
5.6.2 linuxrc 31
5.6.3 根轉換機制:新的?舊的? 32
5.7 提示 34
5.7.1 文件系統目錄層次結構 34
5.7.2 mklips.sh(製作LiPS的腳本) 34
5.7.3 lips.conf(LiPS配置文件) 34
5.7.4 cp –dpR 35
5.7.5 如何判斷一個程序依賴哪些文件 35
5.7.6 帶庫文件複製——lcp() 35
5.7.7 庫文件的命名 36
6 引導 38
6.1 引導過程概述 38
6.2 幾種引導方式 38
6.3 grub引導器 38
6.4 USB引導 38
6.4.1 製作步驟 39
6.5 提示 40
6.5.1 版本問題? 40
7 遠程串口控制台 41
7.1 概述 41
7.2 配置方法 41
7.3 提示 41
7.4 Linux 遠程串口控制台指南 41
8 系統安裝光盤 44
8.1 概述 44
8.2 boot.iso光盤的文件結構分析 44
8.3 製作步驟 45
9 源代碼(配置文件和腳本) 46
9.1 lips.conf 46
9.2 mklips.sh 46


1 引言

1.1 編寫目的
  說明Linux系統裁減的過程及解決的主要技術問題。本文檔的編寫是為了說明L
iPS的詳細設計過程,也可以作為構造一個小型化Linux系統的指南。
  本文檔內容的組織如下所述:這一部分是引言,第2部分是對項目軟、硬件環境
和需求的總體描述,第3部分說明了裁減LINUX的相關基本概念。後面幾個部分是具
體實現方法的詳細說明,4~6分別詳細描述了創建內核、創建根文件系統和引導系
統的方法。最後的內容可以看作附錄,其中7說明了一般Linux系統安裝光盤的創建
方法,8列出了相關的配置文件和源代碼。
1.2 背景
  華中科技大學計算機存儲系統國家專業實驗室,NAS項目(2003.3——2003.8)

1.3 定義
O boot loader: 引導器
O kernel: 內核
O root filesystem: 根文件系統
O USB: 通用串行總線
O
1.4 參考資料
[1] DIY:自己動手做一個迷你 Linux 系統. IBM developerWorks 中國網站. htt
p://www-900.ibm.com/developerWorks/cn/linux/embed/diy/index.shtml
[2] Linux From Scratch. http://clfsbook.mylab.idv.tw/index.html
[3] Linux啟動過程綜述. http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&
i=15750
[4] The Linux Bootdisk HOWTO (中譯版). http://www.linux.org.tw/CLDP/gb/B
ootdisk-HOWTO.html
[5] Using the initial RAM disk (initrd). /usr/src/linux-2.4/Documentatio
n/initrd.txt. (譯文?a href="Ghttp://zope.slat.org/Project/3ybaby/discuss-area/c" target="_blank">Ghttp://zope.slat.org/Project/3ybaby/discuss-area/c
d-boot/cdboot_refer/initrd.htm)
[6] Quickmouse於2003.1發表於白雲黃鶴BBS (http://bbs.whnet.edu.cn Linux討
論區的帖子「裁減Linux」。
[7] Filesystem Hierarchy Standard. http://www.pathname.com/fhs/pub/fhs-2
.2.pdf
[8] LINUX ALLOCATED DEVICES. /usr/src/linux-2.4/Documentation/device.txt
. 或者最新的列表?a href="bhttp://www.kernel.org/pub/linux/docs/device-list/" target="_blank">bhttp://www.kernel.org/pub/linux/docs/device-list/
[9] Karim Yaghmour. Building Embedded Linux Systems. O'Reilly, April 200
3.
[10] Alessandro Rubini. Take Command: Init. http://www.linux.it/kerneldo
cs/init/ , November 1998.
[11] 深入 Linux PAM 體系結構. IBM developerWorks 中國網站. http://www-90
0.ibm.com/developerWorks/cn/linux/l-pam/index.shtml . 2003.7.
[12]
  



2 總體描述

2.1 硬件環境
  開發主機:
  Intel 845芯片組主板,P4賽揚1.8GHz CPU,256M內存,60G IDE硬盤,RTL813
9網卡。
  目標機:
  與主機同構。
2.2 軟件環境
  開發主機:
  Redhat Linux 7.3 (kernel 2.4.18-3),或者Redhat Linux 9 (kernel 2.4.2
0-8)。可以根據需要使用其他版本的內核,比如Redhat 7.3+kernel 2.4.20。
  目標機:
  LiPS,以及應用程序。
2.3 需求規定和約束
  我們目標系統LiPS,即Linux Powered Storage是一個嵌入式Linux操作系統,
主要著眼於提供各種文件服務,不包括X GUI;並且足夠小,可以裝入32M USB盤或
者DOC/DOM等常用設備引導。
  



3 總體設計

3.1 基本設計概念
  提起「裁減Linux」,最容易想到的方法是以一個已經安裝好的系統為基礎,刪
除掉不需要的文件,以減小整個系統的尺寸。而事實上這個方法幾乎是行不通的,
因為通過光盤安裝的一個Redhat 9 Linux系統,即便是只選擇了比較少的軟件包,
其所佔空間也可以輕鬆達到300~500MB,想在這個基礎上裁減到30MB左右是比較困
難的。更困難的是確定哪些東西是可以刪除的?如果刪除了系統必須的文件,可能
導致系統不能引導。
  另一個途徑是從零開始根據需要構建整個系統。「Linux From Scratch」採用
的就是這種方式,一個個安裝需要的軟件包。類似的,更簡單的方法是,安裝一個
完整的Linux系統,然後將必要的軟件(可執行程序)、配置文件、庫文件、內核等
複製出來構建一個小系統。我們採取後一種方式。
  
3.2 軟件結構
  LiPS包括3部分:Linux內核,根文件系統和引導器。
  內核(Kernel)提供了一個操作系統的基本功能,如內存管理、進程調度、文
件系統、網絡等,以及設備驅動程序。
  根文件系統(Root filesystem)是存放運行、維護系統所必須的各種工具軟件
、庫文件、腳本、配置文件和其他特殊文件(比如設備節點)的地方,也可以安裝
各種軟件包。通常根文件系統位於某個磁盤分區,而在LiPS中應用了initrd(初始
RAM盤)機制,將根文件系統放在RAM Disk中。
  引導器(Boot Loader)的任務是從引導設備裝載內核,引導系統運行。Linux
系統常見的引導器包括早期的LILO和近期的GRUB。LiPS用的是GRUB。
  



4 內核

4.1 創建內核的方法
  Linux提供了方便靈活的方法來定製內核,主要步驟包括:下載安裝內核源代碼
樹,配置內核,編譯內核。具體方法請參考相關文檔。關鍵指令如下:
cd /usr/src/linux-2.4
make menuconfig
make dep; make clean; make bzImage
  編譯成功的內核文件為arch/i386/boot/bzImage.
4.2 內核配置
4.2.1 概述
  make menuconfig之後可以看到類似如下的內容(編號是為了描述方便而加上的
)。根據內核版本的不同,列出的項目會有差異。而變化主要發生在發行版為標準
內核打的各種補丁上面,其實標準內核是比較穩定的。
  如下所示,我們配置的內核版本為2.4.20-8,這個「-8」就是Redhat所打的補
丁版本號。補丁一般是對標準內核錯誤的修正和新增的功能。與2.4.20內核配置選
項比較會發現,[10,25,30]都屬於Redhat的補丁。
  一般地,這些補丁選項都不是必須的,因此我們的LiPS內核中都沒有包括這些
選項。其實,完全可以通過直接配置一個標準的內核版本(比如2.4.20)來產生我
們所需要的內核。
Linux Kernel v2.4.20-8-R2Lips Configuration
[1] Code maturity level options --->
[2] Loadable module support --->
[3] Processor type and features --->
[4] General setup --->
[5] Memory Technology Devices (MTD) --->
[6] Parallel port support --->
[7] Plug and Play configuration --->
[8] Block devices --->
[9] Multi-device support (RAID and LVM) --->
[10] Cryptography support (CryptoAPI) --->
[11] Networking options --->
[12] Telephony Support --->
[13] ATA/IDE/MFM/RLL support --->
[14] SCSI support --->
[15] Fusion MPT device support --->
[16] I2O device support --->
[17] Network device support --->
[18] Amateur Radio support --->
[19] IrDA (infrared) support --->
[20] ISDN subsystem --->
[21] Old CD-ROM drivers (not SCSI, not IDE) --->
[22] Input core support --->
[23] Character devices --->
[24] Multimedia devices --->
[25] Crypto Hardware support --->
[26] File systems --->
[27] Console drivers --->
[28] Sound --->
[29] USB support --->
[30] Additional device driver support --->
[31] Bluetooth support --->
[32] Kernel hacking --->
[33] Library routines --->
Load an Alternate Configuration File
Save Configuration to an Alternate File

  下面我們以2.4.20內核為例,來詳細說明內核的配置,也就是選哪些東西、不
選哪些東西。沒有說明的選項,比如「Code maturity level options」,表示不選

4.2.2 Loadable module support
Enable loadable module support
[ ] Set version information on all module symbols
Kernel module loader
  可加載模塊支持。雖然目前所選項目全部編譯進內核,但是內核是支持模塊的
。可以考慮將一些硬件設備的驅動程序編譯為模塊,從而減小內核尺寸,同時增加
適應不同硬件平台的靈活性。
4.2.3 Processor type and features
(Pentium-III/Celeron(Coppermine)) Processor family
Machine Check Exception
< > Toshiba Laptop support
< > Dell laptop support
< > /dev/cpu/microcode - Intel IA32 CPU microcode support
< > /dev/cpu/*/msr - Model-specific register support
< > /dev/cpu/*/cpuid - CPU information support
(off) High Memory Support
[ ] Math emulation
[ ] MTRR (Memory Type Range Register) support
[ ] Symmetric multi-processing support
[ ] Local APIC support on uniprocessors
[ ] Unsynced TSC support
  處理器特性。選擇一下Processor family,其餘基本上都沒有選。High Memor
y Support也可以打開,不清楚有什麼用。
4.2.4 General setup
Networking support
PCI support
(Any) PCI access mode
ISA bus support
PCI device name database
[ ] EISA support
[ ] MCA support
[ ] Support for hot-pluggable devices
System V IPC
BSD Process Accounting
Sysctl support
(ELF) Kernel core (/proc/kcore) format
< > Kernel support for a.out binaries
<*> Kernel support for ELF binaries
< > Kernel support for MISC binaries
Power Management support
< > Kernel support for MISC binaries
Power Management support
<*> Advanced Power Management BIOS support
Ignore USER SUSPEND
Enable PM at boot time
Make CPU Idle calls when idle
Enable console blanking using APM
RTC stores time in GMT
Allow interrupts during APM BIOS calls
Use real mode APM BIOS call to power off
  總體設置。這一部分選項比較重要,包括網絡、總線、進程、二進制文件格式
、電源管理等。其中APM相關的選項比較搞不清楚,有時候halt –p命令不能關閉系
統電源跟這裡有關係。
4.2.5 Plug and Play configuration
<*> Plug and Play support
< > ISA Plug and Play support
  即插即用設置。
4.2.6 Block devices
<*> Normal floppy disk support
< > XT hard disk support
< > Compaq SMART2 support
< > Compaq Smart Array 5xxx support
< > Mylex DAC960/DAC1100 PCI RAID Controller support
<*> Loopback device support
< > Network block device support
<*> RAM disk support
(4096) Default RAM disk size
Initial RAM disk (initrd) support
Per partition statistics in /proc/partitions
  塊設備。軟驅也可以不選。這裡的關鍵選項是Loopback device,RAM disk和i
nitrd,一定要選中。Default RAM disk size多少都沒有關係。
4.2.7 Multi-device support (RAID and LVM)
Multiple devices driver support (RAID and LVM)
<*> RAID support
<*> Linear (append) mode
<*> RAID-0 (striping) mode
<*> RAID-1 (mirroring) mode
<*> RAID-4/RAID-5 mode
<*> Multipath I/O support
<*> Logical volume manager (LVM) support
  MD支持。軟RAID和LVM的支持在這裡選擇,如果不使用,也可以不選。
4.2.8 Networking options
<*> Packet socket
Packet socket: mmapped IO
< > Netlink device emulation
Network packet filtering (replaces ipchains)
[ ] Network packet filtering debugging
Socket Filtering
<*> Unix domain sockets
TCP/IP networking
IP: multicasting
IP: advanced router
[ ] IP: policy routing
[ ] IP: equal cost multipath
[ ] IP: use TOS value as routing key
[ ] IP: verbose route monitoring
[ ] IP: large routing tables
IP: kernel level autoconfiguration
IP: DHCP support
IP: BOOTP support
IP: RARP support
<*> IP: tunneling
< > IP: GRE tunnels over IP
[ ] IP: multicast routing
[ ] IP: TCP Explicit Congestion Notification support
[ ] IP: TCP syncookie support (disabled per default)
IP: Netfilter Configuration --->
< > 802.1Q VLAN Support
---
< > The IPX protocol
< > Appletalk protocol support
Appletalk devices --->
< > DECnet Support
< > 802.1d Ethernet Bridging
QoS and/or fair queueing --->
Network testing --->
  網絡選項。這裡選項也比較多,如果沒有什麼特殊要求,又不是十分理解這些
選項的意義,基本上可以用缺省設置。注意DHCP選項,如果要用到的話要記得選中
這個。
  IP: Netfilter Configuration(跟iptables有關)等幾個子選項都沒有選。
4.2.9 ATA/IDE/MFM/RLL support
<*> ATA/IDE/MFM/RLL support
IDE, ATA and ATAPI Block devices --->
<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
--- Please see Documentation/ide.txt for help/info on IDE drives
[ ] Use old disk-only driver on primary interface
<*> Include IDE/ATA-2 DISK support
Use multi-mode by default
Auto-Geometry Resizing support
<*> Include IDE/ATAPI CDROM support
< > Include IDE/ATAPI TAPE support
< > Include IDE/ATAPI FLOPPY support
<*> SCSI emulation support
[ ] IDE Taskfile Access
--- IDE chipset support/bugfixes
[ ] CMD640 chipset bugfix/support
[ ] RZ1000 chipset bugfix/support
Generic PCI IDE chipset support
Sharing PCI IDE interrupts support
Generic PCI bus-master DMA support
[ ] Boot off-board chipsets first support
[ ] Force enable legacy 2.0.X HOSTS to use DMA
Use PCI DMA by default when available
[ ] Enable DMA only for disks
[ ] AEC62XX chipset support
[ ] ALI M15x3 chipset support
[ ] AMD Viper support
[ ] CMD64X and CMD680 chipset support
[ ] CY82C693 chipset support
[ ] Cyrix CS5530 MediaGX chipset support
[ ] HPT34X chipset support
[ ] HPT366/368/370 chipset support
Intel PIIXn chipsets support
PIIXn Tuning support
[ ] PROMISE PDC202{46|62|65|67|68|69|70} support
[ ] ServerWorks OSB4/CSB5 chipsets support
[ ] SiS5513 chipset support
[ ] SLC90E66 chipset support
[ ] VIA82CXXX chipset support
[ ] Other IDE chipset support
[ ] IGNORE word93 Validation BITS
  IDE設備支持。要用IDE硬盤,當然要選中。CDROM選項看情況也可以不要。SCS
I emulation似乎對使用USB盤有影響。剩下的很多都是跟IDE chipset有關的。
  最好是用dmesg命令找出目標系統主板芯片組,然後選中對應的芯片組支持,這
樣相當於安裝了IDE芯片組的驅動程序。如果沒有指定應該也可以,只是性能可能會
受到一些影響。
4.2.10 SCSI support
<*> SCSI support
--- SCSI support type (disk, tape, CD-ROM)
<*> SCSI disk support
(40) Maximum number of SCSI disks that can be loaded as modules
< > SCSI tape support
< > SCSI OnStream SC-x0 tape support
< > SCSI CD-ROM support
<*> SCSI generic support
--- Some SCSI devices (e.g. CD jukebox) support multiple LUNs
[ ] Enable extra checks in new queueing code
[ ] Probe all LUNs on each SCSI device
[ ] Verbose SCSI error reporting (kernel size +=12K)
[ ] SCSI logging facility
SCSI low-level drivers --->
  SCSI支持。如果要用到SCSI硬盤等SCSI設備,這裡當然要選。目前我們的目標
系統其實沒有SCSI硬盤,但是為了使用USB盤,也要選中SCSI支持。
  SCSI low-level drivers子選項中是一些SCSI卡,都不用選。
4.2.11 Network device support
Network device support
ARCnet devices --->
< > Dummy net driver support
< > Bonding driver support
< > EQL (serial line load balancing) support
< > Universal TUN/TAP device driver support
Ethernet (10 or 100Mbit) --->
Ethernet (10 or 100Mbit)
EISA, VLB, PCI and on board controllers
<*> EtherExpressPro/100 support (eepro100, original Becker driv
er
<*> RealTek RTL-8139 PCI Fast Ethernet Adapter support
Ethernet (1000 Mbit) --->
[ ] FDDI driver support
< > PPP (point-to-point protocol) support
< > SLIP (serial line) support
Wireless LAN (non-hamradio) --->
Token Ring devices --->
[ ] Fibre Channel driver support
Wan interfaces --->
  網絡設備支持。主要選擇網卡類型,Ethernet (10 or 100Mbit)子選項中列出
了內核可以支持的10/100M以太網卡,這裡僅列出了我們選中的2種。其他子選項都
沒有選。
4.2.12 Character devices
Virtual terminal
Support for console on virtual terminal
<*> Standard/generic (8250/16550 and compatible UARTs) serial suppo
rt
Support for console on serial port
[ ] Extended dumb serial driver options
[ ] Non-standard serial port support
[ ] Unix98 PTY support
I2C support --->
Mice --->
Joysticks --->
< > QIC-02 tape support
Watchdog Cards --->
< > AMD 768 Random Number Generator support
< > Intel i8x0 Random Number Generator support
< > AMD 76x native power management (Experimental)
< > /dev/nvram support
< > Enhanced Real Time Clock Support
< > Double Talk PC internal speech card support
< > Siemens R3964 line discipline
< > Applicom intelligent fieldbus card support
Ftape, the floppy tape device driver --->
< > /dev/agpgart (AGP Support)
[ ] Direct Rendering Manager (XFree86 DRI support)
< > ACP Modem (Mwave) support
  字符設備。這裡主要就是選擇了最前面4個跟終端和串口有關的選項,以支持虛
擬終端(遠程登錄要用到),支持標準串口,支持串口控制台。
4.2.13 File systems
Quota support
< > Kernel automounter support
<*> Kernel automounter version 4 support (also supports v3)
<*> Reiserfs support
[ ] Enable reiserfs debug mode
Stats in /proc/fs/reiserfs
<*> Ext3 journalling file system support
[ ] JBD (ext3) debugging support
<*> DOS FAT fs support
<*> MSDOS fs support
< > UMSDOS: Unix-like file system on top of standard MSDOS fs
<*> VFAT (Windows-95) fs support
< > Compressed ROM file system support
Virtual memory file system support (former shm fs)
<*> ISO 9660 CDROM file system support
Microsoft Joliet CDROM extensions
[ ] Transparent decompression extension
< > JFS filesystem support
< > Minix fs support
< > FreeVxFS file system support (VERITAS VxFS(TM) compatible)
< > NTFS file system support (read only)
< > OS/2 HPFS file system support
/proc file system support
< > QNX4 file system support (read only)
< > ROM file system support
<*> Second extended fs support
< > System V/Xenix/V7/Coherent file system support
< > UDF file system support (read only)
< > UFS file system support (read only)
Network File Systems --->
< > Coda file system support (advanced network fs)
<*> NFS file system support
Provide NFSv3 client support
[ ] Root file system on NFS
<*> NFS server support
Provide NFSv3 server support
<*> SMB file system support (to mount Windows shares etc.)
[ ] Use a default NLS
< > NCP file system support (to mount NetWare volumes)
Partition Types --->
Native Language Support --->
Default NLS Option: "iso8859-1"
<*> Codepage 437 (United States, Canada)
<*> Simplified Chinese charset (CP936, GB2312)
<*> Traditional Chinese charset (Big5)
  文件系統。這部分內容比較多,也很重要。首先是Quota,如果目標系統支持這
個功能,這裡就要選中。然後是選擇要支持的文件系統,常用的有Reiserfs,Ext3
,FAT,ISO9660,JFS等等,可以根據情況選擇。/proc和ext2一定要選中。
  還有Network File Systems子選項,可以選擇是否支持NFS和SMB。Native Lan
guage Support子選項跟所支持的語言有關,這裡沒有全部列出來,我們選中了英語
和簡體、繁體中文字符集。
4.2.14 Console drivers
VGA text console
[ ] Video mode selection support
  控制台驅動。調試的時候可以給目標系統接顯示器看一下,實際系統應該可以
不選。
4.2.15 USB support
<*> Support for USB
[ ] USB verbose debug messages
--- Miscellaneous USB options
Preliminary USB device filesystem
[ ] Long timeout for slow-responding devices (some MGE Ellipse UP
Se
--- USB Host Controller Drivers
<*> UHCI Alternate Driver (JE) support
<*> OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
--- USB Device Class drivers
< > USB MIDI support
<*> USB Mass Storage support
USB Mass Storage verbose debug
[ ] Freecom USB/ATAPI Bridge support
[ ] ISD-200 USB/ATA Bridge support
[ ] Microtech CompactFlash/SmartMedia support
< > USB Modem (CDC ACM) support
< > USB Printer support
--- USB Human Interface Devices (HID)
<*> USB Human Interface Device (full HID) support
--- Input core support is needed for USB HID input layer or HID
BP
[ ] /dev/hiddev raw HID device support
--- USB Imaging devices
< > USB Kodak DC-2xx Camera support
< > USB Scanner support
< > Microtek X6USB scanner support
--- USB Multimedia devices
--- Video4Linux support is needed for USB Multimedia device suppo
rt
--- USB Network adaptors
--- USB port drivers
USB Serial Converter support --->
--- USB Miscellaneous drivers
< > Texas Instruments Graph Link USB (aka SilverLink) cable suppo
rt
< > USB LCD device support
  USB支持。如果沒有使用USB設備,這部分可以不選。要使用USB盤,一定要選中
USB Mass Storage support。其餘很多選項我也不清楚是干什麼用的。
4.3 提示
4.3.1 EXTRAVERSION
  在系統中使用uname可以獲得系統版本信息。比如Redhat 9:
[root@lips root]# uname -r
2.4.20-8
[root@lips root]#
  返回結果表示了Redhat修訂後的內核版本號。前面我們提到過,這個「-8」就
是Redhat附加在標準內核版本號後面的一個信息。
  在一個運行LiPS的系統中,我們也需要確定當前使用的內核版本,通過版本信
息來知道這個內核的配置,也可以通過在標準內核版本後面附加特定的編碼來實現

  /usr/src/linux-2.4/Makefile中的變量EXTRAVERSION可以幫助我們達到這個目
標。下面是Makefile文件的最前面幾行內容:
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -8
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
  現在KERNELRELEASE的值就是2.4.20-8。這個信息會被編譯到內核中,uname工
具會從內核文件中提取出版本號。如果將Makefile做一些修改,比如,
EXTRAVERSION = -8-R2Lips
  那麼我們可以得到內核版本號2.4.20-8-R2Lips,表示為了創建LiPS而編譯的一
個特定配置的內核,這個內核是以2.4.20-8為基礎,R2Lips(Release 2 Lips)即
第二個版本。
  對Makefile的修改要在編譯內核之前完成。
4.3.2 .config
  內核配置(make menuconfig)完成之後,會詢問:
Do you wish to save your new kernel configuration?
< Yes > < No >
  回答Yes,配置信息會保存在/usr/src/linux-2.4/.config文件中。注意以「.
」開頭的文件是個隱藏文件,要用ls –a才看的到。.config是個文本文件,內容類
似下面:
#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
CONFIG_KMOD=y
  所以可以把這個文件保存起來,並且給文件名帶上版本號,方便管理、使用。

cp .config ~/config-2.4.20-8-R2Lips

防止暴力攻擊 Linux 終極絕招

發表人 ceasar _POSTON 2007/9/21 0:32:44 (69 人讀取)
Reference:
http://itblog.blogdns.net/index.php?load=read&id=96



如果架了一個 Linux 主機在公用網路上,可以檢查一下 /var/log/secure 這個紀錄檔,會發現每天都會有來自不同 IP 的攻擊者,不斷的嘗試竊取主機的帳號,之前除了被動的作一些加強主機安全性的措施,如關閉不必要服務、絕不使用懶人密碼、限制 SSHD 的登入帳號等等,但是這些只能降低帳號被竊取成功的機率,而不能阻絕那些攻擊者行為,每當檢視那些安全紀錄檔時,總還是提心吊膽的。

然而,今天在悠遊網路時發現一個很好用的工具-DenyHosts ,它是用 Python 語言開發的,用在 Linux 上在適合不過了。

簡單說明一下它的原理,這是一個很小的程式,可以選擇兩種執行模式 Crontab 或 Daemon,程式運行時會去分析系統安全紀錄檔 /var/log/secure,將那些攻擊者的 IP 位址收集並以系統檔 /etc/hosts.deny 將其阻絕連線,被紀錄在 hosts.deny 的 IP 位址就無法與主機連線。

系統需求:
請先檢查 SSHD 是否支援 tcp_wrappers,如不確定請按下述的方法作測試
1. 開啟 SSHD 服務,並以 root 登入
2. 編輯 /etc/hosts.deny,加上一行
sshd: 127.0.0.1

3. 以本機方式登入測試
ssh localhost

4. 你應該會看到這一段訊息
ssh_exchange_identification: Connection closed by remote host

如未出現這訊息,你的 SSHD 尚未支援 tcp_wrappers

如何安裝:
因為筆者的作業系統是用 CentOS 4.4 所以下載 RPM 來裝

#wget http://downloads.sourceforge.net/denyhosts/DenyHosts-2.6-1.src.rpm?modtime=1165494113&big_mirror=0
#rpmbuild --rebuild DenyHosts-2.6-1.src.rpm
#rpm -Uvh /usr/src/redhat/RPMS/noarch/DenyHosts-2.6-1.noarch.rpm

初始化設定:
#cp /usr/share/denyhosts/denyhosts.cfg-dist /etc/denyhosts.cfg
#cp /usr/share/denyhosts/daemon-control-dist /etc/init.d/denyhosts
#vi /etc/init.d/denyhosts

DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg"
改成
DENYHOSTS_CFG = "/etc/denyhosts.cfg"

以 Daemon 方式啟動
# service denyhosts start

檢查一下有無 IP 位址加入到 /etc/hosts.deny

進階設定:
1.避免 log 無限制增長,可設定 logrotate,參照這方法
編輯/新增 /etc/logrotate.d/denyhosts,包含這些內容

# this should match the DAEMON_LOG configuration setting of DenyHosts
/var/log/denyhosts {
missingok
rotate 5
notifempty
prerotate
service denyhosts stop
endscript
postrotate
service denyhosts start
endscript
}

2. 線上資料同步功能,預設是關閉的,這有點類似防毒軟體及防廣告信軟體的線上更新。

官方網站: http://denyhosts.sourceforge.net/index.html

2007年10月16日 星期二

重新註冊所有 DLL檔的方法

重新註冊所有 DLL檔的方法

使用時機:該記憶體不能為read或written

開始>>執行>. 輸入cmd>> 按「確定」,出現DOS窗口,在命令提示符下輸入

for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1

PS 轉自KKCITY BBSCHAT 分站 forlorn 之文章

2007年10月11日 星期四

Diskless Windows with PXE

Diskless Windows with PXE
A step-by-step guide to booting windows 98 without a hard disk, or a windows server (terminal or otherwise) using just a pxe enabled network card and a linux box.
You should be able to get this up and running in under a day, as there are quite a few steps involved, so we will be testing the setup at each stage to help iron out any problems. You will need a linux box, a pc for windows, a copy of windows98 (probably on CD) and a small hard disk (say 2GB) to use for the original windows 98 setup. The basic steps we are going to do are as follows
• Setup bootpd and tftpd on the linux server
• Setup PXE and check the windows pc will sucessfully boot from PXE
• Install a compact safe version of windows, and compress it.
• Transfer the compressed image, and some boot sectors to the linux box.
• Build a new hard disk image on the linux box
• Boot the windows box from the new disk image
Now I made that sound easy huh?
Setup bootpd and tftpd
Most linux distributions come with bootpd and tftpd, so you will have to refer to your distributions documentation as to how to install them (package, rpm or from source) All of the examples in this guide are based on Slackware Linux. We are just going to do the most basic setup possible in order to get this to work.
First up, if you have a server or router on your network that is providing dhcp addresses for all of the network, then you need to ensure that it is configured to not support bootp clients, as we are going to use our linux box for that. I'd allocate a seperate range of addresses just for the bootp clients, which will only need those addresses during the boot process. Once windows is booted, it can get it's real address from a dhcp server or use a static address as normal.
Bootpd uses a configuration file /etc/bootptab. We will set up a dummy entry for our windows pc, and you will need to replace the values with those for your network. For full details of the parameters check out the bootptab man page. We are using a very cut-down configuration, just enough to get it working.
.windows:\
:ht=1:ha=001122334455:\
:hd=/tftpboot:bf="pxelinux.0":\
:sa=10.0.0.5:sm=255.255.255.0:\
:ip=10.0.0.11:
You need to make the following replacements
ha with the MAC address of the windows network card.
hd with the path tftpd will serve the pxe files from
sa with the ip address of the linux box
sm with your networks subnet mask
ip with the ip address you want to give the windows box during the boot process
Now create the directory that tftpd will use for the pxe files. I'd recommend /tftpboot for simplicity at the moment. Create a small text file in the directory, and check you can retrieve it with tftp
root@linuxbox:~# tftp linuxbox
tftp> get /tftpboot/test.txt
Received 615 bytes in 0.0 seconds
tftp> quit
root@linuxbox:~#
If it fails, check the messages log file for any errors.

Setup PXE
You need to grap a copy of H. Peter Anvin's excellent Syslinux (http://syslinux.zytor.com/) that makes all of this possible. Extract memdisk and pxelinux.0 from the download and copy them to /tftpboot. Now create a directory /tftpboot/pxelinux.cfg where the pxe configuration files live. Copy the following basic config into a file called default in the /tftpboot/pxelinux.cfg directory.
DEFAULT net
PROMPT 0

LABEL local
LOCALBOOT 0

LABEL net
KERNEL memdisk
APPEND initrd=win.img
By having local and net sections in the config file means that by changing the default entry we can get the windows box to boot off of its local hard drive, or the network.
We are now going to check that everything is working ok. From windows create a bootable floppy disk. Make sure its bootable. Put it into the linux box, and copy the disk image off 製作windows開機片 floppy BootDisk
dd if=/dev/floppy of=/tftpboot/win.img bs=1024 count=1440 製作win.img開機images
You will probably need to go into the bios setup of the windows box, to enable network booting. You may need to change the boot order to allow network booting first. Check your motherboard manual for details.
Now for the moment of truth ... drumroll please ... Start the windows box.
If everything goes smoothly, you should have seen it start the PXE process, load memdisk and win.img and then give you an A:\ dos command prompt. If you have, then Hoorah, you may proceed. If not, then we need to do a little troubleshooting first.
• You didn't see the PXE stack load, and it try to request an IP address. Re-check your bios and network settings to find out how to get it to network boot.
• The PXE stack loaded, but sat there for ages before failing and booting of the local hard disk. This means it failed to get a bootp response. Check the MAC address in your bootptab file matches the MAC address of the windows network card. Check nothing else on the network is giving out bootp responses.
• The PXE stack loaded, but then complained accessing your tftp server. Check the /var/log/messages log file to see if there is a path of permissions problem. Double check the tftpd server is running. Check the ip address of the server in the bootptab file is correct. You are running bootp and tftp on the same box aren't you as PXE seems to work best when the bootp server is the same box as the tftp server.
Rinse and repeat.
備註:測試PXE開機是否能正常載入win.img
Diskless Windows with PXE - Part 2
Now that we have a working PXE setup its time to move on to install windows. Firstly change the default entry in you pxe config file to local so that pxe will tell the pc to boot off of the local disk.
Setup Windows
We need to install a small version of windows, small enough that once compressed we have enough memory for both the disk image and for windows to run. I'd recommend using an old hard disk for this, preferably one that hasn't had linux on, as the linux boot loaders (lilo, grub) can tamper with the bootsectors, which may cause you problems later on. You only need a small disk, as we are going to install windows in a small FAT16 partion of less that 2 Gigabytes.
I'm going to assume you are happy installing windows from scratch, as I don't intend to walk you through step-by-step instructions of how to do it. These instructions are based on using a FAT16 partition, so when you set up the partion, use fdisk to make sure it it FAT16 and not FAT32. The easiest way I've found to do this, is when fdisk asks if you want to support large disks, Just Say No.
When installing windows, it's best to choose the compact setting so that it only installs the bare minumum. If you want to install lots of other software, I'd recommend installing them to a network drive, either another windows box, or a linux box running samba. I've found that the compact install once compressed will easily fit in under 90Mb, so it may be possible to run with just 128Mb RAM.
There are special configurations, such as win98 lite that are supposed to trim even more fat off, but I've not personally tried them.
Now we need start tweaking the settings so we can compress it easily. Firstly we may as well turn off the swap file, as we won't be needing it when we are running from a ramdisk. Go to Start->Settings->ControlPanel and click on System. Now choose the performance tab, click on the virtual memory button and Disable Virtual Memory 關閉虛擬記憶體
Next up, if you copied any files onto the box such as drivers, you can delete the install files, especially ANYTHING in the temp directory. You should now find you are using less than 200Mb of your C drive.
Time to Compress. We are going to use DriveSpace to compress windows so that we can use a smaller ramdisk, and to make moving windows around MUCH easier.
Go to Start->Programs->Accessories->System Tools->DriveSpace.
Choose to compress your C drive. I'd usually recommend leaving say 20MB of free space on the compressed C drive, as this is enough space for any temporary files windows needs to create. You will probably need to reboot a few times to finish the compression. Usually windows remaps your original hard drive to H: and the compressed drive to C:
If you look at your H:\ drive, you should see most of the files are marked as hidden system files, and the important one is DRVSPACE.000 which is the file containing your compressed filesystem.
In order for windows to happily boot from a ramdisk, we may need to turn off a few filesystem settings.
Go to Start->Settings->Control Panel Click on System. Go to the Performance tab. Click on the FileSystem Button, and go to the TroubleShooting tab.
Booting windows off of a hardisk image, you shouldn't need to tick any of theses, but if windows has problems starting, come back here, and tick all of them to start with. When I intially started with this diskless windows project, I was using 170MB floppy disk images, and needed some of these selected in order to get windows running. Your mileage may vary.
Time to get onto the fun part.
Diskless Windows with PXE - Part 3
Now we have a working PXE system, and windows compressed, we can start on the disk image.
Build a new hard disk image
If you had a small enough hard disk, you could just use dd to copy the entire image onto linux for booting via PXE, but the fun (do I really mean fun?) part is being able to create disk images of any size, so you can match the size of your compressed windows file (drvspace.000)
In order to make bootable disk images, we need to copy a couple of sectors off of your existing windows harddrive. We only need to do this once, as from these two sectors we can build any size disk image.
First up, we need to get the windows harddrive into your linux box, so we can read bits off of it. Once in your linux box (I'll assume you've added it as the secondary master hdc) we need to make a note of some of its geometry settings. Run fdisk /dev/hdc and then press p to view the partition table. You should see your FAT16 partion there in all its glory. Make a note of the number of sectors (and bytes per sector).
The two bits we need off this disk, are the first 384 bytes of the disk, and the first 512 bytes of the first partion (were you've install windows)
dd if=/dev/hdc of=hd.384 bs=384 count=1 匯出備份開機磁區 0-384 byte
If you look at hd.384 in vi it should look a bit like 開機磁區大致內容如下所視
offset 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00000000 fa e9 a2 00 56 51 53 88 d3 80 e2 8f f6 c3 20 74 úé¢.VQS.Ó.â.öà t
00000010 31 bb aa 55 b4 41 cd 13 72 28 81 fb 55 aa 75 22 1»ªU´AÍ.r(.ûUªu"
00000020 f6 c1 01 74 1d 5b 59 1e 66 6a 00 57 51 06 53 6a öÁ.t.[Y.fj.WQ.Sj
00000030 01 6a 10 89 e6 16 1f b8 00 42 cd 13 8d 64 10 1f .j..æ..¸.BÍ..d..
00000040 eb 45 5b 59 53 52 57 51 06 b4 08 cd 13 07 72 39 ëE[YSRWQ.´.Í..r9
00000050 51 c0 e9 06 86 e9 89 cf 59 c1 ea 08 92 40 83 e1 QÀé..é.ÏYÁê..@.á
00000060 3f f7 e1 96 58 5a 39 f2 73 23 f7 f6 39 f8 77 1d ?÷á.XZ9òs#÷ö9øw.
00000070 c0 e4 06 86 e0 92 f6 f1 fe c4 00 e2 89 d1 5a 5b Àä..à.öñþÄ.â.ÑZ[
00000080 86 f0 b8 01 02 cd 13 eb 09 59 5f eb 02 b4 40 5a .ð¸..Í.ë.Y_ë.´@Z
00000090 5b f9 5e c3 5e ac 08 c0 74 09 b4 0e bb 07 00 cd [ù^Ã^.Àt.´.»..Í
000000a0 10 eb f2 f4 eb fd 31 c0 8e d0 bc 00 7c fb fc 8e .ëòôëý1À.м.|ûü.
000000b0 d8 8e c0 bf 00 06 89 e6 b9 00 01 f3 a5 ea c2 06 Ø.À¿...æ¹..ó¥êÂ.
000000c0 00 00 b8 00 12 b3 36 cd 10 be be 07 b9 04 00 84 ..¸..³6Í.¾¾.¹...
000000d0 14 89 f5 78 3f 83 c6 10 e2 f5 e8 b7 ff 4e 6f 20 ..õx?.Æ.âõè•ÿNo
000000e0 70 61 72 74 69 74 69 6f 6e 20 61 63 74 69 76 65 partition active
000000f0 0d 0a 00 84 14 79 1d e8 9a ff 49 6e 76 61 6c 69 .....y.è.ÿInvali

Now to pull of the first 512 bytes of the first partition, we need to calculate where the first partition starts. If your hard drive has 63 sectors (with 512 bytes per sector) then under dos, the first partion starts 63 x 512 bytes in.
dd if=/dev/hdc of=hdp1.512 bs=512 skip=63 count=1 匯出分割區 起始位置 = 63x512 byte
Which under vi should look a bit like
offset 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00000000 eb 3c 90 4d 53 57 49 4e 34 2e 31 00 02 40 01 00 ë<.MSWIN4.1..@..
00000010 02 00 02 00 00 f8 fc 00 3f 00 40 00 3f 00 00 00 .....øü.?.@.?...
00000020 41 e0 3e 00 80 00 29 cf 1b 32 45 20 20 20 20 20 Aà>...)Ï.2E
00000030 20 20 20 20 20 20 46 41 54 31 36 20 20 20 33 c9 FAT16 3É
00000040 8e d1 bc fc 7b 16 07 bd 78 00 c5 76 00 1e 56 16 .Ѽü{..½x.Åv..V.
00000050 55 bf 22 05 89 7e 00 89 4e 02 b1 0b fc f3 a4 06 U¿"..~..N.±.üó¤.
00000060 1f bd 00 7c c6 45 fe 0f 38 4e 24 7d 20 8b c1 99 .½.|ÆEþ.8N$} .Á.
00000070 e8 7e 01 83 eb 3a 66 a1 1c 7c 66 3b 07 8a 57 fc è~..ë:f¡.|f;..Wü
00000080 75 06 80 ca 02 88 56 02 80 c3 10 73 ed 33 c9 fe u..Ê..V..Ã.sí3Éþ
00000090 06 d8 7d 8a 46 10 98 f7 66 16 03 46 1c 13 56 1e .Ø}.F..÷f..F..V.
000000a0 03 46 0e 13 d1 8b 76 11 60 89 46 fc 89 56 fe b8 .F..Ñ.v.`.Fü.Vþ¸
While the disk is in the Linux box we may as well take this easy opportunity to copy all the files off. Make sure you get the hidden files as well (eg. io.sys, msdos.sys etc)
Now to create a new disk image. I usually size the disk image 5MB larger than the files it's going to take, so there is a little free space if needed. But if you are tight on memory, you may need to play with this.
Firstly create an empty file for the image. All of the following code assumes a 100MB disk which is is 512Bytes * 204800 blocks. The disk image geometry will be 100 cylinders, 64 heads, 32 sectors and 512 bytes per sector. This allows the cylinder count to match the size in Megabytes. If you are making a different size, then adjust accordingly.
dd if=/dev/zero of=hd.img bs=512 count=204800 100MB=512Bytes * 204800 blocks
Now mount the disk as a loop device
losetup /dev/loop0 hd.img 掛載hd.img
If you already have something loaded as loop0 you'll need to use a different loop device We need to create a partition table so run
fdisk /dev/loop0 掛載成 loop 分割區
Press x to go to the advanced menu, press c then 100 to set the cylinders. Then h and 64 for the heads, then s and 32 for the sectors. fdisk will probably then tell you its setting the sector offset for dos compatibility, which is what we want.
Now press r to return to the main menu, n to create a new partion. Create it as the first primary partition. Take the defaults offered, and fill the disk. Now press t and 6 to set its type id to 6 (FAT 16) and press a to make the partition active.
Now press w to write the partition to the file. fdisk will complain that it was unable to reread the disk, don't worry. restart fdisk and press p and you should see your lovely partition sitting there. double check the cylinders, heads and sectors for the disk are correct.

root@linuxbox:~# fdisk /dev/loop0

Command (m for help): p

Disk /dev/loop0: 64 heads, 32 sectors, 100 cylinders
Units = cylinders of 2048 * 512 bytes

Device Boot Start End Blocks Id System
/dev/loop0p1 * 1 100 102384 6 FAT16

Command (m for help):
Now we have a disk image with partition table, we don't need to make it ever again. All of the rest of the commands we need to finish off can be scripted as they are not interactive.
remember to unmount the loop device losetup -d /dev/loop0
We could just mount the new partion we have created, and copy the files on , but I've found linux dies if when you try to copy the 90mb drvspace.000 file on. Oops. Think there must be a bug there somewhere. So we need to create a stand-alone partition image, the same size as the one above, which we can copy files to, and then insert that image into the disk image, at the location of partition 1. See I said it was fun. Oh, and it gets better, just wait.
mkdosfs -F 16 -S 512 -R 1 -C hdp1.img 102384
When mkdosfs is creating large images it defaults to 32 sectors and 64 heads, which is why we used the same geometry for the disk image we fdisk'd. Now the partition is made, we don't ever need to re-make it if we just want to update the windows files in the image. Now mount the partition image, copy in the files, unmount it, and inject it into the disk image.
mount -o loop -t msdos hdp1.img /mnt/hd
rm /mnt/hd/*.*
cp win98/*.* /mnt/hd
umount /mnt/hd
dd if=hdp1.img of=hd.img conv=notrunc bs=512 count=204768 seek=32
Now, is when the real fun begins. In order to get this disk image to actually boot, its needs a disk boot sector and a bootable partition boot sector. But these sectors need to contain the geometry for the disk we are creating, not the disk they came from. Hence the following jiggery pokery.
# copy on the disk boot sector
dd if=hd.384 of=hd.img bs=1 count=384 conv=notrunc

# read the partion boot sector off the disk image
dd if=hd.img of=vdp1.old bs=512 skip=32 count=1

# make a copy of the real partition boot sector
cp hdp1.512 vdp1.new

# read bytes 12 to 36 from old image bootsector to the new bootsector
dd if=vdp1.old of=vdp1.new conv=notrunc bs=1 skip=11 seek=11 count=25

# turn sectors into hex and escape the value to a file
echo -e -n "\x20" > vdp1.fix

# inject the value into the new boot sector
dd if=vdp1.fix of=vdp1.new conv=notrunc bs=1 count=1 seek=28

# inject the new boot sector to the start of the partion
dd if=vdp1.new of=hd.img conv=notrunc bs=512 seek=32 count=1
Ok has your head stopped spinning? so copy the image to the tftpboot directory
cp hd.img /tftpboot/win.img
If you want to know what you just did, visit Hale's Boot Sector Disassembly We should now be ready to boot windows. Set the pxe config to use the win.img file, and reboot your windows box. If everything goes according to plan, windows should load just fine.
If you want to save your diskimage from ram back to the linux box, so you can save your changes and make a new disk image, then close all your windows apps and drop into a dos command prompt. Change to the H drive, un-hide the drvspace.000 file, and copy it over the network to the linux server. The easiest way is to have samba installed on the linux server, and mount a drive from windows.
C:\windows>H:
H:\>attrib -s -h -r DRVSPACE.000
H:\>copy DRVSPACE.000 \\linuxbox\root

Troubleshooting
If windows fails to start there are three main areas you may be having a problem.
Firstly does the disk image load completely. If not, then there could be timeout issues or, memory issues. Check your graphics card is not taking more memory than you expected, leaving you with insufficient.
Secondly does the disk image boot. If not, then check the steps when you created it. Retry the image one step at a time. mkdosfs can paste a message into the partition it creates, use it to check that the partition is even trying to load, before fixing its boot sector. Were the boot sectors you copied from the real disk ok? You may need to read Hale's guide and check your sectors by hand with vi
Thirdly windows tries to start but throws a wobbly. Go back to the windows hard disk, and tick all of the troubleshooting checkboxes. Also add the line bootmenu=1 to the bottom of your msdos.sys file, and try booting into safe mode.
Rinse and repeat.
If you are a boot sector guru and spot some error
with how I'm doing this, please let me know.

samba_VFS測試紀錄

ReiserFS套件更新

下載套件:yum install reiserfs-utils
格式化:mkfs.reiserfs -qf /dev/game/king
掛載:mount -t reiserfs /dev/game/king /home/king
===========================================
建立LVM

建立PV: pvcreate /dev/hdb /dev/hdc
建立VG:vgcreate game /dev/hdb /dev/hdc
建立LV:lvcreate -L 40G -n king game
格式化:mkfs.reiserfs -qf /dev/game/king
掛載: mount -t reiserfs /dev/game/king /home/king
目錄權限:chmod 777 /home/king
===========================================
/opt/login.sh

#!/bin/bash
SNAPNAME=$1
umount /home/share/$SNAPNAME
rmdir /home/share/$SNAPNAME
lvremove -f /dev/game/$SNAPNAME
lvcreate -L2000M -s -n $SNAPNAME /dev/game/king
mkdir /home/share/$SNAPNAME
mount /dev/game/$SNAPNAME /home/share/$SNAPNAME
chmod 777 /home/share/$SNAPNAME

===========================================
smb.conf

[share$]
path = /home/share/%m
root preexec = /opt/login.sh %m #%m=電腦名稱
vfs objects = shadow_copy
oplocks = yes
level2 oplocks = yes
share modes = yes
browseable = no
public = yes
writable = yes
create mode = 0777
directory mode = 0777
veto oplock files = /*.ldb/*.dat/

[king$]
path = /home/king
browseable = no
public = yes
writable = yes
create mode = 0777
directory mode = 0777
veto oplock files = /*.ldb/*.dat/

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