Qemu 是建置虛擬電腦教室環境中不可或缺的工具,我們所使用的 Qemu 是自行編譯下載,在執行時可能會出現底下錯誤需要處理:
設定qemu-bridge-helper 權限
qemu-bridge-helper 需要有 root 的權限才能執行,如果沒有 root 權限的話在啟動 qemu 時會出現底下錯誤訊息
failed to create tun device: Operation not permitted
failed to launch bridge helper
qemu-system-x86_64: -net bridge,br=br10: Device 'bridge' could not be initialized
由於我們希望給一般使用者執行 qemu-bridge-helper 的權限,而其安裝目錄在 /usr/local/libexec,我們可以執行底下指令以觀看此檔權限:
ls -l /usr/local/libexec/qemu-bridge-helper
其輸出如下所示:
-rwxr-xr-x 1 root staff 39624 Mar 8 00:08 qemu-bridge-helper
為了讓一般使用者可以執行,此檔案必須具有 SETUID,如此一來才有可以執行之權限,請執行底下指令來設定:
chmod u+s /usr/local/libexec/qemu-bridge-helper
此時再觀察其屬性,其輸出如下所示:
-rwsr-xr-x 1 root staff 39624 Mar 8 00:08 qemu-bridge-helper
我們可以發現其屬性由 rwxr-xr-x 改成 rw{\bf s}r-xr-x,這表示此檔已具有 SEDUID 屬性,可以提供一般使用者使用了。
設定可執行之橋接網路權限
在 Qemu 執行時,會檢查 /usr/local/etc/qemu/bridge.conf 中之權限,如果沒(有)設定的話,在執行 Qemu 時會出現底下的錯誤訊息:
access denied by acl file
failed to launch bridge helper
qemu-system-x86_64: -net bridge,br=br10: Device 'bridge' could not be initialized
以本書來說,所要支援之橋接網路介面為 br10,因此我們必須在 /usr/local/etc/qemu/bridge.conf 檔中增加一行 allow br10 之設定,如底下所示。
allow br0
allow br1
allow br2
allow br10
上述設定是說橋接網路介面 br0、br1、br2 以及 br10 都可以使用,此時我們再執行 Qemu 的話就不會(有)先前的錯誤訊息了。
找不到 bios.bin
如果在執行 qemu 時出現底下錯誤,那表示 seabios 沒有安裝或是作正確的連結。
qemu: could not load PC BIOS 'bios.bin'
要解決此問題,請先安裝 seabios 套件,然後以 root 權限在 /usr/local/share/qemu 目錄下執行:
/usr/local/share/qemu# ln -sf /usr/share/seabios/*.bin .
找不到 kvmvapic.bin
如果在執行 qemu 時出現底下錯誤,那表示 seabios 沒有安裝或是作正確的連結。
Could not open option rom 'kvmvapic.bin': No such file or directory
要解決此問題,請先安裝 seabios 套件,然後以 root 權限在 /usr/local/share/qemu 目錄下執行:
/usr/local/share/qemu# ln -sf /usr/share/seabios/optionrom/*.bin .
2014年3月27日 星期四
安裝、設定 PXE Server
#2019/09/23 修訂
PXE 開機伺服器建置
從現在開始我們要進行虛擬電腦教室的安裝,有關所有檔案的定義請參考下圖:
安裝 qemu 套件
請以 root 權限安裝 qemu-utils qemu-system-x86 套件,指令如下:
# apt-get install qemu-utils qemu-system-x86
裝完之後請以一般使用者權限執行
$ qemu-img --help
開機之問題排除
當我們執行 qemu 時,會出現底下錯誤:
qemu: could not load PC BIOS 'bios.bin'
這是因為 qemu 在執行時會使用到一些 BIOS 的檔案,這些檔案在 qemu 中並未提供,而是要安裝 seabios 套件,因此請執行
apt-get install seabios
將 seabios 套件安裝,並且在 /usr/local/share/qemu 作連結,指令如下:
# ln -sf /usr/share/bios/*.bin
作好連結後再啟動 runpxe.sh,此時即可順利進入 qemu 畫面,並讓 pxe server 順利開機。
一旦 Qemu 可以正常執行之後,我們即可立即動手建立虛擬電腦教室中的第一台電腦,這台電腦將會是整間虛擬電腦教室的 pxe、dhcp 以及安裝伺服器,我們將此電腦命名為 pxeserver。
PXE Server 影像檔建置
PXE Server 並不需要太大的硬碟空間,因此我們設定一個 2GB 大小的影像檔即可,這個檔案我們命名為 pxeserver.img,請執行底下指令來建立此影像檔。
~/virtualclassroom $ qemu-img create pxeserver.img 2G -f qcow2
建立完畢後,我們可以執行 ls -l pxeserver.img 來觀看此檔案,其輸出如下所示:
-rw-r--r-- 1 hunter hunter 2147483648 3月 27 20:23 pxeserver.img
乍看之下 pxeserver.img 的大小為 2 GB (2147483648 bytes),但是如果我們以 du 這個指令來觀看其大小如底下所示:
du -sh pxeserver.img
會發現其輸出為 0 如底下所示,這是因為 qemu-img 所建立的檔案是一個會長大的檔案,一開始新建的檔案大小為 0,而當我們使用此檔來進行作業系統安裝時,它會隨著容量的增加而(自)己長大,一直到 2 GB 為止。
0 pxeserver.img
安裝 Debian X86_64 作業系統
接下來要開始使用 Qemu 安裝 Debian X86_64 作業系統(至) pxeserver.img,安裝「標準系統工具」即可,其它套件例如桌面環境 (Debian desktop environment) 等不必安裝,以節省空間。
請把 Debian 的 ISO 檔放在 /opt/iso/debian-8.3.0-amd64-CD-1.iso
然後執行:
~/virtualclassroom $ qemu-system-x86_64 -enable-kvm -m 2048 -cpu host -smp 2 -drive file=pxeserver.img,format=qcow2 -cdrom /opt/iso/debian-10.1.0-amd64-netinst.iso -boot d
我們可以另外編輯一個 buildpxe.sh 的檔案,其內容如下:
qemu-system-x86_64 -enable-kvm -m 2048 -cpu host -smp 2 \
-drive file=pxeserver.img,format=qcow2 \
-cdrom /opt/iso/debian-10.1.0-amd64-netinst.iso \
-boot d
然後在 ~/virtualclassroom 目錄中執行 sh buildpxe.sh 即可。請安裝 base install,硬碟讓系統自動幫你分割。
啟動 PXE Server
建立好 PXE Server 之後,我們可以另外使用 runpxe.sh 來啟動 PXE Server,其內容如下所示。
# IP=192.168.10.254
# PXE Server
CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
CDROM=/opt/iso/debian-10.1.0-amd64-netinst.iso
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-drive file=$HDA,format=qcow2 \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE \
-boot c
此訊息是因為 qemu bridge helper 這個檔案的權限不足所致,因此我們要自行設定此檔案有 u+s 的權限,請以 root 權限切換至 /usr/lib/qemu 底下有一個 qemu-bridge-helper 的檔案,其屬性如下:
/usr/lib/qemu# ls -l
總計 16
-rwxr-xr-x 1 root root 14328 8月 9 18:41 qemu-bridge-helper
PXE 開機伺服器建置
從現在開始我們要進行虛擬電腦教室的安裝,有關所有檔案的定義請參考下圖:
安裝 qemu 套件
請以 root 權限安裝 qemu-utils qemu-system-x86 套件,指令如下:
# apt-get install qemu-utils qemu-system-x86
裝完之後請以一般使用者權限執行
$ qemu-img --help
開機之問題排除
當我們執行 qemu 時,會出現底下錯誤:
qemu: could not load PC BIOS 'bios.bin'
這是因為 qemu 在執行時會使用到一些 BIOS 的檔案,這些檔案在 qemu 中並未提供,而是要安裝 seabios 套件,因此請執行
apt-get install seabios
將 seabios 套件安裝,並且在 /usr/local/share/qemu 作連結,指令如下:
# ln -sf /usr/share/bios/*.bin
作好連結後再啟動 runpxe.sh,此時即可順利進入 qemu 畫面,並讓 pxe server 順利開機。
一旦 Qemu 可以正常執行之後,我們即可立即動手建立虛擬電腦教室中的第一台電腦,這台電腦將會是整間虛擬電腦教室的 pxe、dhcp 以及安裝伺服器,我們將此電腦命名為 pxeserver。
PXE Server 影像檔建置
PXE Server 並不需要太大的硬碟空間,因此我們設定一個 2GB 大小的影像檔即可,這個檔案我們命名為 pxeserver.img,請執行底下指令來建立此影像檔。
~/virtualclassroom $ qemu-img create pxeserver.img 2G -f qcow2
建立完畢後,我們可以執行 ls -l pxeserver.img 來觀看此檔案,其輸出如下所示:
-rw-r--r-- 1 hunter hunter 2147483648 3月 27 20:23 pxeserver.img
乍看之下 pxeserver.img 的大小為 2 GB (2147483648 bytes),但是如果我們以 du 這個指令來觀看其大小如底下所示:
du -sh pxeserver.img
會發現其輸出為 0 如底下所示,這是因為 qemu-img 所建立的檔案是一個會長大的檔案,一開始新建的檔案大小為 0,而當我們使用此檔來進行作業系統安裝時,它會隨著容量的增加而(自)己長大,一直到 2 GB 為止。
0 pxeserver.img
安裝 Debian X86_64 作業系統
接下來要開始使用 Qemu 安裝 Debian X86_64 作業系統(至) pxeserver.img,安裝「標準系統工具」即可,其它套件例如桌面環境 (Debian desktop environment) 等不必安裝,以節省空間。
請把 Debian 的 ISO 檔放在 /opt/iso/debian-8.3.0-amd64-CD-1.iso
然後執行:
~/virtualclassroom $ qemu-system-x86_64 -enable-kvm -m 2048 -cpu host -smp 2 -drive file=pxeserver.img,format=qcow2 -cdrom /opt/iso/debian-10.1.0-amd64-netinst.iso -boot d
我們可以另外編輯一個 buildpxe.sh 的檔案,其內容如下:
qemu-system-x86_64 -enable-kvm -m 2048 -cpu host -smp 2 \
-drive file=pxeserver.img,format=qcow2 \
-cdrom /opt/iso/debian-10.1.0-amd64-netinst.iso \
-boot d
然後在 ~/virtualclassroom 目錄中執行 sh buildpxe.sh 即可。請安裝 base install,硬碟讓系統自動幫你分割。
啟動 PXE Server
建立好 PXE Server 之後,我們可以另外使用 runpxe.sh 來啟動 PXE Server,其內容如下所示。
# IP=192.168.10.254
# PXE Server
CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
CDROM=/opt/iso/debian-10.1.0-amd64-netinst.iso
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-drive file=$HDA,format=qcow2 \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE \
-boot c
如果不曉得要怎麼生虛擬 MAC Address 的可以至 https://miniwebtool.com/mac-address-generator/ 網址自己產生一個。
儲存完畢後執行:
~/virtualclassroom $ sh runpxe.sh
failed to create tun device: Operation not permitted
qemu-system-x86_64: -net bridge,br=br10: bridge helper failed
/usr/lib/qemu# ls -l
總計 16
-rwxr-xr-x 1 root root 14328 8月 9 18:41 qemu-bridge-helper
請以 root 權限執行:
/usr/lib/qemu# chmod u+s qemu-bridge-helper
作完之後其屬性為:
ls -l
總計 16
-rwsr-xr-x 1 root root 14328 8月 9 18:41 qemu-bridge-helper
接著恢復一般使用者權限執行:
~/virtualclassroom $ sh runpxe.sh
access denied by acl file
qemu-system-x86_64: -net bridge,br=br10: bridge helper failed
~/virtualclassroom $ sh runpxe.sh
access denied by acl file
qemu-system-x86_64: -net bridge,br=br10: bridge helper failed
此時會有另一個錯誤訊息叫 access denied by acl file,要解決這個問題,必須以 root 權限在 /etc/qemu 目錄底下新增一個 bridge.conf,裡面的內容是:
allow br10
然後再以一般使用者權限執行:
~/virtualclassroom $ sh runpxe.sh
此時應該可以看到 pxe 這台虛擬機正確啟動,沒有問題。PXE 伺服器啟動後,我們來驗收一下系統,請執行:
$ cat /proc/cpuinfo
$ free -h
$ df -h
來看 CPU、記憶體以及硬碟空間。
$ cat /proc/cpuinfo
$ free -h
$ df -h
來看 CPU、記憶體以及硬碟空間。
2014年3月13日 星期四
如何在 Qemu 環境下使用 tun/tap 設定以與外界連繫 ?
前言,要使用 VM (虛擬機器) 的一個相當重要的前提是外界可以連到我們的 VM,因此需要使用到 tun tap 來進行設定,以下我們將介紹如何在 Debian 底下以 Qemu 架設 VM,再來與外界連繫。
什麼是 tun tap ?
http://www.ibm.com/developerworks/cn/linux/l-tuntap/index.html
首先請先確認你的機器中有載入 tun 模組,指令如下:
lsmod |grep tun
如果有載入 tun 模組的話,那麼會有底下的輸出:
tun 16887 13
萬一沒有的話,可以使用 root 權限執行
modprobe tun
來載入此模組。我們可以觀察底下檔案
/dev/net/tun
來看看是否有 tun 裝置。其輸出如下:
crw-rw-rwT 1 root root 10, 200 12月 30 15:03 /dev/net/tun
理論上,你的 tun 裝置現在的 owner 及 group 都是 root,這對我們執行虛擬機器有
很大安全漏洞,因為使用者要使用 tun 裝置必須將其加入 root 群組才行,但是把一般
使用者加入 root 群組讓這個使用者擁有不必要的 root 權限。為了系統安全著想,我
們特別新增一個 kvm 的群組,並且讓所有人(包括裝置)都以 kvm 群組為內定權限來開
啟虛擬機器。並將 /dev/net/tun 之群組改為 kvm,如底下所示:
crw-rw-rwT 1 root kvm 10, 200 11月 11 08:42 /dev/net/tun
新增群組 groupadd kvm
設定群組 chgrp kvm /dev/net/tun
觀看使用群組 id username
該 user 必須要有一個次群組為 kvm 才行,如下所示:
id herman
uid=1000(herman) gid=1000(herman) groups=1000(herman),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1001(kvm),120(uml-net),500(nfsuser),501(ftp),502(qemu)
Q: 萬一你的 Linux 核心沒有 tun 模組怎麼辦 ?
A: 自己編 Linux 核心,並將 tun 編譯成模組。
接下來請以 qemu 執行虛擬機器,指令如下:
qemu-system-x86_64 -enable-kvm -m 1024 -hda linux1.img -net nic -net bridge,br=br1
成功的話,我們可以在實體機器上 ping 虛擬機器,也可以在虛擬機器上 ping 實體機器,而此時虛擬機器要以 192.168.1.xx 為 IP。
什麼是 tun tap ?
http://www.ibm.com/developerworks/cn/linux/l-tuntap/index.html
首先請先確認你的機器中有載入 tun 模組,指令如下:
lsmod |grep tun
如果有載入 tun 模組的話,那麼會有底下的輸出:
tun 16887 13
萬一沒有的話,可以使用 root 權限執行
modprobe tun
來載入此模組。我們可以觀察底下檔案
/dev/net/tun
來看看是否有 tun 裝置。其輸出如下:
crw-rw-rwT 1 root root 10, 200 12月 30 15:03 /dev/net/tun
理論上,你的 tun 裝置現在的 owner 及 group 都是 root,這對我們執行虛擬機器有
很大安全漏洞,因為使用者要使用 tun 裝置必須將其加入 root 群組才行,但是把一般
使用者加入 root 群組讓這個使用者擁有不必要的 root 權限。為了系統安全著想,我
們特別新增一個 kvm 的群組,並且讓所有人(包括裝置)都以 kvm 群組為內定權限來開
啟虛擬機器。並將 /dev/net/tun 之群組改為 kvm,如底下所示:
crw-rw-rwT 1 root kvm 10, 200 11月 11 08:42 /dev/net/tun
新增群組 groupadd kvm
設定群組 chgrp kvm /dev/net/tun
觀看使用群組 id username
該 user 必須要有一個次群組為 kvm 才行,如下所示:
id herman
uid=1000(herman) gid=1000(herman) groups=1000(herman),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),1001(kvm),120(uml-net),500(nfsuser),501(ftp),502(qemu)
Q: 萬一你的 Linux 核心沒有 tun 模組怎麼辦 ?
A: 自己編 Linux 核心,並將 tun 編譯成模組。
接下來請以 qemu 執行虛擬機器,指令如下:
qemu-system-x86_64 -enable-kvm -m 1024 -hda linux1.img -net nic -net bridge,br=br1
成功的話,我們可以在實體機器上 ping 虛擬機器,也可以在虛擬機器上 ping 實體機器,而此時虛擬機器要以 192.168.1.xx 為 IP。
如何在 Linux 底下建立橋接介面給虛擬機器使用
#2019/09/23 修訂
0. 原始網路介面:enp2s0
1. 安裝需要軟體 aptitude install bridge-utils uml-utilities
安裝完畢後我們即可使用 brctl 這個指令來觀察/新增/移除橋接網路介面。
2. 請以 root 權限執行
brctl
其輸出如下所示:
Usage: brctl [commands]
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
hairpin <bridge> <port> {on|off} turn hairpin on/off
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show [ <bridge> ] show a list of bridges
showmacs <bridge> show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> {on|off} turn stp on/off
a. 觀看橋接介面資訊:
我們可以執行
brctl show
來觀看目前橋接介面狀態,因為目前為止沒有任何橋接介面存在,因此其輸出如下:
bridge name bridge id STP enabled interfaces
b. 建立空的網路橋接介面
brctl addbr br0
建立完畢後再執行 brctl show,其輸出如下:
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
請注意最右邊的 interfaces 欄位底下是空的。
或是執行 ip addr show 可以顯示其結果,其輸出如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:24:1d:12:5c:c7 brd ff:ff:ff:ff:ff:ff
inet 120.117.72.71/25 brd 120.117.72.127 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::224:1dff:fe12:5cc7/64 scope link
valid_lft forever preferred_lft forever
3: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
link/ether 8a:f7:14:d0:e3:54 brd ff:ff:ff:ff:ff:ff
上述兩種輸出我們都可以看到有新增一個介面叫 br0,這就是所謂的橋接網路介面。
3. 將 br0 橋接給 eth0 使用
brctl addif br0 eth0
eth0 -> br0 -> internet
此時我們再執行
brctl show
會出現
bridge name bridge id STP enabled interfaces
br0 8000.00241d125cc7 no eth0
這告訴我們目前 eth0 已加入 br0 橋接網路介面中。
接下來我們可以執行一些網路指令來觀看目前網路設定狀況:
3.1 ifconfig
其輸出如下:
br0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:31862 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8351683 (7.9 MiB) TX bytes:762 (762.0 B)
eth0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
inet addr:120.117.72.71 Bcast:120.117.72.127 Mask:255.255.255.128
inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:92871708 errors:0 dropped:27 overruns:0 frame:0
TX packets:116756678 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:59143957987 (55.0 GiB) TX bytes:143394438170 (133.5 GiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:854820 errors:0 dropped:0 overruns:0 frame:0
TX packets:854820 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:72657228 (69.2 MiB) TX bytes:72657228 (69.2 MiB)
3.2 route (觀看目前主機路由) -> 什麼叫主機路由 ?
其輸出如下:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 120.117.72.126 0.0.0.0 UG 0 0 0 eth0
120.117.72.0 * 255.255.255.128 U 0 0 0 eth0
但是現在網路會出現連線的問題,因此我們要再修改一下。
4. 修改網路設定,使其開機後能自動 bridge
編輯 /etc/network/interfaces,將 eth0 由 底下片段:
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 120.117.72.71
netmask 255.255.255.128
gateway 120.117.72.126
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 120.117.2.1
dns-search eecs.stust.edu.tw
改為:
# The primary network interface
#allow-hotplug eth0
#iface eth0 inet static
# address 120.117.72.71
# netmask 255.255.255.128
# gateway 120.117.72.126
# # dns-* options are implemented by the resolvconf package, if installed
# dns-nameservers 120.117.2.1
# dns-search eecs.stust.edu.tw
iface eth0 inet manual
auto br0
iface br0 inet static
address 120.117.72.71
netmask 255.255.255.128
gateway 120.117.72.126
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
重新編輯 /etc/network/interfaces 檔案後,我們可以執行
/etc/init.d/networking restart
來重新啟動網路介面,其輸出如下:
[....] Running /etc/init.d/networking restart is deprecated because it may not r[warnble some interfaces ... (warning).
[....] Reconfiguring network interfaces...
Waiting for br0 to get ready (MAXWAIT is 20 seconds).
Starting rpcbind daemon...Already running..
Starting NFS common utilities: statd idmapd.
done.
接著我們執行 ifconfig 來觀看網路狀況,其輸出如下:
br0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
inet addr:120.117.72.71 Bcast:120.117.72.127 Mask:255.255.255.128
inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:33183 errors:0 dropped:0 overruns:0 frame:0
TX packets:427 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8487100 (8.0 MiB) TX bytes:33164 (32.3 KiB)
eth0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:92875730 errors:0 dropped:27 overruns:0 frame:0
TX packets:116759427 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:59145121172 (55.0 GiB) TX bytes:143394914474 (133.5 GiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:857668 errors:0 dropped:0 overruns:0 frame:0
TX packets:857668 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:72951279 (69.5 MiB) TX bytes:72951279 (69.5 MiB)
我們可以發現此時 br0 有網路 ip 等設定,而 eth0 沒有了。接下來我們可以重啟電腦,
來觀看是否重開機後網路設定仍然存在。
另外我們可以觀察 route 來看看主機路由為何,其輸出如下:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 120-117-72-126. 0.0.0.0 UG 0 0 0 br0
120.117.72.0 * 255.255.255.128 U 0 0 0 br0
從上面資訊可以看到目前的對外路由為 br0 介面。
5. 新增 br1 網路介面
請在 /etc/network/interfaces 中新增底下片段:
auto br1
iface br1 inet static
address 192.168.1.1
netmask 255.255.255.0
gateway 120.117.72.71
bridge_ports tap0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
請注意上述設定中之 gateway 要為本機 ip,而 bridge ports 要設為 tap0,設定完畢後
請執行:
/etc/init.d/networking restart
其輸出如下:
[....] Running /etc/init.d/networking restart is deprecated because it may not r[warnble some interfaces ... (warning).
[....] Reconfiguring network interfaces...
Waiting for br0 to get ready (MAXWAIT is 20 seconds).
if-up.d/mountnfs[br0]: waiting for interface br1 before doing NFS mounts ... (warning).
interface tap0 does not exist!
Waiting for br1 to get ready (MAXWAIT is 20 seconds).
RTNETLINK answers: Network is unreachable
Failed to bring up br1.
done.
此時我們再執行一次 ifconfig 來觀看網路介面,其輸出如下:
br0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
inet addr:120.117.72.71 Bcast:120.117.72.127 Mask:255.255.255.128
inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1144 (1.1 KiB) TX bytes:364 (364.0 B)
br1 Link encap:Ethernet HWaddr 36:88:01:09:0f:26
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::3488:1ff:fe09:f26/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:238 (238.0 B)
eth0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:123634 errors:0 dropped:0 overruns:0 frame:0
TX packets:108003 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:102252702 (97.5 MiB) TX bytes:96428415 (91.9 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:6489 errors:0 dropped:0 overruns:0 frame:0
TX packets:6489 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:364364 (355.8 KiB) TX bytes:364364 (355.8 KiB)
我們可以看到多了一個 br1 網路介面,其網段是 192.168.1.1/24
0. 原始網路介面:enp2s0
1. 安裝需要軟體 aptitude install bridge-utils uml-utilities
安裝完畢後我們即可使用 brctl 這個指令來觀察/新增/移除橋接網路介面。
2. 請以 root 權限執行
brctl
其輸出如下所示:
Usage: brctl [commands]
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
hairpin <bridge> <port> {on|off} turn hairpin on/off
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show [ <bridge> ] show a list of bridges
showmacs <bridge> show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> {on|off} turn stp on/off
a. 觀看橋接介面資訊:
我們可以執行
brctl show
來觀看目前橋接介面狀態,因為目前為止沒有任何橋接介面存在,因此其輸出如下:
bridge name bridge id STP enabled interfaces
b. 建立空的網路橋接介面
brctl addbr br0
建立完畢後再執行 brctl show,其輸出如下:
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
請注意最右邊的 interfaces 欄位底下是空的。
或是執行 ip addr show 可以顯示其結果,其輸出如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:24:1d:12:5c:c7 brd ff:ff:ff:ff:ff:ff
inet 120.117.72.71/25 brd 120.117.72.127 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::224:1dff:fe12:5cc7/64 scope link
valid_lft forever preferred_lft forever
3: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
link/ether 8a:f7:14:d0:e3:54 brd ff:ff:ff:ff:ff:ff
上述兩種輸出我們都可以看到有新增一個介面叫 br0,這就是所謂的橋接網路介面。
3. 將 br0 橋接給 eth0 使用
brctl addif br0 eth0
eth0 -> br0 -> internet
此時我們再執行
brctl show
會出現
bridge name bridge id STP enabled interfaces
br0 8000.00241d125cc7 no eth0
這告訴我們目前 eth0 已加入 br0 橋接網路介面中。
接下來我們可以執行一些網路指令來觀看目前網路設定狀況:
3.1 ifconfig
其輸出如下:
br0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:31862 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8351683 (7.9 MiB) TX bytes:762 (762.0 B)
eth0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
inet addr:120.117.72.71 Bcast:120.117.72.127 Mask:255.255.255.128
inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:92871708 errors:0 dropped:27 overruns:0 frame:0
TX packets:116756678 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:59143957987 (55.0 GiB) TX bytes:143394438170 (133.5 GiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:854820 errors:0 dropped:0 overruns:0 frame:0
TX packets:854820 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:72657228 (69.2 MiB) TX bytes:72657228 (69.2 MiB)
3.2 route (觀看目前主機路由) -> 什麼叫主機路由 ?
其輸出如下:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 120.117.72.126 0.0.0.0 UG 0 0 0 eth0
120.117.72.0 * 255.255.255.128 U 0 0 0 eth0
但是現在網路會出現連線的問題,因此我們要再修改一下。
4. 修改網路設定,使其開機後能自動 bridge
編輯 /etc/network/interfaces,將 eth0 由 底下片段:
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 120.117.72.71
netmask 255.255.255.128
gateway 120.117.72.126
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 120.117.2.1
dns-search eecs.stust.edu.tw
改為:
# The primary network interface
#allow-hotplug eth0
#iface eth0 inet static
# address 120.117.72.71
# netmask 255.255.255.128
# gateway 120.117.72.126
# # dns-* options are implemented by the resolvconf package, if installed
# dns-nameservers 120.117.2.1
# dns-search eecs.stust.edu.tw
iface eth0 inet manual
auto br0
iface br0 inet static
address 120.117.72.71
netmask 255.255.255.128
gateway 120.117.72.126
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
重新編輯 /etc/network/interfaces 檔案後,我們可以執行
/etc/init.d/networking restart
來重新啟動網路介面,其輸出如下:
[....] Running /etc/init.d/networking restart is deprecated because it may not r[warnble some interfaces ... (warning).
[....] Reconfiguring network interfaces...
Waiting for br0 to get ready (MAXWAIT is 20 seconds).
Starting rpcbind daemon...Already running..
Starting NFS common utilities: statd idmapd.
done.
接著我們執行 ifconfig 來觀看網路狀況,其輸出如下:
br0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
inet addr:120.117.72.71 Bcast:120.117.72.127 Mask:255.255.255.128
inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:33183 errors:0 dropped:0 overruns:0 frame:0
TX packets:427 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8487100 (8.0 MiB) TX bytes:33164 (32.3 KiB)
eth0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:92875730 errors:0 dropped:27 overruns:0 frame:0
TX packets:116759427 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:59145121172 (55.0 GiB) TX bytes:143394914474 (133.5 GiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:857668 errors:0 dropped:0 overruns:0 frame:0
TX packets:857668 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:72951279 (69.5 MiB) TX bytes:72951279 (69.5 MiB)
我們可以發現此時 br0 有網路 ip 等設定,而 eth0 沒有了。接下來我們可以重啟電腦,
來觀看是否重開機後網路設定仍然存在。
另外我們可以觀察 route 來看看主機路由為何,其輸出如下:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 120-117-72-126. 0.0.0.0 UG 0 0 0 br0
120.117.72.0 * 255.255.255.128 U 0 0 0 br0
從上面資訊可以看到目前的對外路由為 br0 介面。
5. 新增 br1 網路介面
請在 /etc/network/interfaces 中新增底下片段:
auto br1
iface br1 inet static
address 192.168.1.1
netmask 255.255.255.0
gateway 120.117.72.71
bridge_ports tap0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
請注意上述設定中之 gateway 要為本機 ip,而 bridge ports 要設為 tap0,設定完畢後
請執行:
/etc/init.d/networking restart
其輸出如下:
[....] Running /etc/init.d/networking restart is deprecated because it may not r[warnble some interfaces ... (warning).
[....] Reconfiguring network interfaces...
Waiting for br0 to get ready (MAXWAIT is 20 seconds).
if-up.d/mountnfs[br0]: waiting for interface br1 before doing NFS mounts ... (warning).
interface tap0 does not exist!
Waiting for br1 to get ready (MAXWAIT is 20 seconds).
RTNETLINK answers: Network is unreachable
Failed to bring up br1.
done.
此時我們再執行一次 ifconfig 來觀看網路介面,其輸出如下:
br0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
inet addr:120.117.72.71 Bcast:120.117.72.127 Mask:255.255.255.128
inet6 addr: fe80::224:1dff:fe12:5cc7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1144 (1.1 KiB) TX bytes:364 (364.0 B)
br1 Link encap:Ethernet HWaddr 36:88:01:09:0f:26
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::3488:1ff:fe09:f26/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:238 (238.0 B)
eth0 Link encap:Ethernet HWaddr 00:24:1d:12:5c:c7
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:123634 errors:0 dropped:0 overruns:0 frame:0
TX packets:108003 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:102252702 (97.5 MiB) TX bytes:96428415 (91.9 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:6489 errors:0 dropped:0 overruns:0 frame:0
TX packets:6489 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:364364 (355.8 KiB) TX bytes:364364 (355.8 KiB)
我們可以看到多了一個 br1 網路介面,其網段是 192.168.1.1/24
2013年12月9日 星期一
uboot 命令列操作簡介
%http://blog.csdn.net/ghostyu/article/details/6968681
%http://www.denx.de/wiki/view/DULG/Manual
目的:了解 uboot 的命令列操作方式
uboot 是一套廣泛使用在嵌入式系統上之 bootloader,要順利的使用 uboot,必須對其命令列操作方式有所了解,如此一來當 uboot 在開機時發生錯誤的話,才能夠自己一一針對故障進行排除。底下我們將針對 uboot 的指令作概略的說明:
help -> 呼叫可使用之指令,如底下所示:
? - alias for 'help'
askenv - get environment variables from stdin
base - print or set address offset
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootz - boot Linux zImage image from memory
chpart - change active partition
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dcache - enable or disable data cache
dhcp - boot image via network using DHCP/TFTP protocol
echo - echo args to console
editenv - edit environment variable
env - environment handling commands
exit - exit script
ext2load- load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
false - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fdt - flattened device tree utility commands
go - start application at address 'addr'
gpio - input/set/clear/toggle gpio pins
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
imxtract- extract a part of a multi-image
itest - return true/false on integer compare
led - [0|1|green|all] [on|off|toggle]
load - load binary file from a filesystem
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
ls - list files in a directory (default /)
md - memory display
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mtdparts- define flash/nand partitions
mw - memory write (fill)
nand - NAND sub-system
nandecc - switch OMAP3 NAND ECC calculation algorithm
nboot - boot from NAND device
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
ping - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
setexpr - set environment variable as the result of eval expression
showvar - print local hushshell variables
sleep - delay execution for some time
source - run script from memory
test - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
true - do nothing, successfully
usb - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version
version(v) -> 顯示目前 u-boot 版本,如底下所示:
U-Boot 2013.10 (Nov 15 2013 - 09:58:56)
arm-linux-gnueabi-gcc (Debian 4.4.6-14) 4.4.6
GNU ld (GNU Binutils for Debian) 2.22
usb start -> 啟動 usb 功能,其畫面如下所示:
(Re)start USB...
USB0: ULPI: ulpi_reset: failed writing reset bit
ULPI: ulpi_reset: failed writing reset bit
USB EHCI 0.00
scanning bus 0 for devices... 1 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
scanning usb for ethernet devices... 0 Ethernet Device(s) found
usb info -> 觀看 usb 資訊,如底下所示:
1: Hub, USB Revision 2.0
- u-boot EHCI Host Controller
- Class: Hub
- PacketSize: 64 Configurations: 1
- Vendor: 0x0000 Product 0x0000 Version 1.0
Configuration: 1
- Interfaces: 1 Self Powered 0mA
Interface: 0
- Alternate Setting 0, Endpoints: 1
- Class Hub
- Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms
bdinfo -> 顯示目前板子資訊,如底下所示:
arch_number = 0x0000060A
boot_params = 0x80000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x08000000
DRAM bank = 0x00000001
-> start = 0x88000000
-> size = 0x08000000
eth0name = usb_ether
ethaddr = (not set)
current eth = usb_ether
ip_addr = <NULL>
baudrate = 115200 bps
TLB addr = 0x8FFF0000
relocaddr = 0x8FF59000
reloc off = 0x0FE59000
irq_sp = 0x8FEF8F30
sp start = 0x8FEF8F20
mmcinfo -> 顯示目前記憶卡資訊,如底下所示:
Device: OMAP SD/MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU!
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 1 GiB
Bus Width: 4-bit
mmc -> 顯示記憶卡之相關操作指令,如下所示:
Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmclist -> 顯示目前的記憶卡,如底下所示:
OMAP SD/MMC: 0
mmc rescan -> 重新掃瞄目前板子上有幾張記憶卡
mmc part -> 顯示目前記憶卡上之分割區,如底下所示:
Partition Map for MMC device 0 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 2048 163840 bafb41f7-01 0b Boot
2 165888 1931264 bafb41f7-02 83
此資訊可搭配之前分割之 sdcard.img 來比較,如下所示:
Device Boot Start End Blocks Id System
/dev/loop0p1 * 2048 165887 81920 b W95 FAT32
/dev/loop0p2 165888 2097151 965632 83 Linux
fatinfo -> 觀看 FAT filesystem 資訊,其語法如下:
fatinfo <interface> [<dev[:part]>]
其中的 interface 是指儲存介面,而 dev:part 則是指其裝置及分割區編號
我們可以執行底下指令來觀看 sdcard.img 的 #1 分割區:
fatinfo mmc 0:1
其輸出如下:
Interface: MMC
Device 0: Vendor: Man 0000aa Snr adbeef00 Rev: 13.14 Prod: QEMU!
Type: Removable Hard Disk
Capacity: 1024.0 MB = 1.0 GB (2097152 x 512)
Filesystem: FAT16 " "
fatls -> 列出 FAT 分割區之內容,其語法如下:
fatls <interface> [<dev[:part]>] [directory]
因此我們可以執行底下指令來觀看 FAT 檔案系統中之檔案:
fatls mmc 0:1
其輸出如下所示:
2539176 uimage
47164 mlo
1622640 u-boot
346280 u-boot.img
346216 u-boot.bin
2539112 zimage
6 file(s), 0 dir(s)
fatloat -> 載入 FAT 檔案系統中之檔案,其語法如下:
fatload <interface> [<dev[:part]>] <addr> <filename> [bytes [pos]]
現在,我們要將編好的 Linux 核心載入至 ARM 的初始記憶體位置,也就是
0x80000000,我們應該要下底下指令:
fatload mmc 0:1 0x80000000 uImage
其輸出如下所示:
reading uImage
2539176 bytes read in 325 ms (7.5 MiB/s)
這個訊息告訴我們,uboot 已載入 Linux 核心,其檔名為 uImage,根據我們所下的
指令,這個核心被載入至 0x80000000 的位置。
bootm -> 從某個記憶體位置開機,以我們的例子來說,其開機位置為 0x80000000。
因此我們可以下底下指令來開機:
bootm 0x80000000
%http://www.denx.de/wiki/view/DULG/Manual
目的:了解 uboot 的命令列操作方式
uboot 是一套廣泛使用在嵌入式系統上之 bootloader,要順利的使用 uboot,必須對其命令列操作方式有所了解,如此一來當 uboot 在開機時發生錯誤的話,才能夠自己一一針對故障進行排除。底下我們將針對 uboot 的指令作概略的說明:
help -> 呼叫可使用之指令,如底下所示:
? - alias for 'help'
askenv - get environment variables from stdin
base - print or set address offset
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootz - boot Linux zImage image from memory
chpart - change active partition
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dcache - enable or disable data cache
dhcp - boot image via network using DHCP/TFTP protocol
echo - echo args to console
editenv - edit environment variable
env - environment handling commands
exit - exit script
ext2load- load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
false - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fdt - flattened device tree utility commands
go - start application at address 'addr'
gpio - input/set/clear/toggle gpio pins
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
imxtract- extract a part of a multi-image
itest - return true/false on integer compare
led - [0|1|green|all] [on|off|toggle]
load - load binary file from a filesystem
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
ls - list files in a directory (default /)
md - memory display
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mtdparts- define flash/nand partitions
mw - memory write (fill)
nand - NAND sub-system
nandecc - switch OMAP3 NAND ECC calculation algorithm
nboot - boot from NAND device
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
ping - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
setexpr - set environment variable as the result of eval expression
showvar - print local hushshell variables
sleep - delay execution for some time
source - run script from memory
test - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
true - do nothing, successfully
usb - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version
version(v) -> 顯示目前 u-boot 版本,如底下所示:
U-Boot 2013.10 (Nov 15 2013 - 09:58:56)
arm-linux-gnueabi-gcc (Debian 4.4.6-14) 4.4.6
GNU ld (GNU Binutils for Debian) 2.22
usb start -> 啟動 usb 功能,其畫面如下所示:
(Re)start USB...
USB0: ULPI: ulpi_reset: failed writing reset bit
ULPI: ulpi_reset: failed writing reset bit
USB EHCI 0.00
scanning bus 0 for devices... 1 USB Device(s) found
scanning usb for storage devices... 0 Storage Device(s) found
scanning usb for ethernet devices... 0 Ethernet Device(s) found
usb info -> 觀看 usb 資訊,如底下所示:
1: Hub, USB Revision 2.0
- u-boot EHCI Host Controller
- Class: Hub
- PacketSize: 64 Configurations: 1
- Vendor: 0x0000 Product 0x0000 Version 1.0
Configuration: 1
- Interfaces: 1 Self Powered 0mA
Interface: 0
- Alternate Setting 0, Endpoints: 1
- Class Hub
- Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms
bdinfo -> 顯示目前板子資訊,如底下所示:
arch_number = 0x0000060A
boot_params = 0x80000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x08000000
DRAM bank = 0x00000001
-> start = 0x88000000
-> size = 0x08000000
eth0name = usb_ether
ethaddr = (not set)
current eth = usb_ether
ip_addr = <NULL>
baudrate = 115200 bps
TLB addr = 0x8FFF0000
relocaddr = 0x8FF59000
reloc off = 0x0FE59000
irq_sp = 0x8FEF8F30
sp start = 0x8FEF8F20
mmcinfo -> 顯示目前記憶卡資訊,如底下所示:
Device: OMAP SD/MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU!
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 1 GiB
Bus Width: 4-bit
mmc -> 顯示記憶卡之相關操作指令,如下所示:
Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmclist -> 顯示目前的記憶卡,如底下所示:
OMAP SD/MMC: 0
mmc rescan -> 重新掃瞄目前板子上有幾張記憶卡
mmc part -> 顯示目前記憶卡上之分割區,如底下所示:
Partition Map for MMC device 0 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 2048 163840 bafb41f7-01 0b Boot
2 165888 1931264 bafb41f7-02 83
此資訊可搭配之前分割之 sdcard.img 來比較,如下所示:
Device Boot Start End Blocks Id System
/dev/loop0p1 * 2048 165887 81920 b W95 FAT32
/dev/loop0p2 165888 2097151 965632 83 Linux
fatinfo -> 觀看 FAT filesystem 資訊,其語法如下:
fatinfo <interface> [<dev[:part]>]
其中的 interface 是指儲存介面,而 dev:part 則是指其裝置及分割區編號
我們可以執行底下指令來觀看 sdcard.img 的 #1 分割區:
fatinfo mmc 0:1
其輸出如下:
Interface: MMC
Device 0: Vendor: Man 0000aa Snr adbeef00 Rev: 13.14 Prod: QEMU!
Type: Removable Hard Disk
Capacity: 1024.0 MB = 1.0 GB (2097152 x 512)
Filesystem: FAT16 " "
fatls -> 列出 FAT 分割區之內容,其語法如下:
fatls <interface> [<dev[:part]>] [directory]
因此我們可以執行底下指令來觀看 FAT 檔案系統中之檔案:
fatls mmc 0:1
其輸出如下所示:
2539176 uimage
47164 mlo
1622640 u-boot
346280 u-boot.img
346216 u-boot.bin
2539112 zimage
6 file(s), 0 dir(s)
fatloat -> 載入 FAT 檔案系統中之檔案,其語法如下:
fatload <interface> [<dev[:part]>] <addr> <filename> [bytes [pos]]
現在,我們要將編好的 Linux 核心載入至 ARM 的初始記憶體位置,也就是
0x80000000,我們應該要下底下指令:
fatload mmc 0:1 0x80000000 uImage
其輸出如下所示:
reading uImage
2539176 bytes read in 325 ms (7.5 MiB/s)
這個訊息告訴我們,uboot 已載入 Linux 核心,其檔名為 uImage,根據我們所下的
指令,這個核心被載入至 0x80000000 的位置。
bootm -> 從某個記憶體位置開機,以我們的例子來說,其開機位置為 0x80000000。
因此我們可以下底下指令來開機:
bootm 0x80000000
2013年11月27日 星期三
dell streak 5 刷機筆記
dell streak 5 刷機筆記
1. 下載 ClockworkMod Recovery,下載網址如下:
http://forum.xda-developers.com/wiki/Dell_Streak/ROMs#Recovery_Images
2. 在 Debian 64 位元系統安裝刷機工具:adb 及 fastboot。
3. 確定 adb 及 fastboot 能支援 dell streak 5:
3.1 先將 dell streak 5 的 USB Debugging 選項打開,位置是:
Setup -> Development -> USB debugging。
3.2 將 dell streak 5 與主機連線,並執行 lsusb 觀看是否已與 dell streak 5 連線,
其輸出如下:
Bus 004 Device 023: ID 413c:b007 Dell Computer Corp.
3.3 將要刷入 dell streak 5 的 rom 存入 sd card 中,假設其名稱為 rom.zip
3.4 以 root 權限執行 adb devices,看看系統是否有抓到 dell streak 5:
# adb devices
List of devices attached
0011954001337828 device
如果有上述裝置表示 dell streak 5 已經可以被 adb 抓到。
3.5 將 Dell streak 5 重開進 fastboot 模式,可以執行底下指令:
adb reboot bootloader
或一直按 ”照相鍵" + "開機鍵” 一直到開機畫面,再選右上角之 fastboot
3.6 刷 ClockworkMod Recovery image,以此例來說其名稱為 S5-6.0.1.2.img,指令如下:
fastboot -i 0x413c flash recovery S5-6.0.1.2.img
刷完後可以執行 fastboot reboot 來重新開機
4. 重新開機時請按 "音量+" + "音量-" + "開機鍵" 一直到刷機選單,然後選擇:
2. Software upgrade via Update.pkg on SD card
再選擇
choose zip from SD card
選好之後選 Install 即可
記得將所有原本手機上的資料清掉,因此底下操作要先作:
wipe data/factory reset
wipe cache partition
參考網站:
1. 下載 ClockworkMod Recovery,下載網址如下:
http://forum.xda-developers.com/wiki/Dell_Streak/ROMs#Recovery_Images
2. 在 Debian 64 位元系統安裝刷機工具:adb 及 fastboot。
3. 確定 adb 及 fastboot 能支援 dell streak 5:
3.1 先將 dell streak 5 的 USB Debugging 選項打開,位置是:
Setup -> Development -> USB debugging。
3.2 將 dell streak 5 與主機連線,並執行 lsusb 觀看是否已與 dell streak 5 連線,
其輸出如下:
Bus 004 Device 023: ID 413c:b007 Dell Computer Corp.
3.3 將要刷入 dell streak 5 的 rom 存入 sd card 中,假設其名稱為 rom.zip
3.4 以 root 權限執行 adb devices,看看系統是否有抓到 dell streak 5:
# adb devices
List of devices attached
0011954001337828 device
如果有上述裝置表示 dell streak 5 已經可以被 adb 抓到。
3.5 將 Dell streak 5 重開進 fastboot 模式,可以執行底下指令:
adb reboot bootloader
或一直按 ”照相鍵" + "開機鍵” 一直到開機畫面,再選右上角之 fastboot
3.6 刷 ClockworkMod Recovery image,以此例來說其名稱為 S5-6.0.1.2.img,指令如下:
fastboot -i 0x413c flash recovery S5-6.0.1.2.img
刷完後可以執行 fastboot reboot 來重新開機
4. 重新開機時請按 "音量+" + "音量-" + "開機鍵" 一直到刷機選單,然後選擇:
2. Software upgrade via Update.pkg on SD card
再選擇
choose zip from SD card
選好之後選 Install 即可
記得將所有原本手機上的資料清掉,因此底下操作要先作:
wipe data/factory reset
wipe cache partition
參考網站:
Dell Streak 刷機教學... (圖多)
{APK技術組}【精華版APK首發】Dell Streak Mini 5 "ROM刷包~穩定無Bug
How to Install ClockworkMod Recovery on the Dell Streak 5
【新手看了也會】開開心心吃薑餅....Dell Streak Mini 5 自升 Android 2.3.3
2013年11月25日 星期一
安裝 qemu linaro 版
目的:安裝 qemu linaro 版
說明:qemu linaro 版是第三方協力廠商所開發的 qemu 版,其功能較原始官方版本更強,例如支援 beagle 模擬,因此在此我們介紹如何下載、編譯、安裝 qemu linaro 版。
下載:qemu linaro 版下載網址如下:
https://launchpad.net/qemu-linaro/
請下載最新版本,以本例來說,其檔名是 qemu-linaro-1.7.0-2014.01.tar.gz
wget ftp://120.117.72.71/files/qemu-linaro-1.7.0-2014.01.tar.gz
解開:tar xfva qemu-linaro-1.7.0-2014.01.tar.gz
解開後會出現一個名為 qemu-linaro-1.7.0-2014.01 的目錄,請切換至此目錄中。
要編譯前要先安裝底下套件:
zlib1g-dev
pkg-config
libcurl4-openssl-dev
libsdl-dev
libsasl2-dev
libaio-dev
libvde-dev
libvdeplug2-dev
uuid-dev
libcap-ng-dev
libpixman-1-dev
編譯:
./configure
若是 ./configure 出現底下錯誤的話:
ERROR: DTC not present. Your options:
(1) Preferred: Install the DTC devel package
(2) Fetch the DTC submodule, using:
git submodule update --init dtc
其解決方法在:
http://lists.gnu.org/archive/html/qemu-devel/2013-11/msg03494.html
請再安裝底下套件
device-tree-compiler
libfdt-dev
time make -j N
若有錯誤訊息,請設法解決。
安裝:
# make install
驗證:
在 /usr/local/bin 目錄下有一堆 qemu-system-???? 的檔案,如下所示:
/usr/local/bin/qemu-system-alpha /usr/local/bin/qemu-system-or32
/usr/local/bin/qemu-system-arm /usr/local/bin/qemu-system-ppc
/usr/local/bin/qemu-system-cris /usr/local/bin/qemu-system-ppc64
/usr/local/bin/qemu-system-i386 /usr/local/bin/qemu-system-ppcemb
/usr/local/bin/qemu-system-lm32 /usr/local/bin/qemu-system-s390x
/usr/local/bin/qemu-system-m68k /usr/local/bin/qemu-system-sh4
/usr/local/bin/qemu-system-microblaze /usr/local/bin/qemu-system-sh4eb
/usr/local/bin/qemu-system-microblazeel /usr/local/bin/qemu-system-sparc
/usr/local/bin/qemu-system-mips /usr/local/bin/qemu-system-sparc64
/usr/local/bin/qemu-system-mips64 /usr/local/bin/qemu-system-unicore32
/usr/local/bin/qemu-system-mips64el /usr/local/bin/qemu-system-x86_64
/usr/local/bin/qemu-system-mipsel /usr/local/bin/qemu-system-xtensa
/usr/local/bin/qemu-system-moxie /usr/local/bin/qemu-system-xtensaeb
我們可以執行
/usr/local/bin/qemu-system-arm -version
或是
/usr/local/bin/qemu-system-x86_64 --version
其輸出如下:
QEMU emulator version 1.7.0 (qemu-linaro 2014.01), Copyright (c) 2003-2008 Fabrice Bellard
我們可以看過上述字串有 qemu-linaro 2014.01,這表示我們所安裝的 qemu linaro 已經是最新版了。
說明:qemu linaro 版是第三方協力廠商所開發的 qemu 版,其功能較原始官方版本更強,例如支援 beagle 模擬,因此在此我們介紹如何下載、編譯、安裝 qemu linaro 版。
下載:qemu linaro 版下載網址如下:
https://launchpad.net/qemu-linaro/
請下載最新版本,以本例來說,其檔名是 qemu-linaro-1.7.0-2014.01.tar.gz
wget ftp://120.117.72.71/files/qemu-linaro-1.7.0-2014.01.tar.gz
解開:tar xfva qemu-linaro-1.7.0-2014.01.tar.gz
解開後會出現一個名為 qemu-linaro-1.7.0-2014.01 的目錄,請切換至此目錄中。
要編譯前要先安裝底下套件:
zlib1g-dev
pkg-config
libcurl4-openssl-dev
libsdl-dev
libsasl2-dev
libaio-dev
libvde-dev
libvdeplug2-dev
uuid-dev
libcap-ng-dev
libpixman-1-dev
編譯:
./configure
若是 ./configure 出現底下錯誤的話:
ERROR: DTC not present. Your options:
(1) Preferred: Install the DTC devel package
(2) Fetch the DTC submodule, using:
git submodule update --init dtc
其解決方法在:
http://lists.gnu.org/archive/html/qemu-devel/2013-11/msg03494.html
請再安裝底下套件
device-tree-compiler
libfdt-dev
time make -j N
若有錯誤訊息,請設法解決。
安裝:
# make install
驗證:
在 /usr/local/bin 目錄下有一堆 qemu-system-???? 的檔案,如下所示:
/usr/local/bin/qemu-system-alpha /usr/local/bin/qemu-system-or32
/usr/local/bin/qemu-system-arm /usr/local/bin/qemu-system-ppc
/usr/local/bin/qemu-system-cris /usr/local/bin/qemu-system-ppc64
/usr/local/bin/qemu-system-i386 /usr/local/bin/qemu-system-ppcemb
/usr/local/bin/qemu-system-lm32 /usr/local/bin/qemu-system-s390x
/usr/local/bin/qemu-system-m68k /usr/local/bin/qemu-system-sh4
/usr/local/bin/qemu-system-microblaze /usr/local/bin/qemu-system-sh4eb
/usr/local/bin/qemu-system-microblazeel /usr/local/bin/qemu-system-sparc
/usr/local/bin/qemu-system-mips /usr/local/bin/qemu-system-sparc64
/usr/local/bin/qemu-system-mips64 /usr/local/bin/qemu-system-unicore32
/usr/local/bin/qemu-system-mips64el /usr/local/bin/qemu-system-x86_64
/usr/local/bin/qemu-system-mipsel /usr/local/bin/qemu-system-xtensa
/usr/local/bin/qemu-system-moxie /usr/local/bin/qemu-system-xtensaeb
我們可以執行
/usr/local/bin/qemu-system-arm -version
或是
/usr/local/bin/qemu-system-x86_64 --version
其輸出如下:
QEMU emulator version 1.7.0 (qemu-linaro 2014.01), Copyright (c) 2003-2008 Fabrice Bellard
我們可以看過上述字串有 qemu-linaro 2014.01,這表示我們所安裝的 qemu linaro 已經是最新版了。
訂閱:
文章 (Atom)
