2016年12月4日 星期日

客製化 u-boot (2016 版)

u-boot 客製化 (2016 年)

我們在使用 u-boot 時必須要手動輸入底下資訊才能成功開機:

setenv "root=/dev/mmcblk0p2 console=ttyAMA0"
fatload mmc 0:1 0x60008000 uimage
bootm 0x60008000

這主要原因是由於 u-boot 開機環境並沒有設定好,因此我們要來客製化 u-boot
原始碼,讓它可以照我們的要求來開機。請編輯:

u-boot-2016.09/include/configs/vexpress_common.h

這個檔案,修改以下片段:

#define CONFIG_EXTRA_ENV_SETTINGS \
                CONFIG_PLATFORM_ENV_SETTINGS \
                BOOTENV \
                "console=ttyAMA0,38400n8\0" \
                "dram=1024M\0" \
                "root=/dev/sda1 rw\0" \
                "mtd=armflash:1M@0x800000(uboot),7M@0x1000000(kernel)," \
                        "24M@0x2000000(initrd)\0" \
                "flashargs=setenv bootargs root=${root} console=${console} " \
                        "mem=${dram} mtdparts=${mtd} mmci.fmax=190000 " \
                        "devtmpfs.mount=0  vmalloc=256M\0" \
                "bootflash=run flashargs; " \
                        "cp ${ramdisk_addr} ${ramdisk_addr_r} ${maxramdisk}; " \
                        "bootm ${kernel_addr} ${ramdisk_addr_r}\0"


改為:

#define CONFIG_EXTRA_ENV_SETTINGS \
                CONFIG_PLATFORM_ENV_SETTINGS \
                BOOTENV \
                "console=ttyAMA0,38400n8\0" \
                "dram=1024M\0" \
                "root=/dev/mmcblk0p2 rw\0" \
                "flashargs=setenv bootargs root=${root} console=${console}\0" \
                "bootflash=run flashargs; " \
                "fatload mmc 0:1 0x60008000 uimage; " \
                "bootm 0x60008000\0"


然後重新編譯 u-boot,再把 u-boot u-boot.bin 複製到 /mnt/sdcard1 中。

之後請重新開機,看看這次還能不能直接開機,無需手動介入。

如何客製化 rootfs ? (2016 版)

如何客製化 rootfs ?

先前我們所完成的 rootfs 還沒有進行客製化,因此有一些部份還需要設定,例如:

1. root 密碼:leenix123
2. 新增一個使用者帳號 leenix/密碼: leenix123
3. 設定 locale (可裝/可不裝)
4. 設定網路
5. 設定 apt 來源
6. 架設 apache 伺服器
7. 設定主機名稱
8. 清理不必要檔案以節省空間

這些工作都需要在 chroot 環境裡實作,因此請先將 sd.img 裡的第 2 個分割區掛載至
/mnt/sdcard2 目錄下,然後執行:

# chroot /mnt/sdcard2
bash: warning: setlocale: LC_ALL: cannot change locale (zh_TW.UTF8)

==1==
此時我們已經在 /mnt/sdcard2 目錄下,首先我們要修改 root 密碼,請執行:

# echo root:leenix123 | chpasswd

==2==
接下來要新增使用者並設定密碼,請執行:

# useradd leenix
# echo leenix:leenix123 | chpasswd

==3==
接下來請設定語系,以免出現奇奇怪怪的訊息,請執行:

#dpkg-reconfigure locale

由於這是嵌入式系統,不是先前所使用的中文桌面環境,因此僅需要使用英文語系,請
設定 en_US.UTF-8 作為預設語系。

==4==
然後我們要設定網路,請編輯 /etc/network/interfaces,將其內容修改為:
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.10.100
netmask 255.255.255.0
gateway 192.168.10.1

之後我們將以 192.168.10.100 為連線主機檢查 apache server 是否有順利啟動。

==5==
要在虛擬 ARM 環境中安裝軟體跟 PC 版的流程是一樣的,因此要修改
/etc/apt/sources.list 這個設定檔,請將其內容改為:

deb http://opensource.nchc.org.tw/debian/ jessie main contrib non-free

deb http://security.debian.org/ jessie/updates main


==6==
修改完 apt 設定後接下來就可以設定 apache 伺服器,請執行:

# apt-get install apache2
# systemctl enable apache2


==7==
之後我們要設定 /etc/hostname 這個檔案以修改主機名稱,請執行

# echo arm_leenix > /etc/hostname

==8==
最後要離開系統前,請清除不必要的檔案:

# apt-get clean
# rm -rf /usr/share/doc/*
# rm -rf /usr/share/locale/*
# rm -rf /usr/share/man/*
# rm -rf /var/log/*

作完之後離開系統,並解除 /mnt/sdcard2 的掛載,解除 sd.img 的連接,然後重新再執
行虛擬 arm 主機,看能不能用 root 登錄。

2016年11月22日 星期二

如何安裝 Fasteners workbench

Fasteners workbench 是 FreeCAD 的一個外掛功能,其目的是繪製各種工程規格的螺絲及螺帽。截至 FreeCAD 0.16 版為止,Fasteners workbench 並沒有內建在 FreeCAD 中,必須自行下載安裝,因此我們將介紹如何下載、安裝 Fasteners workbench 以供 繪製螺絲。首先請至 Fasteners workbench 的 Git Hub 網頁 https://github.com/shaise/FreeCAD_FastenersWB

點選 Clone or Download 然後再點選 Download ZIP,此時會下載一個名為 FreeCAD_FastenersWB-master.zip 的檔案在 ~/Downloads 目錄下。

接著可以連至其官網看如何安裝,官網位置是:
http://theseger.com/projects/2015/06/fasteners-workbench-for-freecad/

以 Linux 來說,其安裝流程如下:

mkdir -p ~/.FreeCAD/Mod
cd ~/.FreeCAD/Mod
unzip ~/Downloads/FreeCAD_FastenersWB-master.zip

此時會建立一個 ~/.FreeCAD/Mod/FreeCAD_FastenersWB-master 目錄,我們把 FreeCAD 關掉重開,會出現一行訊息 Fasteners workbench Loaded 如下:


$freecad
FreeCAD 0.16, Libs: 0.16R5480 (Git)
© Juergen Riegel, Werner Mayer, Yorik van Havre 2001-2015
  #####                 ####  ###   ####
  #                    #      # #   #   #
  #     ##  #### ####  #     #   #  #   #
  ####  # # #  # #  #  #     #####  #   #
  #     #   #### ####  #    #     # #   #
  #     #   #    #     #    #     # #   #  ##  ##  ##
  #     #   #### ####   ### #     # ####   ##  ##  ##

Fasteners workbench Loaded

接下來就可以在 workbench 選單中看到 Fasteners 了。

2016年11月20日 星期日

如何準備 sd.img (2016 版)

如何準備 sd.img (2016 版)

先前我們所準備的 sd.img 已經接近可以開機的階段,現在只要將開機核心及 bootloader
放至 sd.img 的第一個分割區即可進行開機。底下是 sd.img 的分割區及內容:

sd.img +- part1-+
       |        + MLO         -> 不是每塊 ARM 版都有,主要適用於 TI OMAP 系列
       |        + u-boot      -> 在編譯完之 u-boot-VERSION 目錄下
       |        + u-boot.bin  -> 在編譯完之 u-boot-VERSION 目錄下
       |        + uImage      -> 在編譯完之 linux-VERSION/arch/arm/boot 目錄下
       +- part2-+
                + roofs       -> 先前以 debootstrap 作出來的內容

把上述內容準備好之後,我們可以執行 runsd.sh,其內容如下:

MACHINE=vexpress-a9
SD_IMAGE=sd.img
MEMORY=256

qemu-system-arm -machine $MACHINE -m $MEMORY \
  -nographic \
  -drive file=./$SD_IMAGE,if=sd,format=raw,index=0 \
  -kernel ./bootloader/u-boot-2016.09/u-boot \

然後將 sd.img 完全解除掛載,再執行 sh runsd.sh,我們可以先放著給它跑,最終會當掉,或是在倒數計時階段按 Enter 暫停下來。暫停後會出現 u-boot 的提示符號,如底下所示:

Hit any key to stop autoboot:  0
=> 

請執行 bdinfo 如底下所示:

=> bdinfo
arch_number = 0x000008E0
boot_params = 0x60002000
DRAM bank   = 0x00000000
-> start    = 0x60000000
-> size     = 0x10000000
DRAM bank   = 0x00000001
-> start    = 0x80000000
-> size     = 0x00000004
eth0name    = smc911x-0
ethaddr     = 52:54:00:12:34:56
current eth = smc911x-0
ip_addr     = <NULL>
baudrate    = 38400 bps
TLB addr    = 0x6FFF0000
relocaddr   = 0x6FF7D000
reloc off   = 0x0F77D000
irq_sp      = 0x6FEDCEF0
sp start    = 0x6FEDCEE0


我們可以看到版子資訊,在此可以看到 DRAM bank 0 的 start 位址是 0x60000000,待會我們以此位址來載入核心並開機試試,接下來可以執行 mmcinfo 如底下所示:

=> mmcinfo
Device: MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU! 
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 400 MiB
Bus Width: 1-bit
Erase Group Size: 512 Bytes

此時可以看到有一張 sd 卡,其容量是先前所定義的,以例來說為 400MB。接下來我們可以試著手動載入 linux 核心讓它開機,請執行:

=> fatload mmc 0:1 0x60000000 uImage
reading uImage
2438600 bytes read in 235 ms (9.9 MiB/s)

將 uImage 核心載入 0x60000000 位址,並使用 iminfo 來驗證:
=> iminfo 0x60000000

## Checking Image at 60000000 ...
   Legacy image found
   Image Name:   Linux-3.18.44
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2438536 Bytes = 2.3 MiB
   Load Address: 60008000
   Entry Point:  60008000
   Verifying Checksum ... OK

驗證完沒問題的話可以使用 bootm 指令來開機,指令如下:

=> bootm 0x60000000
## Booting kernel from Legacy Image at 60000000 ...
   Image Name:   Linux-3.18.44
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2438536 Bytes = 2.3 MiB
   Load Address: 60008000
   Entry Point:  60008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK

Starting kernel ...

之後會當掉,我們要修正這個問題。

開機故障排除

故障 1 訊息如下:

VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
1f00          131072 mtdblock0  (driver?)
b300          409600 mmcblk0  driver: mmcblk
  b301           25600 mmcblk0p1 58c7bb94-01
  b302          382976 mmcblk0p2 58c7bb94-02
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

這是表示開機時的 bootargs 沒有設定好,以此例來說,系統找到的開機裝置為 mmcblk0,但是 bootargs 沒有設定好,我們可以在 u-boot 環境下執行底下指令來觀看 bootargs 的設定:

=> printenv bootargs

如果沒有設定或是設定錯誤的話,那麼開機就會失敗,請執行底下指令來設定 bootargs 環境變數:

=> setenv bootargs "root=/dev/mmcblk0p1 console=ttyAMA0"

此時再執行 printenv 來觀看環境變數設定可以看到正確的組態:

=> printenv bootargs
bootargs=root=/dev/mmcblk0p1 console=ttyAMA0

