2008年9月23日 星期二

解開~kernel包新的driver,重新封裝成RPM的神秘面紗吧~

這次要分享的是: 怎樣在 kernel 的編譯當中, 包入新的 driver, 然後包裝為 kernel .rpm 檔案.

作者: Baron. Wan

先將新的驅動程式下載下來, 一般會用到的, 像是 新式的網路卡, 最新的SATA or SAS 硬碟, 這些在 舊式的 kernel 可能都尚未包進去, 而新的驅動程式也要確認有包含在多少的 kernel 版本當中 (2.4 or 2.6), 確認之後, 先給它依照驅動裡面說明 (REAMDE) 來進行安裝, 看是否可正常運作, 如無問題, 則可接下去操作啦.

可以先到 kernel.org 處下載 kernel source code, 通常是 linux-{版本號}.tar.gz , 我習慣將它解到 /usr/src/kernels/ 當中, 緊接著還要去下載需要加入的驅動程式, 將驅動程式放到 /usr/src/kernels/linux-{版本}/drivers/..., 比如: 這個新的驅動程式是屬於 sata, 則放到 scsi/ 的 folder 當中, 建議最好整個 driver 's folder 都 copy 過去, 裡面通常都會有 Makefile, .h, .c or .o 等等可供 compiler 的完整資訊; 編輯 scsi/ folder 裡面的 Makefile, 添加一筆 新的裝置, 內容應該像這樣:
obj-$(CONFIG_SCSI_{your device name}) += libata.o {your device folder}/

[註] libata.o 是否需要加入, 可查看剛剛測試加入新的 module 之後, 在 /lib/modules/`uname -r`/module.dep 裡面, 該 device 是否有延伸的 module 需要驅動, 理論上所有 sata driver 都需要添加 libata.o 這一筆.

之後是添加一筆新的裝置到 Kconfig, 它負責顯示在我們選擇功能上 make *config 的內容裡:
config {device_name}
tristate "show device information,only english"
depends on SCSI_SATA && PCI -- 歸屬於哪個裝置或設備上
default {y|m|n} -- 可設定預設值
help -- 當移到該功能時, 會秀出以下的資訊
........(以下省略)


在要編譯的 kernel-{version}/linux-{version}/ source_code 中,
使用 make mrproper 來清除舊的資料, 如第一次實做則不需要.
使用 make oldconfig or make menuconfig 來將剛剛新建的 driver 含入, 存成 .config

我習慣先行利用 make clean modules;make modules_install install 來產生新的 kernel, 重新開機 try try 確定沒有問題.

重新進入 kernel-{version}/linux-{version}/ , 將 .config 先行備份 config-default, 執行 make mrproper 做清理的動作, 將 config-default copy 到 .config, 執行 make rpm-pkg . 執行的結果是存在 /usr/src/redhat/RPMS/i386/ 與 SRPMS/ 當中各產生一個 rpm 檔案, 當然是要給它執行確認是否可以用!!
# rpm -ivh --nodeps kernel-{version}.i386.rpm
請務必加入這個 --nodeps 參數, 否則會出現 error:
error: Failed dependencies:
kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386

