如何昇級 Debian 官方的 Kernel...

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

如何昇級 Debian 官方的 Kernel...

文章Tetralet » 週日 6月 06, 2004 7:54 am

因為 Debian Woody 的 Kernel 實在太舊了,
所以我們大多會自行想辨法來更新 Kernel。

如果想要安裝 Debian 的官方 Kernel 其實並不難,
只要幾個簡單的步驟就可以使用 apt 工具輕易得把 Kernel 昇級到最新版了!


首先,
請將 initrd-tools、hotplug、modconf、modutils、gcc、g++、g77 等套件進行必要的昇級。
如果可以,請將其全數更新至 testing:
代碼: 選擇全部
apt-get install -t testing initrd-tools hotplug modconf modutils gcc g++ g77


其中,
initrd-tools 套件包含了用來製作及載入 initrd-image 的工具程式。

在安裝完 initrd-tools 套件後,
必須在 /etc/lilo.conf 中加入 initrd=/initrd.img 這個選項,例:
代碼: 選擇全部
image=/vmlinuz
        initrd=/initrd.img
        label=Linux

否則很可能會無法以新的 Kernel 來進行開機。

在 /etc/lilo.conf 中加入 initrd=/initrd.img 這個選項後,
請在 /etc/kernel-img.conf 中再加入:
代碼: 選擇全部
do_initrd = yes

來記錄說已做了此項變更,
否則 apt 可能會拒絕進行 Kernel 的更新。
(以前是必須要這麼做啦,不知現在是否還是需要?)


hotplug 套件是用來自動載入 USB 裝置的 Daemon。
如果不安裝的話,apt 可能會替而要求您下載整個 Kernel Source,
(至少 Kernel 2.6.6 似乎就是如此...)

因為 hotplug 套件會自動載入 USB 裝置所有的所需模組,
非常值得安裝哦!


modconf、modutils 是用來管理 Kernel 模組的工具程式。
如果安裝的是 Kernel 2.6 的,
則一定要昇級至 testing,
否則有些載入模組的相關指令會無法使用。
但如果是 Kernel 2.4 的,則看您是否需要囉...


gcc、g++、g77 是編譯工具,
如果要自行編譯模組的話,
gcc 的版本必須和用來編譯 Kernel-Image 的 gcc 版本相符,
否則編出來的模組可能會無法使用。

呀!對了,別忘了順便安裝 make 套件呀!


接下來是安裝 Kernel-Image 和 Kernel-Headers 套件。
代碼: 選擇全部
apt-get install kernel-image-2.6.6-1-686 kernel-headers-2.6.6-1-686


很多軟體在編繹時都會用到 Kernel Source,
如果安裝了 Kernel-Headers 套件就不用去下載整個 Kernel 的原始碼了,
這樣可以有效節省頻寬和硬碟空間。

在此時,
apt 會順便更新 /initrd.img 和 /vmlinuz 連結,
並執行 lilo。


如果在您的電腦中有 PCMCIA 介面,
並且您所使用的 Kernel 是 2.4 的,
那麼別忘了安裝 PCMCIA Modules:
代碼: 選擇全部
kernel-pcmcia-modules-2.4.26-1-686

但如果使用的是 Kernel 2.6 的就不必了,
它已經包含在 Kernel Image 裡了。


如果有興趣,
也可以試著安裝 Kernel-DOC,
沒事就看看 Kernel 的說明文件吧?
(真的會去看的請舉手!)
代碼: 選擇全部
apt-get install  kernel-doc-2.6.6


到此,基本的相關套件的安裝已告一段落。
如果您是將 LILO 寫入 MBR 的話,
可以順便將其寫入 /dev/hda1 之類的,
有備無患嘛~~


如果您還是擔心,
可以試著再執行一次 lilo,
確認它已正確得寫入了 MBR 或是 /dev/hda1 之中。


如果您是遠端操控 Linux 的,
您可以參考:

 http://moto.debian.org.tw/viewtopic.php?t=3261
 http://moto.debian.org.tw/viewtopic.php?t=3524

如果新的 Kernel 無法正常開機時,
可以用以上方法來自動以舊的 Kernel 來自動再次進行開機。


好囉,
可以重新開機了!