接著再重新執行載入核心及開機的流程:

=> fatload mmc 0:1 0x60008000 uimage
reading uimage
2438600 bytes read in 234 ms (9.9 MiB/s)
=> bootm 0x60008000

此時會出現新的錯誤訊息,如底下所示:

Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.18.44 #1
[<80014824>] (unwind_backtrace) from [<800116d0>] (show_stack+0x10/0x14)
[<800116d0>] (show_stack) from [<80477c64>] (dump_stack+0x98/0xac)
[<80477c64>] (dump_stack) from [<80475b10>] (panic+0x9c/0x200)
[<80475b10>] (panic) from [<80474040>] (cpu_die+0x0/0x80)
[<80474040>] (cpu_die) from [<00000000>] (  (null))
---[ end Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.

開機發生錯誤的解決方式:

開機時會有幾個錯誤訊息,最終會導致無法開機:

Timed out waiting for device dev-mmcblk0p1
     Dependency failed for /boot.

Dependency failed for Local File Systems.

..
等錯誤


請編譯核心,在 General Setup 底下的設定打開:

 [*] open by fhandle syscalls

然後再重新編譯一次核心,並且把編譯完的 uimage 複製至第一個分割區。



2016年11月15日 星期二

u-boot 說明與安裝 (2020 改)

2021/05/7 改版

U-boot 是嵌入式開發板上的泛用型開機程式,也就是所謂的 bootloader,其支援相當多的嵌入式開發板。我們的系統要先載入 u-boot 後才能載入核心,然後完成開機流程。

U-boot 的官方網址是 http://www.denx.de,上面有提供最新版本的 U-boot 原始碼下載,目前最新的版本是 2020.04,但是本課程只要使用 2016.09,請至 ftp 下載,下載完會出現 u-boot-2016.09.tar.bz2 這個檔案。

首先請建立 bootloader 目錄以便存放待會解壓縮的檔案,如果裡面的舊的資料也請先刪除目錄:

rm -rf bootloader
mkdir bootloader

接下來請執行底下指令解開此檔:

tar xfva u-boot-2021.04.tar.bz2 -C bootloader

解開完畢後,會出現一個 u-boot-2021.04 的目錄。請切換至此目錄,然後執行:

makerpi vexpress_ca9x4_defconfig

這個指令會將 vexpress-a9 板子的設定導入,vexpress_ca9x4_defconfig 在 u-boot 目錄下的 configs 目錄,在此目錄我們可以看到其它 u-boot 已支援之板子設定,未來大家設定別的嵌入式開發板時可以使用。舉例來說,假設我們要使用 Raspberry Pi 板的話,此目錄下有底下設定檔可使用:
rpi_defconfig
rpi_2_defconfig
rpi_3_32b_defconfig
rpi_3_defconfig

如果還要再作一些修改,請再執行:

makerpi menuconfig

此時會進入類似 kernel 設定選單的畫面,如果有特殊要求請在此畫面修改,沒有的話可以離開準備編譯。編譯指令是:

makerpi -j 8

編完之後會出現

u-boot
u-boot.bin

兩個檔案,待會我們要來測試 u-boot 開機。請執行:

qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot

之後會出現底下畫面,請在倒數記時的時候按 Enter 以中斷倒數計時。

U-Boot 2021.04 (May 07 2021 - 09:58:18 +0800)

DRAM:  256 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC:   MMC: 0
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   smc911x-0
Hit any key to stop autoboot:  0 

=>

現在停留在 u-boot 的提示符號,我們可以開始作操作。

=========================================================
U-boot 的指令

首先請執行 help 指令,其輸出如底下所示:

=> help
?       - alias for 'help'
base    - print or set address offset
bdinfo  - print Board Info structure
bootefi - Boots an EFI payload from memory
bootelf - Boot from an ELF image in memory
bootm   - boot application image from memory
bootp   - boot image via network using BOOTP/TFTP protocol
bootvx  - Boot vxWorks from an ELF image
bootz   - boot Linux zImage image from memory
cmp     - memory compare
cp      - memory copy
crc32   - checksum calculation
dhcp    - boot image via network using DHCP/TFTP protocol
echo    - echo args to console
env     - environment handling commands
erase   - erase FLASH memory
exit    - exit script
ext2load- load binary file from a Ext2 filesystem
ext2ls  - list files in a directory (default /)
ext4load- load binary file from a Ext4 filesystem
ext4ls  - list files in a directory (default /)
ext4size- determine a file's size
false   - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls   - list files in a directory (default /)
fatsize - determine a file's size
fdt     - flattened device tree utility commands
flinfo  - print FLASH memory information
fstype  - Look up a filesystem type
go      - start application at address 'addr'
help    - print command description/usage
iminfo  - print header information for application image
load    - load binary file from a filesystem
loop    - infinite loop on address range
ls      - list files in a directory (default /)
md      - memory display
mii     - MII utility commands
mm      - memory modify (auto-incrementing address)
mmc     - MMC sub system
mmcinfo - display MMC info
mw      - memory write (fill)
nm      - memory modify (constant address)
part    - disk partition related commands
ping    - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
protect - enable or disable FLASH write protection
pxe     - commands to get and boot from pxe files
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
save    - save file to a filesystem
saveenv - save environment variables to persistent storage
setenv  - set environment variables
showvar - print local hushshell variables
size    - determine a file's size
source  - run script from memory
sysboot - command to get and boot from syslinux files
test    - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
true    - do nothing, successfully
version - print monitor, compiler and linker version

====
bdinfo -> 檢視嵌入式開發板資訊

=> bdinfo
arch_number = 0x000008E0
boot_params = 0x60002000
DRAM bank   = 0x00000000                -> 記憶體 bank0
-> start    = 0x60000000                -> 起始位址 0x60000000
-> size     = 0x10000000                -> 容量     0x10000000 = 256 M
DRAM bank   = 0x00000001                -> 記憶體 bank1
-> start    = 0x80000000                -> 起始位址 0x80000000
-> size     = 0x00000004                -> 容量     0x00000004 = 4 byte
eth0name    = smc911x-0
ethaddr     = 52:54:00:12:34:56
current eth = smc911x-0
ip_addr     = <NULL>
baudrate    = 38400 bps
TLB addr    = 0x6FFF0000
relocaddr   = 0x6FF7D000
reloc off   = 0x0F77D000
irq_sp      = 0x6FEDCEF0
sp start    = 0x6FEDCEE0

=====
mmcinfo -> 檢視記憶卡資訊

=> mmcinfo
Card did not respond to voltage select!

上述訊息是指目前沒有記憶卡插入,所以無法開機。我們使用底下指令來加入記憶下:

qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../sdcard.img,if=sd,format=raw,index=0


其中 -drive 參數是告訴 qemu 如何加上記憶卡,file=../../sdcard.img 是告訴 qemu sdcard.img 的位置,因為這個檔案的位是 ~/virtualarm,所以我們使用 ../../ 這個相對路徑的表示式。如果有接上記憶卡的話,其訊息如下:

=> mmcinfo
Device: MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU!
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 400 MiB
Bus Width: 1-bit
Erase Group Size: 512 Bytes

這個訊息告訴我們記憶卡的大小為 400 MiB (Mega),接下來可以觀看其內容。

=====
fatls -> 檢視 fat 分割區之內容,由於第 1 個分割區是以 fat 來作格式化,所以要使用此指令來觀看。

=> fatls mmc 0:1
  2438600   uimage
  2438536   zimage
  1670756   u-boot
   269344   u-boot.bin

4 file(s), 0 dir(s)

=====
ext4ls -> 檢視 ext4 分割區之內容,因為我們使用 ext4 來格式化第 2 個分割區。

=> ext4ls mmc 0:2
<DIR>       1024 .
<DIR>       1024 ..
<DIR>      12288 lost+found
<DIR>       1024 var
<DIR>       1024 usr
<DIR>       5120 bin
<DIR>       1024 lib
<DIR>       5120 etc
<DIR>       1024 tmp
<DIR>       1024 sys
<DIR>       5120 sbin
<DIR>       1024 run
<DIR>       1024 root
<DIR>       1024 proc
<DIR>       1024 home
<DIR>       1024 dev
<DIR>       1024 boot
<DIR>       1024 mnt
<DIR>       1024 srv
<DIR>       1024 opt
<DIR>       1024 media



=====
ls -> 檢視分割區之內容,例如:

=> ls mmc 0:1 -> 看第 0 張記憶卡的第 1 個分割區。
=> ls mmc 0:2 -> 看第 0 張記憶卡的第 2 個分割區


如果 ext4 無法支援的話,要重新格式化 ext4 檔案系統,指令如下:

mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2 (linux 分割區)

詳細說明可以參考底下網頁:

https://archlinuxarm.org/forum/viewtopic.php?f=53&t=12572

=====
version -> 檢視 u-boot 版本

由於我們啟動 qemu 有載入 -nographic 參數,因此請執行 Ctrl-a + x 來退出 u-boot。
=> version

U-Boot 2016.09 (Nov 14 2016 - 10:39:46 +0800)
arm-linux-gnueabihf-gcc ( 4.9.2-10) 4.9.2
GNU ld (GNU Binutils for Debian) 2.25

2016年10月30日 星期日

如何編譯 ARM HF 核心

如何編譯 ARM HF 核心

最新版的 Linux 核心資訊在 kernel.org 中可以看到,目前為止第三版最新的核心版本為 linux-3.18.44,我們以此版本作為「虛擬 ARM」版的開機核心。我們所使用的「虛擬 ARM」版為 vexpress-a9,qemu 所支援的虛擬 ARM 資訊可以執行底下指令來觀看:

$ qemu-system-arm -machine help
Supported machines are:
akita                Sharp SL-C1000 (Akita) PDA (PXA270)
borzoi               Sharp SL-C3100 (Borzoi) PDA (PXA270)
canon-a1100          Canon PowerShot A1100 IS
cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
collie               Sharp SL-5500 (Collie) PDA (SA-1110)
connex               Gumstix Connex (PXA255)
cubieboard           cubietech cubieboard
highbank             Calxeda Highbank (ECX-1000)
imx25-pdk            ARM i.MX25 PDK board (ARM926)
integratorcp         ARM Integrator/CP (ARM926EJ-S)
kzm                  ARM KZM Emulation Baseboard (ARM1136)
lm3s6965evb          Stellaris LM3S6965EVB
lm3s811evb           Stellaris LM3S811EVB
mainstone            Mainstone II (PXA27x)
midway               Calxeda Midway (ECX-2000)
musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
netduino2            Netduino 2 Machine
none                 empty machine
nuri                 Samsung NURI board (Exynos4210)
palmetto-bmc         OpenPOWER Palmetto BMC
raspi2               Raspberry Pi 2
realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
sabrelite            Freescale i.MX6 Quad SABRE Lite Board (Cortex A9)
smdkc210             Samsung SMDKC210 board (Exynos4210)
spitz                Sharp SL-C3000 (Spitz) PDA (PXA270)
sx1                  Siemens SX1 (OMAP310) V2
sx1-v1               Siemens SX1 (OMAP310) V1
terrier              Sharp SL-C3200 (Terrier) PDA (PXA270)
tosa                 Sharp SL-6000 (Tosa) PDA (PXA255)
verdex               Gumstix Verdex (PXA270)
versatileab          ARM Versatile/AB (ARM926EJ-S)
versatilepb          ARM Versatile/PB (ARM926EJ-S)
vexpress-a15         ARM Versatile Express for Cortex-A15
vexpress-a9          ARM Versatile Express for Cortex-A9
virt-2.6             QEMU 2.6 ARM Virtual Machine
virt                 QEMU 2.7 ARM Virtual Machine (alias of virt-2.7)
virt-2.7             QEMU 2.7 ARM Virtual Machine
xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
z2                   Zipit Z2 (PXA27x)

其中有一行如下:

vexpress-a9          ARM Versatile Express for Cortex-A9

這是我們要玩的虛擬 ARM 開發板,請把 linux 核心放在 /usr/src/ 目錄下,其完整路徑為

/usr/src/linux-3.18.44.tar.xz


=======================底下流程請全部以一般使用者來執行========================

接下來在本地端要解開 linux 原始碼,並準備編譯。請在 ~/qemu_image/arm2 目錄新增 kernel 目錄

~/qemu_image/arm2 $ mkdir kernel
~/qemu_image/arm2 $ cd kernel
~/qemu_image/arm2/kernel $ tar xfva linux-3.18.44.tar.xz
~/qemu_image/arm2/kernel $ cd linux-3.18.44
~/qemu_image/arm2/kernel/linux-3.18.44 $ makerpi vexpress_defconfig
~/qemu_image/arm2/kernel/linux-3.18.44 $ makerpi menuconfig

此時會進入核心設定選單,請選擇

General setup  --->
        Kernel compression mode (XZ)  --->

System Type  --->
        [ ] Enable the L2x0 outer cache controller
        請把原有的 * 取消,否則開機會有問題

完全上述設定後離開設定畫面,然後執行:

~/qemu_image/arm2/kernel/linux-3.18.44 $ makerpi uImage LOADADDR=0x60000000 -j 8

作完之後其訊息如下:

..
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  UIMAGE  arch/arm/boot/uImage
Image Name:   Linux-3.18.44
Created:      Mon Oct 31 11:22:50 2016
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2437760 Bytes = 2380.62 kB = 2.32 MB
Load Address: 60000000
Entry Point:  60000000
  Image arch/arm/boot/uImage is ready


接著可以用 qemu 來試開機,請執行:

~/qemu_image/arm2 $ qemu-system-arm -M vexpress-a9 -m 256 -nographic -kernel
./kernel/linux-3.18.44/arch/arm/boot/zImage

此時會進入核心開機畫面,但是因為我們還沒有給這個核心 rootfs 的緣故,因此開機開到一半會出現底下錯誤:

VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
1f00          131072 mtdblock0  (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.18.44 #2
[<80014824>] (unwind_backtrace) from [<800116d0>] (show_stack+0x10/0x14)
[<800116d0>] (show_stack) from [<80477c64>] (dump_stack+0x98/0xac)
[<80477c64>] (dump_stack) from [<80475b10>] (panic+0x9c/0x200)
[<80475b10>] (panic) from [<805ec228>] (mount_block_root+0x1d0/0x260)
[<805ec228>] (mount_block_root) from [<805ec3c0>] (mount_root+0x108/0x110)
[<805ec3c0>] (mount_root) from [<805ec520>] (prepare_namespace+0x158/0x19c)
[<805ec520>] (prepare_namespace) from [<805ebeb4>] (kernel_init_freeable+0x244/0x254)
[<805ebeb4>] (kernel_init_freeable) from [<80473f60>] (kernel_init+0x8/0xe8)
[<80473f60>] (kernel_init) from [<8000e500>] (ret_from_fork+0x14/0x34)
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)


這是正常的,請按 Ctrl+a 然後再按 x 即可離開 qemu 模擬畫面,之後我們將會為此虛擬 ARM 主機加上 rootfs 及 bootloader 使其可以開機。

如何下載 Raspberry Pi 3 之影像檔及安裝至記憶卡

Raspberry Pi3 是目前唯一一塊使用 64 位元 ARM 版 CPU 的嵌入式開發板,官網所提
供的開機影像檔只有 32 位元。目前 64 位元版作業系統仍在開發中,要在 RPI3 上開
機必須使用 SD 記憶卡,因此需要自行下載並安裝開機影像檔至記憶卡中。

要下載 RPI3 的影像檔,請至其官方網頁,連結選單 DOWNLOADS -> RASPBIAN 下載:

RASPBIAN JESSIE LITE ->
         這是最小的開機影像檔,沒有桌面環境,其大小為 292 MB

RASPBIAN JESSIE WITH PIXEL ->
         這是內建桌面環境的開機影像檔,其大小為 1.4 G

考慮到我們開發嵌入式系統多半沒有螢幕,因此在一般情況下只需下載 LITE 版本即可。
下載完會出現一個檔案,其檔名是 YYYY-MM-DD-raspbian-jessie-lite.zip,其中 YYYY
是指西元,MM 是指月份,DD 是指日期,舉例來說在 2016-09-23 官方網站有推出一個
版本,因此其檔名為 2016-09-23-raspbian-jessie-lite.zip。

要解開此檔,請執行:

unzip 2016-09-23-raspbian-jessie-lite.zip

此時會出現一個影像檔,其檔名是:2016-09-23-raspbian-jessie-lite.img

下載/解壓縮完影像檔後,要將此影像檔轉植至 SD 卡,為了減少容量不足的問題,請選
一片 8GB 以上之 SD 卡來轉植影像檔。

要轉植影像檔可以參考官檔說明,其網址如下:

https://www.raspberrypi.org/documentation/installation/installing-images/README.md

轉植方式如下:

1. 請先把 SD 記憶卡插入讀卡機,再接上電腦,並執行 dmesg 來觀察其硬碟代號,例如
[94457.081710] scsi 7:0:0:0: Direct-Access     FNK TECH  USB CARD READER 2.33 PQ: 0 ANSI: 2
[94457.086175] sd 7:0:0:0: Attached scsi generic sg2 type 0
[94457.086291] sd 7:0:0:0: [sdb] 15759360 512-byte logical blocks: (8.07 GB/7.51 GiB)
[94457.086412] sd 7:0:0:0: [sdb] Write Protect is off
[94457.086415] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
[94457.086537] sd 7:0:0:0: [sdb] No Caching mode page found
[94457.086541] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[94457.088724]  sdb: sdb1
[94457.089589] sd 7:0:0:0: [sdb] Attached SCSI removable disk

可以看到記憶卡的硬碟代號是 /dev/sdb

2. 請以 root 權限,在 2016-09-23-raspbian-jessie-lite.img 的目錄下執行:

# time dd bs=4M if=2016-09-23-raspbian-jessie-lite.img of=/dev/sdb
sie-lite.img of=/dev/sdb
331+1 records in
331+1 records out
1389363200 bytes (1.4 GB) copied, 193.759 s, 7.2 MB/s

real    3m13.762s
user    0m0.000s
sys     0m2.068s

請注意上面指令的 /dev/sdb 要確定是你的記憶卡硬碟代號,千萬不要打錯,以免不小
心把你的 windows 硬碟甚至是系統碟洗掉。

如果一切都沒作錯的話,此時讀卡機會開始閃,等它閃完理論上就作好 RPI3 的開機碟。
此時執行 lsblk 可以看到目前 SD 卡上有兩個分割區:

sdb                           8:16   1   7.5G  0 disk
├─sdb1                        8:17   1    63M  0 part
└─sdb2                        8:18   1   1.2G  0 part

2016年10月23日 星期日

如何建立 rootfs (新版 2020)

如何建立 rootfs
#2020/05/05 改版

Q. 什麼是 rootfs ?

嵌入式系統所使用的 Linux,如同工作站版本的 Linux 一樣,都有一個 / 目錄,這個目錄就是所謂的 rootfs。X86 主機的 / 目錄是我們在安裝 Debian Linux 時所建立,但是嵌入式系統的 Linux,其安裝流程十分不一樣,它沒有開機光碟/隨身碟等作為安裝工具,因此必須手動進行安裝。

需要工具:

debootstrap qemu-user-static

請執行:

# apt-get install debootstrap qemu-user-static

*** 我們預計先作一個虛擬的 ARM 系統,以 qemu 來執行,未來各位買 raspberry pi 來進行實作時,要安裝原廠所提供的嵌入式 Linux 作業系統 ***

安裝完畢後,我們要將之前所建立的 sd.img 再掛到 /mnt/sdcard1 /mnt/sdcard2 目錄,其中:

/mnt/sdcard1 - 大小:80M/ 檔案系統:VFAT/ 主要功能:放系統開機核心。
/mnt/sdcard2 - 大小:*  / 檔案系統:EXT4/ 主要功能:放 rootfs 及應用程式。


確定掛載後,我們要在 /mnt/sdcard2 目錄下建立新的 rootfs,指令如下:

# debootstrap \
  --arch=armhf \
  --keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
  --verbose \
  --foreign \
  buster \
  /mnt/sdcard2 \
  file:///home/ftp/debian

其中

--arch=armhf 是指我們 arm 的版本是 hf (Hard Float)
--keyring    是告訴 debootstrap 其 keyring.pgp 檔的位置
--verbose    是將過程全部顯示出來
--foreign    是指使用 armel 這個架構,一般都是在 x86_64 主機上實作其它平台的
             rootfs,所以要加上此參數。
buster       是指我們現在要安裝的 debian 版本為 buster,以後若升級至 bullseye
             的話必須要把 buster 改成 bullseye。
/mnt/sdcard2 是指要建立的 rootfs 目錄
file:///home/ftp/debian 是指建立 rootfs 時要下載的鏡像站來源,一般來說如果使用
             網路鏡像站的話,其參數為:
             ftp://debian.csie.nctu.edu.tw/debian
             或
             ftp://opensource.nchc.org.tw/debian
             等等諸如此類的鏡像站來源,使用網路鏡像站有很多缺點,最主的缺點是
             下載套件的時間是跟網路速度有關,因此先前帶大家自行建立網路鏡像站
             就是為了解決這個問題,所以請使用 file:///home/ftp/debian 即可不上
             網下載而是使用本機硬碟之鏡像站來下載,速度會非常快。

執行上述指令會出現底下訊息:

I: Retrieving Release
I: Retrieving Release.gpg
I: Checking Release signature
I: Valid Release signature (key id 75DDC3C4A499F1A18CB5F3C8CBF8D6FD518E17E1)
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
..
I: Extracting libmount1...
I: Extracting libsmartcols1...
I: Extracting libuuid1...
I: Extracting mount...
I: Extracting util-linux...
I: Extracting liblzma5...
I: Extracting zlib1g...

這樣表示 debootstrap 的第一階段告一段落,接著請執行:

# cp /usr/bin/qemu-arm-static /mnt/sdcard2/usr/bin/

然後進入 chroot 環境:

# chroot /mnt/sdcard2 /bin/bash
bash: warning: setlocale: LC_ALL: cannot change locale (zh_TW.UTF8)
I have no name!@120:/#

看到 I have no name! 的提示符號就表示我們已經進入 chroot 環境,請再執行:

# /debootstrap/debootstrap --second-stage
I: Keyring file not available at /usr/share/keyrings/debian-archive-keyring.gpg; switching to https mirror https://mirrors.kernel.org/debian
I: Installing core packages...
I: Unpacking required packages...
I: Unpacking acl...
I: Unpacking libacl1:armel...
..
I: Configuring tasksel...
I: Configuring tasksel-data...
I: Configuring libc-bin...
I: Configuring systemd...
I: Base system installed successfully.

看到最後一行有 Base system installed successfully 表示最原本的 rootfs 已經作好。

作完等待下次再來進行設定,請先將 sd.img 整個解除掉 (umount, losetup -d)。。

安裝 ARM toolchain (2016 年版)

安裝 Cross toolchain

目前 ARM 的平台已經有 64 位元 CPU,其 Debian 架構是 aarch64,為了兼顧傳統 32 位元之 armel/armhf 支援,及最新的 aarch64 架構支援,我們必須安裝這三者之 toolchain,並分別設定其指令才能使用。要編譯 ARM 平台的程式,必須安裝 Cross toolchain,所謂的 Cross toolchain 就是 在 X86 平台上編譯 ARM 的可執行檔。要安裝這些 toolchain 必須使用 Embedded Debian Project 所提供資源,所以我們要修改 /etc/apt/sources.list 這個檔案,新增底下設定:

#armhf toolchain
deb http://emdebian.org/tools/debian/ jessie main

新增完畢之後,請執行:

# apt-get update

然後執行:
# dpkg --print-foreign-architectures
armel
i386

這裡可以看到目前我們的系統支援 armel 以及 i386 等非 x86_64 平台的架構,現在請
執行:

# dpkg --add-architecture armhf
# dpkg --add-architecture arm64

來新增 armhf 及 arm64 架構,作完之後再重新執行剛剛的指令可以看到目前已經有
armhf 架構了,指令如下:
# dpkg --print-foreign-architectures

其輸出至少會有三行:
armel                   - armel 架構
armhf                   - armhf 架構
arm64                   - arm64 架構


接著安裝 armhf 以及 arm64 的 gcc 套件,請執行:

# apt-get update
# apt-get install crossbuild-essential-armhf
# apt-get install crossbuild-essential-arm64


為了方便未來我們使用這三個不同版本的工具,請在 ~/.bashrc 中新增底下設定:

alias makearm='make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-'
alias makerpi='make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-'
alias makearm64='make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-'

然後安裝

# apt-get install qemu-user qemu-user-static

接下來執行底下指令來驗證 armhf 版本之編譯工具是否已安裝完成:

$ arm-linux-gnueabihf-gcc -v
$ arm-linux-gnueabihf-cpp -v
$ arm-linux-gnueabihf-g++ -v


然後請再執行底下指令來驗證 arm64 版本之編譯工具是否已安裝完成:

$ aarch64-linux-gnu-gcc -v
$ aarch64-linux-gnu-cpp -v
bash: aarch64-linux-gnu-cpp:命令找不到

上述錯誤是指在 /usr/bin 目錄沒有底下連結,請自行建立:

lrwxrwxrwx 1 root root 25 10月 24 10:07 aarch64-linux-gnu-cpp -> aarch64-linux-gnu-cpp-4.9

建立完再重新執行一次:

$ aarch64-linux-gnu-cpp -v

此時應該就沒有問題了,請再執行最後一個程式的驗證:

$ aarch64-linux-gnu-g++ -v

看看是否已安裝完畢,接著可以作編譯 arm 版 hello.c 的程式,指令如:

~/prog $ arm-linux-gnueabihf-gcc hello.c -o hello_arm

接著檢查 hello_arm 是否為 ARM 之可執行檔:

~/prog $ file hello_arm
hello_arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.18, BuildID[sha1]=ff5f6feea2e9b6d69384e8983758eb78c629276a, not stripped

確定有上面的檔案是 ARM 版可執行檔後,我們可以執行底下指令來驗證:

~/prog $ qemu-arm hello_arm
Hello World

接下來請執行底下指令,將 hello.c 編譯成 arm64 位元版本:

~/prog $ aarch64-linux-gnu-gcc hello.c -o hello_arm64


此時會編出一個 hello_arm64 的檔案,請執行底下指令來觀看此檔格式:

~/prog $ file hello_arm64
hello_arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=6a5f0a968cea7ef12c8dfb9873772f1660ea0b6c, not stripped

要驗證此檔是否可執行,請執行:

~/prog $ qemu-aarch64 hello_arm64
Hello World


截至目前為止,我們已完成 armhf、arm64 之編譯工具安裝及驗收,這些工具將成為未來編譯 arm 核心、u-boot 的基本工具。


Q:什麼是 armel ? 什麼是 armhf ? 什麼是 arm64 ?






請依照
https://wiki.debian.org/CrossToolchains
https://wiki.debian.org/EmdebianToolchain
https://wiki.debian.org/Embedded_Debian
來安裝,20 分鐘驗收。


如何用 qemu 安裝虛擬機

# apt-get install qemu-system-x86

新增一個 ~/centos,並切換至此目錄:

$ mkdir ~/centos

$ cd ~/centos

作 centos 安裝硬碟檔,容量 10G

底下指令是 raw 格式:
~/centos$ qemu-img create centos.img 10G
Formatting 'centos.img', fmt=raw size=10737418240

或生 qcow2 格式
~/centos$ qemu-img create centos_qcow2.img 10G -f qcow2
Formatting 'centos_qcow2.img', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16

上述任一格式均可安裝 centos,目前 centos 最新的 ISO 檔名為:

CentOS-7-x86_64-DVD-1511.iso

我們將此檔複製至 ~/centos 目錄中,然後執行底下指令確定系統是否有載入 kvm 模組:

$ lsmod |grep kvm
kvm_intel             163840  0
kvm                   438272  1 kvm_intel

接著開始安裝,請執行底下指令:

~/centos$ qemu-system-x86_64  -enable-kvm -m 4096 -drive file=centos.img,format=raw -cdrom CentOS-7-x86_64-DVD-1511.iso -boot d

此時會進入 CentOS 安裝畫面,選擇:

Software Selection -> Server with GUI

Begin Installation 畫面中要設定 root 密碼及一般使用,此時會進行 centos 的安裝
流程,等安裝完畢後重新開機並在原啟動畫面按 Ctrl+C 中斷虛擬機。

我們再執行底指令重啟虛擬機:

~/centos$ qemu-system-x86_64  -enable-kvm -m 4096 -drive file=centos.img,format=raw -cdrom CentOS-7-x86_64-DVD-1511.iso -boot c


接著就有虛擬機可用,那麼目前 centos.img 就是我們所安裝的虛擬 linux 環境,如果要
作備份,請先把虛擬機關閉,然後執行:

~/centos$ qemu-img convert -O raw centos.img centos_backup.img

執行完畢後會出現一個 centos_backup.img 檔,這就是我們虛擬機的備份檔,以後玩虛
擬機是玩 centos.img 這個檔案,萬一玩死掉了可以執行底下指令來復原:

~/centos$ qemu-img convert -O raw centos_backup.img centos.img

復原之後就可以繼續玩 centos.img 檔。

2016年9月20日 星期二

設定 3D 建模環境

系統準備

前言

首先將系統安裝至有 X-window,然後準備設定顯卡的驅動程式,我們可以執行:

lspci 來觀察目前系統的顯示卡,如底下所示:

01:00.0 VGA compatible controller: NVIDIA Corporation GF119 [GeForce GT 620 OEM] (rev a1)

05:00.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 21)


