0. 先以 qemu 安裝 ARM 版 Debian Linux 至 arm.img
檔案位置:
~/qemu_image/ -> 所有虛擬 ARM 檔案目錄
/arm.img -> 虛擬 ARM 硬碟映像檔
/vmlinuz-3.2.0-4-versatile -> ARM 開機核心
/initrd.img-3.2.0-4-versatile -> ARM 開機 initrd
/runarm.sh -> 開機 script
0. 先執行底下指令:
# losetup -a
此時會看到目前沒有輸出。
1. 接著將開機核心擷取出來:
# losetup /dev/loop0 arm.img
再執行
# losetup -a
其輸出如下:
/dev/loop0: [0831]:31198060 (/home/herman/qemu_image/arm.img)
這表示 /dev/loop0 與 arm.img 已經連接 (attach) 在一起,之後我們可以使用 fdisk -lu /dev/loop0 來觀看是否為當初安裝時所分割的磁區:
Device Boot Start End Blocks Id System
/dev/loop0p1 2048 3913727 1955840 83 Linux
/dev/loop0p2 3915774 4192255 138241 5 Extended
/dev/loop0p5 3915776 4192255 138240 82 Linux swap / Solaris
開機核心位於 ?
/boot
因此,我們要將 /dev/loop0p1 掛載上來,再至其 boot 目錄擷取 ARM 版 Linux 核心及 initrd。
losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0
接著我們可以將 /dev/loop1 掛載至 /mnt 目錄下:
mount /dev/loop1 /mnt
掛載完後可以執行 df -h /mnt 來觀看結果:
檔案系統 容量 已用 可用 已用% 掛載點
/dev/loop1 1.9G 506M 1.3G 30% /mnt
接著可以至 /mnt/boot 目錄下擷取 Linux 核心
cp /mnt/boot/initrd.img-3.2.0-4-versatile .
cp /mnt/boot/vmlinuz-3.2.0-4-versatile .
如此一來即完成核心擷取,接下來可以進行開機作業。
2. 使用 qemu 來開機
請將底下指令另存 runarm.sh 以便進行開機:
qemu-system-arm -M versatilepb -m 512 \
-kernel ./vmlinuz-3.2.0-4-versatile \
-initrd ./initrd.img-3.2.0-4-versatile \
-hda arm.img \
-append "root=/dev/sda1"
接著請執行 sh runarm.sh
3. 登入系統,確定我們是在 ARM 的機器中
請在登入畫面使用 root 帳號、密碼,看能不能登入,並執行
cat /proc/cpuinfo
來觀看 CPU 狀態。
如果在 qemu 視窗中點擊滑鼠將會使 qemu 把滑鼠「抓走」,此時我們要按
Ctrl+Alt 讓 qemu 將滑鼠「釋放」出來,否則會沒有遊標可用,要確定目前
滑鼠是否有被 qemu 抓走請看 qemu 之狀態列。
在 qemu 畫面下按 Ctrl+Alt+f 可以放大/縮小全螢幕狀態。
4. 安裝 arm 的 Xwindow,並進入 Xwindow 環境
4.1 將 /etc/apt/sources.list 中的鏡像站改至校內:
加上這兩行
deb ftp://120.117.72.71/debian wheezy main contrib non-free
deb ftp://120.117.72.71/debian wheezy-updates main contrib non-free
將 deb-src 註解,保留 security.debian.org 設定
修改完畢後執行 apt-get update
再安裝 xorg icewm 套件
4.2 安裝完畢後以一般 user 登入
登入完畢後執行
startx
看看能不能進入 Xwindow
5. 清除已安裝之 .deb 檔案
# apt-get clean
清除完畢可以執行 df -h 來看目前磁碟空間
6. 依照 X86 流程,安裝 iceweasel,並觀察能否上網。
2013年11月11日 星期一
2012年5月23日 星期三
自編 Linux 核心
自編 Linux 核心
為什麼要自己編 Linux 核心 ?
缺點:程度還沒到那邊的人,編出來的核心有時候開機會當機。
優點:
1. 修正舊核心的 bug
2. 支援新的硬體
3. 針對自己主機的硬體進行最佳化
4. 關閉不必要的核心模組,精簡編譯完之核心大小
如何挑核心
Linux 有一個存放核心的官方網站 (https://www.kernel.org/),在此網站中會有各個版本的最新核心,我們為了要調整自己使用機器之效能,因此必須要自行編譯核心,在核心官方網站中有三個種類的核心可下載,分別是:
- mainline - 目前開發版本,主要目的是加入新功能及測試,不建議在伺服器/嵌入式系統中使用,以免有未修正之 bug 導致機器不穩。
- stable - 穩定版核心,可提供日常使用
- longterm - 此版核心又稱為 LTS (Long Term Support - 長期支援) 核心,主要目的在於修正已知 bug,非常適合伺服器/嵌入式系統中使用。
如何編核心
1. 安裝程式編譯環境
2. 安裝核心編譯環境
3. 下載核心
4. 編譯核心
5. 安裝核心
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
1. 安裝程式編譯環境
編譯 Linux 核心主要會使用到 GCC,在安裝 GCC 之前,我們可以看一下目前系統的 Linux 核心是由那一版的 GCC 所編譯完成,請執行:
$ dmesg | more
可以看到底下片段:
[ 0.000000] Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01
-17)
此訊息告訴我們 Linux 核心是由 gcc 4.8.4 所編譯完成,因此如果我們安裝 GCC 的話,以 4.8.4 (以上) 為主。
編譯 Linux 核心主要會使用到 GCC,在安裝 GCC 之前,我們可以看一下目前系統的 Linux 核心是由那一版的 GCC 所編譯完成,請執行:
$ dmesg | more
可以看到底下片段:
[ 0.000000] Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01
-17)
此訊息告訴我們 Linux 核心是由 gcc 4.8.4 所編譯完成,因此如果我們安裝 GCC 的話,以 4.8.4 (以上) 為主。
請安裝
gcc-4.8
cpp-4.8
g++-4.8
這三個套件,其中每個套件各有兩個版本:
gcc
gcc-4.8
gcc-4.9
cpp
cpp-4.8
cpp-4.9
g++
g++-4.8
g++-4.9
我們可以在 /usr/bin 目錄中看到目前的版本為何,或是執行以下指令:
gcc -v
cpp -v
g++ -v
如果我們至 /usr/bin 目錄下執行
ls -l gcc* cpp* g++*
會看到以下輸出:
lrwxrwxrwx 1 root root 7 3月 4 10:05 cpp -> cpp-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 cpp-4.8
-rwxr-xr-x 1 root root 833080 12月 26 2014 cpp-4.9
lrwxrwxrwx 1 root root 7 3月 4 10:05 g++ -> g++-4.8
-rwxr-xr-x 1 root root 776696 12月 20 2014 g++-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 gcc -> gcc-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 gcc-4.8
-rwxr-xr-x 1 root root 24736 12月 20 2014 gcc-ar-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-nm-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-ranlib-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 cpp -> cpp-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 cpp-4.8
-rwxr-xr-x 1 root root 833080 12月 26 2014 cpp-4.9
lrwxrwxrwx 1 root root 7 3月 4 10:05 g++ -> g++-4.8
-rwxr-xr-x 1 root root 776696 12月 20 2014 g++-4.8
lrwxrwxrwx 1 root root 7 3月 4 10:05 gcc -> gcc-4.8
-rwxr-xr-x 1 root root 772600 12月 20 2014 gcc-4.8
-rwxr-xr-x 1 root root 24736 12月 20 2014 gcc-ar-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-nm-4.8
-rwxr-xr-x 1 root root 24704 12月 20 2014 gcc-ranlib-4.8
這表示上述三個命令都聯結到 4.8 版,全部的聯結版本都要一致才行。檢查方式是執行:
$ gcc -v
$ g++ -v
$ cpp -v
$ gcc -v
$ g++ -v
$ cpp -v
來觀看版本編號,安裝完畢後請編譯 hello.c,指令如下:
gcc hello.c -o hello
再執行
./hello
如果出現 Hello world!! 即代表我們的程式編譯環境安裝 OK!!
2. 安裝核心編譯環境
請安裝以下套件才可編譯核心
kernel-package
libncurses5-dev
bzip2
xz-utils
3. 下載核心
國內 Linux 核心映站在:
linux.cdpa.nsysu.edu.tw (與底下那台合併了)
ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v4.x/
ftp.isu.edu.tw
請將 Linux 核心下載至 /usr/src 目錄,我們以 4.4.23 為例,請下載
linux-4.4.23.tar.xz
附帶一提:xz 格式是目前壓縮率最高之非失真壓縮演算法
(失真壓縮演算法->jpg)
3.5 解壓縮
請在 /usr/src 目錄執行:
/usr/src/ # tar xfva linux-4.4.23.tar.xz
此時會出現一個 linux-4.4.23 的目錄,我們要建一個 link
/usr/src/ # ln -s linux-4.4.23 linux
4. 編譯核心
a. /usr/src # cd linux
a.5 複製已存在核心編譯參數,注意那個點!!
/usr/src/linux # cp /boot/config-3.16.0-4-amd64 .config
b. 設定編譯核心參數
/usr/src/linux # make menuconfig
General setup --->
Kernel compression mode (XZ) --->
Processor type and features --->
Processor family (Core 2/newer Xeon) --->
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) ---
IP: Netfilter Configuration ---> M
IPv6: Netfilter Configuration ---> M
修改完畢後退出 Linux 核心編譯的設定畫面。
/usr/src/linux # make menuconfig
General setup --->
Kernel compression mode (XZ) --->
Processor type and features --->
Processor family (Core 2/newer Xeon) --->
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) ---
IP: Netfilter Configuration ---> M
IPv6: Netfilter Configuration ---> M
c. time make-kpkg --initrd --revision=1.0.lpm kernel_image -j8
編譯完成後,你會有一個檔案叫:
/usr/src/linux-image-4.4.23_1.0.lpm_amd64.deb
我們再來安裝此檔即可,安裝指令如下:
/usr/src # dpkg -i linux-image-4.4.23_1.0.lpm_amd64.deb
/usr/src # dpkg -i linux-image-4.4.23_1.0.lpm_amd64.deb
d. 我們編譯到一半如果出現錯誤的話,該如何解決 ? 例如:
H16TOFW firmware/matrox/g200_warp.fw
H16TOFW firmware/matrox/g400_warp.fw
make[1]: Leaving directory `/usr/src/linux-3.3.7'
/usr/bin/make -j2 ARCH=i386 \
-C Documentation/lguest
make: *** Documentation/lguest: 沒有此一檔案或目錄. Stop.
make: *** [debian/stamp/build/kernel] Error 2
real 38m37.627s
user 65m58.119s
sys 5m21.180s
上述的問題是 LGUEST 不存在,因此我們看 .config 這檔案,將裡面的 LGUEST 設定
完全註記,再重新執行一次 make menuconfig (回到步驟 b)。
5. 安裝核心
/usr/src# dpkg -i linux-image-4.1.18_1.0.lpm_amd64.deb
其畫面如下:
選取了原先未選的套件 linux-image-4.1.18。
(讀取資料庫 ... 目前共安裝了 79198 個檔案和目錄。)
Preparing to unpack linux-image-4.1.18_1.0.lpm_amd64.deb ...
Done.
Unpacking linux-image-4.1.18 (1.0.lpm) ...
設定 linux-image-4.1.18 (1.0.lpm) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.1.18 /boot/vmlinuz-4.1.18
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.1.18 /boot/vmlinuz-4.1.18
update-initramfs: Generating /boot/initrd.img-4.1.18
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.1.18 /boot/vmlinuz-4.1.18
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.1.18
Found initrd image: /boot/initrd.img-4.1.18
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done
/usr/src# dpkg -i linux-image-4.1.18_1.0.lpm_amd64.deb
其畫面如下:
選取了原先未選的套件 linux-image-4.1.18。
(讀取資料庫 ... 目前共安裝了 79198 個檔案和目錄。)
Preparing to unpack linux-image-4.1.18_1.0.lpm_amd64.deb ...
Done.
Unpacking linux-image-4.1.18 (1.0.lpm) ...
設定 linux-image-4.1.18 (1.0.lpm) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.1.18 /boot/vmlinuz-4.1.18
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.1.18 /boot/vmlinuz-4.1.18
update-initramfs: Generating /boot/initrd.img-4.1.18
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.1.18 /boot/vmlinuz-4.1.18
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.1.18
Found initrd image: /boot/initrd.img-4.1.18
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done
如果安裝過程中有一些 missing firmware 的訊息,這是表示某些 firmware 沒有裝的意思,請直接安裝此套件,再重裝一次核心即可修正。
6. 重新開機 -> 正常開機(OK)
-> 當機(以舊版核心重開,設法解決問題)
訂閱:
文章 (Atom)