在進入了新的 Kernel 之後,
請別忘了修改 /etc/modules 或 /etc/modules-2.6 來載入必需的模組。
而 nVidia Driver 或是 VMware 等軟體也別忘了重新編譯一次。
不過這就不在本主題的討論範圍之內了。


如果您不清楚該載入什麼樣的模組,
您不妨安裝 discover 套件,
它會自動偵測您的電腦硬體設備,
並自動替您載入相關的模組。
Debian-Installer 據說就是使用 discover 套件來自動偵測硬體的哦!
不過,(您可以猜到的)
對於官方 Kernel 不支援的硬體,
它是無法偵測出來的!

以上所有的動作已寫成了以下這個 Script,
如果您不怕眼睛痛的話可以參考看看!

代碼: 選擇全部
#!/bin/bash

CheckParameter=""

Pause()
{
   echo ""
   echo "Press <Enter> To Continue, Or <Ctrl><C> To Interrupt..."
   read EnterKey
}


# 是否使用 --help 參數
if [ -n "$( echo " $@ " | grep -i -- ' --help ' )" ]; then
   echo ""
   echo "Usage: $0 --Kernel KernelPackageName --GCC stable/testing/unstable"
   echo "   --HotPlug stable/testing/unstable --Initrd-Tools stable/testing/unstable"
   echo "   --Module-Tools stable/testing/unstable --do_initrd --vga16_off"
   echo "   --support_acpi --with_pcmcia --with_doc --auto_reboot"
   echo ""
   echo "   --help:      Display this information"
   echo "   --Kernel KernelPackageName: Assign The Kernel Version,"
   echo "      for example: 2.6.0-1-k7 or 2.4.23-1-686."
   echo "   --GCC stable/testing/unstable:   Install GCC package"
   echo "   --HotPlug stable/testing/unstable:"
   echo "      Install hotplug package"
   echo "   --Initrd-Tools stable/testing/unstable:"
   echo "      Install initrd-tools package"
   echo "   --Module-Tools stable/testing/unstable:"
   echo "      Install modconf and modutils package"
   echo ""
   echo "   --do_initrd:   Add 'initrd=/initrd.img' to /etc/lilo.conf"
   echo "   --vga16_off:   Add 'append=\"video=vga16:off\"' to /etc/lilo.conf"
   echo "   --support_acpi:   Add 'append=\"acpi=on apm=off\"' to /etc/lilo.conf"
   echo "   --with_pcmcia:   Install Kernel PCMCIA modules, For Kernel 2.4.x Only"
   echo "   --with_doc:   Install Kernel documents"
   echo "   --auto_reboot:   Reboot machine automatic after installation"
   echo ""
   exit 0
fi