上述訊息表示我們的系統有 2 張顯卡,其中一張是 Nvidia 的顯卡,其型號為 GeForce GT 620,另一張為系統內建的顯卡,其廠牌為 ASPEED。由於 3D 建模需要使用到 3D 加速卡的功能,因此我們要為系統安裝 Nvidia 官方驅動程式。

設定 /etc/apt/sources.list 檔案,請修改其內容如下:

deb http://opensource.nchc.org.tw/debian/ jessie main contrib non-free
                                                              ^^^^^^^^
請注意上面的設定要有 non-free,如此一來才能安裝 Nvidia 驅動程式。

設定好 /etc/apt/sources.list 檔案後,請執行:

# apt-get update
# apt-get upgrade

先將系統目前的套件全部更新一次,然後再來安裝 Nvidia 驅動程式。

================================
將原本舊有顯卡驅動程式 blacklist

請執行底下指令,可以看到目前有 ast 及 nouveau 模組載入至系統中:

# lsmod |grep ast
ast                    53585  0
ttm                    77862  2 ast,nouveau
drm_kms_helper         49210  2 ast,nouveau
drm                   249998  5 ast,ttm,drm_kms_helper,nouveau
i2c_algo_bit           12751  3 ast,igb,nouveau
i2c_core               46012  7 ast,drm,igb,i2c_i801,drm_kms_helper,i2c_algo_bit,nouveau

