2013年9月30日 星期一

Linux 核心編譯及相關知識

=== 編譯設定時請先注意核心版本是否正確,並確定是否有 64-bit kernel 選項 ===

設定核心參譯參數:

設定參數有三種選項,分別是:

1. M -> 編譯成模組,可即時載入/移除模組,舉例來說:搖桿的驅動程式是 joydev.ko,一般人電腦並沒有連接 USB 搖桿,因此我們無需隨時載入 joydev.ko 這個驅動程式模組,等到我們有接上 USB 搖桿時再來載入即可。
2. * -> 編譯並內嵌至核心,無法移除
3.   -> 不編譯此模組


驅動程式模組操作:

1. lsmod -> 觀看目前有那些驅動程式模組已載入至記憶體,其輸出如下:

herman@debian:~$ lsmod
Module                  Size  Used by
joydev                 17232  0
nvidia               9384645  29
drm                   211810  2 nvidia
nfsv3                  29787  1
rpcsec_gss_krb5        26504  0
nfsv4                 158090  0
nfsd                  192007  2
auth_rpcgss            39085  2 nfsd,rpcsec_gss_krb5
oid_registry           12419  1 auth_rpcgss
nfs_acl                12511  2 nfsd,nfsv3
nfs                   105982  3 nfsv3,nfsv4
lockd                  55577  3 nfs,nfsd,nfsv3
fscache                37551  2 nfs,nfsv4
sunrpc                160406  24 nfs,nfsd,rpcsec_gss_krb5,auth_rpcgss,lockd,nfsv3,nfsv4,nfs_acl

..
..

其中 Module 欄位是目前已載入至記憶體中之模組,Size 是該模組大小,Used by 是指該模組是否有被其它模組使用,舉例來說,如果我們執行:

lsmod|grep usb

會得到以下輸出:

usb_storage            48020  0
scsi_mod              158157  5 sg,usb_storage,libata,sd_mod,sr_mod
usbcore               134854  4 uhci_hcd,usb_storage,ehci_hcd,ehci_pci
usb_common             12440  1 usbcore

其中 usbcore 是 USB 驅動程式之主模組,它會被其它 USB 相關驅動程式模組所使用,例如 usb_storage 是用來驅動 USB 儲存裝置之模組,它必須有 usbcore 才能使用。

2. modprobe -> 載入驅動程式模組

請先執行 lsmod|grep joydev 看看目前是否有載入 joystick 之驅動程式模組。接著我們可以使用 root 權限來載入 joydev 驅動程式模組:

# modprobe joydev

載入後可以再執行一次 lsmod|grep joydev 來看目前是否有載入 joystick 之驅動程式模組,理論上其輸出如下:

joydev                 17232  0

這表示我們已成功載入 joydev 驅動程式模組。

3. rmmod -> 移除驅動程式模組

若我們要移除 joydev 模組的話,請以 root 權限執行底下指令:

# rmmod joydev

再以 lsmod|grep joydev 來看目前是否有載入 joystick 之驅動程式模組。



編譯核心參數設定

請以 root 權限在 /usr/src/linux 目錄下執行底下指令:

/usr/src/linux # make menuconfig

接著可以進行參數設定

1. General setup  --->
        Kernel compression mode (Gzip)  --->
                XZ
   目的:使用最高壓縮率之壓縮演算法以節省空間。

   [*] Enable loadable module support  --->

   目的:開啟可載入模組設定

        [*]   Module versioning support
        支援其它版本核心所編譯出來的模組,萬一有相容性的問題則無法支援。



2. Processor type and features  --->
        Processor family (Generic-x86-64)  --->
                Processor family (Core 2/newer Xeon)
   目的:把 CPU 由 Generic-x86-64 改為 Core 2/newer Xeon 可以加強在本機的
         效能,因為本機 CPU 是 Core 2 Duo (hint: cat /proc/cpuinfo)


         (512) Maximum number of CPUs

   目的:支援最高 512 顆 CPU。

   Bus options (PCI etc.)  ---> 設定電腦內部匯流排,例如 PCI、ISA .. etc.

