2019年4月16日 星期二

制作initial RAM filesystem,以及讓kernel boot into RAM disk filesystem

首先會從u-boot的 bootargs參數開始,關鍵在於這兩個藍色字的參數,可以讓kernel booting到RAM disk

bootargs "root=/dev/ram0 rw console=ttyMV0,115200 earlycon=ar3700_uart,0xd0012000 no_console_suspend init=/init rootdelay=3 rootfstype=ext4"


當u-boot開到kernel之後,Kernel就會去把你包的Initial RAM filesystem 掛載到 root參數(也就是/dev/ram0) ,前提是你的 Initial RAM filesystem要記得要建立/dev/ram0

再來當你的 Initial RAM filesystem 掛載好之後,會接著去跑第二個參數 init這個檔案,init通常是一支shell script,也是kernel轉換到filesystem後的第一個檔案,他的動作通常會去掛載一些資料夾之後就幫忙導到linuxrc(也就是busybox),接著就成功進入作業系統


先列出我Build Code環境,各個資料夾的樹狀結構


















下面列出各個階段Programer需要作的事情:

1. U-Boot
修改 bootargs 參數,修改的內容如上面所敘述

2. 編譯Busybox
下載一包Busybox,先去執行make menuconfig,接著去設定要安裝的路徑,如下圖:
 Settings  --->
     --- Installation Options ("make install" behavior)


















接著,可以把Busybox編譯成Static Library的方式,如下圖:
Settings  --->
    [*] Build static binary (no shared libs)

















上面步驟都設定完成後,離開並儲存,在去作make install,最後會生出一個簡易的root filesystem(還不完整)


3. 制作 Initial RAM filesystem
請先到上個步驟當中,安裝Busybox的路徑,會看到如下圖,皆為Busybox所產生:






接著我們要繼續補足 Initial RAM filesystem所缺少的,分別作以下幾個步驟:
3-1. 建立 proc資料夾,sys資料夾 (mkdir proc; mkdir sys)
3-2. 建立 init檔案,其內容如下:
#!/bin/sh -x
MOUNT="/bin/mount"
${MOUNT} -t proc /proc /proc
${MOUNT} -t sysfs /sys /sys
${MOUNT} -t usbfs none /proc/bus/usb
${MOUNT} -t devpts devpts /dev/pts
/linuxrc

3-3. 建立dev資料夾,以及所需要的device node,執行 makedev.sh來建立,內容如下:
(內容較多,我把他補充再文章最後) ...

以上三個小步驟完成後,就建立出基本的 Initial RAM filesystem,如下圖:




4. Kernel
首先要先作make menuconfig,並且把 Initial RAM filesystem選像打開,並且選擇已經編譯好的busybox(我編譯好的busybox在kernel資料夾的上一層資料夾 ../build/fs.initrd/),路徑如下:
General setup ---->
     [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
     (../build/fs.initrd/) Initramfs source file(s)

存檔離開後,執行make,便會把Initial RAM filesystem包進Kernel當中



當上面的Kernel都準備好了之後,讓U-Boot booting進入Kernel. 應該就可以順利進入RAM filesystem了。


如果遇到Failed to execute /init (error -2)的Kernel Panic情形,請確認下面幾件事情
1. Busybox選項是否有開啟mount指令
2. Busybox是否有開啟Static Build
3. 請在安裝完Busybox之後,把產生出的busybox執行檔,權限改為Superuser (chmod +s busybox)


















用法: ./makedev.sh (busybox安裝路徑)

##################  makedev.sh ############################
#!/bin/sh

if [ x$1 == "x" ]; then
        echo ""
        echo "Usage:   makedev ROOTDIR"
        echo ""
        echo "  ROOTDIR is the directory of root FS, please use full path."
        echo ""
        exit 0
fi

rm -rf $1/dev/*
cd $1/dev/

DEVINDEX=(a b c d e f g h i j k l m n o p q r s t u v w x y z)
NODEINDEX=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)
M_NUM=8
N_NUM=0
DEVNODE=sd
TYPE=b

major=${M_NUM}
minor=${N_NUM}

for i in ${DEVINDEX[@]} ; do
        mknod -m 660 ${DEVNODE}${i} ${TYPE} ${major} ${minor}
        let minor=minor+1

        for j in ${NODEINDEX[@]}; do
                mknod -m 660 ${DEVNODE}${i}${j} ${TYPE} ${major} ${minor}
                let minor=minor+1
        done

        if [ $minor -gt 255 ]; then
                let major=65
                let minor=0
        fi
done


mknod -m 600 mem        c 1 1
mknod -m 666 null       c 1 3
mknod -m 666 zero       c 1 5
mknod -m 644 random     c 1 8
mknod -m 444 urandom    c 1 9
mknod -m 600 tty0       c 4 0
mknod -m 600 tty1       c 4 1
mknod -m 600 tty2       c 4 2
mknod -m 600 tty3       c 4 3
mknod -m 600 tty4       c 4 4
mknod -m 600 tty5       c 4 5
mknod -m 600 ttys0      c 3 48
mknod -m 600 ttyS0      c 4 64
mknod -m 600 ttys1      c 3 49
mknod -m 600 ttyS1      c 4 65
mknod -m 600 ttys2      c 3 50
mknod -m 600 ttyS2      c 4 66
mknod -m 666 tty        c 5 0
mknod -m 600 console    c 5 1
mknod -m 755 ram0       b 1 0
mknod -m 755 ram1       b 1 1
mknod -m 755 ram2       b 1 2
mknod -m 755 ram3       b 1 3
mknod -m 755 ram4       b 1 4
mknod -m 660 loop0      b 7 0
mknod -m 660 loop1      b 7 1
mknod -m 660 loop2      b 7 2
mknod -m 660 loop3      b 7 3
mknod -m 644 crypto     c 10 70
mknod -m 644 cesa       c 10 71
mknod -m 660 rtc0       c 254 0

for i in $(seq 0 8)
do
mknod mtd$i c 90 $(expr $i + $i)
mknod mtdblock$i b 31 $i
done

mknod -m 660 fb0 c 29 0

mknod md0 b 9 0
mknod md1 b 9 1
mknod md2 b 9 2
mknod md3 b 9 3
mknod md4 b 9 4

mknod sg0 c 21 0
mknod sg1 c 21 1
mknod sg2 c 21 2
mknod sg3 c 21 3
mknod sg4 c 21 4
mknod sg5 c 21 5
mknod sg6 c 21 6
mknod sg7 c 21 7
mknod sg8 c 21 8
mknod sg9 c 21 9
mknod sg10 c 21 10
mknod sg11 c 21 11
mknod sg12 c 21 12
mknod sg13 c 21 13
mknod sg14 c 21 14
mknod sg15 c 21 15

mknod sr0 b 11 0
mknod sr1 b 11 1
mknod sr2 b 11 2
mknod sr3 b 11 3
mknod sr4 b 11 4
mknod sr5 b 11 5
mknod sr6 b 11 6
mknod sr7 b 11 7
mknod sr8 b 11 8
mknod sr9 b 11 9
mknod sr10 b 11 10
mknod sr11 b 11 11
mknod sr12 b 11 12
mknod sr13 b 11 13
mknod sr14 b 11 14
mknod sr15 b 11 15

mknod -m 666 ptmx       c 5 2

mknod ppp c 108 0

mknod fuse c 10 229

mkdir shm

#i2c
I2C_INDEX=(0 1 2)
for i in ${I2C_INDEX[@]}; do
        mknod -m 600 i2c$i c 89 $i
        mknod -m 600 i2c-$i c 89 $i
done

#for sshd
mknod ptyp0 c 2 0
mknod ptyp1 c 2 1
mknod ptyp2 c 2 2
mknod ttyp0 c 3 0
mknod ttyp1 c 3 1
mknod ttyp2 c 3 2

#pts
mkdir pts; cd pts
mknod -m 640 0          c 136 0
mknod -m 640 1          c 136 1
mknod -m 640 2          c 136 2
mknod -m 640 3          c 136 3
mknod -m 640 4          c 136 4
mknod -m 640 5          c 136 5
cd ..

mknod hiddev0   c 180 96
cd ..

cd ../../

exit 0
###############################################





2019年4月11日 星期四

Linux 進入rootfs之後,查詢u-boot bootcmd變數的方法

進入Kernel後,在檔案系統中,若想要查詢u-boot的bootcmd參數值,可以用下面的指令來查詢~

# cat /proc/cmdline


2019年4月2日 星期二

使用Linux dd command 清除硬碟的 partition table

假設有顆硬碟為 /dev/sda

使用下面指令可以清空硬碟的 partition table

dd if=/dev/zero of=/dev/sda bs=512 count=1

因為硬碟的partition table 通常放在 最前面的 512Byte 的地方

如果想把硬碟回到最初始的狀態,可以這樣作~

2019年3月26日 星期二

使用grep的-v參數,來排除某些字串的方法

目前我們的Code Server為SVN,整個Project裡面有包含整包Linux Source Code,假設這包Code被編譯過,當我們使用svn status的時候,就會多出很多"?"的選項,如下圖:(問號在SVN裡面就是新產生的檔案)













假設我們現在改了一些檔案,又想透過SVN從Project裡面知道改了哪些,可以使用grep -v "?" 就可以把"?"的檔案排除掉,就可以看到"M"的檔案,因此我們可以這樣下:

svn status | grep -v "?"

2019年3月21日 星期四

使用wolcmd.exe wake on lan 工具 喚醒電腦的指令

1. 下載 wolcmd.exe的網址:
https://www.depicus.com/wake-on-lan/wake-on-lan-cmd

2. 下載完成後,把執行檔放在方便執行的地方,ex: C:/ or D:/ 等等

3. 開啟"命令提示字元",切換到command的路徑,執行 "wolcmd.exe"會看到下圖的說明,講解wolcmd.exe詳細的參數與用法










4. wolcmd.exe 009027a322fc 192.168.1.3 255.255.255.0 7
==> 這樣便可以喚醒 MAC:00:90:27:a3:22:fc ,IP為192.168.1.3 的電腦

日本九州-福岡自助旅行,行前需準備的事情

今年預計4月中來一趟日本北九州自由行,因此記錄一下所有事前準備的事項與順序,也可以拿來作之後自由行的參考,每一個項目我都有記錄大概幾月幾號完成的,可以自己預估一下出發日多久前就需要完成~

1. 訂飛機票 (2019/01/04 完成),價錢約NT.6000
- 此次的飛機票,我是訂廉價航空-香草,桃園<==>福岡,我選擇的是包含20公斤行李,以及可以選位置,另外要特別注意的是香草航空除了刷卡會有1.5%的海外刷卡費用之外,還會另外收取一筆付款手續費 NT.210,因此來回機票就被收NT.420






















2. 申請富邦的快樂旅平卡   (2019/01/05 完成)
- 自助出國建議還是要保旅遊不便險&旅遊平安險,富邦的快樂旅平卡就提供這樣的服務,因此需要到富邦網站申辦快樂旅平卡(數位),申請過之後,會email憑證給你(約一個禮拜),申辦時除了填寫你自己的資料,記得也把要一起出國的配偶或小孩一起填寫。大約出國日的前一個月,再來申辦旅遊不便險以及旅遊平安險,兩位大人:$446,兩位小孩:$308,另外我們選的方案,如下圖勾選的:




















申辦網址:https://www.fubon.com/insurance/b2b2c/happy/index.html


3. 自駕租車 (2019/1/18 完成) 租三天+4天KEP(日幣5500) 共日幣 21325
- 到九州玩,需要租車的朋友,可以到tabirai網站租車,用日文網站訂車會比用中文網站還要便宜,訂完之後,看到是跟Budget訂的車子,另外高速公路過路費與中文導航可以等出發前一個月,在網站留言跟對方說,另外最重要的,到達日本要租車時,必須提供台灣護照、台灣駕照、日文譯本駕照,缺一不可
訂車網址:https://www.tabirai.net















4. 開始訂旅館 (2019/1/26 完成)
- 基本上就是上Agoda或是Booking找合乎預算的房間預訂,在訂房之前記得先找找有沒有可以折價的優惠代碼,若是預訂Agoda,雖然有延後付款功能(快到住宿日再付款),但因為Agoda匯差是使用自己的公式計算,非銀行匯差,所以會貴好幾百塊台幣,建議是直接預定當天就付款


5. 預訂九州野生動物園門票&飛買家無線AP & 富邦旅平險 (2019/3/19 完成)
- 預訂九州動物園門票(網路搜尋"用jalan預約九州動物園"會有教學),我們預約的時候都只剩下午時段,聽說是到現場還可以改時段,2大1小門票,預約價錢大人票價少200日元,小孩少100日元,另外總價還會再少2000日元(共7000日元)
- 飛買家無線AP,google搜尋就可以訂了,有時候會有優惠碼,可以注意一下,他可以直接機場取貨,租7天折完價為NT.593
- 富邦旅平險網址:https://b2c.518fb.com/ecmobile/hwc/login.do  2大2小 共NT.754


2019年3月7日 星期四

[shell] shell script的字串處理,取某幾個字元,cut 的用法

shell script當中要取字串有個最簡單的方法,如下:
假設現在有個字串"Hi we are the world!"







上面程式第一個 echo 表示,我要從第三個字元之後開始取,取到最終
上面程式第二個 echo 表示,我要從第三個字元之後開始取,共取8個字元
執行結果會如下圖:





cut
我們也可以用cut指令來取得特定位置字元
一樣用上面的範例 有個字串為 "Hi we are the world!"
假設我要取第4個字元到第9個
我們可以這樣下:



另外cut也可以用來作分割處理,例如我想用"空格"來分割,並取第3個字串