顯示具有 linux 核心 標籤的文章。 顯示所有文章
顯示具有 linux 核心 標籤的文章。 顯示所有文章

2013年11月11日 星期一

使用 qemu 啟動虛擬 ARM 機器

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,並觀察能否上網。

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,非常適合伺服器/嵌入式系統中使用。
我們要下載並安裝之核心為 longterm 版本,在官方網站中又有兩個版本的核心可以下載,分別是 3.X 以及 4.X 之核心,由於我們要在 Xeon 等級的 CPU 上執行此核心,因此可以挑選 4.X longterm 版本核心,以目前 (2016/10/3) 來說,我們選擇 4.4.23 版之 Linux 核心來進行編譯。


如何編核心

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 (以上) 為主。

請安裝

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

這表示上述三個命令都聯結到 4.8 版,全部的聯結版本都要一致才行。檢查方式是執行:

$ 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 核心編譯的設定畫面。


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



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

如果安裝過程中有一些 missing firmware 的訊息,這是表示某些 firmware 沒有裝的意思,請直接安裝此套件,再重裝一次核心即可修正。

6. 重新開機 -> 正常開機(OK)
            -> 當機(以舊版核心重開,設法解決問題)