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