** 經由 2.6 kernel compiler 之後的 modules , 眼尖的人可能發現到, 怎麼每個 .ko 檔都變肥了 ? 我也是因為這個原因找了很多網站, 一次想說放棄的心情下, 無意中找到這個網站, 內容直接說明一個指令 strip , 經由這個網站的大大說明, 請不要直接使用 strip 下去跑, 因為沒帶參數的這個指令, 是個殺傷力極大的...; 後來我從 [Linux 指令參考手冊-O'Reilly] 當中, 找到了關於這個指令的描述: 從目的檔 files 中, 將符號移除。哇! 的確很強, 如果不帶參數, module 裡面所有的符號統統被刪除, 那還能用嗎 ?!! 所以, 我決定採用那位網站的大大所說: strip -g -s -d *.ko 照此方式操作, 結果很好, 另外, 我又將它給發揚光大, 把 strip 跟 find 結合, 哈哈...就可以修改所有的 .ko 囉.

方法如下:
strip -v -x(or -g -S -d) `find kernel/ -name *.ko`


希望以後會有更加便利的方式, 讓整合資源簡單化, 這樣 Linux 就會越來越普及。

2008年9月19日 星期五

製作無人值守的windowsXP超級封裝光碟

作者. Baron. Wan

需要資料:
1. easyboot [製作開機光碟工具]
2. windowsXP CD片 [ 解開 support/tools/deploy.cab ]
3. ultraISO [ 修改 .iso & .ima 開機的image 內容 ]
4. nero [ 製作可開機 dvd 光碟用途 ]
5. ghost 11版 for dos (ghost.exe)
6. dos 的 光碟驅動
7. 需有一些些 dos 能力

開始製作:
1. 解開 easyboot (以下內容只做為教學用途,若有需相關軟體,期望能考慮其合法性.) , 在 disk1/ezboot/ 底下有個 setup98.img (這是win98 開機boot image檔), 為何需要這個, 因為我在製作整個過程, 為了達到無人值守的要求, 曾經嘗試許多的網路上提供的方式, 用來用去都不是太符合自己的要求. 要做到無人值守, 在ghost 還原後立即重新開機, 系統能依時間內未按任何按鍵而採用預設由硬碟啟動的方式來達成此一目標. 不過, 這個檔案內容有些東西要更換一下,來符合自己的需求, 嘿嘿 ~
2. 首先, 先行編寫 config.sys 跟 autoexec.bat 這兩個檔, 以下是我的範本:
======== config.sys =========
[MENU]
MENUITEM=FDISK,SPFDISK
MENUITEM=MG,Use USB drive and Manual GHOST
MENUITEM=AR,Not use USB drive and Auto fdisk-Auto Recovery
MENUITEM=MPR,Not use USB drive and Not auto fdisk-Auto Recovery
MENUITEM=AB,Auto Backup
MENUDEFAULT=FDISK,30
MENUCOLOR=15,0

[COMMON]
DEVICE=HIMEM.SYS
DOS=HIGH,UMB
BREAK=OFF
NUMLOCK=ON
FILES=32
BUFFERS=64,4
LASTDRIVE=Z
SHELL=COMMAND.COM /P /E:1024
DEVICE=DRIVER\NEC_IDE.SYS /D:NECIDE
DEVICE=DRIVER\MTMCDAI.SYS /D:MTMCDAI
DEVICE=DRIVER\TEAC_CDI.SYS /D:TEAC-CDI
DEVICE=DRIVER\oakcdrom.sys /D:OAKCD001
DEVICE=DRIVER\gcdrom.sys /D:MSCD000 /C0
DEVICE=DRIVER\gcdrom.sys /D:MSCD001 /C1
DEVICE=DRIVER\gcdrom.sys /D:MSCD002 /C2

[FDISK]

[MG]
DEVICE=DRIVER\DUSE.EXE VERBOSE CDDEVICE=USBCDROM

[AR]

[AB]

[MPR]

======== autoexec.bat ========
@echo off
LH DRIVER\MSCDEX.EXE /D:MTMCDAI /D:OAKCD001 /D:TEAC-CDI /D:NECIDE /D:MSCD000 /D:MSCD001 /D:MSCD002 /L:O

goto %config%

:FDISK
O:\
spfdisk.exe
goto exit

:MG
LH DRIVER\MSCDEX.EXE /D:USBCDROM /L:U
SMARTDRV.EXE
O:\
ghost.exe
goto exit

:AR
SMARTDRV.EXE
O:\
auto.bat
goto exit

:AB
SMARTDRV.EXE
O:\
backup.bat
goto exit

:MPR
SMARTDRV.EXE
O:\
noauto.bat
goto exit

:exit
@echo on

===========================================
上述針對 .bat 的內容

******** auto.bat ********
ghost.exe -CLONE,mode=PLOAD,src=O:\system.gho:1,dst=1:1,sze1=90P,sze2=10P -SURE -NTD -FX -RB

******** noauto.bat ********
ghost.exe -CLONE,mode=PLOAD,src=O:\system.gho:1,dst=1:1 -SURE -NTD -FX -RB

******** backup.bat ********
ghost -CLONE,mode=PDUMP,src=1:1,dst=1:2\system.gho -SPLIT=650 -Z5 -NTD -SURE -FX -RB

以上. 都設定完畢了之後, 接下來最費工的地方, 就是來去找 driver, 網路上有提供下載的位置, 由於當初沒抄, 反正只要搜尋一下, 花點時間就能找到了, 然後將之集合起來...
以下 setup98.img 內容, 是我已經變更後的資料:

******* setup98.img ********
aspicd.sys
autoexec.bat
btdosm.sys
choice.com
command.com
config.sys
drvspace.bin
findcd.exe
flashpt.sys
format.com
himem.sys
io.sys
jo.sys <-- 這個,在io.sys 會載入, 就是可以由硬碟啟動的東東
mem.exe
msdos.sys
smartdrv.exe
driver\
driver\DUSE.exe
driver\duseldr.com
driver\mtmcdai.386
driver\mtmcdai.sys
driver\nec_ide.sys
driver\oakcdrom.sys
driver\teac_cdi.sys
*********************************

3. 上述處理好之後, 可先利用 UltraISO 將這個 image 檔寫在軟碟上, 啟動try一下是否 ok?
確定沒問題之後, 請先參考(4) 步驟的燒錄內容, 唯獨目前為止, 因為尚未製作 .gh* 的檔案. 製作出第一張的開機光碟, 接下來, 以下是很重要的...

封裝 windows 系統前, 我習慣會先將不用的, 多餘的, 先行清除, 然後做磁碟重組完畢之後, 再開始做封裝動作, 系統越是乾淨越好 !

習慣上, 我會把 DEPLOY 這個 folder MOVE 到 D:\ .
先執行 setupmgr.exe , 然後選擇以 sysprep 的方式製作, 選擇全自動安裝的過程, 依序輸入相關在安裝時會需要輸入的資訊, 包含註冊碼..等資訊, 最後讓它在C:\DEPLOY 產生 sysprep.inf 檔; 接下來執行 sysprep.exe , 不知道是不是因為我的是 winxp sp2 版本的關係, 我執行該程式反應出來的內容, 怎麼跟網路上說明好像不太一樣 ?!!

是這樣的, 我勾選了 [不重設啟用的限定期限],[使用迷你安裝],[偵測非隨插即用的硬體]這三項.記住!! [不重新產生安全性識別元] 不能勾選, 否則製作出來的封裝, 只能在原來的機器上運作. 封裝完畢後, 就用那片剛完成的開機光碟, 開機選擇 [Auto backup], 然後它就會自動將 C:\ 製作 image 到 D:\

4. 最後一步, 就是回到 windows, 當然由於剛剛封裝完畢, 所以當進入 windows 時, 它會自動解封裝, 順便看看解封裝的過程有沒有問題吧 !!

解完封裝後, 進入 windowsXP 系統, 安裝 nero, 然後選擇 DVD-ROM (boot) , 就是要製作 DVD版的開機光碟, 然後選擇開機的 image 檔, 這個檔案當然就是 setup98.img 囉, 然後選擇[新建], 之後在主畫面, 將 spfdisk.exe , ghost.exe , auto.bat , noauto.bat , backup.bat 放入, 然後將 system.gh* 放入, 最後, 當然就是再把它燒錄起來.

2008年9月3日 星期三

Linux 速記~

作者: Baron. Wan



YUM 使用 proxy 進行連線

於 .repo 檔中添加:
        proxy=http://proxy_ip:port


建立 swap 檔案

# dd if=/dev/zero of=<路徑+檔名> bs=1024 count=<容量 kb>

ex: dd if=/dev/zero of=/swapfile bs=1M count=1024
bs=1M count=1024 (總共為 1GB)

# mkswap -c <上述產生的swap 檔案路徑檔名>
ex: mkswap -c /swapfile

# swapon /swapfile

查看記憶體
# free

Linux nbtstat 功能
# nmblookup

系統負載狀況
# vmstat

系統時間變更
# date MMDDhhmmYYYY

系統時間寫入硬體
# hwclock --systohc

將本機的檔案COPY到遠端的主機 (SMB)
smbclient //192.168.0.1/share -U username%password -c "lcd /var/backup; put backup-99999.tar.gz"
遠端命令:
lcd 指定本機端路徑
cd 變更遠端路徑
put 將本機端的檔案COPY到遠端當前的路徑下
get 將遠端目前位置的檔案COPY到本機當前路徑
!ls 列出本機的檔案
ls 列出遠端的檔案

重新編譯原碼
rpm -ivh .src.rpm
會在家目錄產生 ~/rpmbuild/{SOURCE,SPECS}
1. 進入 SOURCE/ 解壓縮該原碼 ( .tar.gz | .tar.bz2 ), 然後進入該目錄修改自己需要的.
2. 重新壓回原格式.
3. 進入 SPECS/ 中, 執行該 .specs : rpmbuild -ba .specs
4. 將產生的 .rpm (~/rpmbuild/RPMS/(i386|i686|noarch)) 放到 /myrpm/apps/2011/i386/packages
5. 將新的 .src.rpm (~/rpmbuild/SRPMS/) 放到 /myrpm/apps/2011/srpm
6. 進入 /myrpm/apps/2011/i386/ 處, 執行 : createrepo --update ./
    這段執行會在底下的 repodata/ 處產生 packages/ 關聯的 xml 檔.
之後我們就可經由 yum 來 install 它了. (當然前提須要先架設自己的 yum server)

grep 一次查詢多個不一樣的關鍵字
rpm -qa |grep -P '{|faad2-libs|gstream-ffmpeg|libdc1394|dirac-libs|gsm|lame-libs|x264-libs|}'

尋找多檔案中的關鍵字
find . -type f -print | xargs grep "關鍵字"


sed指令 ~ 覆寫修改檔案內容
sed -i "/尋找字串/s/原字串/修改為字串/g要進行修改的檔案
ex: sed -i "/ROOTDIR/s/^/#/g" /etc/sysconfig/named


sed指令 ~ 單行多條件 ~ 刪除後插入
sed -e "/HWADDR=/,1d;2i HWADDR=\"00:00:00:00:00:00\"" -i ifcfg-eth0
-e : 單行多條件
1d : 刪除條件中的單行
2i : 隨後插入 後面的字串

sed指令 ~ 搜尋字串並暫存, 再取出並銜接後面字串內容
cat known_hosts| sed -e "s/\([[:lower:]]\)\:\ /\1.test\,192\.168\.1\.1 /g"
[註] 用 '(' and ')' 標示起來的會被暫存, 用 \1 可取出第一筆資料
再例:
cat known_hosts|  sed -e "s/\([[:lower:]]\)\([0-9]\)\:\ /\1\2\,192\.168\.1\.\2 /g"
[註] 有兩個 '(' and ')' , 則 \1 取第一筆, \2 取第二筆

ssh 只限於允許的成員登入作法, 在 pam.d 中的 sshd 內添加
auth       required     pam_stack.so service=system-auth
auth       required     /lib/security/pam_listfile.so item=user sense=allow file=/etc/ssh/user_allowlist onerr=succeed 
account    required     pam_nologin.so


cpio 快速說明
cpio -idv (解壓縮)
cpio -oH crc (CRC檢查後壓縮)

一般除了使用 cp -arp 方式複製,也可使用 cpio:(於要複製的當前目錄中進行)
find . | cpio -pmd   /要複製到何處 ? (目的端)

depmod 建立kernel 相關模組的相依性
# depmod -a (all)
# depmod -a 2.6.32-131.0.15.el6.i686 (針對此 kernel 版本)
# depmod -a -b /root/test/ (預設是 /lib/modules 路徑, 此將變更到 /root/test/ 去尋找當前 kernel 版本的目錄)

設定 Partition 可 Boot 區域
/sbin/parted  <裝置>
ex: /sbin/parted /dev/sdg

(parted) toggle N boot
N 代表第幾個 Partition 設為 Boot,此例中為 sdg1
ex: toggle 1 boot

然後 quit 離開即可。

[以下內容原出處已遺忘...]
========================================================

[系統管理]釋放掉Linux記憶體(Cache)

在此都以Cent OS 5.3為例,
有些人可能會利用free指令發現,
記憶體怎麼一直被吃掉…
但用top指令也查不出是哪個程式
這時候在free指令的時候仔細看
絕大部分都是被放到Cache跟Buffer去了,
Cache的作用是讓常用的文件暫存在記憶體裡面,減少IO次數提升效率
而Buffer則是減緩文件正式寫入硬碟的時間,
在Web Server上會很明顯的一點就是Cache大量消耗,
這有助於提升整體Web Server的效率沒錯,
所以在RAM Size還允許的情況下,不太建議清除記憶體
但若有程式不能完全釋放記憶體的情況下,
仍想清除Cache的時候該如何呢
可以用以下指令
echo 1 > /proc/sys/vm/drop_caches
建議用1即可,用2可以從dentries、inodes中壓出更多的空間.
echo 2 > /proc/sys/vm/drop_caches
但3就不建議了,容易造成系統錯誤.
記得釋放完,要再下
echo 0 > /proc/sys/vm/drop_caches
指令.來回復預設狀況喔!~

--------------------------------------------------------------------------------------------------------------
Linux 系統光碟安裝,從 USB隨身碟外掛 ks.cfg:

   1. 於安裝選單中 (install manu),按 鍵,於輸入列尾端附加:

       ip=dhcp  ks=hd:sda1:/your_path/ks.cfg


   2. 安裝完畢,光碟不要急著拔出,因為在安裝時,usbdisk 被系統認為是 sda,因此當系統寫mbr 資訊到硬碟時,是以 sdb(hd1) 來寫入,所以在第一次 reboot後,要進入救援模式,chroot 進入 /mnt/sysimage 後,重新執行 grub-install /dev/sda,來讓 system boot 的位置重新設定。但是,在進行 grub-install 前,請記得變更 /boot/grub/grub.conf 中相關 (hd1) 變更為 (hd0) 。當然最好的辦法:就是直接在 ks.cfg 內容最後 (%post),直接添加 "修改 grub.conf " 的內容。

example:

--------------------------------------------------------------------------

%post --nochroot

mkdir -p /mnt/sysimage/tmp/usbdisk/

mount /dev/sda1 /mnt/sysimage/tmp/usbdisk/

%post

/etc/init.d/network start

rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6

rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms

rpm -ivh /tmp/usbdisk/cluster/CentOS/6/x86_64/Packages/rpmforge-release-0.5.2-1.el6.rf.x86_64.rpm

rpm -ivh /tmp/usbdisk/cluster/CentOS/6/x86_64/Packages/epel-release-6-8.noarch.rpm

rpm -ivh /tmp/usbdisk/cluster/CentOS/6/x86_64/Packages/atrpms-repo-6-6.el6.x86_64.rpm

...

sed "/^[[:space:]]root/s/hd1/hd0/g; /^splashimage/s/hd1/hd0/g" -i /boot/grub/grub.conf

...

# 這是可開機自動 login 的設定 (給自己註記~)

sed "/^exec.*mingetty/s/$/ --autologin root root_password/" -i /etc/init/tty.conf

...

...

/sbin/grub-install /dev/sdb

%post --nochroot

umount /mnt/sysimage/tmp/usbdisk/

-------------------------------------------------------------------------


[註] ip 參數是當 ks.cfg 內容中需要進行網路部署時需要。

**************************************************************

Linux 系統安裝光碟,從遠端主機外掛 ks.cfg:

      於安裝選單中 (install manu),按鍵,於輸入列尾端附加:

       ip=dhcp  ks={http://|ftp://|nfs://...}/remote_path/ks.cfg