其中 ast 為 ASPEED 顯卡的驅動程式模組,而 nouveau 為 Nvidia 顯卡的「非官方」驅動程式模組。這兩個模組在開機時都要設定無需載入,因此請至 /etc/modprobe.d/ 目錄中編輯 fbdev-blacklist.conf 這個檔案,新增底下兩行:

blacklist ast
blacklist nouveau

存檔後重新開機,此時再打

$ lsmod | grep ast
以及
$ lsmod |grep nouveau

這兩個指令看看這兩個模組是否有載入,理論上這個模組現在沒有載入,所以沒有任何輸出。

================================
安裝顯卡驅動程式

請以 root 權限執行:

# apt-get install nvidia-kernel-dkms

安裝完畢後請執行:

# modprobe nvidia

並執行

# lsmod |grep nvidia
nvidia              10520178  0
drm                   249998  2 nvidia
i2c_core               46012  5 drm,igb,i2c_i801,i2c_algo_bit,nvidia

如果沒有作錯的話,我們現在可以看到 nvidia 的驅動程式模組。此時再執行:

# lspci -k

可以看到底下片段,這表示 nvidia 的顯卡驅動程式已安裝完畢。

01:00.0 VGA compatible controller: NVIDIA Corporation GF119 [GeForce GT 620 OEM] (rev a1)
        Subsystem: ASUSTeK Computer Inc. Device 8473
        Kernel driver in use: nvidia

================================
安裝 X window

# apt-get install xorg icewm

安裝完畢後請以一般使用者權限執行:

$ startx

如果此時有錯誤的話,請以 root 權限執行:

# X -configure

此時會在 /root 目錄中出現一個檔案叫 xorg.conf.new,我們要將此檔複製至 /etc/X11
底下,指令如下:

# cp /root/xorg.conf.new /etc/X11/xorg.conf

然後再以一般使用者執行:

$ startx

此時應該可以進入 X 視窗,要確定是否載入 nvidia 驅動程式模組請開終端機,再以

root 權限觀察 /var/log/Xorg.0.log,其中是否有底下片段:

[  1106.212] (II) NVIDIA GLX Module  340.96  Sun Nov  8 22:06:18 PST 2015
[  1106.212] (II) LoadModule: "nvidia"

這表示我們已成功載入 nvidia 驅動程式模組。


================================
安裝 blender

