LPI102考試準備:核心(轉)

post0發表於2007-08-24
LPI102考試準備:核心(轉)[@more@]

  執行時核心管理

  本節討論初級管理(LPIC-1)102 考試的主題 1.105.1 的內容。這個主題的權值是 4。

  在本節中,學習如何:

  使用命令列工具獲得關於當前執行的核心和核心模組的資訊

  手工裝載和解除安裝核心模組

  判斷何時可以解除安裝模組

  配置系統以便按照檔名之外的名稱來裝載模組

  從技術上說,Linux 是系統的核心。核心為應用程式執行和使用各種硬體裝置提供了一個框架。它是處理硬體介面、排程和記憶體管理等任務的低層程式碼。許多人把整個系統稱為 GNU/Linux,因為大多數發行版中的許多工具來自 Free Software Foundation 的 GNU 專案。但是,常常簡稱為 “Linux” 而不是 “GNU/Linux”。

  uname

  uname 命令輸出關於系統及其核心的資訊。清單 1 顯示 uname 的各種選項以及產生的資訊;表 3 中定義了這些選項。

  清單 1. uname 命令

  ian@pinguino:~$ uname

  Linux

  ian@pinguino:~$ uname -s

  Linux

  ian@pinguino:~$ uname -n

  pinguino

  ian@pinguino:~$ uname -r

  2.6.12-10-386

  ian@pinguino:~$ uname -v

  #1 Mon Jan 16 17:18:08 UTC 2006

  ian@pinguino:~$ uname -m

  i686

  ian@pinguino:~$ uname -o

  GNU/Linux

  ian@pinguino:~$ uname -a

  Linux pinguino 2.6.12-10-386 #1 Mon Jan 16 17:18:08 UTC 2006 i686 GNU/Linux

  表 3. uname 的選項 選項 描述

  -s 輸出核心名。如果沒有指定選項,這是預設選項。

  -n 輸出節點名或主機名。

  -r 輸出核心的釋出版本。這個選項常常與模組處理命令一起使用。

  -v 輸出核心的版本。

  -m 輸出機器的硬體(CPU)名。

  -o 輸出作業系統名。

  -a 輸出以上所有資訊。

  清單 1 來自在 Intel® CPU 上執行的 Ubuntu 系統。uname 命令在大多數 UNIX® 和類 UNIX 系統以及 Linux 上都是可用的。根據 Linux 發行版和版本的不同,以及執行的機器型別的不同,顯示的資訊是不同的。清單 2 顯示的輸出來自執行 Fedora Core 4 的 AMD Athlon 64 系統和 Apple PowerBook。

  清單 2. 對另一個系統使用 uname

  Linux attic4 2.6.14-1.1656_FC4 #1 Thu Jan 5 22:13:55 EST 2006 x86_64

  x86_64 x86_64 GNU/Linuxfilesystem

  Darwin Ian-Shields-Computer.local 7.9.0 Darwin Kernel Version 7.9.0:

  Wed Mar 30 20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC

  Power Macintosh powerpc

  核心模組

  核心管理著系統的許多低層功能,包括硬體和介面。由於存在許多不同的硬體和幾種不同的檔案系統,所以支援所有功能的核心會非常大。幸運的是,核心模組(kernel modules) 使我們能夠在需要時裝載支援軟體,比如硬體驅動程式或檔案系統,所以可以用一個小核心啟動系統,然後根據需要裝載其他模組。裝載常常是自動的,比如在插入 USB 裝置時自動裝載相關的驅動程式。

  本節的剩餘部分討論用於核心模組的命令和配置。

  用於裝載和解除安裝模組這樣的任務的命令需要根特權。顯示關於模組的資訊的命令常常可以由一般使用者執行。但是,因為這些命令在 /sbin 中,常常不在非根使用者的路徑中,所以如果您是非根使用者,那麼可能必須使用完整路徑名。

  lsmod

  使用 lsmod 命令顯示系統上當前裝載的模組,如清單 3 所示。您的輸出可能不一樣,但是應該會看到一些共同的條目。

  清單 3. 用 lsmod 顯示核心模組

  [ian@attic4 ~]$ /sbin/lsmod

  Module Size Used by

  nvnet 74148 0

  nvidia 4092336 12

  forcedeth 24129 0

  md5 4161 1

  ipv6 268737 12

  parport_pc 29189 1

  lp 13129 0

  parport 40969 2 parport_pc,lp

  autofs4 29637 1

  sunrpc 168453 1

  ipt_REJECT 5825 1

  ipt_state 1985 3

  ip_conntrack 42009 1 ipt_state

  iptable_filter 3137 1

  ip_tables 19521 3 ipt_REJECT,ipt_state,iptable_filter

  dm_mod 58613 0

  video 16069 0

  button 4161 0

  battery 9541 0

  ac 4933 0

  ohci_hcd 26977 0

  ehci_hcd 41165 0

  i2c_nforce2 7105 0

  i2c_core 21825 1 i2c_nforce2

  shpchp 94661 0

  snd_intel8x0 34945 1

  snd_ac97_codec 76217 1 snd_intel8x0

  snd_seq_dummy 3781 0

  snd_seq_oss 37569 0

  snd_seq_midi_event 9409 1 snd_seq_oss

  snd_seq 62801 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event

  snd_seq_device 9037 3 snd_seq_dummy,snd_seq_oss,snd_seq

  snd_pcm_oss 51569 0

  snd_mixer_oss 18113 1 snd_pcm_oss

  snd_pcm 100553 3 snd_intel8x0,snd_ac97_codec,snd_pcm_oss

  snd_timer 33733 2 snd_seq,snd_pcm

  snd 57669 11 snd_intel8x0,snd_ac97_codec,snd_seq_oss,snd_seq,

  snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer

  soundcore 11169 1 snd

  snd_page_alloc 9925 2 snd_intel8x0,snd_pcm

  floppy 65397 0

  ext3 132681 3

  jbd 86233 1 ext3

  sata_nv 9541 0

  libata 47301 1 sata_nv

  sd_mod 20545 0

  scsi_mod 147977 2 libata,sd_mod

  [ian@attic4 ~]$

  可以看到這個系統裝載了許多模組。其中大多數是核心提供的。但是,有一些模組(比如來自 NVIDIA Corporation 的 nvnet、nvidia 和 sata_nv 模組)包含專有程式碼,不是作為標準核心的一部分提供的。按照這種模組化的方式,可以將專有程式碼插入開放原始碼的核心。如果廠商的許可證允許的話,Linux 發行商可以將專有模組新增到發行版中,這樣您就不必直接從廠商那裡獲得這些模組,並可以確保具有適當的模組版本。

  在清單 3 中,還可以看到對顯示卡、SATA 和 SCSI 硬碟驅動器、軟碟機和音效卡等裝置的模組化支援擴充套件,以及用於連網特性(比如 IPV6)、檔案系統支援(比如 ext3)和 Sun 遠端過程呼叫(RPC)的模組。

  除了模組名之外,lsmod 還顯示模組的大小和使用者數量。如果一個模組由其他模組使用,那麼會列出這些模組。例如,soundcore 模組由 snd 模組使用,後者又由其他幾個聲音模組使用。

  modinfo

  modinfo 命令顯示關於一個或多個模組的資訊。如清單 4 所示,這些資訊包括檔案的完整路徑、作者、許可證、模組可能接受的任何引數、版本、依賴項和其他資訊。

  清單 4. 基本模組資訊

  [ian@attic4 ~]$ /sbin/modinfo floppy

  filename: /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/block/floppy.ko

  author: Alain L. Knaff

  license: GPL

  alias: block-major-2-*

  vermagic: 2.6.12-1.1456_FC4 686 REGPARM 4KSTACKS gcc-4.0

  depends:

  srcversion: 2633BC999A0747D8D215F1F

  parm: FLOPPY_DMA:int

  parm: FLOPPY_IRQ:int

  parm: floppy:charp

  [ian@attic4 ~]$ /sbin/modinfo sata_nv

  filename: /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/scsi/sata_nv.ko

  author: NVIDIA

  description: low-level driver for NVIDIA nForce SATA controller

  license: GPL

  version: 0.6

  vermagic: 2.6.12-1.1456_FC4 686 REGPARM 4KSTACKS gcc-4.0

  depends: libata

  alias: pci:v000010DEd0000008Esv*sd*bc*sc*i*

  alias: pci:v000010DEd000000E3sv*sd*bc*sc*i*

  alias: pci:v000010DEd000000EEsv*sd*bc*sc*i*

  alias: pci:v000010DEd00000054sv*sd*bc*sc*i*

  alias: pci:v000010DEd00000055sv*sd*bc*sc*i*

  alias: pci:v000010DEd00000036sv*sd*bc*sc*i*

  alias: pci:v000010DEd0000003Esv*sd*bc*sc*i*

  alias: pci:v000010DEd*sv*sd*bc01sc01i*

  srcversion: 3094AD48C1B869BCC301E9F

  在清單 4 中,注意在給出模組檔名的行中,這些檔名以 .ko 字尾結束。這將 2.6 核心的模組與其他目標檔案和 2.4 及以前版本的核心模組區分開(在 2.4 及以前版本的核心中,核心模組與其他目標檔案都使用 .o 字尾)。

  還會注意到模組路徑包括核心版本。例如,/lib/modules/2.6.12-1.1456_FC4/kernel/drivers/block/floppy.ko 包括 2.6.12-1.1456_FC4 作為路徑元素。這個值與 uname -r 顯示的值相同。核心模組是與給定的核心相關的,這種結構管理這種關係。

  在 2.6 核心上,還可以使用 modinfo 來限制查詢的模組資訊範圍。使用 -F 選項提取單一型別的資訊,比如引數、描述、許可證、檔名或別名。如果需要不同型別的資訊,那麼可以用不同選項多次執行這個命令。在 2.4 核心上,用 -p 這樣的引數提取引數資訊。當前的 modinfo 命令也支援老式的引數。清單 5 給出一些例子。

  清單 5. 特定的模組資訊

  [ian@attic4 ~]$ /sbin/modinfo -F parm snd

  cards_limit:Count of auto-loadable soundcards.

  major:Major # for sound driver.

  [ian@attic4 ~]$ /sbin/modinfo -F license nvidia floppy

  NVIDIA

  GPL

  [ian@attic4 ~]$ /sbin/modinfo -p snd

  major:Major # for sound driver.

  cards_limit:Count of auto-loadable soundcards.

  使用您的 Linux 技能

  可以使用教程 “LPI 101 考試準備(主題 103):GNU 和 UNIX 命令” 中討論的一些技術來提取資訊,比如模組接受的引數數量。清單 6 給出一個例子。

  清單 6. 每個模組的引數數量

  [ian@attic4 ~]$ for n in `/sbin/lsmod | tail +2 | cut -d " " -f1`;

  > do echo "$n $(/sbin/modinfo -p $n |wc -l )" | grep -v " 0$"; done

  nvnet 12

  forcedeth 1

  parport_pc 5

  dm_mod 1

  ohci_hcd 2

  ehci_hcd 2

  shpchp 3

  snd_intel8x0 7

  snd_ac97_codec 1

  snd_seq_dummy 2

  snd_seq_oss 2

  snd_seq 7

  snd_pcm_oss 3

  snd_pcm 2

  snd_timer 1

  snd 2

  snd_page_alloc 1

  scsi_mod 6

  rmmod

  如果模組的使用計數是 0,那麼可以安全地刪除它。例如,在準備裝載模組的更新版本時可能要進行刪除操作。這是一種出色的模組化核心特性,因為在對特定裝置的支援進行更新時,不一定需要重新引導系統。要刪除模組,使用 rmmod 命令以及模組名,如清單 7 所示。

  清單 7. 刪除正在執行的系統上的模組

  [root@attic4 ~]# rmmod floppy

  關於 rmmod 的其他選項,請參考手冊頁。

  insmod 和 modprobe

  刪除了模組之後,可能需要重新裝載它。這可以使用 insmod 命令,這個命令接受要裝載的模組的完整路徑名以及可能需要的任何模組選項。如果使用這個命令,可能希望使用命令替換來生成檔名。可以採用的兩種方式見清單 8。

  清單 8. 使用 insmod 裝載模組

  [root@attic4 ~]# insmod /lib/modules/`uname -r`/kernel/drivers/block/floppy.ko

  [root@attic4 ~]# rmmod floppy

  [root@attic4 ~]# insmod $(modinfo -F filename floppy)

  上面的第二種形式使我們不必記住模組所在的子目錄(這個例子中的 drivers/block),但是還有更好的裝載模組的方法。modprobe 命令提供一個高階介面,它操作模組名而不是檔案路徑。它還會裝載模組所依賴的其他模組,並可以裝載和刪除模組。

  清單 9 演示如何使用 modprobe 刪除 vfat 模組以及使用它的 fat 模組。然後,它顯示如果重新裝載了模組,系統會做什麼,最後顯示重新裝載模組的結果。注意,指定 -v 選項可以獲得詳細輸出;否則,modprobe(和底層的 insmod 命令)只顯示來自模組本身的錯誤訊息。在每一步之間,lsmod 透過管道連線到 grep,從而顯示 vfat 或 fat 模組是否裝載了。

  清單 9. 使用 modprobe 裝載模組

  [root@lyrebird root]# modprobe -r vfat

  vfat: Device or resource busy

  [root@lyrebird root]# lsmod | grep fat

  vfat 13132 1

  fat 38744 0 [vfat]

  [root@lyrebird root]# umount /windows/D

  [root@lyrebird root]# modprobe -r vfat

  [root@lyrebird root]# modprobe -v --show vfat

  /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o

  /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o

  [root@lyrebird root]# lsmod | grep fat

  [root@lyrebird root]# modprobe -v vfat

  /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o

  Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o

  Symbol version prefix '

  /sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o

  Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o

  [root@lyrebird root]# lsmod | grep fat

  vfat 13132 0 (unused)

  fat 38744 0 [vfat]

  depmod

  您剛才看到,在一些模組依賴於其他模組時,modprobe 可以處理多個模組的自動裝載。這些依賴關係記錄在適當核心的 /lib/modules 子目錄中的 modules.dep 檔案中(核心版本號由 uname -r 命令給出)。這個檔案以及幾個對映檔案是由 depmod 命令生成的。-a(表示 all)現在是可選的。

  depmod 命令掃描當前核心的 /lib/modules 子目錄中的模組並更新依賴資訊。清單 10 給出一個例子以及這個操作修改的檔案。

  清單 10. 使用 depmod 重新構建 modules.dep

  [root@lyrebird root]# date

  Thu Mar 16 10:41:05 EST 2006

  [root@lyrebird root]# depmod

  [root@lyrebird root]# cd /lib/modules/`uname -r`

  [root@lyrebird 2.4.21-37.0.1.EL]# ls -l mod*

  -rw-rw-r-- 1 root root 54194 Mar 16 10:41 modules.dep

  -rw-rw-r-- 1 root root 31 Mar 16 10:41 modules.generic_string

  -rw-rw-r-- 1 root root 73 Mar 16 10:41 modules.ieee1394map

  -rw-rw-r-- 1 root root 1614 Mar 16 10:41 modules.isapnpmap

  -rw-rw-r-- 1 root root 29 Mar 16 10:41 modules.parportmap

  -rw-rw-r-- 1 root root 65171 Mar 16 10:41 modules.pcimap

  -rw-rw-r-- 1 root root 24 Mar 16 10:41 modules.pnpbiosmap

  -rw-rw-r-- 1 root root 122953 Mar 16 10:41 modules.usbmap

  [root@lyrebird 2.4.21-37.0.1.EL]# cd -

  /root

  可以使用配置檔案 /etc/modules.conf 定製 modprobe 和 depmod 的行為。這常常用來為模組名指定別名和指定在裝載模組之後或解除安裝模組之前應該執行的命令。但是,還可以進行許多其他配置。清單 11 給出一個 /etc/modules.conf 示例。更多細節請參考 modules.conf 的手冊頁。

  清單 11. /etc/modules 檔案示例

  [root@lyrebird root]# cat /etc/modules.conf

  alias eth0 e100

  alias usb-controller usb-uhci

  alias usb-controller1 ehci-hcd

  alias sound-slot-0 i810_audio

  post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :

  pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :

  您還應該知道,某些系統使用另一個配置檔案 modprobe.conf,而其他系統將模組配置資訊儲存在 /etc/modules.d 目錄中。在某些系統上還可以發現稱為 /etc/modules 的檔案;這個檔案包含應該在引導時裝載的核心模組的名稱。

  USB 模組

  在將 USB 裝置熱插入 Linux 系統時,核心必須判斷要裝載哪些模組來處理這個裝置。這常常由一個熱插入指令碼來完成,這個指令碼使用 usbmodules 命令來尋找適當的模組。也可以自己執行 usbmodules(作為根使用者)。清單 12 給出一個例子。

  清單 12. USB 模組

  root@pinguino:~# lsusb

  Bus 005 Device 004: ID 1058:0401 Western Digital Technologies, Inc.

  Bus 005 Device 003: ID 054c:0220 Sony Corp.

  Bus 005 Device 001: ID 0000:0000

  Bus 004 Device 001: ID 0000:0000

  Bus 003 Device 001: ID 0000:0000

  Bus 002 Device 001: ID 0000:0000

  Bus 001 Device 003: ID 04b3:310b IBM Corp. Red Wheel Mouse

  Bus 001 Device 001: ID 0000:0000

  root@pinguino:~# usbmodules --device /proc/bus/usb/005/003

  usb-storage

  root@pinguino:~# usbmodules --device /proc/bus/usb/001/003

  usbmouse

  usbhid

  下一節講解如何構建和配置定製的核心

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-965591/,如需轉載,請註明出處,否則將追究法律責任。

相關文章