for Parameter in $@
do
   # 使用 --Initrd-Tools stable/testing/unstable 來同時安裝 initrd-tools 套件。
   if [ "$CheckParameter" = 'Initrd-Tools' ]; then
      CheckParameter=""

      case "$Parameter" in
         stable|testing|unstable)
            echo ""
            echo "Install Initrd-Tools..."
            apt-get -t "$Parameter" install initrd-tools
            echo ""
            ;;
         *)
            echo ""
            echo "Usage : "$0" --Initrd-Tools stable/testing/unstable"
            echo "Please try again."
            echo ""
            exit 1
            ;;
      esac
      Pause
   fi

   if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--initrd-tools' ]; then
      CheckParameter="Initrd-Tools"
   fi


   # 使用 --HotPlug stable/testing/unstable 來同時安裝 hotplug 套件。
   if [ "$CheckParameter" = 'HotPlug' ]; then
      CheckParameter=""

      case "$Parameter" in
         stable|testing|unstable)
            echo ""
            echo "Install HotPlug..."
            apt-get -t "$Parameter" install hotplug
            echo ""
            ;;
         *)
            echo ""
            echo "Usage : "$0" --HotPlug stable/testing/unstable"
            echo "Please try again."
            echo ""
            exit 1
            ;;
      esac
      Pause
   fi

        if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--hotplug' ]; then
      CheckParameter="HotPlug"
   fi


   # 使用 --Module-Tools stable/testing/unstable 來同時安裝 modconf 及 modutils 套件。
   if [ "$CheckParameter" = 'Module-Tools' ]; then
      CheckParameter=""

      case "$Parameter" in
         stable|testing|unstable)
            echo ""
            echo "Install Module-Tools..."
            apt-get -t "$Parameter" install modconf modutils
            echo ""
            ;;
         *)
            echo ""
            echo "Usage : "$0" --Module-Tools stable/testing/unstable"
            echo "Please try again."
            echo ""
            exit 1
            ;;
      esac
      Pause
   fi
        if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--module-tools' ]; then
      CheckParameter="Module-Tools"
   fi


   # 使用 --GCC stable/testing/unstable 來同時安裝 GCC。編譯驅動模組時所必須的。
   if [ "$CheckParameter" = 'GCC' ]; then
      CheckParameter=""

      case "$Parameter" in
         stable|testing|unstable)
            echo ""
            echo "Install GCC..."
            apt-get -t "$Parameter" install gcc g++ g77
            echo ""
            ;;
         *)
            echo ""
            echo "Usage : "$0" --GCC stable/testing/unstable"
            echo "Please try again."
            echo ""
            exit 1
            ;;
      esac
      Pause
   fi

        if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--gcc' ]; then
      CheckParameter="GCC"
   fi


   # 使用 -do_initrd 來指定在 lilo.conf 中加入 initrd=/initrd.img
   if [ -n "$( echo " $@ " | grep -i -- ' --do_initrd ' )" ]; then
      echo ""
      echo "Adding 'initrd=/initrd.img' to /etc/lilo.conf..."
      if [ ! -f /etc/kernel-img.conf ]; then
         touch /etc/kernel-img.conf
      fi
   
      if [ -z "$(grep -i "do_initrd = yes" /etc/kernel-img.conf )" ]; then
         sed -e '/^image=\/vmlinuz$/a\
   initrd=\/initrd.img' /etc/lilo.conf > /tmp/lilo.conf.tmp
         mv /tmp/lilo.conf.tmp /etc/lilo.conf
      
         # 記錄以上動作己修改完成
      
         cat >> /etc/kernel-img.conf << EOF
do_initrd = yes
EOF
         echo "Done."
      else
         echo "It seems no need..."
      fi
      echo ""
      Pause
   fi


   # 使用 --vga16_off 來指定在 lilo.conf 中加入 append="video=vga16:off"
        if [ -n "$( echo " $@ " | grep -i -- ' --vga16_off ' )" ]; then
      echo ""
      echo "Add 'append=\"video=vga16:off\"' to /etc/lilo.conf..."
      if [ -z "$(grep "^append" /etc/lilo.conf )" ]; then
         sed -e '/^# append=\"\"$/a\
append=\"video=vga16:off\"' /etc/lilo.conf > /tmp/lilo.conf.tmp
         mv /tmp/lilo.conf.tmp /etc/lilo.conf
         echo "Done."
      else
         if [ -z "$(grep "^append" /etc/lilo.conf | grep 'video=vga16:off')" ]; then
            sed -e "s/^append=\"*\"/append=\"video=vga16:off /g" /etc/lilo.conf > /tmp/lilo.conf.tmp
            mv /tmp/lilo.conf.tmp /etc/lilo.conf
            echo "Done."
         else
            echo "It seems no need..."
         fi
      fi
      echo ""
      Pause
   fi


   # 使用 --support_acpi 來指定在 lilo.conf 中加入 append="acpi=on apm=off"
        if [ -n "$( echo " $@ " | grep -i -- ' --support_acpi ' )" ]; then
      echo ""
      echo "Add 'append=\"acpi=on apm=off\"' to /etc/lilo.conf..."
      if [ -z "$(grep "^append" /etc/lilo.conf )" ]; then
         sed -e '/^# append=\"\"$/a\
append=\"acpi=on apm=off\"' /etc/lilo.conf > /tmp/lilo.conf.tmp
         mv /tmp/lilo.conf.tmp /etc/lilo.conf
         echo "Done."
      else
         if [ -z "$(grep "^append" /etc/lilo.conf | grep 'acpi=on apm=off')" ]; then
            sed -e "s/^append=\"*\"/append=\"acpi=on apm=off /g" /etc/lilo.conf > /tmp/lilo.conf.tmp
            mv /tmp/lilo.conf.tmp /etc/lilo.conf
             echo "Done."
         else
            echo "It seems no need..."
         fi
      fi
      echo ""
      Pause
   fi


   # 使用 --Kernel KernelPackageName 來指定 Kernel Image 的套件名稱。
   if [ "$CheckParameter" = 'Kernel' ]; then
      CheckParameter=""
      KernelPacakgeName="$Parameter"
   fi

        if [ $(echo "$Parameter" | tr [A-Z] [a-z]) = '--kernel' ]; then
      CheckParameter="Kernel"
   fi