3. Executable file formats / Emulations  --->
        [*] IA32 Emulation
        <*>   IA32 a.out support

   目的:在 64 位元 Linux 底下執行 32 位元 Linux 程式,例如 Adobe Reader 只出 32
        位元版 (i386 版),打開此參數可以讓我們所編譯的 Linux 核心支援此程式
        執行。

    --- Networking support  設定網路相關硬體及軟體
          Networking options  ---> 不要動,以免網路無法動作
    [ ]   Amateur Radio support  ---> 業餘無線電支援,請關閉,我們不需要。
    < >   CAN bus subsystem support  --->
    < >   IrDA (infrared) subsystem support  --->
    <M>   Bluetooth subsystem support  --->
    -*-   Wireless  ---
    < >   WiMAX Wireless Broadband support  --->
    < >   NFC subsystem support  --->


4. Device Drivers  ---> 此目錄底下有相當多的參數可以設定,請將不要的模組移除以
        減少空間。
        < > Parallel port support  --->  關閉,我們現在的電腦已經沒有 RS232
                的平行埠介面了。

        <M>   Loopback device support
        (8)     Number of loop devices to pre-create at init time
        < >     Cryptoloop Support
        loopback device 可以用來掛載光碟片的 ISO 檔,簡單來說它是 Linux 上的
        虛擬光碟。舉例來說,假設我們要掛在 debian 安裝 iso 檔,其檔名是:
        debian-7.1.0-amd64-CD-1.iso 的話,我們可以使用 root 的權限執行:
        # mount -o loop debian-7.1.0-amd64-CD-1.iso /mnt
        將此光碟片掛載至 /mnt 目錄下,此時系統會出現底下訊息:
        mount: warning: /mnt seems to be mounted read-only.
        這表示 /mnt (光碟片) 是唯讀目錄,無法寫入。我們可以使用 ls /mnt
        來觀看是否是光碟片內容。
        因此 Loopback device 參數一定要設定,否則將無法使用虛擬光碟。

        < > ATA/ATAPI/MFM/RLL support (DEPRECATED)  --->
        此參數有個 DEPRECATED 的單字,因此通常不再支援,除非你的電腦有接很老舊
        的裝置,否則可以不必編。


        <M> Serial ATA and Parallel ATA drivers  --->
        支援 SATA 介面,問題在於:我們如何知道本機 SATA 介面卡為何 ?

        lspci 可以看到底下資訊:

00:1f.2 IDE interface: Intel Corporation NM10/ICH7 Family SATA Controller [IDE mode] (rev 01)

        上述資料告訴我們本機的 SATA 介面是 Intel 的 NM10/ICH7 晶片,若想知道該晶
片使用那個模組的話,請執行:lspci -v,其輸出如下所示:

00:1f.2 IDE interface: Intel Corporation NM10/ICH7 Family SATA Controller [IDE mode] (rev 01) (prog-if 80 [Master])
        Subsystem: Giga-byte Technology Device b002
        Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 19
        I/O ports at 01f0 [size=8]
        I/O ports at 03f4 [size=1]
        I/O ports at 0170 [size=8]
        I/O ports at 0374 [size=1]
        I/O ports at f000 [size=16]
        Capabilities: <access denied>
        Kernel driver in use: ata_piix

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

            IEEE 1394 (FireWire) support  --->  取消,目前此介面幾乎沒人使用
        [ ] Macintosh device drivers  --->      取消,目前此介面幾乎沒人使用

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

        -*- Network device support  ---> 設定網路介面
                < >   ARCnet support  --->
                [ ]   ATM drivers  --->
                      *** CAIF transport drivers ***
                      Distributed Switch Architecture drivers  --->
                -*-   Ethernet driver support  ---> 設定網路卡驅動程式

        我們以 lspci -v 可以看到以下訊息:

03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)
        Subsystem: Giga-byte Technology GA-EP45-DS5/GA-EG45M-DS2H Motherboard
        Flags: bus master, fast devsel, latency 0, IRQ 43
        I/O ports at d000 [size=256]
        Memory at e5010000 (64-bit, prefetchable) [size=4K]
        Memory at e5000000 (64-bit, prefetchable) [size=64K]
        [virtual] Expansion ROM at e5020000 [disabled] [size=64K]
        Capabilities: <access denied>
        Kernel driver in use: r8169
        因此可以看到本機電腦所使用之網路卡驅動模組是 r8169,廠牌為 Realtek。

                < >   FDDI driver support
                [ ]   HIPPI driver support
                < >   General Instruments Surfboard 1000
                {M}   PHY Device support and infrastructure  --->
                < >   Micrel KS8995MA 5-ports 10/100 managed Ethernet switch (NEW
                < >   PLIP (parallel port) support
                {M}   PPP (point-to-point protocol) support
                      USB Network Adapters  --->  沒有 USB 網卡則全部關掉
                [ ]   Wireless LAN  ---> 沒有 wifi 無線網卡則全部關掉
                      WiMAX Wireless Broadband devices  ---> 沒有 wimax 卡則關掉
                [ ]   Wan interfaces support  --->
                < >   IEEE 802.15.4 drivers  --->
                < >   VMware VMXNET3 ethernet driver
                [ ]   ISDN support  --->

    <M> Sound card support  --->        音效卡支援
        --- Sound card support
        [ ]   Preclaim OSS device numbers
        <M>   Advanced Linux Sound Architecture  --->
        < >   Open Sound System (DEPRECATED)  --->

        音效卡我們只保留 ALSA,我們的音效卡是:

00:1b.0 Audio device: Intel Corporation NM10/ICH7 Family High Definition Audio Controller (rev 01)

        因此其驅動程式如下:

            [*]   PCI sound devices  --->
                <M>   Intel HD Audio  --->
                <M>   Intel/SiS/nVidia/AMD/ALi AC97 Controller
                <M>   Intel/SiS/nVidia/AMD MC97 Modem

        Graphics support  --->          顯示卡支援

        我們的顯示卡是

01:00.0 VGA compatible controller: NVIDIA Corporation G96 [GeForce 9400 GT] (rev a1)
        由於我只裝官方驅動程式,因此把 nouveau 關掉,兩者會相衝。

            < > Nouveau (nVidia) cards
        其餘驅動程式可以關閉以簡省空間。


        {*} Hardware Monitoring support  --->
        硬體監測驅動程式,因為我們看不到主機板上面的晶片,因此建議全部編譯,
        讓電腦開機時自動偵測並載入相對應之驅動程式模式。

        我們可以使用 lm-sensors 這個套件來看主機板上面的溫度/電壓/風扇

        sensors-detect

        偵測完畢後會出現底下訊息,告訴我們要載入那些模組以驅動硬體監視驅動
        程式。

Now follows a summary of the probes I have just done.
Just press ENTER to continue:

Driver `it87':
  * ISA bus, address 0x290
    Chip `ITE IT8718F Super IO Sensors' (confidence: 9)

Driver `coretemp':
  * Chip `Intel digital thermal sensor' (confidence: 9)

To load everything that is needed, add this to /etc/modules:
#----cut here----
# Chip drivers
coretemp
it87
#----cut here----
If you have some drivers built into your kernel, the list above will
contain too many modules. Skip the appropriate ones!

Do you want to add these lines automatically to /etc/modules? (yes/NO)

Unloading i2c-dev... OK
Unloading cpuid... OK



    {M} Generic Thermal sysfs driver  --->      溫度管理

    <M> Multimedia support  --->        設定視訊/電視卡之驅動程式模組

    <M> VFIO Non-Privileged userspace driver framework  ---> 將 VGA pass 給 qemu
        --- VFIO Non-Privileged userspace driver framework
        <M>   VFIO support for PCI devices
        [*]     VFIO PCI support for VGA devices


5.        Firmware Drivers  --->        某些硬體需要 firmware (韌體) 才能動作,
        這些韌體在 Debian 的 firmware* 套件中。
        大部份常見會用到的韌體是無線網卡,例如 b43 (broadcom) 無線網卡之類。

沒有留言:

張貼留言