2014年12月15日 星期一

uboot 常用指令介紹

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月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 測試看看是否會在本地端開視窗。

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

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

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

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 下載資料。



請參考網頁

備份 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 目錄下,「理論上」無需再透過網路上網下載檔案,但是記得隨時更新套件狀態,以免有漏洞未更新造成系統安全問題。

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 鏡像站可以正常運轉。

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 檔案複製處繼續修改。

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 上傳,請注意!!

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,但是出現底下錯誤的話:

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 伺服器設定。

建置 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



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。



虛擬電腦教室所需之 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
---------------------------------------------------------------------------------------------------------

如何使用無線網卡連上網路

如何使用無線網卡連上網路

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 .

安裝、設定 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

如果不曉得要怎麼生虛擬 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

此訊息是因為 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

請以 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

此時會有另一個錯誤訊息叫 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、記憶體以及硬碟空間。




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。


如何在 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