請以 root 權限執行:

# apt-get install blender                       # 安裝 blender 主程式
# apt-get install nvidia-cuda-toolkit           # 安裝 cuda 硬體加速工具箱

然後以一般使用者權限執行:

$ blender

等 blender 啟動後,開啟

File -> User Preferences... 選單

然後至 System 畫面,選擇 CUDA -> GeForce GT 620 以啟動 3D 加速。

然後再選擇 Save User Settings 來儲存我們的設定。

此時即完成 blender 的 3D 加速設定。

================================
安裝 FreeCAD

請以 root 權限執行:

# apt-get install freecad

來安裝 FreeCAD,安裝完畢後再以一般使用者權限執行:

$ freecad

以啟動 freecad,此時應該可以看到 freecad 的介面。

================================
安裝 LibreCAD

請以 root 權限執行:

# apt-get install librecad

來安裝 librecad,安裝完畢後再以一般使用者權限執行:

$ librecad

來啟動 librecad,此時應該可以看到 librecad 的介面。

#下載 Nvidia 驅動程式:

#Nvidia 的驅動程式請至官網下載,輸入正確的型號 (GeForce GT 620) 以及作業系統
#(Linux 64bit) 後即可下載,目前最新的版本為 367.44,其檔名為

#NVIDIA-Linux-x86_64-367.44.run


2016年6月2日 星期四

如何安裝 docker

Docker 官方網頁有介紹如何在 jessie 中安裝 docker,其網址如下:

https://docs.docker.com/engine/installation/linux/debian/#debian-jessie-80-64-bit

請編輯 /etc/apt/sources.list 檔案,新增底下這行:

# Docker
deb https://apt.dockerproject.org/repo debian-jessie main

然後以 root 權限執行

# apt-get update
# apt-get install docker-engine

安裝完畢後,理論上你的 docker 服務已經開始運轉,我們可以執行

# systemctl status docker

來觀察目前狀態。在此同時,我們如果執行

# ifconfig

的話,也會看到有一個新的網路介面叫 docker0 的,其狀態如底下所示:

docker0   Link encap:Ethernet  HWaddr 02:42:48:93:4b:a0
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP 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)


docker 之預設橋接網路介面為 docker0,其預設網段為 172.17.0.0/24,如果我們希望將網段改為 192.168.20.0/24,則在啟動 docker 前,我們要先設定 docker 的網段,請編輯 /etc/default/docker
這個檔案,將 DOCKER_OPTS 改成底下設定(其中一行):

南臺校外
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --bip=192.168.20.0/24"

南臺校內
DOCKER_OPTS="--dns 120.117.2.1 --dns 120.117.2.2 --bip=192.168.20.0/24"

其中 --dns 是指 docker0 所提供 DNS 位址,而 --bip 則是所設定的網段。改完之後,要重新啟動 docker0,在那之前,要先將 docker 服務停止,指令如下:

# systemctl stop docker

關完之後可以執行

# systemctl status docker

來看目前 docker 狀態。

接著來修理 docker0,docker0 不是網路介面,而是橋接網路,因此使用底下指令可以看
到 docker0 的狀態。

# brctl show
bridge name     bridge id               STP enabled     interfaces
br10            8000.000000000000       no
docker0         8000.024248934ba0       no

現在執行底下指令可以看到 docker0 的 IP 還沒改過來。

# ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 02:42:48:93:4b:a0
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP 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)

我們將 docker0 這個橋拿掉:

# brctl delbr docker0
bridge docker0 is still up; can't delete it

這表示 docker0 這個橋接網路介面還沒關掉,我們要執行底下指令才能關掉:

# ifconfig docker0 down
# ifdown docker0
# brctl delbr docker0

如此一來 docker0 就完全不見了,可以執行 ifconfig 來驗證看看。


編輯 /etc/sudoers 檔,為自己的帳號新增 sudo 的權限 (無需打密碼)

account  ALL=(ALL:ALL) NOPASSWD:ALL

上面的 account 是指你自己的帳號。


我們也可以新增一個 br20 的橋接網路介面,然後在 /etc/default/docker 中作底下修改:

DOCKER_OPTS="--dns 120.117.2.1 --dns 120.117.2.2 -b=br20"

如此一來會讓 docker 使用 br20 這個橋接網路介面,然後再重新啟動 docker 服務:

# systemctl restart docker

接著可以觀察網路上是否有現成的影像檔可以下載:

sudo docker search debian:jessie

此時會看到有很多現成的 docker 影像檔可以下載,在下載前我們先看一下目前有的
docker 影像檔:

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

從此可以看到目前沒有下載任何 docker 影像檔,請執行底下指令下載 docker 影像檔:

$ sudo docker pull debian:jessie
jessie: Pulling from library/debian
51f5c6a04d83: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:2ca1d757fce75accad6ff84339c3327c7aa96ad6e7b7d6fdde22b2a537fac703
Status: Downloaded newer image for debian:jessie

下載完畢後再執行底下指令觀看目前是否已下載 docker image ?

herman@120:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              jessie              1742affe03b5        10 days ago         125.1 MB

執行 docker jessie

$ sudo docker run -t -i debian:jessie /bin/bash
root@58abce6c9be8:/#

恭喜你,你已經啟動第一個 docker 容器了。但是這個容器相當陽春,連 ifconfig 指令
也沒有:
root@58abce6c9be8:/# ifconfig
bash: ifconfig: command not found

我們可以至 debian packages 網站查查看 ifconfig 屬於那個套件,再補裝上去,經過
查詢,ifconfig 屬於 net-tools 套件,在安裝此套件前要執行

# apt-get update
# apt-get install net-tools

安裝完畢後執行:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:c0:a8:14:02
          inet addr:192.168.20.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:c0ff:fea8:1402/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3058 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2603 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:26185005 (24.9 MiB)  TX bytes:180507 (176.2 KiB)

可以看到 eth0 的 IP 為 192.168.20.2,此時我們可以從實體機來 ping 192.168.20.2
看看是否能 ping 到這台主機:

$ ping 192.168.20.2
PING 192.168.20.2 (192.168.20.2) 56(84) bytes of data.
64 bytes from 192.168.20.2: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 192.168.20.2: icmp_seq=2 ttl=64 time=0.026 ms
64 bytes from 192.168.20.2: icmp_seq=3 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=4 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=5 ttl=64 time=0.025 ms
64 bytes from 192.168.20.2: icmp_seq=6 ttl=64 time=0.022 ms
64 bytes from 192.168.20.2: icmp_seq=7 ttl=64 time=0.023 ms
^C
--- 192.168.20.2 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 5999ms
rtt min/avg/max/mdev = 0.022/0.024/0.032/0.006 ms

也可以從 docker 虛擬機 ping 192.168.20.1 來看看是否能 ping 到 docker0:

root@58abce6c9be8:/# ping 192.168.20.1
PING 192.168.20.1 (192.168.20.1): 56 data bytes
64 bytes from 192.168.20.1: icmp_seq=0 ttl=64 time=0.044 ms
64 bytes from 192.168.20.1: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.20.1: icmp_seq=2 ttl=64 time=0.031 ms
^C--- 192.168.20.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.031/0.035/0.044/0.000 ms

到此為止,我們已經成功啟動一台 docker 的虛擬機,並且知道其網路設定了。接下來要
進行 apache 伺服器安裝,在那之前要先設定好鏡像站來源,否則下載軟體的速度會很慢

# apt-get install vim

接著編輯 /etc/apt/sources.list 檔案:

deb http://security.debian.org jessie/updates main

#deb http://httpredir.debian.org/debian jessie main
#deb http://httpredir.debian.org/debian jessie-updates main

deb ftp://192.168.20.1/debian jessie main contrib non-free
deb ftp://192.168.20.1/debian jessie-updates main

然後執行

# apt-get update

看看是否可以從實體主機的 debian 鏡站中下載套件,接下來安裝 apache 套件:

# apt-get install apache2

下載安裝完成後,可以自實體機以瀏覽器打開 http://192.168.20.2 來看是否有網頁,
如果沒有的話請執行:

# /etc/init.d/apache2 start
[....] Starting web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.20.2. Set the 'ServerName' directive globally to suppress this message
. ok

# /etc/init.d/apache2 status
[ ok ] apache2 is running.

來啟動並觀看 apache2 這個服務是否有執行,確定 apache2 有執行後可以再使用實體機
的瀏覽器打開 192.168.20.2 以驗證網頁服務是否有啟動。

=======================================
在實體機上如果要觀察目前有那些 docker 的容器正在執行的話,可以執行:

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
58abce6c9be8        debian:jessie       "/bin/bash"         53 minutes ago      Up 53 minutes                           dreamy_heisenberg

=======================================
離開 docker 容器,請在 docker 中輸入 exit:

root@58abce6c9be8:/# exit
exit
~$

此時再在實體機中執行:

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

會發現剛剛運行中之系統已經不見,這表示 docker 容器已經停止。

建立 chroot 環境

什麼是 chroot ?

chroot (change root) 是一個指令,它可以將某個小型的檔案系統變成一個 /  環境,而這個小型的檔案系統要用 debootstrap 這個指令來建立。

使用 debootstrap 指令

debootstrap 指令是用來建立小型 root 環境的一個指令,他對於建立嵌入式系統的根目錄或是我們現在要建立的小型 root 環境都非常有用,要安裝 debootstrap 請執行:

# apt-get install debootstrap


安裝完成後,請在 ~/virtualclassroom 底下建立一個 chroot 目錄,接著在此目錄新增一個 shell script,其檔名為 debootstrap.sh,內容如下所示:

SOURCEDIR=`pwd`/LEENIX
ARCH=amd64
DEBIAN_RELEASE=jessie
#DEBIAN_MIRROR=ftp://opensource.nchc.org.tw/debian
DEBIAN_MIRROR=file:///srv/ftp/debian

[ -d $SOURCEDIR ] && rm -rf $SOURCEDIR

mkdir -p $SOURCEDIR

time debootstrap --arch ${ARCH} ${DEBIAN_RELEASE} ${SOURCEDIR} ${DEBIAN_MIRROR}

建完 debootstrap.sh 後,請以 root 權限執行:

# sh debootstrap.sh

此時會看到 debootstrap 開始抓檔案並開始安裝一個最原始、最小型的 / 檔案系統。debootstrap.sh 執行完的畫面如下所示:

I: Configuring iputils-ping...
I: Configuring isc-dhcp-common...
I: Configuring isc-dhcp-client...
I: Configuring tasksel...
I: Configuring tasksel-data...
I: Configuring libc-bin...
I: Configuring systemd...
I: Base system installed successfully.

此時會有一個 LEENIX 的目錄,我們可以檢查此目錄來看其內容,這個目錄其實就是一個最精簡的 / 目錄。接下來我們可以使用 chroot 指令來切換至此目錄,請先編輯 chroot.sh 檔案,其內容如下所示:

SOURCEDIR=`pwd`/LEENIX

chroot ${SOURCEDIR} \
  /usr/bin/env -i \
  HOME=/root \
  TERM=$TERM \
  PS1='\u:\w\$ ' \
  PATH=/bin:/usr/bin:/sbin:/usr/sbin \
  /bin/bash --login