done


# 安裝 Kernel Image
if [ -z "$KernelPacakgeName" ]; then
   echo ""
   echo "$0: Missing Kernel-Version."
   echo "Try $0 --help for more options..."
   echo ""
   exit 1
fi

KernelVersion=$(echo $KernelPacakgeName | cut -d "-" -f 1)

echo ""
echo "New Kernel Version = $KernelVersion"
echo "New Kernel Package Version = $KernelPacakgeName"
Pause

apt-get install kernel-image-$KernelPacakgeName
Pause

# 安裝 Kernel PCMCIA Modules
if [ -n "$( echo " $@ " | grep -i -- ' --with_pcmcia ' )" ]; then
   apt-get install kernel-pcmcia-modules-$KernelPacakgeName
   Pause
fi

# 安裝 Kernel Headers,很多軟體在編繹時都用得到!
# 這樣就不用下載整個 Kernel 的原始碼了。
apt-get install kernel-headers-$KernelPacakgeName

if [ -d /usr/src/linux ]; then
   rm -R /usr/src/linux
fi
if [ -f /usr/src/linux ]; then
   rm /usr/src/linux
fi
if [ -d /usr/src ]; then
   ln -s /usr/src/kernel-headers-$KernelPacakgeName /usr/src/linux-$KernelVersion
   ln -s /usr/src/kernel-headers-$KernelPacakgeName /usr/src/linux-$KernelPacakgeName
fi
if [ -d /lib/modules/$KernelPacakgeName ]; then
   cd /lib/modules/$KernelPacakgeName
   ln -s /usr/src/kernel-headers-$KernelPacakgeName build
fi


# 將新的開機設定寫入磁碟中
# 注意:apt-get 指令現在似乎會自動替您做這件事!不過再做一次比較保險。

lilo -v -v -v
Pause


# 順便把相關文件也安裝進來
if [ -n "$( echo " $@ " | grep -i -- ' --with_doc ' )" ]; then
   apt-get install kernel-doc-$KernelVersion
   Pause
fi

# 好囉,請自行重新開機,讓新的 Kernel 開始運作。
if [ -n "$( echo " $@ " | grep -i -- ' --auto_reboot ' )" ]; then
   reboot
fi


我想,
這篇內容對版上大多數的人而言實是不值一哂;
不過有需要的人不妨參考看看吧!


對了,
順便慶祝一下個人的第 1,500 篇...
要灌水灌到 1,500 篇可真不是件易事呀!
(路人:不行!這小子開始驕傲起來了...)
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:如何昇級 Debian 官方的 Kernel...

文章timeriver » 週一 6月 07, 2004 6:45 pm

再幫忙補充一點(建議)
下次如果可以的話把此分享文件預設之 debian 套件環境註解清楚
並且把步驟編號一下

譬如:我現在使用 stable , 想要用 testing 的 kernel 2.6
所以必須更改 sources.list 才找的到 kernel 2.6
既然已經是寫給新手看了,可以寫的更詳細一點呢 ;-)

如果是寫給新手的文章,就該假設他什麼都不會才對
盡可能的詳細
"Hope deffered makes the heart sick. But when dreams come true.There is life and joy" proverbs 13:12
timeriver
懵懂的國中生
懵懂的國中生
 
文章: 106
註冊時間: 週三 3月 31, 2004 12:02 am
來自: 基隆

re:如何昇級 Debian 官方的 Kernel...

文章Tetralet » 週二 6月 08, 2004 8:41 am

雖然個人是認為,
您所提到的應該是屬於 apt 相關指令的範圍呢!

不過,
還是非常謝謝您的提醒。

如果對 apt 相關指令有興趣者,
請參考:

 http://moto.debian.org.tw/viewtopic.php?t=1469
 http://moto.debian.org.tw/viewtopic.php?t=1244
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm


回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客