U-Boot 是嵌入式系統上最常見的 Boot Loader,底下說明其常用指令:
U-Boot# help -> 列出可使用指令
U-Boot# version -> 觀看目前所使用 U-Boot 版本
U-Boot 2014.07 (Oct 14 2014 - 11:45:06)
arm-linux-gnueabi-gcc (Debian 4.4.5-8) 4.4.5
GNU ld (GNU Binutils for Debian) 2.20.1.20100303
U-Boot# 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 = 0x8FF4C000
reloc off = 0x0FE4C000
irq_sp = 0x8EF2BEE0
sp start = 0x8EF2BED0
U-Boot# mmc list -> 列出目前板子上面的 sdcard
OMAP SD/MMC: 0
U-Boot# mmcinfo -> 顯示(SD)記憶卡資訊,亦可以打成 mmc info
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
U-Boot# mmc part -> 觀看 MMC 上的分割區
Partition Map for MMC device 0 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 2048 163840 8a5a18c6-01 0b Boot
2 165888 1931264 8a5a18c6-02 83
U-Boot# ls -> 可觀看目錄裡的檔案,底下介紹用法
ls - list files in a directory (default /)
Usage:
ls <interface> [<dev[:part]> [directory]]
- List files in directory 'directory' of partition 'part' on
device type 'interface' instance 'dev'.
U-Boot# ls mmc 0:1 -> 觀看第 0 個 MMC,第 1 個分割區之內容
2404728 uimage
51100 mlo
1853076 u-boot
392152 u-boot.bin
392216 u-boot.img
5 file(s), 0 dir(s)
U-Boot# ls mmc 0:2 -> 觀看第 0 個 MMC,第 2 個分割區 (rootfs) 之內容
U-Boot# fatinfo -> 觀看 FAT 檔案系統資訊
usage: fatinfo <interface> [<dev[:part]>]
U-Boot# fatinfo mmc 0:1 -> 觀看第 0 個 MMC,第 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 " "
U-Boot# fatinfo mmc 0:2 -> 觀看第 0 個 MMC,第 2 個分割區,因此分割區為 ext3,故
無資料顯示。
** Unable to use mmc 0:2 for fatinfo **
U-Boot# fatls mmc 0:1 -> 觀看第 0 個 MMC,第 1 個分割區之內容
2404728 uimage
51100 mlo
1853076 u-boot
392152 u-boot.bin
392216 u-boot.img
5 file(s), 0 dir(s)
U-Boot# ext2ls mmc 0:2 -> 觀看第 0 個 MMC,第 2 個分割區(ext3)之內容
** 所有 ls 指令如 fatls、ext2ls .. 等均可以直接用 ls 指令來代替,語法一樣 **
U-Boot# reset
resetting ...
U-Boot# usb -> USB 操作相關指令
usb - USB sub-system
Usage:
usb start - start (scan) USB controller
usb reset - reset (rescan) USB controller
usb stop [f] - stop USB [f]=force stop
usb tree - show USB device tree
usb info [dev] - show available USB devices
usb test [dev] [port] [mode] - set USB 2.0 test mode
(specify port 0 to indicate the device's upstream port)
Available modes: J, K, S[E0_NAK], P[acket], F[orce_Enable]
usb storage - show details of USB storage devices
usb dev [dev] - show or set current USB storage device
usb part [dev] - print partition table of one or all USB storage devices
usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'
to memory address `addr'
usb write addr blk# cnt - write `cnt' blocks starting at block `blk#'
from memory address `addr'
U-Boot# usb info -> 觀看 USB 資訊,不過因為還沒啟動,所以沒資訊
USB is stopped. Please issue 'usb start' first.
U-Boot# usb start -> 啟動 USB 裝置
(Re)start USB...
USB0: 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 裝置
U-Boot# usb info
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
U-Boot# printenv -> 列出開機環境設定,請全部複製下來修改
arch=arm
baudrate=115200
beaglerev=C4
board=beagle
board_name=beagle
bootargs=console=ttyO2,115200n8 mpurate=auto buddy=none camera=none vram=12M omapfb.mode=dvi:640x480MR-16@60 omapdss.def_disp=dvi root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
bootcmd=run findfdt; mmc dev ${mmcdev}; if mmc rescan; then if run userbutton; then setenv bootenv uEnv.txt;else setenv bootenv user.txt;fi;echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loadimage; then run mmcboot;fi;fi;run nandboot;setenv bootfile zImage;if run loadimage; then run loadfdt;run mmcbootz; fi;
bootdelay=1
bootdir=/boot
bootenv=uEnv.txt
bootfile=zImage
bootpart=0:2
buddy=none
camera=none
console=ttyO2,115200n8
cpu=armv7
defaultdisplay=dvi
dieid#=51454d5551454d555400000051454d55
dvimode=640x480MR-16@60
ethact=usb_ether
fdt_high=0xffffffff
fdtaddr=0x80f80000
fdtfile=omap3-beagle.dtb
findfdt=if test $beaglerev = AxBx; then setenv fdtfile omap3-beagle.dtb; fi; if test $beaglerev = Cx; then setenv fdtfile omap3-beagle.dtb; fi; if test $beaglerev = C4; then setenv fdtfile omap3-beagle.dtb; fi; if test $beaglerev = xMAB; then setenv fdtfile omap3-beagle-xm-ab.dtb; fi; if test $beaglerev = xMC; then setenv fdtfile omap3-beagle-xm.dtb; fi; if test $fdtfile = undefined; then echo WARNING: Could not determine device tree to use; fi;
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
loadaddr=0x80200000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadfdt=run validatefdt; load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
loadimage=load mmc ${bootpart} ${loadaddr} ${bootdir}/${bootfile}
loadramdisk=load mmc ${bootpart} ${rdaddr} ${bootdir}/${ramdisk}
mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
mmcbootz=echo Booting with DT from mmc${mmcdev} ...; run mmcargs; bootz ${loadaddr} - ${fdtaddr}
mmcdev=0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext3 rootwait
mpurate=auto
nandargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${nandroot} rootfstype=${nandrootfstype}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs
ramargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${ramroot} rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr}
ramdisk=ramdisk.gz
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=0x81000000,64M
ramrootfstype=ext2
rdaddr=0x81000000
soc=omap3
stderr=serial
stdin=serial
stdout=serial
usbtty=cdc_acm
userbutton=if gpio input 173; then run userbutton_xm; else run userbutton_nonxm; fi;
userbutton_nonxm=gpio input 7;
userbutton_xm=gpio input 4;
validatefdt=if test $beaglerev = xMAB; then if test ! -e mmc ${bootpart} ${bootdir}/${fdtfile}; then setenv fdtfile omap3-beagle-xm.dtb; fi; fi;
vendor=ti
ver=U-Boot 2014.07 (Oct 14 2014 - 11:45:06)
vram=12M
Environment size: 3604/131068 bytes
2014年12月15日 星期一
2014年12月1日 星期一
建立一個 br10 橋接網路介面
#2019/09/23 修訂
192.168.10.0/24 -> IP 範圍為 192.168.10.0 ~ 192.168.10.255
Netmask為 255.255.255.0 (24 bit)
Gateway ?
DNS ?
Bridge 命名方式:最好可以一眼看出此橋之網路設定,例如:
br0 -> 192.168.0.0/24
br1 -> 192.168.1.0/24
br2 -> 192.168.2.0/24
..
br10 -> 192.168.10.0/24
我們可以執行底下指令新增 br10
# brctl addbr br10
# ifconfig br10
br10 Link encap:Ethernet HWaddr 52:55:ae:8e:ad:d0
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
現在可以看到 br10 沒有 IP,接下來可以指定 192.168.10.1/24 作為 br10 的 IP,指令如下:
# ifconfig br10 192.168.10.1/24 up
或是
# ifconfig br10 192.168.10.1 netmask 255.255.255.0
接著可以觀察 br10 的 IP,如下所示:
# ifconfig br10
br10 Link encap:Ethernet HWaddr 52:55:ae:8e:ad:d0
inet addr:192.168.10.1 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::5055:aeff:fe8e:add0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 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:0 (0.0 B) TX bytes:508 (508.0 B)
此時我們可以 ping 192.168.10.1 看看其輸出:
$ ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.024 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.045 ms
^C
--- 192.168.10.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2051ms
rtt min/avg/max/mdev = 0.023/0.030/0.045/0.012 ms
這表示 192.168.10.1 這個介面已經被我們「無中生有」製造出來,這就是虛擬的橋接網路介面。
如果要刪除此網路介面的話,可以用 root 權限執行:
# brctl delbr br10
bridge br10 is still up; can't delete it
此時會有錯誤訊息,告訴我們 br10 還在使用中,不能刪除。因此要用 root 權限關閉此網路介面,指令如下:
# ifconfig br10 down
接著再執行
# brctl delbr br10
即可刪除此網路介面,我們可以使用 brctl show 來觀察 br10 是否仍然存在。
使用 brctl 建立 br10 有個缺點,那就是 br10 在系統重開後就會不見,因此我們要建立一個永久的 br10 介面。在本課程,我們建立一個 192.168.10.0/24 之橋接網路介面,其
/etc/network/interfaces 之設定如下:
auto br10
iface br10 inet static
address 192.168.10.1 # 橋接網路介面之 IP
netmask 255.255.255.0 # NetMask
gateway 120.117.72.71 # eth0 IP,亦即橋接網路介面之 gateway。
bridge_ports tap0 # 初始 tap,之後 br10 會自動新增其它 tap。
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
設定完之後,重新啟動網路介面,或是執行底指令:
# ifconfig br10 up
# ifup br10
即可啟動 br10,我們可以執行
# ifconfig br10
來觀看其輸出,如底下所示:
br10 Link encap:Ethernet HWaddr 8e:03:1e:8e:fe:99
inet addr:192.168.10.1 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::8c03:1eff:fe8e:fe99/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:648 (648.0 B)
接下來要將 /usr/local/libexec/qemu-bridge-helper 這個檔案 setuid,指令如下:
# cd /usr/local/libexec
# chmod u+s qemu-bridge-helper
# ls -l qemu-bridge-helper
-rwsr-xr-x 1 root staff 39680 10月 21 10:46 qemu-bridge-helper
^
此檔現在具有 u+s 屬性。
然後要修改 /usr/local/etc/qemu/bridge.conf 這個檔案,若此檔不存在的話,請自行新增,加入一行:
allow br10
接著請建立 ~/qemu_stretch 目錄,再在其中新增 buildpxe.sh 這個檔案,其內容如下:
# IP=192.168.10.254 pxeserver.my.com
CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
#HDA=pxe2.img
HDA_SIZE=4G
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
CDROM=/opt/iso/debian-stretch-DI-rc2-amd64-netinst.iso
[ -f $HDA ] && mv $HDA ${HDA}.`date +%Y%m%d`
qemu-img create $HDA $HDA_SIZE -f qcow2
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-drive file=$HDA,format=qcow2 -vga qxl \
-cdrom $CDROM -boot d \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
請注意 debian 的安裝 iso 檔要放在 /opt/iso 目錄下,不然上面這個 script 檔要修改才可以執行。
接著我們要把 runpxe.sh 改成底下格式:
# IP=192.168.10.254 pxeserver.example.org
CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
HDB=hdb.img
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-drive file=$HDA,format=raw \
-boot c \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
接著,我們要將 ARM 虛擬機接上 br10 這個橋接網路介面,請在 runarm.sh 中修改為:
qemu-system-arm -M versatilepb -m 512 \
-kernel ./vmlinuz-3.2.0-4-versatile \
-initrd ./initrd.img-3.2.0-4-versatile \
-net nic,macaddr="52:54:00:12:34:56" -net bridge,br=br10 \
-hda arm.img \
-append "root=/dev/sda1"
全部設定完畢後,我們即可執行 sh runarm.sh 來看看新的 ARM 虛擬環境是否有在
192.168.10.0/24 之網段內。在此可以先執行
# brctl show br10
bridge name bridge id STP enabled interfaces
br10 8000.fe624e24d08c no tap0
上述輸出告訴我們 br10 目前有一台虛擬機器掛上。接著修改虛擬 ARM 機器之 IP 設定,>在 /etc/network/interfaces 中,如底下所示:
# The primary network interface
allow-hotplug eth0
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.10.20
netmask 255.255.255.0
gateway 120.117.72.71 # gateway IP
然後重啟虛擬機之網路,一直到執行 ifconfig 可以看到本機之 IP 為 192.168.10.20。
接下作簡單驗證:
在實體機上執行:
ping 192.168.10.20
在虛擬機上執行:
ping 192.168.10.1
如果都可以 ping 得到機器的話,再在實體機上執行 iceweasel 看是否能打開 192.168.10.20 之網頁,如果可以的話表示設定沒問題。反之,請 debug !
2014年10月6日 星期一
目的:把遠端 X window 的視窗,丟回本機端
0. 設定本機端 X window
請編輯 /etc/X11/xinit/xserverrc 這個檔案,把
exec /usr/bin/X -nolisten tcp "$@"
改成
exec /usr/bin/X #-nolisten tcp "$@"
改完後,本機 X Window 要重啟,重啟完畢後請在本機端執行
xhost +
access control disabled, clients can connect from any host
1. 連線至遠端主機
ssh -l USER IP
登入後執行:
export DISPLAY=localhost_IP:0
設定完畢後,在遠端主機執行 xterm 測試看看是否會在本地端開視窗。
請編輯 /etc/X11/xinit/xserverrc 這個檔案,把
exec /usr/bin/X -nolisten tcp "$@"
改成
exec /usr/bin/X #-nolisten tcp "$@"
改完後,本機 X Window 要重啟,重啟完畢後請在本機端執行
xhost +
access control disabled, clients can connect from any host
1. 連線至遠端主機
ssh -l USER IP
登入後執行:
export DISPLAY=localhost_IP:0
設定完畢後,在遠端主機執行 xterm 測試看看是否會在本地端開視窗。
2014年6月24日 星期二
安裝 Java JRE
JAVA Runtime Environment (JRE) 是經常使用的工具,但是受限於版權的因素,Debian Linux 並沒有把 Oracle 的 Java Runtime Environment 包進來,而 JRE 又經常因為安全性的因素更新。在這種情況下,我們只能手動更新 JRE,否則將會有漏洞而導致系統安全發生。底下將介紹如何安裝 JRE。
1. 下載
請至 Oracle 官方網站下載 JRE,其網址如下:
http://java.com/zh_TW/download/
依本文章為例,我們所下載的 JRE 是 jre-7u60-linux-x64.tar.gz。
2. 解壓縮
我們將 JRE 解壓縮至 /usr/local/java 目錄下,請以 root 權限先建立 /usr/local/java 目錄,指令如下:
#mkdir -p /usr/local/java
接著再將 jre-7u60-linux-x64.tar.gz 解壓縮至 /usr/local/java 目錄,指令如下:
#tar xfva jre-7u60-linux-x64.tar.gz -C /usr/local/java
此時會出現一個目錄,其完整路徑為 /usr/local/java/jre1.7.0_60。
接著請建立一個 /usr/local/java/cur 連結至 /usr/local/java/jre1.7.0_60 目錄:
ln -s /usr/local/java/jre1.7.0_60 /usr/local/java/cur
3. 安裝
請以 root 權限執行底下指令:
#update-alternatives --install /usr/bin/java java /usr/local/java/cur/bin/java 1
#update-alternatives --set java /usr/local/java/cur/bin/java
4. 設定環境
請在 ~/.bashrc 目錄下加入底下幾行:
JAVA="/usr/local/java"
JAVAbin="/usr/local/java/cur/bin"
CLASSPATH="/usr/share/java"
export JAVA_HOME="/usr/local/java/cur"
export PATH=$PATH:$JAVAbin
5. 安裝 firefox plugin
在安裝 firefox plugin 前,必須先關閉 firefox,接著以一般使用者權限至 ~/.mozilla/plugins 目錄下執行底下指令:
~/.mozilla/plugins $ ln -sf /usr/local/java/cur/lib/amd64/libnpjp2.so .
6. 測試 JRE 是否安裝成功 ?
以 firefox 連線至官方網頁測試即可,網址在:
https://www.java.com/en/download/installed.jsp
1. 下載
請至 Oracle 官方網站下載 JRE,其網址如下:
http://java.com/zh_TW/download/
依本文章為例,我們所下載的 JRE 是 jre-7u60-linux-x64.tar.gz。
2. 解壓縮
我們將 JRE 解壓縮至 /usr/local/java 目錄下,請以 root 權限先建立 /usr/local/java 目錄,指令如下:
#mkdir -p /usr/local/java
接著再將 jre-7u60-linux-x64.tar.gz 解壓縮至 /usr/local/java 目錄,指令如下:
#tar xfva jre-7u60-linux-x64.tar.gz -C /usr/local/java
此時會出現一個目錄,其完整路徑為 /usr/local/java/jre1.7.0_60。
接著請建立一個 /usr/local/java/cur 連結至 /usr/local/java/jre1.7.0_60 目錄:
ln -s /usr/local/java/jre1.7.0_60 /usr/local/java/cur
3. 安裝
請以 root 權限執行底下指令:
#update-alternatives --install /usr/bin/java java /usr/local/java/cur/bin/java 1
#update-alternatives --set java /usr/local/java/cur/bin/java
4. 設定環境
請在 ~/.bashrc 目錄下加入底下幾行:
JAVA="/usr/local/java"
JAVAbin="/usr/local/java/cur/bin"
CLASSPATH="/usr/share/java"
export JAVA_HOME="/usr/local/java/cur"
export PATH=$PATH:$JAVAbin
5. 安裝 firefox plugin
在安裝 firefox plugin 前,必須先關閉 firefox,接著以一般使用者權限至 ~/.mozilla/plugins 目錄下執行底下指令:
~/.mozilla/plugins $ ln -sf /usr/local/java/cur/lib/amd64/libnpjp2.so .
6. 測試 JRE 是否安裝成功 ?
以 firefox 連線至官方網頁測試即可,網址在:
https://www.java.com/en/download/installed.jsp
2014年6月19日 星期四
進階 Linux 作業系統期末上機考
1. 建立一個 deb_mirror.img,其大小為 4GB,此檔案必須可以支援中文 Debian 以及英文 Debian 之安裝。
2. 在 linux.img 中設定編譯 linaro qemu 環境,設定指令如下:
./configure --enable-tcg-interpreter --enable-gcov --enable-tpm
要設定到如底下所示
pixman system
SDL support yes
GTK support yes
curses support yes
curl support yes
mingw32 support no
Audio drivers oss
Block whitelist (rw)
Block whitelist (ro)
VirtFS support yes
VNC support yes
VNC TLS support yes
VNC SASL support yes
VNC JPEG support yes
VNC PNG support yes
VNC WS support yes
xen support no
brlapi support no
bluez support yes
Documentation yes
GUEST_BASE yes
PIE yes
vde support yes
Linux AIO support yes
ATTR/XATTR support yes
Install blobs yes
KVM support yes
RDMA support yes
TCG interpreter yes
fdt support yes
preadv support yes
fdatasync yes
madvise yes
posix_madvise yes
sigev_thread_id yes
uuid support yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
Trace backend nop
Trace output file trace-<pid>
spice support yes (0.12.6/0.12.4)
rbd support yes
xfsctl support yes
nss used yes
libusb yes
usb net redir yes
GLX support yes
libiscsi support yes
build guest agent yes
QGA VSS support no
seccomp support yes
coroutine backend ucontext
coroutine pool yes
GlusterFS support no
virtio-blk-data-plane yes
gcov gcov
gcov enabled yes
TPM support yes
libssh2 support yes
TPM passthrough yes
QOM debugging yes
vhdx yes
2. 在 linux.img 中設定編譯 linaro qemu 環境,設定指令如下:
./configure --enable-tcg-interpreter --enable-gcov --enable-tpm
要設定到如底下所示
pixman system
SDL support yes
GTK support yes
curses support yes
curl support yes
mingw32 support no
Audio drivers oss
Block whitelist (rw)
Block whitelist (ro)
VirtFS support yes
VNC support yes
VNC TLS support yes
VNC SASL support yes
VNC JPEG support yes
VNC PNG support yes
VNC WS support yes
xen support no
brlapi support no
bluez support yes
Documentation yes
GUEST_BASE yes
PIE yes
vde support yes
Linux AIO support yes
ATTR/XATTR support yes
Install blobs yes
KVM support yes
RDMA support yes
TCG interpreter yes
fdt support yes
preadv support yes
fdatasync yes
madvise yes
posix_madvise yes
sigev_thread_id yes
uuid support yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
Trace backend nop
Trace output file trace-<pid>
spice support yes (0.12.6/0.12.4)
rbd support yes
xfsctl support yes
nss used yes
libusb yes
usb net redir yes
GLX support yes
libiscsi support yes
build guest agent yes
QGA VSS support no
seccomp support yes
coroutine backend ucontext
coroutine pool yes
GlusterFS support no
virtio-blk-data-plane yes
gcov gcov
gcov enabled yes
TPM support yes
libssh2 support yes
TPM passthrough yes
QOM debugging yes
vhdx yes
2014年6月18日 星期三
自行編譯「完整版 Linaro Qemu」
Linaro Qemu 是 Linaro 基金會所支援的 Qemu,它較官方的 Qemu 支援更多 ARM 硬體,因此十分適合用在嵌入式系統開發上面。qemu linaro 有一項特異功能是使用 usb redir net 以使用網路傳遞 usb 通訊協定, 但是 debian wheezy 的函式庫過於老舊以致於無法將 qemu linaro 的這項功能啟動,在此介紹如何自行外加新版的函式庫以啟動此功能。
假設在 qemu linaro 目錄下執行 ./configure 出現:
ERROR: pixman not present. Your options:
(1) Preferred: Install the pixman devel package (any recent
distro should have packages as Xorg needs pixman too).
(2) Fetch the pixman submodule, using:
git submodule update --init pixman
其解決方式如下:
apt-get install libpixman-1-dev
若是 ./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
其解決方式為:
apt-get install libfdt-dev
之後有可能出現的錯誤訊息是:
GTK support no
的訊息,我們可以檢視 configure 檔案,裡面有底下段落:
##########################################
# GTK probe
if test "$gtk" != "no"; then
gtkpackage="gtk+-$gtkabi"
if test "$gtkabi" = "3.0" ; then
gtkversion="3.0.0"
vtepackage="vte-2.90"
vteversion="0.32.0"
else
gtkversion="2.18.0"
vtepackage="vte"
vteversion="0.24.0"
.. (中略)
elif ! $pkg_config --exists "$vtepackage >= $vteversion"; then
if test "$gtk" = "yes" ; then
error_exit "libvte not found (required for gtk support)"
.. (下略)
我們可以看到上面有一行:
error_exit "libvte not found (required for gtk support)"
此訊息表示 libvte-dev 之類名稱的套件沒有安裝,我們可以利用 aptitude 安裝 libvte-dev 套件,再執行 ./configure 看看。
seccomp support no
這表示我們沒有安裝 libseccomp-dev 套件,但是此套件目前在 Wheezy 底下並沒有出現,必須設定 Debian backports 才可以安裝,設定方式請在 /etc/apt/sources.list 中加入底下內容:
#Wheezy Backports
deb http://ftp.tw.debian.org/debian wheezy-backports main
接著執行 apt-get update; apt-get install libseccomp-dev 即可安裝。安裝完畢後我們再執行
./configure
其狀態如下:
seccomp support yes
1. 下載必要函式庫
apt-get install
libnss3-dev
libudev-dev
libpng12-dev
libghc6-zlib-dev
libogg-dev
libglobus-openssl-dev
libxrandr-dev
libxfixes-dev
libjpeg8-dev
libsasl2-dev
libiscsi-dev
librbd-dev
xfslibs-dev
libbrlapi-dev
libbluetooth-dev
libxen-dev
spice - http://spice-space.org/download.html
http://www.spice-space.org/download/releases/spice-0.12.5.tar.bz2
http://www.spice-space.org/download/releases/spice-protocol-0.12.7.tar.bz2
http://www.spice-space.org/download/usbredir/usbredir-0.7.tar.bz2
https://alioth.debian.org/frs/download.php/3842/pcsc-lite-1.8.7.tar.bz2
#https://alioth.debian.org/frs/download.php/3757/pcsc-lite-1.8.6.tar.bz2
http://jaist.dl.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.19/libusb-1.0.19.tar.bz2
但是在編 spice 時會說 pixman 版本太舊,因此我們還要自行安裝新版 pixman。
pixman - http://cgit.freedesktop.org/pixman/
http://cgit.freedesktop.org/pixman/snapshot/pixman-0.28.2.tar.gz
libcacard - http://spice-space.org/download/libcacard/
http://spice-space.org/download/libcacard/libcacard-0.1.2.tar.bz2
2. 安裝
pcsc-lite-1.8.7 安裝步驟:
tar xfva pcsc-lite-1.8.7.tar.bz2
cd pcsc-lite-1.8.7
./configure
make
# make install
libcacard 安裝步驟:
tar xfva libcacard-0.1.2.tar.bz2
./configure
錯誤訊息:
checking for NSS... no
configure: error: Package requirements (nss) were not met:
No package 'nss' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables NSS_CFLAGS
and NSS_LIBS to avoid the need to call pkg-config.
請安裝
libnss3-dev
即可。
make -j N
make install
libusb-1.0.18 安裝步驟:
tar xfva libusb-1.0.18.tar.bz2
cd libusb-1.0.18
./configure
make -j N
#make install
usbredir-0.7 安裝步驟:
tar xfva usbredir-0.7.tar.bz2
cd usbredir-0.7
./configure
make -j N
#make install
spice-protocol-0.12.7 安裝
tar xfva spice-protocol-0.12.7.tar.bz2
cd spice-protocol-0.12.7
./configure
make -j N
#make install
#cp /usr/local/share/pkgconfig/spice-protocol.pc /usr/lib/pkgconfig/
pixman 安裝步驟:
tar xfva pixman-0.28.2.tar.gz
cd pixman-0.28.2
./autogen
./configure
make -j N
# make install
celt 安裝步驟:
請注意 SPICE 只接受 CELT 0.51 版,因此不要安裝比此新的版本:
wget http://downloads.us.xiph.org/releases/celt/celt-0.5.1.3.tar.gz
tar xfv celt-0.5.1.3.tar.gz
cd celt-0.5.1.3
./configure
make -j N
#make install
cd /usr/local/lib/pkgconfig
/usr/local/lib/pkgconfig# ln -s celt.pc celt051.pc
spice
spice 安裝步驟:
tar xfva spice-0.12.5.tar.bz2
cd spice-0.12.5
./configure --enable-smartcard
但是執行此指令不一定能順利執行,大多數的情況下會有錯誤,我們要一一處理,例如:
錯誤訊息:
checking for CELT051... no
configure: error: Package requirements (celt051 >= 0.5.1.1) were not met:
No package 'celt051' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables CELT051_CFLAGS
and CELT051_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
如果遇上以上錯誤訊息的話請先安裝先前所提到的 celt 0.51 套件:
錯誤訊息:
checking for pyparsing python module... not found
configure: error: pyparsing python module is required to compile this package
請安裝底下套件:
python-pyparsing
即可。
錯誤訊息:
checking sasl/sasl.h usability... no
checking sasl/sasl.h presence... no
checking for sasl/sasl.h... no
checking for sasl_client_init in -lsasl2... no
checking for sasl_client_init in -lsasl... no
configure: error: Missing required Cyrus SASL development package
請安裝底下套件:
libsasl2-dev
即可
錯誤訊息:
checking for SMARTCARD... no
configure: error: Package requirements (libcacard >= 0.1.2) were not met:
No package 'libcacard' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables SMARTCARD_CFLAGS
and SMARTCARD_LIBS to avoid the need to call pkg-config.
請依先前步驟安裝 libcacard 0.1.2 即可。
qemu
tar xfva qemu-linaro-1.7.0-2014.01.tar.gz
cd qemu-linaro-1.7.0-2014.01
./configure
time make -j 4
su
# make install
安裝完畢後可以執行底下指令來看看 qemu-linaro 版是否能正確執行:
qemu-system-arm -version
如果出現底下錯誤訊息的話,表示動態連結函式庫沒設定好:
qemu-system-arm: error while loading shared libraries: libspice-server.so.1: cannot open shared object file: No such file or directory
請以 root 權限執行:
# ldconfig
再回到一般使用者權限即可執行:
$ qemu-system-arm -version
QEMU emulator version 1.7.0 (qemu-linaro 2014.01), Copyright (c) 2003-2008 Fabrice Bellard
假設在 qemu linaro 目錄下執行 ./configure 出現:
ERROR: pixman not present. Your options:
(1) Preferred: Install the pixman devel package (any recent
distro should have packages as Xorg needs pixman too).
(2) Fetch the pixman submodule, using:
git submodule update --init pixman
其解決方式如下:
apt-get install libpixman-1-dev
若是 ./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
其解決方式為:
apt-get install libfdt-dev
之後有可能出現的錯誤訊息是:
GTK support no
的訊息,我們可以檢視 configure 檔案,裡面有底下段落:
##########################################
# GTK probe
if test "$gtk" != "no"; then
gtkpackage="gtk+-$gtkabi"
if test "$gtkabi" = "3.0" ; then
gtkversion="3.0.0"
vtepackage="vte-2.90"
vteversion="0.32.0"
else
gtkversion="2.18.0"
vtepackage="vte"
vteversion="0.24.0"
.. (中略)
elif ! $pkg_config --exists "$vtepackage >= $vteversion"; then
if test "$gtk" = "yes" ; then
error_exit "libvte not found (required for gtk support)"
.. (下略)
我們可以看到上面有一行:
error_exit "libvte not found (required for gtk support)"
此訊息表示 libvte-dev 之類名稱的套件沒有安裝,我們可以利用 aptitude 安裝 libvte-dev 套件,再執行 ./configure 看看。
seccomp support no
這表示我們沒有安裝 libseccomp-dev 套件,但是此套件目前在 Wheezy 底下並沒有出現,必須設定 Debian backports 才可以安裝,設定方式請在 /etc/apt/sources.list 中加入底下內容:
#Wheezy Backports
deb http://ftp.tw.debian.org/debian wheezy-backports main
接著執行 apt-get update; apt-get install libseccomp-dev 即可安裝。安裝完畢後我們再執行
./configure
其狀態如下:
seccomp support yes
1. 下載必要函式庫
apt-get install
libnss3-dev
libudev-dev
libpng12-dev
libghc6-zlib-dev
libogg-dev
libglobus-openssl-dev
libxrandr-dev
libxfixes-dev
libjpeg8-dev
libsasl2-dev
libiscsi-dev
librbd-dev
xfslibs-dev
libbrlapi-dev
libbluetooth-dev
libxen-dev
spice - http://spice-space.org/download.html
http://www.spice-space.org/download/releases/spice-0.12.5.tar.bz2
http://www.spice-space.org/download/releases/spice-protocol-0.12.7.tar.bz2
http://www.spice-space.org/download/usbredir/usbredir-0.7.tar.bz2
https://alioth.debian.org/frs/download.php/3842/pcsc-lite-1.8.7.tar.bz2
#https://alioth.debian.org/frs/download.php/3757/pcsc-lite-1.8.6.tar.bz2
http://jaist.dl.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.19/libusb-1.0.19.tar.bz2
但是在編 spice 時會說 pixman 版本太舊,因此我們還要自行安裝新版 pixman。
pixman - http://cgit.freedesktop.org/pixman/
http://cgit.freedesktop.org/pixman/snapshot/pixman-0.28.2.tar.gz
libcacard - http://spice-space.org/download/libcacard/
http://spice-space.org/download/libcacard/libcacard-0.1.2.tar.bz2
2. 安裝
pcsc-lite-1.8.7 安裝步驟:
tar xfva pcsc-lite-1.8.7.tar.bz2
cd pcsc-lite-1.8.7
./configure
make
# make install
libcacard 安裝步驟:
tar xfva libcacard-0.1.2.tar.bz2
./configure
錯誤訊息:
checking for NSS... no
configure: error: Package requirements (nss) were not met:
No package 'nss' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables NSS_CFLAGS
and NSS_LIBS to avoid the need to call pkg-config.
請安裝
libnss3-dev
即可。
make -j N
make install
libusb-1.0.18 安裝步驟:
tar xfva libusb-1.0.18.tar.bz2
cd libusb-1.0.18
./configure
make -j N
#make install
usbredir-0.7 安裝步驟:
tar xfva usbredir-0.7.tar.bz2
cd usbredir-0.7
./configure
make -j N
#make install
spice-protocol-0.12.7 安裝
tar xfva spice-protocol-0.12.7.tar.bz2
cd spice-protocol-0.12.7
./configure
make -j N
#make install
#cp /usr/local/share/pkgconfig/spice-protocol.pc /usr/lib/pkgconfig/
pixman 安裝步驟:
tar xfva pixman-0.28.2.tar.gz
cd pixman-0.28.2
./autogen
./configure
make -j N
# make install
celt 安裝步驟:
請注意 SPICE 只接受 CELT 0.51 版,因此不要安裝比此新的版本:
wget http://downloads.us.xiph.org/releases/celt/celt-0.5.1.3.tar.gz
tar xfv celt-0.5.1.3.tar.gz
cd celt-0.5.1.3
./configure
make -j N
#make install
cd /usr/local/lib/pkgconfig
/usr/local/lib/pkgconfig# ln -s celt.pc celt051.pc
spice
spice 安裝步驟:
tar xfva spice-0.12.5.tar.bz2
cd spice-0.12.5
./configure --enable-smartcard
但是執行此指令不一定能順利執行,大多數的情況下會有錯誤,我們要一一處理,例如:
錯誤訊息:
checking for CELT051... no
configure: error: Package requirements (celt051 >= 0.5.1.1) were not met:
No package 'celt051' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables CELT051_CFLAGS
and CELT051_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
如果遇上以上錯誤訊息的話請先安裝先前所提到的 celt 0.51 套件:
錯誤訊息:
checking for pyparsing python module... not found
configure: error: pyparsing python module is required to compile this package
請安裝底下套件:
python-pyparsing
即可。
錯誤訊息:
checking sasl/sasl.h usability... no
checking sasl/sasl.h presence... no
checking for sasl/sasl.h... no
checking for sasl_client_init in -lsasl2... no
checking for sasl_client_init in -lsasl... no
configure: error: Missing required Cyrus SASL development package
請安裝底下套件:
libsasl2-dev
即可
錯誤訊息:
checking for SMARTCARD... no
configure: error: Package requirements (libcacard >= 0.1.2) were not met:
No package 'libcacard' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables SMARTCARD_CFLAGS
and SMARTCARD_LIBS to avoid the need to call pkg-config.
請依先前步驟安裝 libcacard 0.1.2 即可。
qemu
tar xfva qemu-linaro-1.7.0-2014.01.tar.gz
cd qemu-linaro-1.7.0-2014.01
./configure
time make -j 4
su
# make install
安裝完畢後可以執行底下指令來看看 qemu-linaro 版是否能正確執行:
qemu-system-arm -version
如果出現底下錯誤訊息的話,表示動態連結函式庫沒設定好:
qemu-system-arm: error while loading shared libraries: libspice-server.so.1: cannot open shared object file: No such file or directory
請以 root 權限執行:
# ldconfig
再回到一般使用者權限即可執行:
$ qemu-system-arm -version
QEMU emulator version 1.7.0 (qemu-linaro 2014.01), Copyright (c) 2003-2008 Fabrice Bellard
2014年5月29日 星期四
將實體機的 Debian 鏡像站分享給 pxeserver
2019/10/14 修改
PXE Server 雖然有 deb_mirror.img 來作為網路安裝下載之檔案儲存空間,但畢竟不是一個完整的 Debian 鏡像站,為了解決這個問題,讓 PXE Server 能成為虛擬教室真正的 Debian 鏡像站,我們要將實體機的 /home/ftp/debian 及 /home/ftp/emdebian 目錄以 NFS 方式分享給 PXE Server,而 PXE Server 可以掛載此兩個目錄,並成為虛擬教室中真正的鏡像站主機。
作法:
1. 本機(實體機器)端開啟 NFS 服務
首先請以 root 權限安裝 nfs-kernel-server 套件,接著修改
/etc/exports 檔案,加上二行:
/home/ftp/debian 192.168.10.254(ro,sync,no_subtree_check)
/home/ftp/emdebian 192.168.10.254(ro,sync,no_subtree_check)
作完後執行
/etc/init.d/nfs-kernel-server restart
然後執行 showmount -e localhost 來觀看輸出,如底下所示:
root@aspire:~# showmount -e localhost
Export list for localhost:
/home/ftp/emdebian 192.168.10.254
/home/ftp/debian 192.168.10.254
2. PXE Server 掛載 NFS 目錄
2.1 確認有看到實體機分享出來的鏡像站目錄
showmount -e 192.168.10.1
^^^^^^^^^^^^ -> 此 IP 為 PXE Server 所看到實體主機之 IP
看到輸出如下所示:
Export list for 192.168.10.1:
/home/ftp/emdebian 192.168.10.254
/home/ftp/debian 192.168.10.254
2.2 建置 ftp 伺服器
2.3 在 pxe 伺服器底下輸入:
# showmount -e 192.168.10.1
Export list for 192.168.10.1:
/srv/ftp 192.168.10.0/24
接著手動掛載試試看:
# mkdir -p /home/ftp/debian
# mount -t nfs 192.168.10.1:/home/ftp/debian /home/ftp/debian
看看能不能把遠端的 ftp 站掛在 pxe 伺服器的 /home/ftp 目錄。確定可以的話我們把設定寫入
/etc/fstab
接著請修改 /etc/passwd 檔案,將
ftp:x:107:65534::/srv/ftp:/usr/sbin/nologin
改成
ftp:x:107:65534::/home/ftp:/usr/sbin/nologin
然後用瀏覽器開 ftp://192.168.10.254,看看能不能看到 debian 目錄。
# vi /etc/fstab
新增一行:
192.168.10.1:/home/ftp/debian /home/ftp/debian nfs defaults 0 0
然後可以執行:
# mount -a
來確認掛載沒有問題。
3. 測試虛擬機之鏡像站設定
請在實體機上修改 /etc/apt/sources.list 檔,將其中的鏡像站設定改為:
deb ftp://192.168.10.254/debian/ stretch main contrib non-free
然後再執行
# apt-get update
看看能不能自 ftp://192.168.10.254 下載資料。
請參考網頁
PXE Server 雖然有 deb_mirror.img 來作為網路安裝下載之檔案儲存空間,但畢竟不是一個完整的 Debian 鏡像站,為了解決這個問題,讓 PXE Server 能成為虛擬教室真正的 Debian 鏡像站,我們要將實體機的 /home/ftp/debian 及 /home/ftp/emdebian 目錄以 NFS 方式分享給 PXE Server,而 PXE Server 可以掛載此兩個目錄,並成為虛擬教室中真正的鏡像站主機。
作法:
1. 本機(實體機器)端開啟 NFS 服務
首先請以 root 權限安裝 nfs-kernel-server 套件,接著修改
/etc/exports 檔案,加上二行:
/home/ftp/debian 192.168.10.254(ro,sync,no_subtree_check)
/home/ftp/emdebian 192.168.10.254(ro,sync,no_subtree_check)
作完後執行
/etc/init.d/nfs-kernel-server restart
然後執行 showmount -e localhost 來觀看輸出,如底下所示:
root@aspire:~# showmount -e localhost
Export list for localhost:
/home/ftp/emdebian 192.168.10.254
/home/ftp/debian 192.168.10.254
2. PXE Server 掛載 NFS 目錄
2.1 確認有看到實體機分享出來的鏡像站目錄
showmount -e 192.168.10.1
^^^^^^^^^^^^ -> 此 IP 為 PXE Server 所看到實體主機之 IP
看到輸出如下所示:
Export list for 192.168.10.1:
/home/ftp/emdebian 192.168.10.254
/home/ftp/debian 192.168.10.254
2.2 建置 ftp 伺服器
2.3 在 pxe 伺服器底下輸入:
# showmount -e 192.168.10.1
Export list for 192.168.10.1:
/srv/ftp 192.168.10.0/24
接著手動掛載試試看:
# mkdir -p /home/ftp/debian
# mount -t nfs 192.168.10.1:/home/ftp/debian /home/ftp/debian
看看能不能把遠端的 ftp 站掛在 pxe 伺服器的 /home/ftp 目錄。確定可以的話我們把設定寫入
/etc/fstab
接著請修改 /etc/passwd 檔案,將
ftp:x:107:65534::/srv/ftp:/usr/sbin/nologin
改成
ftp:x:107:65534::/home/ftp:/usr/sbin/nologin
然後用瀏覽器開 ftp://192.168.10.254,看看能不能看到 debian 目錄。
# vi /etc/fstab
新增一行:
192.168.10.1:/home/ftp/debian /home/ftp/debian nfs defaults 0 0
然後可以執行:
# mount -a
來確認掛載沒有問題。
3. 測試虛擬機之鏡像站設定
請在實體機上修改 /etc/apt/sources.list 檔,將其中的鏡像站設定改為:
deb ftp://192.168.10.254/debian/ stretch main contrib non-free
然後再執行
# apt-get update
看看能不能自 ftp://192.168.10.254 下載資料。
請參考網頁
備份 Embedebian 鏡像站
目的:備份 Embedebian 鏡像站
Embedebian 是提供 Debain 的嵌入式版本套件,特別是 ARM 的 Cross Compile 環境,在建置嵌入式系統開發時需要 Embedebian 所提供的套件才能編譯原始碼 (如 Linux 核心、bootloader) 或是進行其它工作。
一般來說我們都是直接自 Embedebian 網站上下載套件,其方式是先在 /etc/apt/sources.list 設定底下這兩行:
deb http://ftp.tw.debian.org/debian/ squeeze main
deb http://www.emdebian.org/debian/ squeeze main
加完之後執行
apt-get update
更新套件狀態,
然後先安裝 emdebian-archive-keyring 套件以免出現套件驗證錯誤,再安裝底下套件:
g++-4.4-arm-linux-gnueabi
cpp-4.4-arm-linux-gnueabi
gcc-4.4-arm-linux-gnueabi
接下來可以試著編譯 arm 底下的程式。請先建一個 hello.c 之檔案,內容如下:
#include <stdio.h>
void main(void)
{
printf("Hello World\n");
}
然後使用 gcc 來編譯:
gcc hello.c -o hello
接著可以用 file 來觀看其屬性:
file hello
我們可以看到此檔為 x86-64 之可執行檔,如底下所示:
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xe899e4c904b6efa70bd90c9a293d37109e111e59, not stripped
接下來可以使用 arm-linux-gnueabi-gcc-4.4 來編譯此檔使其成為 ARM 之可執行檔,這個過程也就是所謂的 Cross Compile
arm-linux-gnueabi-gcc-4.4 hello.c -o hello_arm
然後使用 file 來觀看其輸出:
file hello_arm
如底下所示,是 ARM 平台的可執行檔:
hello_arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x1c0380de88d986d10d6fb8ef5fa9492f4bd410dd, not stripped
----------------------------------------------------------------------
請執行 getemdebian.sh 來下載 www.emdebian.org/debian 目錄,其內容如下:
debmirror \
--arch=armel,i386,amd64 \
--dist=squeeze,wheezy \
--host=www.emdebian.org \
--root="debian" \
--diff=none -p \
--nosource \
--method=http \
--section main,contrib,non-free,main/debian-installer,main/installer-armel,main/i18n,main/source \
--ignore-release-gpg /home/ftp/emdebian/ ;
date
建立好 emdebian 鏡像之後,我們可以把 /etc/apt/sources.list 改成:
deb http://ftp.tw.debian.org/debian/ squeeze main
#deb http://www.emdebian.org/debian/ squeeze main
deb ftp://localhost/emdebian/ squeeze main
完成此流程後,我們就可以把 ARM cross compiler 放在自建鏡像站的 emdebian 目錄下,「理論上」無需再透過網路上網下載檔案,但是記得隨時更新套件狀態,以免有漏洞未更新造成系統安全問題。
Embedebian 是提供 Debain 的嵌入式版本套件,特別是 ARM 的 Cross Compile 環境,在建置嵌入式系統開發時需要 Embedebian 所提供的套件才能編譯原始碼 (如 Linux 核心、bootloader) 或是進行其它工作。
一般來說我們都是直接自 Embedebian 網站上下載套件,其方式是先在 /etc/apt/sources.list 設定底下這兩行:
deb http://ftp.tw.debian.org/debian/ squeeze main
deb http://www.emdebian.org/debian/ squeeze main
加完之後執行
apt-get update
更新套件狀態,
然後先安裝 emdebian-archive-keyring 套件以免出現套件驗證錯誤,再安裝底下套件:
g++-4.4-arm-linux-gnueabi
cpp-4.4-arm-linux-gnueabi
gcc-4.4-arm-linux-gnueabi
接下來可以試著編譯 arm 底下的程式。請先建一個 hello.c 之檔案,內容如下:
#include <stdio.h>
void main(void)
{
printf("Hello World\n");
}
然後使用 gcc 來編譯:
gcc hello.c -o hello
接著可以用 file 來觀看其屬性:
file hello
我們可以看到此檔為 x86-64 之可執行檔,如底下所示:
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xe899e4c904b6efa70bd90c9a293d37109e111e59, not stripped
接下來可以使用 arm-linux-gnueabi-gcc-4.4 來編譯此檔使其成為 ARM 之可執行檔,這個過程也就是所謂的 Cross Compile
arm-linux-gnueabi-gcc-4.4 hello.c -o hello_arm
然後使用 file 來觀看其輸出:
file hello_arm
如底下所示,是 ARM 平台的可執行檔:
hello_arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x1c0380de88d986d10d6fb8ef5fa9492f4bd410dd, not stripped
----------------------------------------------------------------------
請執行 getemdebian.sh 來下載 www.emdebian.org/debian 目錄,其內容如下:
debmirror \
--arch=armel,i386,amd64 \
--dist=squeeze,wheezy \
--host=www.emdebian.org \
--root="debian" \
--diff=none -p \
--nosource \
--method=http \
--section main,contrib,non-free,main/debian-installer,main/installer-armel,main/i18n,main/source \
--ignore-release-gpg /home/ftp/emdebian/ ;
date
建立好 emdebian 鏡像之後,我們可以把 /etc/apt/sources.list 改成:
deb http://ftp.tw.debian.org/debian/ squeeze main
#deb http://www.emdebian.org/debian/ squeeze main
deb ftp://localhost/emdebian/ squeeze main
完成此流程後,我們就可以把 ARM cross compiler 放在自建鏡像站的 emdebian 目錄下,「理論上」無需再透過網路上網下載檔案,但是記得隨時更新套件狀態,以免有漏洞未更新造成系統安全問題。
2014年5月22日 星期四
自建 Debian 鏡像站
2019/10/14 修改
目的:自建 Debian 鏡像站 (MIRROR)
在安裝 Debian Linux 的過程中,常常需要使用網路進行遠端連線來下載套件 (packages), 如果網路連線有問題的話,我們經常無法進行套件下載或更新的操作。這對執行專案是項極大的困擾,為了不讓網路干擾我們進行下載,因此必須自行建立 Debian 鏡像站。
Debian 支援相當多硬體架構,因此官方鏡像站需要相當多的容量才可以儲存所有套件,我們的計畫僅需要底下架構:
X86_64 (amd64)
i386 (i386)
EABI ARM (armel)
Hard Float ABI ARM (armhf)
ARM64 (arm64)
其它架構的檔案無需下載,以節省硬碟空間。要自建 Debian 鏡像站的流程如下:
1. 建立 ftp 伺服器
2. 下載 Debian 套件
3. 啟動服務
4. 設定 /etc/apt/sources.list
------------------------------
如果我們希望所下載的 Debian 鏡像站可以提供給 pxeserver 使用的話,還必須
利用 NFS 的方式將 Debian 鏡像站的目錄分享給 pxeserver。
=========================================
1. 建立 ftp 伺服器
請以 root 權限執行:
# apt-get install proftpd-basic
安裝完畢後,請修改 /etc/proftpd/proftpd.conf 這個檔案,將底下部份移除行首之 #
(註解),移除完之結果如底下所述:
---------
<Anonymous ~ftp>
User ftp
Group nogroup
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous ftp
# Cosmetic changes, all files belongs to ftp user
DirFakeUser on ftp
DirFakeGroup on ftp
RequireValidShell off
# Limit the maximum number of anonymous logins
MaxClients 70
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayChdir .message
# Limit WRITE everywhere in the anonymous chroot
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
# Uncomment this if you're brave.
# <Directory incoming>
# # Umask 022 is a good standard umask to prevent new files and dirs
# # (second parm) from being group and world writable.
# Umask 022 022
# <Limit READ WRITE>
# DenyAll
# </Limit>
# <Limit STOR>
# AllowAll
# </Limit>
# </Directory>
</Anonymous>
--------
接著請修改 /etc/passwd 將 ftp 的家目錄由 /srv/ftp 改至 /home/ftp
修改完成後,請執行 proftpd-basic 服務,指令如下:
# /etc/init.d/proftpd restart
[ ok ] Stopping ftp server: proftpd.
[ ok ] Starting ftp server: proftpd.
啟動完畢後,我們可以使用 iceweasel 或是 gftp 來驗證自己的 ftp 站是否已完成架設。
=========================================
2. 下載 Debian 套件
由於 Debian 套件所佔之容量極為龐大,要下載 Debian 套件前請先確定自己的 /home/ftp 目錄是否有至少 150 GB 的容量,以免硬碟容量不足。
接下來請安裝 debmirror 套件,以便下載 Debian 鏡像站,接著請撰寫底下 script:
#HOST=ftp.tw.debian.org
HOST=debian.nctu.edu.tw
#HOST=opensource.nchc.org.tw
#HOST=ftp.twaren.net
debmirror \
--arch=i386,amd64,armel,armhf \
--dist=buster,buster-updates,buster-backports \
--di-arch=i386,amd64,armel \
--di-dist=stable \
--host=$HOST \
--root=":debian" \
--diff=none -p \
--nosource \
--method=rsync \
--section main,contrib,non-free \
--i18n \
--ignore-release-gpg /home/ftp/debian/ ;
此 script 請放在 /home/ftp 目錄下,執行:
# sh getdeb.sh
接著此 script 就會自動進行 Debian 套件下載的工作,我們也可以使用 crontab
讓此工作定期 (每日凌晨 2 點) 執行。
4. 設定 /etc/apt/sources.list
請修改 /etc/apt/sources.list
加上以下兩行:
deb file:/home/ftp/debian/ buster main contrib non-free
deb ftp://127.0.0.1/debian buster main contrib non-free
deb ftp://localhost/debian buster main contrib non-free
其中第一行是指在本機端下載套件時,可以不經由 ftp 傳輸協定,直接使用檔案複製的方式來進行套件下載。
第二行則是透過 ftp 傳輸協定,自 127.0.0.1 下載套件,請注意 lo 介面要打開,否則沒有 ftp://localhost 或 ftp://127.0.0.1。因此我們新的 /etc/apt/sources.list 可以只保留底下這幾行:
deb file:/home/ftp/debian/ buster main contrib non-free
deb ftp://127.0.0.1/debian buster main contrib non-free
#deb ftp://localhost/debian buster main contrib non-free
deb http://security.debian.org/ stable/updates main contrib
修改完畢後,可以在本機端使用
apt-get update
apt-get upgrade
apt-get install 套件
來進行安裝測試,以確認自己所架設之 Debian 鏡像站可以正常運轉。
目的:自建 Debian 鏡像站 (MIRROR)
在安裝 Debian Linux 的過程中,常常需要使用網路進行遠端連線來下載套件 (packages), 如果網路連線有問題的話,我們經常無法進行套件下載或更新的操作。這對執行專案是項極大的困擾,為了不讓網路干擾我們進行下載,因此必須自行建立 Debian 鏡像站。
Debian 支援相當多硬體架構,因此官方鏡像站需要相當多的容量才可以儲存所有套件,我們的計畫僅需要底下架構:
X86_64 (amd64)
i386 (i386)
EABI ARM (armel)
Hard Float ABI ARM (armhf)
ARM64 (arm64)
其它架構的檔案無需下載,以節省硬碟空間。要自建 Debian 鏡像站的流程如下:
1. 建立 ftp 伺服器
2. 下載 Debian 套件
3. 啟動服務
4. 設定 /etc/apt/sources.list
------------------------------
如果我們希望所下載的 Debian 鏡像站可以提供給 pxeserver 使用的話,還必須
利用 NFS 的方式將 Debian 鏡像站的目錄分享給 pxeserver。
=========================================
1. 建立 ftp 伺服器
請以 root 權限執行:
# apt-get install proftpd-basic
安裝完畢後,請修改 /etc/proftpd/proftpd.conf 這個檔案,將底下部份移除行首之 #
(註解),移除完之結果如底下所述:
---------
<Anonymous ~ftp>
User ftp
Group nogroup
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous ftp
# Cosmetic changes, all files belongs to ftp user
DirFakeUser on ftp
DirFakeGroup on ftp
RequireValidShell off
# Limit the maximum number of anonymous logins
MaxClients 70
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayChdir .message
# Limit WRITE everywhere in the anonymous chroot
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
# Uncomment this if you're brave.
# <Directory incoming>
# # Umask 022 is a good standard umask to prevent new files and dirs
# # (second parm) from being group and world writable.
# Umask 022 022
# <Limit READ WRITE>
# DenyAll
# </Limit>
# <Limit STOR>
# AllowAll
# </Limit>
# </Directory>
</Anonymous>
--------
接著請修改 /etc/passwd 將 ftp 的家目錄由 /srv/ftp 改至 /home/ftp
修改完成後,請執行 proftpd-basic 服務,指令如下:
# /etc/init.d/proftpd restart
[ ok ] Stopping ftp server: proftpd.
[ ok ] Starting ftp server: proftpd.
啟動完畢後,我們可以使用 iceweasel 或是 gftp 來驗證自己的 ftp 站是否已完成架設。
=========================================
2. 下載 Debian 套件
由於 Debian 套件所佔之容量極為龐大,要下載 Debian 套件前請先確定自己的 /home/ftp 目錄是否有至少 150 GB 的容量,以免硬碟容量不足。
接下來請安裝 debmirror 套件,以便下載 Debian 鏡像站,接著請撰寫底下 script:
#HOST=ftp.tw.debian.org
HOST=debian.nctu.edu.tw
#HOST=opensource.nchc.org.tw
#HOST=ftp.twaren.net
debmirror \
--arch=i386,amd64,armel,armhf \
--dist=buster,buster-updates,buster-backports \
--di-arch=i386,amd64,armel \
--di-dist=stable \
--host=$HOST \
--root=":debian" \
--diff=none -p \
--nosource \
--method=rsync \
--section main,contrib,non-free \
--i18n \
--ignore-release-gpg /home/ftp/debian/ ;
此 script 請放在 /home/ftp 目錄下,執行:
# sh getdeb.sh
接著此 script 就會自動進行 Debian 套件下載的工作,我們也可以使用 crontab
讓此工作定期 (每日凌晨 2 點) 執行。
4. 設定 /etc/apt/sources.list
請修改 /etc/apt/sources.list
加上以下兩行:
deb file:/home/ftp/debian/ buster main contrib non-free
deb ftp://127.0.0.1/debian buster main contrib non-free
deb ftp://localhost/debian buster main contrib non-free
其中第一行是指在本機端下載套件時,可以不經由 ftp 傳輸協定,直接使用檔案複製的方式來進行套件下載。
第二行則是透過 ftp 傳輸協定,自 127.0.0.1 下載套件,請注意 lo 介面要打開,否則沒有 ftp://localhost 或 ftp://127.0.0.1。因此我們新的 /etc/apt/sources.list 可以只保留底下這幾行:
deb file:/home/ftp/debian/ buster main contrib non-free
deb ftp://127.0.0.1/debian buster main contrib non-free
#deb ftp://localhost/debian buster main contrib non-free
deb http://security.debian.org/ stable/updates main contrib
修改完畢後,可以在本機端使用
apt-get update
apt-get upgrade
apt-get install 套件
來進行安裝測試,以確認自己所架設之 Debian 鏡像站可以正常運轉。
2014年5月8日 星期四
建立 deb_mirror.img
目的:將 deb_mirror.img 建立成一個小型的 debian repository
思維模式:
PXE Server 負責提供一個可以讓同網域網段之電腦利用網路開機、取得 IP 以及安裝 Debian Linux 的功能,其中 deb_mirror.img 負責存放網路安裝 (net install) 時必須使用的套件 (package),也就是安裝時所必要的 .deb 檔案。因此我們建立 deb_mirror.img,將其分割、格式化,並掛載至 /mnt 目錄以利下載套件用。
建立 deb_mirror.img 流程:
a. dd if=/dev/zero of=deb_mirror.img bs=1G count=2
b. # fdisk deb_mirror.img
將其建立一個分割區。
c. 將 deb_mirror.img 格式化
# losetup /dev/loop0 deb_mirror.img
# losetup -o $[2048*512] /dev/loop1 /dev/loop0
# mkfs.ext4 /dev/loop1
d. 將 /dev/loop1 掛載至 /mnt 目錄
mount /dev/loop1 /mnt
掛載完畢後可以執行
df -h /mnt 來觀察是否有正確掛載,其輸出如下所示:
檔案系統 容量 已用 可用 已用% 掛載點
/dev/loop1 2.0G 3.0M 1.9G 1% /mnt
複製 deb_mirror.img 流程:
一開始我們的想法很單純,將 Debian 安裝光碟第一片複製到 deb_mirror.img 中「理論上」即可提供安裝流程所需要的檔案。因此我們需要將 debian 第一片安裝光碟中之檔案複製到 /mnt (目前已掛載 deb_mirror.img) 目錄下,首先要下載第一片安裝光碟,並掛載至 /cdrom 目錄,其操作如下:
1. 下載 debian 第一片安裝光碟
wget ftp://ftp.twaren.net/pub/Debian/debian-cd/current/amd64/iso-cd/debian-7.5.0-amd64-CD-1.iso
(校內請至 120.117.72.71 之 iso 目錄下載)
2. 掛載 debian-7.5.0-amd64-CD-1.iso 至 /cdrom 目錄
首先檢查是否有 /cdrom 目錄,若沒有的話請執行:
# mkdir /cdrom
建立完此目錄後將 debian-7.5.0-amd64-CD-1.iso 掛載至此目錄,指令如:
mount -o loop debian-7.5.0-amd64-CD-1.iso /cdrom
3. 檢視 /cdrom 目錄之內容:
請切換至 /crom 目錄,指令如下:
cd /cdrom
接著執行 ls -l,其輸出如下:
-r--r--r-- 1 root root 27 4月 26 21:38 autorun.inf
dr-xr-xr-x 1 root root 2048 4月 26 21:38 boot
dr-xr-xr-x 1 root root 2048 4月 26 21:38 css
lr-xr-xr-x 1 root root 1 4月 26 21:37 debian -> .
dr-xr-xr-x 1 root root 2048 4月 26 21:38 dists
dr-xr-xr-x 1 root root 4096 4月 26 21:37 doc
dr-xr-xr-x 1 root root 2048 4月 26 21:38 efi
dr-xr-xr-x 1 root root 2048 4月 26 21:38 firmware
-r--r--r-- 1 root root 159629 4月 24 15:42 g2ldr
-r--r--r-- 1 root root 8192 4月 24 15:42 g2ldr.mbr
dr-xr-xr-x 1 root root 2048 4月 26 21:37 install
dr-xr-xr-x 1 root root 2048 4月 26 21:38 install.amd
dr-xr-xr-x 1 root root 4096 4月 26 21:38 isolinux
-r--r--r-- 1 root root 212666 4月 26 21:51 md5sum.txt
dr-xr-xr-x 1 root root 2048 4月 26 21:38 pics
dr-xr-xr-x 1 root root 2048 4月 26 21:38 pool
-r--r--r-- 1 root root 9262 4月 26 21:51 README.html
-r--r--r-- 1 root root 176551 4月 11 09:52 README.mirrors.html
-r--r--r-- 1 root root 87800 4月 11 09:52 README.mirrors.txt
-r--r--r-- 1 root root 425 4月 26 21:38 README.source
-r--r--r-- 1 root root 5827 4月 26 21:51 README.txt
-r--r--r-- 1 root root 366350 4月 24 15:42 setup.exe
dr-xr-xr-x 1 root root 2048 4月 26 21:38 tools
-r--r--r-- 1 root root 256 4月 26 21:38 win32-loader.ini
/cdrom 目錄有許多目錄及檔案,我們可以執行 du -sh * 來觀看每個檔案/目錄的容量,如底下所示:
512 autorun.inf
1.9M boot
8.0K css
0 debian
3.3M dists
33M doc
416K efi
2.0K firmware
156K g2ldr
8.0K g2ldr.mbr
2.0K install
33M install.amd
303K isolinux
208K md5sum.txt
29K pics
562M pool
9.5K README.html
173K README.mirrors.html
86K README.mirrors.txt
512 README.source
6.0K README.txt
358K setup.exe
76K tools
512 win32-loader.ini
其中 pool 目錄所佔容量最大,共有 562 MB,這個目錄相當「可疑」,很有可能是我們在安裝時所會用到的 .deb 檔案,因此值得切換進去觀察裡面內容。經過一番觀察,此目錄的確存放 .deb 檔案,因此可以將此目錄複製到 /mnt 目錄,指令如下:
cp -av /cdrom/pool /mnt
執行 buildlinux.sh 之鏡像站選擇/下載套件 出錯時之處理流程:
請在 buildlinux 之虛擬機器按 Ctrl+Alt+F 切換至全螢幕,然後按 Alt+F4 至第四個虛端終端機來看錯誤訊息,此時我們會看到系統是因為少了那些檔案而導致安裝流程出錯。根據其錯誤訊息,我們要建立
/mnt/dists/jessie
/mnt/dists/sid
/mnt/dists/squeeze
/mnt/dists/wheezy
四個目錄,再建立底下連結:
root@wyvern:/mnt/dists# ln -s wheezy stable
root@wyvern:/mnt/dists# ln -s jessie testing
root@wyvern:/mnt/dists# ln -s squeeze oldstable
root@wyvern:/mnt/dists# ln -s sid unstable
然後再複製每個目錄所缺少的檔案,目前缺少 Release 檔案。
複製完畢後請至 PXE 伺服器重新掛載 /var/www/debian 目錄
mount -o ro,remount /var/www/debian
並檢查 /var/www 底下是否有 dists 目錄以及剛剛複製的檔案。
然後請再回到 buildlinux 底下,切換至全營幕並重新執行安裝流程,此時我們會發現出現新的錯誤訊息,這表示剛剛 buildlinux 已經有抓到我們複製的檔案,並前往下一步,由於檔案仍然有缺,因此出現新的錯誤訊息。
因此我們繼續複製缺少的檔案:
/mnt/dists# mkdir -p wheezy/main/binary-amd64/
cd wheezy/main/binary-amd64/
wget ftp://ftp.debian.org/debian/dists/wheezy/main/binary-amd64/Release
複製完畢後請再回到 PXE 伺服器,重新掛載 /var/www/debian 目錄。掛載完畢後請再檢查 /var/www/debian/dists/wheezy/main/binary-amd64/Release 這個檔案是否存在,然後切換至 buildlinux 繼續安裝流程。
現在出現的錯訊息是
dists/wheezy/Release is unsigned.
這表示 Release 這個檔案沒有數位簽章,也就是說我們沒有複製 Release.gpg 這個檔案,請複製
ftp://ftp.debian.org/debian/dists/wheezy/Release.gpg
指令如下:
/mnt/dists/wheezy# wget ftp://ftp.debian.org/debian/dists/wheezy/Release.gpg
另一個錯誤訊息是
relolver (libc6-udeb): package doesn't exist (ignored)
這表示 libc6-udeb 這個套件找不到,請至 packages.debian.org 來找
我們可以找到此套件的位置是:
http://ftp.debian.org/debian/pool/main/e/eglibc/libc6-udeb_2.13-38+deb7u1_amd64.udeb
因此我們要在自己的鏡像站的同一個目錄存這個檔案,請切換至
/mnt/pool/main/e/eglibc 目錄,如果沒有此目錄的話,請自己建一個
接著下載此檔:
/mnt/pool/main/e/eglibc# wget http://ftp.debian.org/debian/pool/main/e/eglibc/libc6-udeb_2.13-38+deb7u1_amd64.udeb
作完後請記得至 PXE 伺服器重新掛載 /var/www/debian
之後再切換至 buildlinux 來繼續安裝流程
----------------------------------------------------------------------------
PXE 伺服器設定:
此時我們可以啟動 PXE 伺服器,並將 /dev/sdb1 以 ro 的權限來掛載至
/var/www/debian 目錄,指令如下:
# mount -o ro /dev/sdb1 /var/www/debian
(請注意上述指令在 PXE 伺服器中執行)
掛載完畢後可以執行 df -h /var/www/debian 來觀看其輸出,如底下所示:
檔案系統 容量 已用 可用 已用% 掛載點
/dev/sdb1 2.0G 600M 1.3G 32% /var/www/debian
我們可以看到 /var/www/debian 目前已用 600M 的空間,正好是之前複製光碟片的容量。
----------------------------------------------------------------------------
建立 linux client 主機:
請執行 buildlinux.sh 看看能否進入安裝畫面,並正常安裝。我們在輸入鏡像站時以自定鏡像站 192.168.10.254 來作為安裝鏡像站,結果發現出錯。因此要回到 /mnt 檔案複製處繼續修改。
思維模式:
PXE Server 負責提供一個可以讓同網域網段之電腦利用網路開機、取得 IP 以及安裝 Debian Linux 的功能,其中 deb_mirror.img 負責存放網路安裝 (net install) 時必須使用的套件 (package),也就是安裝時所必要的 .deb 檔案。因此我們建立 deb_mirror.img,將其分割、格式化,並掛載至 /mnt 目錄以利下載套件用。
建立 deb_mirror.img 流程:
a. dd if=/dev/zero of=deb_mirror.img bs=1G count=2
b. # fdisk deb_mirror.img
將其建立一個分割區。
c. 將 deb_mirror.img 格式化
# losetup /dev/loop0 deb_mirror.img
# losetup -o $[2048*512] /dev/loop1 /dev/loop0
# mkfs.ext4 /dev/loop1
d. 將 /dev/loop1 掛載至 /mnt 目錄
mount /dev/loop1 /mnt
掛載完畢後可以執行
df -h /mnt 來觀察是否有正確掛載,其輸出如下所示:
檔案系統 容量 已用 可用 已用% 掛載點
/dev/loop1 2.0G 3.0M 1.9G 1% /mnt
複製 deb_mirror.img 流程:
一開始我們的想法很單純,將 Debian 安裝光碟第一片複製到 deb_mirror.img 中「理論上」即可提供安裝流程所需要的檔案。因此我們需要將 debian 第一片安裝光碟中之檔案複製到 /mnt (目前已掛載 deb_mirror.img) 目錄下,首先要下載第一片安裝光碟,並掛載至 /cdrom 目錄,其操作如下:
1. 下載 debian 第一片安裝光碟
wget ftp://ftp.twaren.net/pub/Debian/debian-cd/current/amd64/iso-cd/debian-7.5.0-amd64-CD-1.iso
(校內請至 120.117.72.71 之 iso 目錄下載)
2. 掛載 debian-7.5.0-amd64-CD-1.iso 至 /cdrom 目錄
首先檢查是否有 /cdrom 目錄,若沒有的話請執行:
# mkdir /cdrom
建立完此目錄後將 debian-7.5.0-amd64-CD-1.iso 掛載至此目錄,指令如:
mount -o loop debian-7.5.0-amd64-CD-1.iso /cdrom
3. 檢視 /cdrom 目錄之內容:
請切換至 /crom 目錄,指令如下:
cd /cdrom
接著執行 ls -l,其輸出如下:
-r--r--r-- 1 root root 27 4月 26 21:38 autorun.inf
dr-xr-xr-x 1 root root 2048 4月 26 21:38 boot
dr-xr-xr-x 1 root root 2048 4月 26 21:38 css
lr-xr-xr-x 1 root root 1 4月 26 21:37 debian -> .
dr-xr-xr-x 1 root root 2048 4月 26 21:38 dists
dr-xr-xr-x 1 root root 4096 4月 26 21:37 doc
dr-xr-xr-x 1 root root 2048 4月 26 21:38 efi
dr-xr-xr-x 1 root root 2048 4月 26 21:38 firmware
-r--r--r-- 1 root root 159629 4月 24 15:42 g2ldr
-r--r--r-- 1 root root 8192 4月 24 15:42 g2ldr.mbr
dr-xr-xr-x 1 root root 2048 4月 26 21:37 install
dr-xr-xr-x 1 root root 2048 4月 26 21:38 install.amd
dr-xr-xr-x 1 root root 4096 4月 26 21:38 isolinux
-r--r--r-- 1 root root 212666 4月 26 21:51 md5sum.txt
dr-xr-xr-x 1 root root 2048 4月 26 21:38 pics
dr-xr-xr-x 1 root root 2048 4月 26 21:38 pool
-r--r--r-- 1 root root 9262 4月 26 21:51 README.html
-r--r--r-- 1 root root 176551 4月 11 09:52 README.mirrors.html
-r--r--r-- 1 root root 87800 4月 11 09:52 README.mirrors.txt
-r--r--r-- 1 root root 425 4月 26 21:38 README.source
-r--r--r-- 1 root root 5827 4月 26 21:51 README.txt
-r--r--r-- 1 root root 366350 4月 24 15:42 setup.exe
dr-xr-xr-x 1 root root 2048 4月 26 21:38 tools
-r--r--r-- 1 root root 256 4月 26 21:38 win32-loader.ini
/cdrom 目錄有許多目錄及檔案,我們可以執行 du -sh * 來觀看每個檔案/目錄的容量,如底下所示:
512 autorun.inf
1.9M boot
8.0K css
0 debian
3.3M dists
33M doc
416K efi
2.0K firmware
156K g2ldr
8.0K g2ldr.mbr
2.0K install
33M install.amd
303K isolinux
208K md5sum.txt
29K pics
562M pool
9.5K README.html
173K README.mirrors.html
86K README.mirrors.txt
512 README.source
6.0K README.txt
358K setup.exe
76K tools
512 win32-loader.ini
其中 pool 目錄所佔容量最大,共有 562 MB,這個目錄相當「可疑」,很有可能是我們在安裝時所會用到的 .deb 檔案,因此值得切換進去觀察裡面內容。經過一番觀察,此目錄的確存放 .deb 檔案,因此可以將此目錄複製到 /mnt 目錄,指令如下:
cp -av /cdrom/pool /mnt
執行 buildlinux.sh 之鏡像站選擇/下載套件 出錯時之處理流程:
請在 buildlinux 之虛擬機器按 Ctrl+Alt+F 切換至全螢幕,然後按 Alt+F4 至第四個虛端終端機來看錯誤訊息,此時我們會看到系統是因為少了那些檔案而導致安裝流程出錯。根據其錯誤訊息,我們要建立
/mnt/dists/jessie
/mnt/dists/sid
/mnt/dists/squeeze
/mnt/dists/wheezy
四個目錄,再建立底下連結:
root@wyvern:/mnt/dists# ln -s wheezy stable
root@wyvern:/mnt/dists# ln -s jessie testing
root@wyvern:/mnt/dists# ln -s squeeze oldstable
root@wyvern:/mnt/dists# ln -s sid unstable
然後再複製每個目錄所缺少的檔案,目前缺少 Release 檔案。
複製完畢後請至 PXE 伺服器重新掛載 /var/www/debian 目錄
mount -o ro,remount /var/www/debian
並檢查 /var/www 底下是否有 dists 目錄以及剛剛複製的檔案。
然後請再回到 buildlinux 底下,切換至全營幕並重新執行安裝流程,此時我們會發現出現新的錯誤訊息,這表示剛剛 buildlinux 已經有抓到我們複製的檔案,並前往下一步,由於檔案仍然有缺,因此出現新的錯誤訊息。
因此我們繼續複製缺少的檔案:
/mnt/dists# mkdir -p wheezy/main/binary-amd64/
cd wheezy/main/binary-amd64/
wget ftp://ftp.debian.org/debian/dists/wheezy/main/binary-amd64/Release
複製完畢後請再回到 PXE 伺服器,重新掛載 /var/www/debian 目錄。掛載完畢後請再檢查 /var/www/debian/dists/wheezy/main/binary-amd64/Release 這個檔案是否存在,然後切換至 buildlinux 繼續安裝流程。
現在出現的錯訊息是
dists/wheezy/Release is unsigned.
這表示 Release 這個檔案沒有數位簽章,也就是說我們沒有複製 Release.gpg 這個檔案,請複製
ftp://ftp.debian.org/debian/dists/wheezy/Release.gpg
指令如下:
/mnt/dists/wheezy# wget ftp://ftp.debian.org/debian/dists/wheezy/Release.gpg
另一個錯誤訊息是
relolver (libc6-udeb): package doesn't exist (ignored)
這表示 libc6-udeb 這個套件找不到,請至 packages.debian.org 來找
我們可以找到此套件的位置是:
http://ftp.debian.org/debian/pool/main/e/eglibc/libc6-udeb_2.13-38+deb7u1_amd64.udeb
因此我們要在自己的鏡像站的同一個目錄存這個檔案,請切換至
/mnt/pool/main/e/eglibc 目錄,如果沒有此目錄的話,請自己建一個
接著下載此檔:
/mnt/pool/main/e/eglibc# wget http://ftp.debian.org/debian/pool/main/e/eglibc/libc6-udeb_2.13-38+deb7u1_amd64.udeb
作完後請記得至 PXE 伺服器重新掛載 /var/www/debian
之後再切換至 buildlinux 來繼續安裝流程
----------------------------------------------------------------------------
PXE 伺服器設定:
此時我們可以啟動 PXE 伺服器,並將 /dev/sdb1 以 ro 的權限來掛載至
/var/www/debian 目錄,指令如下:
# mount -o ro /dev/sdb1 /var/www/debian
(請注意上述指令在 PXE 伺服器中執行)
掛載完畢後可以執行 df -h /var/www/debian 來觀看其輸出,如底下所示:
檔案系統 容量 已用 可用 已用% 掛載點
/dev/sdb1 2.0G 600M 1.3G 32% /var/www/debian
我們可以看到 /var/www/debian 目前已用 600M 的空間,正好是之前複製光碟片的容量。
----------------------------------------------------------------------------
建立 linux client 主機:
請執行 buildlinux.sh 看看能否進入安裝畫面,並正常安裝。我們在輸入鏡像站時以自定鏡像站 192.168.10.254 來作為安裝鏡像站,結果發現出錯。因此要回到 /mnt 檔案複製處繼續修改。
2014年4月17日 星期四
進階 Linux 作業系統上機考
進階 Linux 作業系統上機考
1. 請建立一個橋接網路介面,名為 br9,其網域為 192.168.9.0/24,此橋接網路介面可以讓其 pxeserver (192.168.9.254) 提供 DNS、DHCP、tftp、www 以及 ftp 服務。
2. 請建立 pxeserver_學號.img,學號為你的學號,其影像檔大小為 5 GB,並在其中建置 PXE Server 之服務。
3. 利用 runpxe.sh 這個 shell script 來開機,並提供 DHCP 服務,提供之 IP 範圍為 192.168.9.51 ~ 192.168.9.100。
4. DNS 服務定義如下:
192.168.9.1 -> host1.my.com, gateway.my.com
192.168.9.2 -> host2.my.com
192.168.9.3 -> host3.my.com
..
192.168.9.254 -> host254.my.com, pxe.my.com
5. http://192.168.9.254 及 ftp://192.168.9.254 都要是 Debian 鏡像站 (掛載實體機上面的 NFS 分享)
6. 利用 netboot.sh 來測試是否能自 pxeserver_學號.img 網路開機,並進入 X-Window。
7. 請於中午 12:00 前將 pxeserver_學號.img 上傳至 ftp upload 目錄中。
8. FTP 主機僅接受來自校內之 IP 上傳,請注意!!
1. 請建立一個橋接網路介面,名為 br9,其網域為 192.168.9.0/24,此橋接網路介面可以讓其 pxeserver (192.168.9.254) 提供 DNS、DHCP、tftp、www 以及 ftp 服務。
2. 請建立 pxeserver_學號.img,學號為你的學號,其影像檔大小為 5 GB,並在其中建置 PXE Server 之服務。
3. 利用 runpxe.sh 這個 shell script 來開機,並提供 DHCP 服務,提供之 IP 範圍為 192.168.9.51 ~ 192.168.9.100。
4. DNS 服務定義如下:
192.168.9.1 -> host1.my.com, gateway.my.com
192.168.9.2 -> host2.my.com
192.168.9.3 -> host3.my.com
..
192.168.9.254 -> host254.my.com, pxe.my.com
5. http://192.168.9.254 及 ftp://192.168.9.254 都要是 Debian 鏡像站 (掛載實體機上面的 NFS 分享)
6. 利用 netboot.sh 來測試是否能自 pxeserver_學號.img 網路開機,並進入 X-Window。
7. 請於中午 12:00 前將 pxeserver_學號.img 上傳至 ftp upload 目錄中。
8. FTP 主機僅接受來自校內之 IP 上傳,請注意!!
2014年4月11日 星期五
建置 apache 伺服器
1. 安裝 apache 套件
在 Debian 作業系統底下要架設 Apache 伺服器必須先安裝 apache2 套件,指令如下所示:
# apt-get install apache2 \Enter
2. 掛載 deb_mirror.img
由於先前所完成之 deb_mirror.img 在虛擬機器中會被當作是 /dev/sdb1 這個分割區,其掛載點在 /var/www/debian 目錄,因此要在 PXE Server 中先新增此目錄,指令如下所示:
# mkdir -p /var/www/debian \Enter
接下來可以編輯 PXE Server 的 /etc/fstab 這個檔案,並新增底下這行:
UUID=b43e1707-19c5-42cb-9424-f4bf7118d39a /var/www/debian ext4 defaults 0 2
**** 請注意上述的 UUID 為 deb_mirror.img 之第一個分割區之 UUID ***
要取得此 UUID,請將 deb_mirror.img 連接到 /dev/loop1,再執行
# blkid /dev/loop1 \Enter
來取得其 UUID。
2. 啟動 apache 伺服器
要手動啟動 apache 伺服器之指令如下:
# /etc/init.d/apache2 restart \Enter
[ ok ] Restarting web server: apache2 ... waiting .
3. 修改 apache 伺服器至我們的 /srv/ftp 目錄
請以 root 權限編輯 /etc/apache2/sites-enabled/000-default.conf 這個檔案,將底下片段:
DocumentRoot /var/www/html
改成
DocumentRoot /srv/ftp
改完存檔後,再重新啟動 apache2 服務。
4 檢查 apache 伺服器是否啟動
請在實體機器上以瀏灠器打開 192.168.10.254 以及 192.168.10.254/debian 來觀看是否有內容。
5. trouble shooting
如果以瀏灠器打開 http://192.168.10.254,但是出現底下錯誤的話:
Apache/2.4.10 (Debian) Server at 192.168.10.254 Port 80 表示我們要作底下修改: 請編緝 /etc/apache2/apache2.conf 找到底下片段: #<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory> 將註解符號 # 全部清除,變成底下的樣子: <Directory /srv/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory> 之後,再重新啟動 apache2 服務,並觀察是否可以連上。
在 Debian 作業系統底下要架設 Apache 伺服器必須先安裝 apache2 套件,指令如下所示:
# apt-get install apache2 \Enter
2. 啟動 apache 伺服器
要手動啟動 apache 伺服器之指令如下:
# /etc/init.d/apache2 restart \Enter
[ ok ] Restarting web server: apache2 ... waiting .
3. 修改 apache 伺服器至我們的 /srv/ftp 目錄
請以 root 權限編輯 /etc/apache2/sites-enabled/000-default.conf 這個檔案,將底下片段:
DocumentRoot /var/www/html
改成
DocumentRoot /srv/ftp
改完存檔後,再重新啟動 apache2 服務。
4 檢查 apache 伺服器是否啟動
請在實體機器上以瀏灠器打開 192.168.10.254 以及 192.168.10.254/debian 來觀看是否有內容。
5. trouble shooting
如果以瀏灠器打開 http://192.168.10.254,但是出現底下錯誤的話:
Forbidden
You don't have permission to access / on this server.Apache/2.4.10 (Debian) Server at 192.168.10.254 Port 80 表示我們要作底下修改: 請編緝 /etc/apache2/apache2.conf 找到底下片段: #<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory> 將註解符號 # 全部清除,變成底下的樣子: <Directory /srv/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory> 之後,再重新啟動 apache2 服務,並觀察是否可以連上。
2014年4月10日 星期四
設定 iptable 規則以便 PXE Server 連上網路
底下操作請全部以 root 進行
0 請設定 ipv4 forward,指令如下:
echo "1" > /proc/sys/net/ipv4/ip_forward
我們可以執行底下指令來確認設定是否有成功:
cat /proc/sys/net/ipv4/ip_forward
其輸出應為 "1"
1. 清除所有 iptable rules
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
2. 設定新的 iptable rules
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
設定完畢後使用 pxe server 來作 apt-get update/apt-get upgrade/apt-get install PKG 來看看是否能連上鏡像站,若無法連上鏡像站的話請檢查 DNS 伺服器設定。
0 請設定 ipv4 forward,指令如下:
echo "1" > /proc/sys/net/ipv4/ip_forward
我們可以執行底下指令來確認設定是否有成功:
cat /proc/sys/net/ipv4/ip_forward
其輸出應為 "1"
1. 清除所有 iptable rules
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
2. 設定新的 iptable rules
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
設定完畢後使用 pxe server 來作 apt-get update/apt-get upgrade/apt-get install PKG 來看看是否能連上鏡像站,若無法連上鏡像站的話請檢查 DNS 伺服器設定。
建置 DHCP 伺服器
要讓 PXE Server 可以指派 IP 給 192.168.10.0/24 網域中的所(有)電腦,必須先安裝DHCP 伺服器並進行設定才行,首先要安裝 isc-dhcp-server 套件,請執行底下指令以進行安裝:
# apt-get install isc-dhcp-server \Enter
1. 設定 DHCP 伺服器
DHCP 伺服器之設定檔位置在 /etc/dhcp/dhcpd.conf,我們希望 DHCP 伺服器所給定的 IP 範圍限制在 192.168.10.100 ∼ 192.168.10.200 間,其它 IP 由我們手動設定使用,其內容如列表 3.8 所示:
option domain−name " example . org " ;
option domain−name−servers 8.8.8.8;
default−lease−time 600;
max−lease−time 7200;
allow booting ;
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.100 192.168.10.200;
option subnet−mask 255.255.255.0;
option broadcast−address 192.168.10.255;
option routers 192.168.10.1;
option domain−name−servers 8.8.8.8;
next−server 192.168.10.254;
filename " pxelinux .0 " ;
}
因此我們的 IP 分配如下:
192.168.10.1 -> 閘道 (br10)
192.168.10.2 ~ 192.168.10.99 -> 自定 IP
192.168.10.100 ~ 192.168.10.200 -> DHCP 自動分配 IP
192.168.10.201 ~ 191.168.10.253 -> 自定 IP
192.168.10.254 -> PXE Server
接著請設定 /etc/default/isc-dhcp-server 這個檔案,把底下片段
INTERFACESv4=:
修改為
INTERFACESv4="ens3"
其中 ens3 是你的網路卡。
2. 啟動 DHCP 伺服器
要啟動 DHCP 伺服器,請執行底下指令:
# /etc/init.d/isc-dhcp-server restart \Enter
其輸出如下:
[ ok ] Stopping ISC DHCP server: dhcpd.
[ ok ] Starting ISC DHCP server: dhcpd
請注意第 3 行的訊息告訴我們 dhcpd 已被啟動,如果前面的設定都沒(有)作錯的話,理論上這個 DHCP 伺服器已經可以分配 IP 給 192.168.10.0/24 網段中之其它電腦了
3. 檢查 DHCP 伺服器是否正常動作
為了檢查 DHCP 伺服器是否有正常動作,我們可以檢視 DHCP 的設定檔,其位置在 /var/log/syslog。如果 DHCP 伺服器有正常動作的話,應該會(有)底下片段:
syslog:Mar 27 03:36:46 pxeserver dhcpd: DHCPDISCOVER from de:ad:be:ef:ec:a8 via eth0
syslog:Mar 27 03:36:47 pxeserver dhcpd: DHCPOFFER on 192.168.10.103 to de:ad:be:ef:ec:a8 via eth0
syslog:Mar 27 03:36:49 pxeserver dhcpd: DHCPREQUEST for 192.168.10.103 (192.168.10.254) from de:ad:be:ef:ec:a8 via eth0
syslog:Mar 27 03:36:49 pxeserver dhcpd: DHCPACK on 192.168.10.103 to de:ad:be:ef:ec:a8 via eth0
4.讓 DHCP 伺服器開機後就會啟動
# update-rc.d isc-dhcp-server defaults \Enter
update-rc.d: using dependency based boot sequencing
# apt-get install isc-dhcp-server \Enter
1. 設定 DHCP 伺服器
DHCP 伺服器之設定檔位置在 /etc/dhcp/dhcpd.conf,我們希望 DHCP 伺服器所給定的 IP 範圍限制在 192.168.10.100 ∼ 192.168.10.200 間,其它 IP 由我們手動設定使用,其內容如列表 3.8 所示:
option domain−name " example . org " ;
option domain−name−servers 8.8.8.8;
default−lease−time 600;
max−lease−time 7200;
allow booting ;
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.100 192.168.10.200;
option subnet−mask 255.255.255.0;
option broadcast−address 192.168.10.255;
option routers 192.168.10.1;
option domain−name−servers 8.8.8.8;
next−server 192.168.10.254;
filename " pxelinux .0 " ;
}
因此我們的 IP 分配如下:
192.168.10.1 -> 閘道 (br10)
192.168.10.2 ~ 192.168.10.99 -> 自定 IP
192.168.10.100 ~ 192.168.10.200 -> DHCP 自動分配 IP
192.168.10.201 ~ 191.168.10.253 -> 自定 IP
192.168.10.254 -> PXE Server
接著請設定 /etc/default/isc-dhcp-server 這個檔案,把底下片段
INTERFACESv4=:
修改為
INTERFACESv4="ens3"
其中 ens3 是你的網路卡。
2. 啟動 DHCP 伺服器
要啟動 DHCP 伺服器,請執行底下指令:
# /etc/init.d/isc-dhcp-server restart \Enter
其輸出如下:
[ ok ] Stopping ISC DHCP server: dhcpd.
[ ok ] Starting ISC DHCP server: dhcpd
請注意第 3 行的訊息告訴我們 dhcpd 已被啟動,如果前面的設定都沒(有)作錯的話,理論上這個 DHCP 伺服器已經可以分配 IP 給 192.168.10.0/24 網段中之其它電腦了
3. 檢查 DHCP 伺服器是否正常動作
為了檢查 DHCP 伺服器是否有正常動作,我們可以檢視 DHCP 的設定檔,其位置在 /var/log/syslog。如果 DHCP 伺服器有正常動作的話,應該會(有)底下片段:
syslog:Mar 27 03:36:46 pxeserver dhcpd: DHCPDISCOVER from de:ad:be:ef:ec:a8 via eth0
syslog:Mar 27 03:36:47 pxeserver dhcpd: DHCPOFFER on 192.168.10.103 to de:ad:be:ef:ec:a8 via eth0
syslog:Mar 27 03:36:49 pxeserver dhcpd: DHCPREQUEST for 192.168.10.103 (192.168.10.254) from de:ad:be:ef:ec:a8 via eth0
syslog:Mar 27 03:36:49 pxeserver dhcpd: DHCPACK on 192.168.10.103 to de:ad:be:ef:ec:a8 via eth0
4.讓 DHCP 伺服器開機後就會啟動
# update-rc.d isc-dhcp-server defaults \Enter
update-rc.d: using dependency based boot sequencing
tftp 伺服器建置
2019/11/11 修訂
我們所架設的 PXE 伺服器主要提供同網域 (192.168.10.0/24) 上其它主機能透過網路開機,為了提供網路開機的功能,必須在 PXE 伺服器上安裝 DHCP 伺服器、TFTP 伺服器,底下介紹如何安裝 TFTP 伺服器:
請執行底下指令以安裝 tftp 套件:
# apt-get install tftpd-hpa \Enter
要設定 tftp 伺服器可以提供網路開機的服務必須先下載 X86_64 之 netboot 檔案,下載位置如底下所示:
http://192.168.10.254/debian/dists/buster/main/installer-amd64/current/images/netboot/
ftp://ftp.tw.debian.org/debian/dists/buster/main/installer-amd64/current/images/netboot/
下載完畢後請以 root 權限將 netboot.tar.gz 解開在 /srv/tftp 目錄,指令如下:
# tar xfva netboot.tar.gz -C /srv/tftp \Enter
解完之後在 /srv/tftp 目錄下會有底下檔案:
root@pxe:/srv/tftp# ls -l
total 18908
drwxrwxr-x 3 root root 4096 Mar 30 06:03 debian-installer
lrwxrwxrwx 1 root root 47 Mar 30 06:03 ldlinux.c32 -> debian-installer/amd64/boot-screens/ldlinux.c32
-rw-r--r-- 1 root root 19351686 May 6 10:39 netboot.tar.gz
lrwxrwxrwx 1 root root 33 Mar 30 06:03 pxelinux.0 -> debian-installer/amd64/pxelinux.0
lrwxrwxrwx 1 root root 35 Mar 30 06:03 pxelinux.cfg -> debian-installer/amd64/pxelinux.cfg
-rw-rw-r-- 1 root root 64 Mar 30 06:03 version.info
如果沒有問題的話,接下來就可以準備啟動 tftp 伺服器了。
請執行底下指令來啟動 tftp 伺服器:
# /etc/init.d/tftpd-hpa restart \Enter
[ ok ] Restarting HPA's tftpd: in.tftpd.
這表示目前 tftp 已經啟動成功了,如果希望設定 tftp 伺服器於下次開機後自動執行,請使用 update-rc.d 來進行設定,如底下所示:
# update-rc.d tftpd-hpa defaults \Enter
其輸出如下所示:
update-rc.d: using dependency based boot sequencing
update-rc.d: warning: default stop runlevel arguments (0 1 6) do not match tftpd
-hpa Default-Stop values (1)
啟動完畢後,我們新增一個 buildlinux1.sh 來測試 tftp 伺服器是否已可正常使用,其內容如下:
# IP=192.168.10.254 pxeserver.example.org
CPU=host
SMP=2
MEMORY=1024
HDA=linux1.img
HDA_SIZE=10G
MAC="DE:AD:BE:CF:EC:B9"
BRIDGE=br10
CDROM=/opt/iso/debian-8.3.0-amd64-CD-1.iso
[ -f $HDA ] && rm $HDA
qemu-img create $HDA $HDA_SIZE -f qcow2
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-drive file=$HDA,format=qcow2 \
-boot n \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
新增完畢後,請執行:
~/virtualclassroom$ sh buildlinux1.sh
理論此時可以看到網路開機的畫面,然後可以開始裝機,這是我們第一台 linux 測試機器,其名稱為 linux1.my.com。
我們所架設的 PXE 伺服器主要提供同網域 (192.168.10.0/24) 上其它主機能透過網路開機,為了提供網路開機的功能,必須在 PXE 伺服器上安裝 DHCP 伺服器、TFTP 伺服器,底下介紹如何安裝 TFTP 伺服器:
請執行底下指令以安裝 tftp 套件:
# apt-get install tftpd-hpa \Enter
要設定 tftp 伺服器可以提供網路開機的服務必須先下載 X86_64 之 netboot 檔案,下載位置如底下所示:
http://192.168.10.254/debian/dists/buster/main/installer-amd64/current/images/netboot/
ftp://ftp.tw.debian.org/debian/dists/buster/main/installer-amd64/current/images/netboot/
下載完畢後請以 root 權限將 netboot.tar.gz 解開在 /srv/tftp 目錄,指令如下:
# tar xfva netboot.tar.gz -C /srv/tftp \Enter
解完之後在 /srv/tftp 目錄下會有底下檔案:
root@pxe:/srv/tftp# ls -l
total 18908
drwxrwxr-x 3 root root 4096 Mar 30 06:03 debian-installer
lrwxrwxrwx 1 root root 47 Mar 30 06:03 ldlinux.c32 -> debian-installer/amd64/boot-screens/ldlinux.c32
-rw-r--r-- 1 root root 19351686 May 6 10:39 netboot.tar.gz
lrwxrwxrwx 1 root root 33 Mar 30 06:03 pxelinux.0 -> debian-installer/amd64/pxelinux.0
lrwxrwxrwx 1 root root 35 Mar 30 06:03 pxelinux.cfg -> debian-installer/amd64/pxelinux.cfg
-rw-rw-r-- 1 root root 64 Mar 30 06:03 version.info
如果沒有問題的話,接下來就可以準備啟動 tftp 伺服器了。
請執行底下指令來啟動 tftp 伺服器:
# /etc/init.d/tftpd-hpa restart \Enter
[ ok ] Restarting HPA's tftpd: in.tftpd.
這表示目前 tftp 已經啟動成功了,如果希望設定 tftp 伺服器於下次開機後自動執行,請使用 update-rc.d 來進行設定,如底下所示:
# update-rc.d tftpd-hpa defaults \Enter
其輸出如下所示:
update-rc.d: using dependency based boot sequencing
update-rc.d: warning: default stop runlevel arguments (0 1 6) do not match tftpd
-hpa Default-Stop values (1)
啟動完畢後,我們新增一個 buildlinux1.sh 來測試 tftp 伺服器是否已可正常使用,其內容如下:
# IP=192.168.10.254 pxeserver.example.org
CPU=host
SMP=2
MEMORY=1024
HDA=linux1.img
HDA_SIZE=10G
MAC="DE:AD:BE:CF:EC:B9"
BRIDGE=br10
CDROM=/opt/iso/debian-8.3.0-amd64-CD-1.iso
[ -f $HDA ] && rm $HDA
qemu-img create $HDA $HDA_SIZE -f qcow2
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-drive file=$HDA,format=qcow2 \
-boot n \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
新增完畢後,請執行:
~/virtualclassroom$ sh buildlinux1.sh
理論此時可以看到網路開機的畫面,然後可以開始裝機,這是我們第一台 linux 測試機器,其名稱為 linux1.my.com。
虛擬電腦教室所需之 shell script 及檔案定義
∼/ .................................................................... 家目錄
virtualclassroom/......................................虛擬電腦教室目錄
+debian-7.4.0-amd64-CD-1.iso....................Debian X86_64 ISO 檔
+pxeserver.img .................................... PXE Server 之影像檔
+deb_mirror.img........儲存 debian 套件之影像檔,PXE Server 之 sdb
+linux.img..........................................Linux 主機之影像檔
+buildpxe.sh..............安裝 PXE Server 之 shell script,列表 3.6
+buildlinux.sh ........... 安裝 Linux 主機之 shell script,列表 3.10
+runpxe.sh.......執行 PXE Server 虛擬機器之 shell script,列表 3.7
+runlinux.sh ........... 執行 Linux 虛擬主機之 shell script,列表 ??
-----------------------buildpxe.sh-------------------------------------------
# IP=192.168.2.254 pxeserver.example.org
CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
CDROM=/opt/iso/debian-7.4.0-amd64-CD-1.iso
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-hda $HDA \
-cdrom $CDROM -boot d \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
----------------------------------------------------------------------------------------
---------------------runpxe.sh-------------------------------------------------------
# IP=192.168.2.254
# PXE Server
CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
HDB=deb_mirror.img
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
CDROM=/opt/iso/debian-7.4.0-amd64-CD-1.iso
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-hda $HDA \
-hdb $HDB \
-cdrom $CDROM \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
----------------------------------------------------------------------------------------------------
-------------------------buildlinux.sh----------------------------------------------------------
CPU=host
SMP=2
MEMORY=1024
HDA=linux.img
MAC="DE:AD:BE:EF:EC:A8"
BRIDGE=br10
CDROM=/opt/iso/debian-7.4.0-amd64-CD-1.iso
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-hda $HDA \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE \
-bootp tftp://192.168.10.254/pxelinux.0 \
-tftp /srv/tftp \
-------------------------------------------------------------------------------------------------------
------------------runlinux.sh---------------------------------------------------------------------
CPU=host
SMP=2
MEMORY=1024
HDA=linux.img
MAC="DD:AD:BE:EF:EC:B6"
BRIDGE=br10
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-hda $HDA \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
---------------------------------------------------------------------------------------------------------
virtualclassroom/......................................虛擬電腦教室目錄
+debian-7.4.0-amd64-CD-1.iso....................Debian X86_64 ISO 檔
+pxeserver.img .................................... PXE Server 之影像檔
+deb_mirror.img........儲存 debian 套件之影像檔,PXE Server 之 sdb
+linux.img..........................................Linux 主機之影像檔
+buildpxe.sh..............安裝 PXE Server 之 shell script,列表 3.6
+buildlinux.sh ........... 安裝 Linux 主機之 shell script,列表 3.10
+runpxe.sh.......執行 PXE Server 虛擬機器之 shell script,列表 3.7
+runlinux.sh ........... 執行 Linux 虛擬主機之 shell script,列表 ??
-----------------------buildpxe.sh-------------------------------------------
# IP=192.168.2.254 pxeserver.example.org
CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
CDROM=/opt/iso/debian-7.4.0-amd64-CD-1.iso
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-hda $HDA \
-cdrom $CDROM -boot d \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
----------------------------------------------------------------------------------------
---------------------runpxe.sh-------------------------------------------------------
# IP=192.168.2.254
# PXE Server
CPU=host
SMP=2
MEMORY=1024
HDA=pxeserver.img
HDB=deb_mirror.img
MAC="DE:AD:BE:CF:EC:B7"
BRIDGE=br10
CDROM=/opt/iso/debian-7.4.0-amd64-CD-1.iso
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-hda $HDA \
-hdb $HDB \
-cdrom $CDROM \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
----------------------------------------------------------------------------------------------------
-------------------------buildlinux.sh----------------------------------------------------------
CPU=host
SMP=2
MEMORY=1024
HDA=linux.img
MAC="DE:AD:BE:EF:EC:A8"
BRIDGE=br10
CDROM=/opt/iso/debian-7.4.0-amd64-CD-1.iso
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-hda $HDA \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE \
-bootp tftp://192.168.10.254/pxelinux.0 \
-tftp /srv/tftp \
-------------------------------------------------------------------------------------------------------
------------------runlinux.sh---------------------------------------------------------------------
CPU=host
SMP=2
MEMORY=1024
HDA=linux.img
MAC="DD:AD:BE:EF:EC:B6"
BRIDGE=br10
qemu-system-x86_64 -enable-kvm -cpu $CPU -smp $SMP -m $MEMORY \
-hda $HDA \
-net nic,macaddr=$MAC -net bridge,br=$BRIDGE
---------------------------------------------------------------------------------------------------------
如何使用無線網卡連上網路
如何使用無線網卡連上網路
1. 關閉有線網路之 default route
請先以 route 指令來觀看目前的 default route 為何,其指令如下:
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
link-local * 255.255.0.0 U 1000 0 0 eth0
我們可以看到目前預設的 route 是 eth0,請將此 default route 刪除,指令如下:
route del default eth0
接著再執行一次 route 來觀看結果,如底下所示:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
link-local * 255.255.0.0 U 1000 0 0 eth0
2. 將無線網卡啟動
通常無線網卡是 wlan0 這個裝置,如果不確定的話請觀看 /etc/udev/rules.d/70-persistent-net.rules 這個檔案,找到以下片段:
# PCI device 0x168c:/sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0 (ath9k)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="94:39:e5:62:ac:10", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"
確認為 wlan0 之後,請執行底下指令啟動無線網卡:
ifconfig wlan0 up
3. 使用無線網卡掃瞄基地台
一旦啟動無線網卡後,我們可以執行底下指令來掃瞄基地台:
# iwlist wlan0 scanning
其輸出如下所示:
Wlan0 Scan completed :
Cell 01 - Address: 00:E0:4C:A5:EB:1A
Channel:6
Frequency:2.437 GHz (Channel 6)
Quality=64/70 Signal level=-46 dBm
Encryption key:off
ESSID:"stut_p503"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s
Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
..(中間省略)
Cell 02 - Address: 00:12:0E:BA:7A:AE
Channel:6
Frequency:2.437 GHz (Channel 6)
Quality=35/70 Signal level=-75 dBm
Encryption key:off
ESSID:"stut_s412@"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s
Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
..(中間省略)
Cell 03 - Address: 90:F6:52:B3:E4:9A
Channel:4
Frequency:2.427 GHz (Channel 4)
Quality=30/70 Signal level=-80 dBm
Encryption key:on
ESSID:"S611-AP"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s
Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
..(中間省略)
我們會發現無線網卡掃瞄到很多不同的 ESSID,這些 ESSID 即是無線網卡所掃瞄到的基地台,無線基地台分成兩個種類:
A. 需要密碼才能連線
B. 無需密碼即能連線
底下分別說明:
4. 連線需要密碼之無線基地台
假設我們有一個基地台名為 HAHAHA,其連線密碼為 0123456789 的話,則我們需要執行底下指令才能連線,建議寫成 shell script:
----------------------------wifi-on.sh--------------------------------
ifconfig eth0 down
wpa_passphrase "HAHAHA" 0123456790 > /etc/wpa_supplicant/WIFI.conf
wpa_supplicant -BDwext -iwlan0 -c/etc/wpa_supplicant/WIFI.conf
dhclient -v wlan0
route add default wlan0
echo "nameserver 8.8.8.8" > /etc/resolv.conf
-----------------------------------------------------------------------
5. 連線無需密碼之基地台
同上,如果無線基地台無需密碼即可連線的話,請執行底下指令即可:
iwconfig wlan0 essid "HAHAHA"
dhclient -v wlan0
6. 設定 default route
接下來請執行 route 檢查 wlan0 是否為 default route,如下所示:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.22.127.254 0.0.0.0 UG 0 0 0 wlan0
10.22.120.0 * 255.255.248.0 U 0 0 0 wlan0
如果 wlan0 目前仍不是 default route,我們要手動將 wlan0 設定為 default route,指令如下:
# route add default wlan0
作完後請再執行 route 指令確認即可。
1. 關閉有線網路之 default route
請先以 route 指令來觀看目前的 default route 為何,其指令如下:
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
link-local * 255.255.0.0 U 1000 0 0 eth0
我們可以看到目前預設的 route 是 eth0,請將此 default route 刪除,指令如下:
route del default eth0
接著再執行一次 route 來觀看結果,如底下所示:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
link-local * 255.255.0.0 U 1000 0 0 eth0
2. 將無線網卡啟動
通常無線網卡是 wlan0 這個裝置,如果不確定的話請觀看 /etc/udev/rules.d/70-persistent-net.rules 這個檔案,找到以下片段:
# PCI device 0x168c:/sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0 (ath9k)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="94:39:e5:62:ac:10", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"
確認為 wlan0 之後,請執行底下指令啟動無線網卡:
ifconfig wlan0 up
3. 使用無線網卡掃瞄基地台
一旦啟動無線網卡後,我們可以執行底下指令來掃瞄基地台:
# iwlist wlan0 scanning
其輸出如下所示:
Wlan0 Scan completed :
Cell 01 - Address: 00:E0:4C:A5:EB:1A
Channel:6
Frequency:2.437 GHz (Channel 6)
Quality=64/70 Signal level=-46 dBm
Encryption key:off
ESSID:"stut_p503"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s
Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
..(中間省略)
Cell 02 - Address: 00:12:0E:BA:7A:AE
Channel:6
Frequency:2.437 GHz (Channel 6)
Quality=35/70 Signal level=-75 dBm
Encryption key:off
ESSID:"stut_s412@"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s
Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
..(中間省略)
Cell 03 - Address: 90:F6:52:B3:E4:9A
Channel:4
Frequency:2.427 GHz (Channel 4)
Quality=30/70 Signal level=-80 dBm
Encryption key:on
ESSID:"S611-AP"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s
Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
..(中間省略)
我們會發現無線網卡掃瞄到很多不同的 ESSID,這些 ESSID 即是無線網卡所掃瞄到的基地台,無線基地台分成兩個種類:
A. 需要密碼才能連線
B. 無需密碼即能連線
底下分別說明:
4. 連線需要密碼之無線基地台
假設我們有一個基地台名為 HAHAHA,其連線密碼為 0123456789 的話,則我們需要執行底下指令才能連線,建議寫成 shell script:
----------------------------wifi-on.sh--------------------------------
ifconfig eth0 down
wpa_passphrase "HAHAHA" 0123456790 > /etc/wpa_supplicant/WIFI.conf
wpa_supplicant -BDwext -iwlan0 -c/etc/wpa_supplicant/WIFI.conf
dhclient -v wlan0
route add default wlan0
echo "nameserver 8.8.8.8" > /etc/resolv.conf
-----------------------------------------------------------------------
5. 連線無需密碼之基地台
同上,如果無線基地台無需密碼即可連線的話,請執行底下指令即可:
iwconfig wlan0 essid "HAHAHA"
dhclient -v wlan0
6. 設定 default route
接下來請執行 route 檢查 wlan0 是否為 default route,如下所示:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.22.127.254 0.0.0.0 UG 0 0 0 wlan0
10.22.120.0 * 255.255.248.0 U 0 0 0 wlan0
如果 wlan0 目前仍不是 default route,我們要手動將 wlan0 設定為 default route,指令如下:
# route add default wlan0
作完後請再執行 route 指令確認即可。
2014年3月27日 星期四
Qemu 執行時之問題排除
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 .
設定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 .
安裝、設定 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
訂閱:
文章 (Atom)