編輯完之後可以用 root 權限執行:

sh chroot.sh

此時你會發現你的目錄位置變成 /,如底下所示:

~/virtualclassroom/chroot# sh chroot.sh
root@120:/#

現在我們已經切換到剛剛那個小型的 root 目錄了,在這個目錄可以作一些事情,理論上不會傷害到實體主機。例如 apt-get 指令等均是在此小型 / 目錄中作修改。我們可以在這個目錄新增一個空的 aaa.txt 檔,指令如下所示:

/# touch aaa.txt

接著打 exit 離開 chroot 環境,再觀看 LEENIX 目錄中是否有 aaa.txt 這個檔案。

以上所完成的就是一個最簡單的 chroot 環境,它與我們接下來要教的 docker 有點類似,所以 docker 才號稱是「加了外掛的 chroot 環境」。

2016年5月18日 星期三

使用 preseed 自動安裝 Linux

我們一般安裝 Linux 的方式是一台一台裝,如果遇上大量佈建系統環境的情況,舉例來說,我們要裝 20 台 Linux 主機,那麼一台一台裝可能會非常辛苦。在這種情況下,Debian 提供了一種安裝系統的方式,稱為 preseed,其官方文件在:

https://wiki.debian.org/DebianInstaller/Preseed

這種安裝方式是透過一個預先作好的設定檔,檔案為 preseed.cfg (可自定檔案),裡面針對所需要的系統配置來定義要如何分割硬碟、安裝那些套件、root 密碼定義、一般使用者帳號、密碼定義,以及預設鏡像站 .. 等皆可設定在 pressed.cfg 中。

請至上課用 ftp 站下載預先建立好的 preseed.cfg,放在
http://192.168.10.254/preseed.cfg
用瀏灠器觀看其內容,看看是否有讀取的權限。

安裝

請修改 buildlinux1.sh 至 buildlinux2.sh,並將 boot d 改為 boot n,使用網路開機,在開機選單中按 TAB,加上底下設定:

auto=true url=http://192.168.10.254/preseed.cfg


然後按 Enter,看看系統會不會自動安裝。


這種手動安裝方式比較麻煩,還要在開機時按 TAB 進入開機選單編輯,如果要作全自動的安裝,請在 pxe server 底下的

/srv/tftp/debian-installer/amd64/boot-screens/txt.cfg 中將

append vga=788 initrd=debian-installer/amd64/initrd.gz --- quiet

改成

append vga=788 initrd=debian-installer/amd64/initrd.gz --- quiet auto=true priority=critical url=http://192.168.10.254/preseed.cfg

然後再重新啟動 buildlinux2.sh 試試看。



==========================================================================
假設要安裝 10 GB 之虛擬 Linux,其硬碟規畫如下:

/dev/sda1       /       ext4    2G
/dev/sda2       /usr    ext4    2.5G
/dev/sda3       swap    swap    2G
/dev/sda4       /home   xfs     *

其 preseed 語法如下:

d-i partman-auto/expert_recipe string
      boot-root ::
              2048 2100 4096 ext4
                      $primary{ } $bootable{ }
                      method{ format } format{ }
                      use_filesystem{ } filesystem{ ext4 }
                      mountpoint{ / }
              .
              2048 3000 4096 ext4
                      method{ format } format{ }
                      use_filesystem{ } filesystem{ ext4 }
                      mountpoint{ /usr }
              .
              1024 1500 300% linux-swap
                      method{ swap } format{ }

              .
              100000 1000000000 -1 xfs
                      method{ format } format{ }
                      use_filesystem{ } filesystem{ xfs }
                      mountpoint{ /home }

2016年5月16日 星期一

CIC IC 競賽元件庫安裝

請先完成

Synopsys Design Compiler/Synthesis 之安裝


再執行此部份流程。

Cell Library 標準元件庫是 Cell Base 流程的基礎,也是編譯 RTL 碼不可或缺的重要元素,所謂的標準元件庫是指由 AND、OR、NOT、XOR、FlipFlops .. 等構成的元件庫,這些元件可以用來組合成「所有」的數位電路。

由於 Cell Library 為各 EDA 大廠的智慧財產權,沒有申請前無法下載、使用商業版的 Cell Library,只能使用 CIC 所提供的 IC 競賽元件庫,底下介紹流程。

下載

CBDK_IC_Contest_v2.1.tar


解壓縮

請解壓縮至 /opt/PROCESS 目錄下

tar xfva CBDK_IC_Contest_v2.1.tar -C /opt/PROCESS

此時會出現底下目錄

/opt/PROCESS/CBDK_IC_Contest_v2.1/SynopsysDC

裡面有兩個子目錄,分別是 db 及 lib 目錄。

設定

請在 DC 的選單中執行:

File -> Setup

此時會出現 Setup 視窗,請在此視窗設定三個參數,分別如下:


Link Library

/opt/PROCESS/CBDK_IC_Contest_v2.1/SynopsysDC/db/fast.db


Target Library

/opt/PROCESS/CBDK_IC_Contest_v2.1/SynopsysDC/db/fast.db


Symbol Library

/opt/EDA/synthesis/cur/libraries/syn/class.sdb

並且將其它元件庫刪掉。

編譯:

如果一切都沒問題的話,我們可以執行編譯的流程,在編譯前請選 Logical Hierarchy 視窗中的 half_adder,並看其 Schematic (圖示在上方),我們會發現電路目前是一個十字符號。接著請執行選單:

Design -> Compile Design

此時會出現一個視窗作微調,在此我們不作任何微調,直接點選 OK 按鍵。點選 OK,Design Compiler 會自動進行電路編譯,並作最佳化,作完之後再點選 Schematic 即可看到編譯完之電路,理論上應該是最精簡的電路。編譯完之電路請選

File -> Save As 將編譯完之後的電路存為 ha_compile.v,其內容如下:


/////////////////////////////////////////////////////////////
// Created by: Synopsys DC Expert(TM) in wire load mode
// Version   : K-2015.06-SP5
// Date      : Tue May 17 11:08:48 2016
/////////////////////////////////////////////////////////////


module half_adder ( x, y, Sum, Cout );
  input x, y;
  output Sum, Cout;


  XOR2X1 U3 ( .A(y), .B(x), .Y(Sum) );
  AND2X1 U4 ( .A(y), .B(x), .Y(Cout) );
endmodule


我們可以很明顯的看出此段程式是由 Design Complier 所編譯出來,它使用到的 AND 及 XOR 閘的名稱分別是 AND2X1 以及 XOR2X1,這不是基本 Verilog 閘,所以如果我們使用 cver 來編譯這檔案,會出現底下錯誤:

cver ha_compile.v
GPLCVER_2.12a of 05/16/07 (Linux-elf).
Copyright (c) 1991-2007 Pragmatic C Software Corp.
  All Rights reserved.  Licensed under the GNU General Public License (GPL).
  See the 'COPYING' file for details.  NO WARRANTY provided.
Today is Tue May 17 11:32:39 2016.
Compiling source file "ha_compile.v"
Unresolved modules or udps:
  XOR2X1
  AND2X1

  2 modules or udps unresolved after library processing - cannot continue.
  Unable to begin simulation.
End of GPLCVER_2.12a at Tue May 17 11:32:39 2016 (elapsed 0.0 seconds).

這兩個錯誤的意思是 XOR2X1 及 AND2X1 是找不到的電路模組,要解決這個問題,我們還是要來看 CIC 所提供的元件庫,在

/opt/PROCESS/CBDK_IC_Contest_v2.1/Verilog/tsmc13.v 中可以看到其中有 AND2X1 及 XOR2X1 之定義。因此我們可以將此檔複製過來我們跑模擬的目錄,再執行:
cver ha_compile.v tsmc13.v

此時應該不會有任何錯誤。

最後我們再加上 testfixture 檔,看看能不能跑波型出來:

cver ha_compile.v tsmc13.v test_ha.v

此時一樣會生出新的 testha.dmp,並且可以使用 gtkwave 觀察出波形,我們可以看到這邊的波形是有輸入 -> 輸出 延遲的。

到這邊為止,我們已經完成 Design Compiler 編譯 RTL 碼至 Gate Level 碼的流程,並又使用 cver 來重新驗證所跑出來的 Gate Level 碼是否能正確模擬出波形來。

Synopsys Design Compiler/Synthesis 之安裝

Design Compiler/Synthesis 的目的是用來編譯 (Compile) 硬體描述語言所寫出來的電路,將 RTL 碼轉成 Gate Level 碼,以便進行電路合成 (Synthesis) 用。


下載:

請至 CIC 網頁下載

synthesis_2016.03_linux.tgz
lc_2015.06-sp3_linux.tgz
mvtools_2014.12-sp1_linux.tgz
DFT-Compiler.zip
Design-Compiler.zip
Power-Compiler.zip
installation_guide_synopsys.txt

解壓縮

請將 synthesis_2016.03_linux.tgz 解開至 /opt/EDA 目錄中,此時會出現

/opt/EDA/synthesis/cur 目錄

設定

請在 ~/.bashrc 中設定底下內容:

DC_bin="/opt/EDA/synthesis/cur/bin"

export PATH=$PATH:$DC_bin

執行

一開始執行 dc_shell 時,會出現底下錯誤:

$ dc_shell
/opt/EDA/synthesis/cur/linux64/syn/bin/common_shell_exec: error while loading shared libraries: libtiff.so.3: cannot open shared object file: No such file or directory


這個問題是因為它綁了一個很舊的函式庫叫 libtiff.so.3,如果到 /usr/lib 底下尋找的話,會發現最舊的版本是 libtiff.so.4,如底下所示:

/usr/lib$ find ./ -name libtiff.so*
./x86_64-linux-gnu/libtiff.so.5
./x86_64-linux-gnu/libtiff.so.5.2.0
./x86_64-linux-gnu/libtiff.so.4.3.6
./x86_64-linux-gnu/libtiff.so.4
./i386-linux-gnu/libtiff.so.5
./i386-linux-gnu/libtiff.so.5.2.0

我們使用鋸箭法來解決這個問題,請以 root 權限 至 /usr/lib/x86_64-linux-gnu/ 下建立一個 libtiff.so.3 的連結,指令如下:

cd /usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu # ln -s libtiff.so.4.3.6 libtiff.so.3

此時看到有一個 libtiff.so.3 的連結,之後再執行:

$ dc_shell -gui

看看可否正常執行。

測試

從 Design Compiler 的 GUI 畫面中載入 ha_rtl.v 看看能不能看到電路模組 ?

接下來請參考
 
CIC IC 競賽元件庫安裝

2016年5月11日 星期三

安裝、架設 DNS 伺服器

2019/10/21 修訂

參考資料:

http://www.l-penguin.idv.tw/article/dns.htm
http://www.twbsd.org/cht/book/ch22.htm

定義:

網域為:my.com,192.168.10.0/24
閘道 IP:192.168.10.1
PXE 伺服器 IP:192.168.10.254 -> pxe.my.com
其它每台主機的名稱為:

192.168.10.1 -> host1.my.com, gateway.my.com
192.168.10.2 -> host2.my.com
..
192.168.10.254 -> host254.my.com, pxe.my.com, dns.my.com

安裝 DNS 伺服器

# apt-get install bind9

設定 DNS 伺服器

主要設定檔位置:/etc/bind/named.conf -> 此檔應該不必修改,要修改的是所參考到的檔案。

/etc/bind/named.conf.default-zones 新增底下片段:

zone "my.com" IN {
        type master;
        file "/etc/bind/db-my.com";
        allow-update { none; };
};

接著編輯 /etc/bind/db-my.com 這個檔案,其內容如下:

$TTL          86400
$ORIGIN my.com.
@          1D IN SOA                    @ root.my.com. (
                                        2015041601          ; 修改序號
                                        3H                  ; refresh
                                        15M                 ; retry
                                        1W                  ; expiry
                                        1D )                ; minimum

@                   IN NS         dns.my.com.
dns.my.com.  IN A          192.168.10.254

;設定 MX record
;@              IN MX 10      ms1
;@              IN MX 20      ms2
;ms1            IN A          11.22.33.69
;ms2            IN A          11.22.33.70

;www            10 IN A       11.22.33.85     ;www 做 load balancing
;www            10 IN A       11.22.33.86     ;www 做 load balancing
;web            IN CNAME      www             ;讓 web.abc.com.tw 也指到 www
gateway         IN A     192.168.10.1;
pxe             IN A     192.168.10.254;
host1           IN A     192.168.10.1;
host2           IN A     192.168.10.2;
host3           IN A     192.168.10.3;
..
host254         IN A     192.168.10.254;

設定好之後請重啟 bind9

# systemctl restart bind9.service
# systemctl status bind9.service

並修改 /etc/resolv.conf 之內容如下:

search my.com
nameserver 192.168.10.254

再看看是否能順利進行正解:

nslookup host1.my.com

此時如果進行反解查詢,應該是找不到資料(因為我們還未設定)。

接下來要進行反解設定,請先在 /etc/bind/named.conf.default-zones 這個檔案中再
新增底下片段:

zone "10.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/db-192.168.10";
};

其中 10.168.192.in-addr.arpa 是設定 192.168.10.X 這個網段的資料,而

/etc/bind/db-192.168.10 這個檔案則是設定反查之紀錄,其內容如下:
;BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL    86400
@       IN      SOA     my.com. root.my.com. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;
;@      IN      NS      dns.my.com.
        IN      NS      my.com.
1         IN PTR        gateway.my.com.
254       IN PTR        dns.my.com.
254       IN PTR        pxe.my.com.
1         IN PTR        host1.my.com.
2         IN PTR        host2.my.com.
3         IN PTR        host3.my.com.
4         IN PTR        host4.my.com.
..
254       IN PTR        host254.my.com.

設定完之後請再次重啟 bind9,並作正、反解查詢,如果沒有設定錯誤的話,現在
應該可以順利的進行正反解。

接著,我們來看看此 DNS 設定是否能查詢到外界網域,請執行:

nslookup www.google.com

理論上應該沒有問題,因為 dns 預設會往上查詢網路上已存在之正、反解資料。


設定 bind 只查 IPV4

# vi /etc/default/bind9
將 OPTIONS 改成底設定:

OPTIONS="-4 -u bind"

然後再重新啟動 /etc/init.d/bind9

2016年3月29日 星期二

Calibre 安裝與設定

#2020/04/16 更新

Calibre 是用來作 Design Rule Check - DRC 以及 Layout V.S. Schematic - LVS 驗證的工具,在古時候 DRC/LVS 驗證用的工具是 Cadence 的 Dracula。到了深次微米製程 (0.35 um 以下) 後變成以 Calibre 來作為 DRC/LVS 驗證工具。截至 2020/04 為止,CIC 所提供的 Calibre 版本是 2020.2,下載完畢後會出現

calibre_2020.2_14.12_linux_1of3.tgz
calibre_2020.2_14.12_linux_2of3.tgz
calibre_2020.2_14.12_linux_3of3.tgz
CIC.tar

這四個檔案,其中第 1-3  個檔案為安裝檔,第 4 個檔案為安裝說明。下載後請執行:

tar xfva calibre_2020.2_14.12_linux_1of3.tgz -C /opt/EDA
tar xfva calibre_2020.2_14.12_linux_2of3.tgz -C /opt/EDA
tar xfva calibre_2020.2_14.12_linux_3of3.tgz -C /opt/EDA


指令以便解壓縮。解開之後檔案會出現在 /opt/EDA/calibre 目錄,此時要進行環境設定,請編輯一般使用者 ~/.bashrc 加入底下設定:

Calibrebin="/opt/EDA/calibre/cur/bin"

export PATH=$PATH:$Calibrebin

export LM_LICENSE_FILE=1717@lsncku

export CALIBRE_HOME=/opt/EDA/calibre/cur
export MGC_TMPDIR=/tmp
export USE_CALIBRE_VCO=aoi

設定好之後重新啟動終端機載入環境設定,然後執行:

calibre -gui&

此時應該可以看到 calibre 的視窗。

 Calibre 與其它軟體的連結

Calibre 是屬於後端驗證的工作,在使用上有命令式及圖形介面兩種操作模式,圖形介面要與 virtuoso 整合在一起,因此要特別設定 virtuoso 的起始檔案,也就是 ~/.cdsinit 這個檔案,請在此檔中新增底下片段:

load( strcat( getShellEnvVar("CALIBRE_HOME")
"/shared/pkgs/icv/tools/queryskl/calibre.skl" ))

新增完畢後再重新啟動 virtuoso,此時應該可以在 virtuoso 的主視窗中看到底下訊息:


//
//  Calibre Skill Interface * (v2020.2_14.12) *
//
//                 Copyright Mentor Graphics Corporation 2005
//                             All Rights Reserved.
//         THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION
//            WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION
//              OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS.
//
//

如果出現底下錯誤的話,表示要設定 MGC_TMPDIR 環境變數如前面所示:

*WARNING* Calibre: The Calibre temp directory doesn't not exist. Check the $MGC_HOME/tmp directory or set the environment variable MGC_TMPDIR to a writable directory to fix this.


如果出現底下錯誤的話,那表示要把 /opt/EDA/calibre/cur/tmp 目錄打開寫入權限。

Can't open Calibre menu creation output file /opt/EDA/calibre/cur/tmp/virtInp.20677.customMenu for writing

請先切換至 /opt/EDA/calibre/cur 目錄,並觀看目錄權限,如底下所示:

# cd /opt/EDA/calibre/cur

/opt/EDA/calibre/cur # ls -l
lrwxrwxrwx  1 herman herman     29  8月 26  2015 docs -> ../docs_cal_2015.3_17.12/docs
lrwxrwxrwx  1 herman herman      8  8月 26  2015 tmp -> /usr/tmp

上面兩個連結檔都有問題,因此要刪掉重建:

/opt/EDA/calibre/cur# rm tmp
/opt/EDA/calibre/cur# ln -s /tmp .

至於 docs 目錄因為沒有提供,所以就算了。

作完之後,再重啟 virtuoso 看看還有沒有錯誤訊息。

2016年3月28日 星期一

Laker 下載與安裝

#2020/04/09 更新


Laker 原本是思源科技 (SpringSoft) 的產品,是標準台灣之光,後來被新思科技併購,因此目前 Laker 已畫入新思科技的產品中,在全客式流程中,Laker 有兩個產品,其中:

Laker Advanced Design Platform 是用來畫電路 schematic 用的,官方說明如下:

https://www.synopsys.com/TOOLS/IMPLEMENTATION/CUSTOMIMPLEMENTATION/Pages/laker-custom-design-ds.aspx

另一個為:

Laker Custom Layout Automation System 是用來畫佈局圖,目前 (2020/04) 的最新
版本是 2020.03,下載完畢後會出現 laker_2020.03_linux.tgz 這個檔案。

下載完畢後請執行

# tar xfva laker_2020.03_linux.tgz -C /opt/EDA

執行完畢後會出現 /opt/EDA/laker 目錄。之後請設定 .bashrc,新增底下內容:

Laker="/opt/EDA/laker/cur/bin"

export PATH=$PATH:$Laker

至於 Laker 的 License 設定如 .bashrc 中之:

export LM_LICENSE_FILE=5229@lsncku

啟動 laker:

請執行

laker&

即可看到 laker 畫面。如果出現底下錯誤訊息的話要另外處理:

/opt/EDA/laker/cur/platform/LINUX64/bin/laker: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory


上述問題是 laker 找不到 libpng12.so.0,「理論上」要安裝 libpng12 的套件,但是因為現在的 Debian 10 已經是 libpng16 版,因此我們要手動作連結,請以 root 權限執行底下指令:

# cd /usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu# ls -l libpng
lrwxrwxrwx 1 root root     19  4月  8  2019 libpng16.so.16 -> libpng16.so.16.36.0
-rw-r--r-- 1 root root 227248  4月  8  2019 libpng16.so.16.36.0
/usr/lib/x86_64-linux-gnu# ln -s libpng16.so.16.36.0 libpng12.so.0
/usr/lib/x86_64-linux-gnu# !ls -l
ls -l libpng* -l
lrwxrwxrwx 1 root root     19  4月  9 11:24 libpng12.so.0 -> libpng16.so.16.36.0
lrwxrwxrwx 1 root root     19  4月  8  2019 libpng16.so.16 -> libpng16.so.16.36.0
-rw-r--r-- 1 root root 227248  4月  8  2019 libpng16.so.16.36.0

此時你會看到 libpng12.so.0 已經連結到新版的 libpng16.so.16.36.0,此時再重新啟動 laker 看看能不能執行。

==================================

設定 laker 製程,請至 CIC 的製程目錄複製 laker.tf 回自己家目錄的 ~/model,指令如下:

cp /opt/PROCESS/CIC0181P6M/laker/laker.tf ~/model

之後即可建立新的元件庫,並建立新的 inv layout 圖來編輯 layout。

2016年3月22日 星期二

Cosmos Scope 安裝流程

#2020/04/09 更新

Cosmos Scope 原本是 Avanti 這間公司的產品,因為種種因素賣給了 Synopsys。此套軟體的目的很簡單,就是觀看 SPICE 模擬結果,因此它的容量很小,安裝也不難,截至目前 (2020/04) 為止,CIC 所提供的 Cosmos Scope 版本為 2019.06,下載後會出現

cosmos_scope_2019.06_linux.tgz

這個檔案,由於 Cosmos Scope 與 HSPICE 都是 Synopsys 的產品,因此 License Server 的設定是一樣的。請執行

# tar xfva cosmos_scope_2019.06_linux64.tgz -C /opt/EDA

此時會在 /opt/EDA 目錄解開 cosmos_scope 目錄,裡面有相關檔案。

設定 Cosmos Scope 路徑

請在 .bashrc 中新增底下幾行:

CosmosScope="/opt/EDA/cosmos_scope"
CosmosScopebin="/opt/EDA/cosmos_scope/cur/ai_bin"

export PATH=$PATH:$CosmosScope:$CosmosScopebin

之後可以載入此設定,並執行

$cscope&

來執行 cosmos scope,萬一遇上底下錯誤訊息的話,請確認網路設定是否有錯。

eecs@120:~$ /opt/EDA/cosmos_scope/cur/ai_bin/cscope
couldn't open socket: invalid argument
    while executing
"dp_MakeRPCClient $s_host $s_port"
    (procedure "AimSession" line 78)
    invoked from within
"AimSession 120 41865 localhost,eecs"
    while
evaluating -c supplied command

上述錯誤訊息是你的 /etc/hosts 及 /etc/hostname 沒有設定好所造成的訊息,請確認完全沒有問題後,再重新開機才能執行。


利用 Cosmos Scope 來觀看波形

請使用 virtuoso 轉出 netlist 檔,在 Ananlog Design Environment 中選擇 Simulation -> Netlist -> Create,此時會出現一個 netlist 視窗。在此視窗中執行 File -> Save As 把此檔存成 inv.sp (視你的電路而定),其內容如下:

** Generated for: hspiceD
** Generated on: Mar 22 11:43:44 2016
** Design library name: cic018
** Design cell name: not
** Design view name: schematic.2
.GLOBAL vdd!


.TRAN 1e-9 200e-9 START=0.0

.OP

.TEMP 25.0
.OPTION
+    ARTIST=2
+    INGOLD=2
+    PARHIER=LOCAL
+    PSF=2
.INCLUDE "/home/herman/model/1p6mcic018.include"

** Library name: cic018
** Cell name: not
** View name: schematic.2
m0 vdd! in out vdd! P_18 L=180e-9 W=720e-9
m1 0 in out 0 N_18 L=180e-9 W=360e-9
v0 vdd! 0 DC=1.8
v1 in 0 PULSE 0 1.8 0 100e-12 100e-12 50e-9 100e-9
.END

執行 hspice inv.sp 可以得到 inv.tr0 這個檔案,但是因為我們還沒有設定要觀看的波形,所以這個檔案沒辦法用 Cosmos Scope 來觀看波形。此時會出現錯誤,因此要修改inv.sp 檔,在 .OPTION 區段加上 + POST,結果如下:

.OPTION
+    ARTIST=2
+    INGOLD=2
+    PARHIER=LOCAL
+    PSF=2
+    POST               <--- 此行為新增的設定。

接著再執行一次

hspice inv.sp

此時再打開 inv.tr0 看看有沒有波形可以觀察。

HSPICE 安裝

安裝 HSPICE 及模擬

SPICE 是電路模擬程式,在 1970 年代由柏克萊大學開始研發,之後發展出許多分支,其中 HSPICE 可算是電路模擬的工業標準,在完成電路設計後,必須以 HSPICE 來進行模擬以驗證電路功能是否正確無誤,符合我們的要求,模擬完後才能進行下線,沒有經過  HSPICE 驗證的電路其可靠性會受到質疑。

要安裝 HSPICE,請至 CIC 下載 HSPICE 之檔案,以 2016/3 月為例,目前最新版之 HSPICE 為 2015.06 版,下載完後會出現

hspice_2015.06_linux.tgz
installation_guide_synopsys.txt

這 2 個檔案,其中第一個是 HSPICE 的安裝檔,第二個是安裝說明,我們主要是看 HSPICE 的 License Server 設定埠為

26585@lsncku

HSPICE 的安裝路徑一樣整理到 /opt/EDA/hspice,首先下底下指令來安裝

# tar xfva hspice_2015.06_linux.tgz -C /opt/EDA

此時會自動在 /opt/EDA 底下將 HSPICE 安裝到 /opt/EDA/hspice 目錄下。HSPICE 安裝完畢後進行設定,否則無法對應到正確目錄,之後模擬會出問題。請在

/opt/EDA/hspice/cur/hspice/bin

目錄下執行 ./config 程式,請依目前安裝目錄來進行設定並退出,退出時注意看其訊息是否為 sucessed。完成此步驟後,接下來要設定執行路徑及 License Server。

設定執行路徑

請在 ~/.bashrc 中新增底下設定:

Hspice="/opt/EDA/hspice"
Hspicebin="/opt/EDA/hspice/cur/hspice/bin"

export PATH=$PATH:$Hspice:$Hspicebin

LM_LICENSE_FILE=26585@lsncku

作完後,以一般使用者的權限執行

$ hspice

看看能不能正常呼叫這個檔案,沒問題後,可以設定 HSPICE 環境,請將 CIC 的虛擬製程模擬檔 cic018.l 複製至 ~/model 目錄下,再編譯 ~/model/1p6mcic018.include 檔案,其內容只有一行:

.lib '/home/herman/model/cic018.l' TT

接下來可以在 virtuoso 中測試 HSPICE 是否能執行並跑出模擬波形,請依老師操作測試。

2016年3月15日 星期二

CIC 虛擬製程檔安裝及設定

EDA 工具安裝完畢後,要設定製程檔,如此一來才能進行電路模擬與晶片設計。我們把製程檔的目錄設定在 /opt/PROCESS,目前由於智財權的關係,CIC 僅提供本身的虛擬製程下載,請將檔案解壓縮在 /opt/PROCESS 目錄中,其位置是:

/opt/PROCESS/CIC0181P6M

其中會有底下檔案:

drwxrwxrwx  5 root root 4096 Mar  4  2009 calibre
drwxr-xr-x  2 root root 4096 Mar 14  2009 doc
drwxrwxrwx  2 root root 4096 Mar  4  2009 laker
drwxrwxrwx  2 root root 4096 Mar 14  2009 model
drwxrwxrwx  2 root root 4096 Mar  4  2009 virtuoso

其說明如下:

calibre    -> 提供 Mentor Graphics (明導國際) calibre 驗證之檔案,可以用來作  DRC、LVS 以及 PEX 驗證流程
doc        -> CIC 虛擬製程文件
laker      -> 提供 Synopsys laker 電路繪製之檔案
model      -> 提供 HSPICE 模擬之檔案
virtuoso   -> 提供 Cadence virtuoso 電路繪製之檔案

理論上,解壓縮完後,製程就安裝完畢,接下來要進行設定使用者家目錄,以使執行 EDA 工具時載入。我們預先定義的目錄如下:

~/         -> 使用者家目錄
~/model    -> 存放 SPICE model、DRC/LVS 命令及製程檔
~/lib      -> 存放所有自建 virtuoso 之元件庫
~/lklib    -> 存放所有自建 laker 之元件庫
~/simulation -> 存放所有模擬資料

目前為止,我們還沒有這些目錄,因此請先在使用者家目錄中建立這些目錄:

~$ mkdir model lib lklib simulation

複製相關檔案:

~/display.drf - Cadence 之 EDA 工具在顏色方面之設定檔,用來顯示 schematic
        view 或是 layout view 顏色。要複製此檔,請執行:
       
~$ cp /opt/PROCESS/CIC0181P6M/virtuoso/display.drf ~

~/model/cic18.tf - CIC 018 虛擬製程之技術檔,要複製此檔,請執行:
~$ cp /opt/PROCESS/CIC0181P6M/virtuoso/cic18.tf ~/model

~/model/cic018.l - 這是 CIC 0.18 製程的 SPICE 模型檔,此檔位於
/opt/PROCESS/CIC0181P6M/model/cic018.l,要複製此檔,請執行:

~$ cp /opt/PROCESS/CIC0181P6M/model/cic018.l ~/model




接著請自行使用 virtuoso 建立新元件庫及建立一個最簡單的 not 閘,來觀察其功能是否正確。並且要測試存檔功能,看看存檔後,能不能再次打開 not 閘這個檔案。



*** /etc/skel 目錄設定 ***

2016年2月29日 星期一

下載、安裝、設定 Cadence Virtuoso EDA 工具

下載及驗證:

Cadence Virtuoso EDA 工具是業界佔有率相當高的 EDA 工具,主要功能在於繪製電路圖 (Schematic Entry)、符號圖 (Symbol)、佈局圖 (Layout)。除此之外,Cadence Virtuoso 亦可以直接呼叫外部工具來進行 Spice Simulation 以及 DRC/LVS 驗證。

要安裝 Cadence Virtuoso EDA 工具,首先要下載 CIC 所提供的壓縮檔,以目前
(2016/03/01) 而言,其最新的版本是 IC_615_06.15.151,總共有四個壓縮檔要下載,
如底下所示:
IC_615_06.15.151_1of4.tgz
IC_615_06.15.151_2of4.tgz
IC_615_06.15.151_3of4.tgz
IC_615_06.15.151_4of4.tgz
下載完畢後,請執行 gzip -t xxx.tgz 來測試所下載之壓縮檔是否有誤,如果沒有
任何錯誤訊息的話,代表此壓縮檔格式正確,接下來可以進行安裝。

================================================================================
解壓縮及安裝:

建立安裝目錄

# mkdir -p /opt/EDA/cadence

解開壓縮檔

# tar xfva IC_615_06.15.151_1of4.tgz -C /opt/EDA/cadence
# tar xfva IC_615_06.15.151_2of4.tgz -C /opt/EDA/cadence
# tar xfva IC_615_06.15.151_3of4.tgz -C /opt/EDA/cadence
# tar xfva IC_615_06.15.151_4of4.tgz -C /opt/EDA/cadence

解開之後,會出現

/opt/EDA/cadence/IC 目錄,在此目錄下即是已解開之 Virtuso EDA 工具。

================================================================================
設定 Virtuoso 環境

為什麼使用 Linux 作為 EDA 安裝平台 ?

1. Cadence

Cadence (益華電腦) 的作業平台支援資訊在其官方網頁:

http://www.cadence.com/support/computing/Pages/default.aspx

而目前支援平台資訊在此:

http://www.cadence.com/support/computing/Documents/Cadence_Platform_Support_Plan.pdf

從官方網頁裡可以看到,Cadence 自 2005 起即開始支援紅帽 Linux 作業系統,而且
慢慢取消針對其它平台如 Sun SPARC 之支援。因此未來 Linux 作業系統將是 Cadence
的主要作業系統平台之一,其版本主要是 RHEL 5/6/7。

2. Synopsys

Synopsys (新思科技) 的作業平台支援資訊在其官方網頁:

http://www.synopsys.com/Support/LI/SupportPlatform/Pages/PlatformsRoadmap.aspx

從官方網頁裡亦可以看到,Synopsys 的主要作業系統平台是 Linux,其版本主要是
RHEL 5/6/7。

3. Mentor graphics

Mentor graphics (明導國際) 的作業系統平台支援資訊在其官方網頁:

https://supportnet.mentor.com/systemreqs.html

從官方網頁裡亦可以看到,Mentor Graphics 的主要作業系統平台是 Linux,其版本
主要是 RHEL 5/6/7。

小結:

為了提供一個完整的 EDA 操作環境,因此我們需要佈建以 Linux 為主的作業系統平台,
並在其中安裝各種 EDA 工具,以提供 IC 設計人員一個統一的環境。

** 所謂「統一」的意思是所有工作在 Linux 上完成即可,不需要在 Linux/Windows
   間切換。

工作目錄安排:


/opt/EDA -> 已安裝之 IC 設計工具

/opt/EDA_tools -> 原始檔


/opt/EDA_tools/virtuoso        -> Virtuoso EDA 工具
/opt/EDA_tools/synopsys        -> Synopsys EDA 工具
/opt/EDA_tools/mentor_graphics -> Mentor Graphics EDA 工具