- 下載source code (官網: http://www.netperf.org/)
$
wget ftp://ftp.netperf.org/netperf/netperf-2.7.0.tar.gz - 解壓縮套件
$ tar zxvf netperf-2.7.0.tar.gz - 進入source code目錄執行configure配置編譯選項
$ ./
configure CC=/opt/ti -am335x-linux -devkit -08.00.00.00/bin/arm-linux -gnueabihf -gcc --host arm --config-cache - 若有出現下列錯誤,則執行執行步驟5,否則直接執行步驟6進行編譯即可
checking for sys/socket. h... (cached ) yes checking types of arguments for select...int , fd_set *, struct timeval * checking whether setpgrp takes no argument...configure : error: cannot check setpgrp when cross compiling - 修正setpgrp錯誤
$ echo "ac_cv_func_setpgrp_void=yes" > config
. cache - 執行編譯
$ make - 編譯成功後可在src目錄下看到netperf與netserver,即可傳到目標機台上進行驗證
2016/1/12
Cross Compile For netperf
2016/1/5
Segmentation fault:FTP傳輸型態在搞鬼
首先看下面這段簡單的Hello World程式碼,按理說編譯完直接丟到目標機台上執行應該不會有什麼問題才對。
但卻一直發生Segmentation fault的錯誤提示後來發現是因為使用FileZilla傳輸造成的,FileZilla有個設定值:傳輸型態,預設為自動,將這設定值改為二進位檔案即可解決此問題。
2015/9/7
iw指令連線操作記錄
以下範例假定無線網卡裝置名稱為wlan0(通常會是這名字),若不知道可以透過ifconfig -a指令查詢無線網卡裝置名稱。
確認無線裝置連線狀態
如果沒有任何連線,則會顯示Not connected,否則會顯示連線的相關資訊
掃描鄰近的wifi廣播訊號
連線到WPA/WPA2加密的無線網路
APPLE是無線網路的SSID資訊,輸入上述指令會停住等待使用者輸入連線密碼,1234509876即為設定的密碼,輸入完後按下Enter即會自動產生連線相關文件
連線指令
若沒跳出任何錯誤訊息應該就完成連線了
這時可以查詢連線狀態
要求DHCP伺服器配發動態IP
確認無線裝置連線狀態
# iw wlan0 link
Not connected.
掃描鄰近的wifi廣播訊號
# iw wlan0 scan
連線到WPA/WPA2加密的無線網路
# wpa_passphrase APPLE >> /tmp/wifi.conf
1234509876
# reading passphrase from stdin network={ ssid="APPLE" #psk="1234509876" psk=a36065d029db325508281a51a19f8fff1c389c11129a74b6c6d3a25200cae713 }
# wpa_supplicant -B -i wlan0 -c /tmp/wifi.conf
這時可以查詢連線狀態
# iw wlan0 link Connected to 36:a3:95:d7:a7:55 (on wlan0) SSID: APPLE freq: 2437 RX: 59639 bytes (440 packets) TX: 12188 bytes (76 packets) signal: -58 dBm tx bitrate: 65.0 MBit/s MCS 7 bss flags: short-preamble short-slot-time dtim period: 3 beacon int: 100
要求DHCP伺服器配發動態IP
# dhclient wlan0
2015/7/20
在Linux系統上製作Windows的USB安裝隨身碟(EFI支援的GPT格式)
不論在Linux或是Windows上要製作Linux安裝隨身碟都有現成套件可以輕易完成(如UNetbootin),但反過來要在Linux系統上製作Windows安裝隨身碟就沒這麼容易了,但也只需要幾個步驟就可以了!
目前還是EFI跟Legacy BIOS的接棒時期,安裝隨身碟也就分為EFI支援的GPT格式跟Legacy BIOS的MBR格式,這篇文章方法僅適用GPT格式。
先安裝gparted套件對隨身碟進行磁區分割
完成上述步驟後就可以重新開機,並將開機裝置指定到隨身碟,就會進入Windows安裝界面了。目前驗證過Windows7(64-bits)與Windows8(64-bits)均能成功進入安裝畫面。
目前還是EFI跟Legacy BIOS的接棒時期,安裝隨身碟也就分為EFI支援的GPT格式跟Legacy BIOS的MBR格式,這篇文章方法僅適用GPT格式。
先安裝gparted套件對隨身碟進行磁區分割
sudo apt-get install gparted sudo gparted
- 在右上角下拉式選單中,選擇隨身碟裝置。
- 卸載隨身碟裝置
功能列選單:Partition > Unmount - 建立Partition表格
功能列選單:Device > Create Partition Table ...
選擇gpt - 建立分割區
功能列選單:Partition > New
選擇fat32
- 儲存變更
Ctrl + Enter - 關閉gparted
sudo mkdir /mnt/iso /mnt/usb sudo mount *.iso /mnt/iso sudo mount /dev/sdXY /mnt/usb sudo cp -R /mnt/iso/* /mnt/usb
完成上述步驟後就可以重新開機,並將開機裝置指定到隨身碟,就會進入Windows安裝界面了。目前驗證過Windows7(64-bits)與Windows8(64-bits)均能成功進入安裝畫面。
2015/7/16
【治具】RS232 迴路測試每根Pin腳功能
RS232是個歷久不衰的訊號通訊協議,雖然在主流電腦上已經很難看見其蹤跡,但在伺服器或是嵌入式裝置乃至於近年很夯的物連網裝置都很容易見到,這篇文章主要記錄如何設計硬體治具並撰寫對應測試程式。
首先可以先參考RS232每根Pin腳的功能用途,網路上有大量文章介紹,就不再贅述,可以參考連結:Ethernut RS-232 Primer
先看做好的治具成品圖
治具硬體Rework
參考連結
首先可以先參考RS232每根Pin腳的功能用途,網路上有大量文章介紹,就不再贅述,可以參考連結:Ethernut RS-232 Primer
先看做好的治具成品圖
治具硬體Rework
- 使用4.7kOhm電阻將TxD與RxD串接起來,如果只需要驗證資料傳輸只需做這部分重工即可,大部分情況下(未使用Hardware Flow Control)其他Pin腳都不會用到。
- 使用4.7kOhm電阻將DCD與DSR串接起來。
- 將DSR跟DTR直接短路串接。
- 使用4.7kOhm電阻將RI與CTS串接起來。
- 將CTS跟RTS直接短路串接。
- 從TX發送資料,硬體TxD與RxD已經串接,因此會收到送出資料,確認收到資料並比對資料內容即可確認TxD與RxD腳位功能是否正常。
- 硬體RTS與CTS及RI串接,因此設置/重置RTS訊號,再讀取CTS與RI訊號即可確認這三根腳位功能是否正常。
- 硬體DTR與DSR及DCD串接,因此設置/重置DTR訊號,再讀取DSR與DCD訊號即可確認這三根腳位功能是否正常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | // File name: uart.c // gcc -o uart uart.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <fcntl.h> #include <termios.h> int main (int argc, char *argv[]) { int ret = 0; int len; unsigned char buf[16] = {0xAA, 0x55, 0x00, 0xFF, 0x5A, 0xA5, 0xF0, 0x0F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; unsigned char buf_rev[16]; int fd; FILE *fp = NULL; int status; struct termios tio; if (argc <= 1) { fprintf(stderr, "Usage: %s <dev>\n", argv[0]); ret = 255; goto end; } fp = fopen (argv[1], "w+"); if (fp == NULL) { puts ("Fail to open device"); ret = 255; goto end; } printf ("+ TX: "); fflush (fp); len = fwrite (buf, sizeof (char), 16, fp); fflush (fp); if (len < 16) { puts ("Fail to transfer data"); ret = 255; goto clean; } puts ("Pass"); printf ("+ RX: "); len = fread (buf_rev, sizeof (char), 16, fp); if (len < 16) { puts ("Fail to receive data"); ret = 255; goto clean; } else if (memcmp (buf, buf_rev, 16) != 0) { puts ("Check data fail"); ret = 255; goto clean; } puts ("Pass"); fclose (fp); fp = NULL; if ( (fd = open (argv[1], O_RDWR)) < 0 ) { puts ("Fail to open device"); ret = 255; goto end; } tcgetattr(fd, &tio); printf ("RTS -> CTS - RI: "); status |= TIOCM_RTS; ioctl(fd, TIOCMSET, &status); ioctl(fd, TIOCMGET, &status); ret = status & (TIOCM_CTS | TIOCM_RNG); // Should be 0xA0 status &= ~TIOCM_RTS; ioctl(fd, TIOCMSET, &status); ioctl(fd, TIOCMGET, &status); if ( (status & (TIOCM_CTS | TIOCM_RNG)) || ret != 0xA0) { // Status should be 0x00, false puts ("FAIL"); if (ret == 0x0) puts (" --> Case1: RTS fail; Case2: CTR & RI fail"); else if (ret == 0x80) puts (" --> CTS fail"); else if (ret == 0x20) puts (" --> RI fail"); else puts (" -> RTS fail"); ret = 6; goto clean; } else { puts ("PASS"); ret = 0; } printf ("DTR -> DSR - DCD: "); status |= TIOCM_DTR; ioctl(fd, TIOCMSET, &status); ioctl(fd, TIOCMGET, &status); ret = status & (TIOCM_DSR | TIOCM_CAR); // Should be 0x140 status &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &status); ioctl(fd, TIOCMGET, &status); if ( (status & (TIOCM_DSR | TIOCM_CAR)) || ret != 0x140) { // Status should be 0x00, false puts ("FAIL"); if (ret == 0x0) puts (" --> Case1: DTR fail; Case2: DSR & DCD fail"); else if (ret == 0x100) puts (" --> DCD fail"); else if (ret == 0x40) puts (" --> DSR fail"); else puts (" -> RTS fail"); ret = 7; goto clean; } else { puts ("PASS"); ret = 0; } clean: if (fp) fclose (fp); if (fd > 0) close (fd); end: printf("Return Code: %d\n", ret); return ret; } |
參考連結
2015/7/8
Trace shell script的小技巧
參考上圖,有三個script,先執行test1.sh,會帶起test2.sh;test2.sh會再帶起test3.sh,如果從test1.sh開始了解程式架構,很容易就可以得知彼此之間的執行關係;但有時候線頭只抓到test2.sh或是test3.sh時就麻煩了。
在Linux下可以使用bash maintain的$PPID變數再搭配ps指令就可以慢慢推敲出script file的呼叫關係。
直接看範例:
執行結果:
在Linux下可以使用bash maintain的$PPID變數再搭配ps指令就可以慢慢推敲出script file的呼叫關係。
直接看範例:
#!/bin/sh # file: test1.sh echo $0 echo "Execute by `ps -o comm -h --pid $PPID`" echo =========== ./test2.sh
#!/bin/sh # file: test2.sh echo $0 echo "Execute by `ps -o comm -h --pid $PPID`" echo =========== ./test3.sh
#!/bin/sh # file: test3.sh echo $0 echo "Execute by `ps -o comm -h --pid $PPID`" echo ===========
執行結果:
./test1.sh Execute by bash =========== ./test2.sh Execute by test1.sh =========== ./test3.sh Execute by test2.sh ===========
2015/7/7
更改Shell輸出文字的顏色、底線、粗體等控制
要在Shell輸出文字中有顏色改變、底線與粗體效果,需要用到如下的控制碼:
會在螢幕上顯示紅色的Hello,但這樣要記住所有效果的代碼也不是辦法,可以將每種效果定義為一種變數,如此要調用就會簡單多了,如下可以達到相同效果:
完整的效果定義
效果Demo
呈現結果
printf "'\033[0;31m'Hello'\033[0m'"
Red='\033[0;31m' NC='\033[0m' printf "${Red}Hello${NC}"
完整的效果定義
#!/bin/bash # File: color.sh # Regular Colors Black='\033[0;30m' Red='\033[0;31m' Green='\033[0;32m' Yellow='\033[0;33m' #Orange='\033[0;33m' Blue='\033[0;34m' Purple='\033[0;35m' Cyan='\033[0;36m' White='\033[0;37m' # Bold BBlack='\033[1;30m' BRed='\033[1;31m' BGreen='\033[1;32m' BYellow='\033[1;33m' BBlue='\033[1;34m' BPurple='\033[1;35m' BCyan='\033[1;36m' BWhite='\033[1;37m' # Underline UBlack='\033[4;30m' URed='\033[4;31m' UGreen='\033[4;32m' UYellow='\033[4;33m' UBlue='\033[4;34m' UPurple='\033[4;35m' UCyan='\033[4;36m' UWhite='\033[4;37m' # Background GBlack='\033[40m' GRed='\033[41m' GGreen='\033[42m' GYellow='\033[43m' GBlue='\033[44m' GPurple='\033[45m' GCyan='\033[46m' GWhite='\033[47m' # High Intensity IBlack='\033[0;90m' IRed='\033[0;91m' IGreen='\033[0;92m' IYellow='\033[0;93m' IBlue='\033[0;94m' IPurple='\033[0;95m' ICyan='\033[0;96m' IWhite='\033[0;97m' # Bold High Intensity BIBlack='\033[1;90m' BIRed='\033[1;91m' BIGreen='\033[1;92m' BIYellow='\033[1;93m' BIBlue='\033[1;94m' BIPurple='\033[1;95m' BICyan='\033[1;96m' BIWhite='\033[1;97m' # High Intensity Background GIBlack='\033[0;100m' GIRed='\033[0;101m' GIGreen='\033[0;102m' GIYellow='\033[0;103m' GIBlue='\033[0;104m' GIPurple='\033[0;105m' GICyan='\033[0;106m' GIWhite='\033[0;107m' LightGray='\033[0;37m' DarkGray='\033[1;30m' LightRed='\033[1;31m' LightGreen='\033[1;32m' Yellow='\033[1;33m' LightBlue='\033[1;34m' LightPurple='\033[1;35' LightCyan='\033[1;36' NC='\033[0m'
效果Demo
#!/bin/bash # File: color_demo.sh . color.sh printf "${Black}Black${NC}\n" printf "${Red}Red${NC}\n" printf "${Green}Green${NC}\n" printf "${Yellow}Yellow${NC}\n" printf "${Blue}Blue${NC}\n" printf "${Purple}Purple${NC}\n" printf "${Cyan}Cyan${NC}\n" printf "${White}White${NC}\n" printf "${BBlack}BBlack${NC}\n" printf "${BRed}BRed${NC}\n" printf "${BGreen}BGreen${NC}\n" printf "${BYellow}BYellow${NC}\n" printf "${BBlue}BBlue${NC}\n" printf "${BPurple}BPurple${NC}\n" printf "${BCyan}BCyan${NC}\n" printf "${BWhite}BWhite${NC}\n" printf "${UBlack}UBlack${NC}\n" printf "${URed}URed${NC}\n" printf "${UGreen}UGreen${NC}\n" printf "${UYellow}UYellow${NC}\n" printf "${UBlue}UBlue${NC}\n" printf "${UPurple}UPurple${NC}\n" printf "${UCyan}UCyan${NC}\n" printf "${UWhite}UWhite${NC}\n" printf "${GBlack}GBlack${NC}\n" printf "${GRed}GRed${NC}\n" printf "${GGreen}GGreen${NC}\n" printf "${GYellow}GYellow${NC}\n" printf "${GBlue}GBlue${NC}\n" printf "${GPurple}GPurple${NC}\n" printf "${GCyan}GCyan${NC}\n" printf "${GWhite}GWhite${NC}\n" printf "${IBlack}IBlack${NC}\n" printf "${IRed}IRed${NC}\n" printf "${IGreen}IGreen${NC}\n" printf "${IYellow}IYellow${NC}\n" printf "${IBlue}IBlue${NC}\n" printf "${IPurple}IPurple${NC}\n" printf "${ICyan}ICyan${NC}\n" printf "${IWhite}IWhite${NC}\n" printf "${BIBlack}BIBlack${NC}\n" printf "${BIRed}BIRed${NC}\n" printf "${BIGreen}BIGreen${NC}\n" printf "${BIYellow}BIYellow${NC}\n" printf "${BIBlue}BIBlue${NC}\n" printf "${BIPurple}BIPurple${NC}\n" printf "${BICyan}BICyan${NC}\n" printf "${BIWhite}BIWhite${NC}\n" printf "${GIBlack}GIBlack${NC}\n" printf "${GIRed}GIRed${NC}\n" printf "${GIGreen}GIGreen${NC}\n" printf "${GIYellow}GIYellow${NC}\n" printf "${GIBlue}GIBlue${NC}\n" printf "${GIPurple}GIPurple${NC}\n" printf "${GICyan}GICyan${NC}\n" printf "${GIWhite}GIWhite${NC}\n"
讓ssh連線不用手動輸入密碼(自動登入)
最近專案有個應用:在客戶端透過ssh自動連線到伺服器並下達命令,卻遇到了需要手動輸入密碼的問題,發現ssh有提供公私鑰機制可以免除每次登入都需要輸入密碼,設定步驟也很簡單:
- 產生金鑰:在客戶端執行
過程中會出現Enter passphrase提示輸入訊息,直接按Enter跳過即可
ssh-keygen -t rsa -b 2048
- 將產生的公鑰內容上傳到伺服器的~/.ssh/authorized_keys檔案
ssh-copy-id user_id@server_ip
只要完成上述兩個步驟就完成了,步驟2的user_id需替換成遠端連線的帳號、server_ip則是遠端連線的ip,底下稍微做一下說明:
- 步驟1會產生一組本機的公鑰與私鑰,執行完後可以在~/.ssh目錄下看到兩個檔案
- id_rsa:私鑰,之後連線會使用這私鑰進行演算後傳送到遠端進行驗證
- id_rsa.pub:公鑰,內容會儲存在遠端的~/.ssh/authorized_keys檔案內,客戶端傳來的驗證資訊會以這資訊進行驗證
- 步驟2的ssh-copy-id其實是一隻script(/usr/bin/ssh-copy-id),功能就是把id_rsa.pub內容幫忙存到遠端的~/.ssh/authorized_keys檔案內。
2015/6/1
【QEMU】在X86 PC上執行其他平台(如ARM)程式
情境:要在X86 PC上透過QEMU模擬器執行ARM的程式。
先透過file指令確認執行程式的格式內容為ARM平台所用
qemu最後面加上要執行的程式即可,中間options視需求加入適當的參數
先直接執行看看
qemu不知道去哪裡載入loader,手動指定路徑後再執行看看
這時loader需要載入相關library,手動指定動態鏈結檔目錄再執行看看
這時應該就可以看到正確執行結果了!
先透過file指令確認執行程式的格式內容為ARM平台所用
$ file hello hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=d7efe6f9528e036c383501d6fc0dd1ca6fc880b1, not stripped
qemu最後面加上要執行的程式即可,中間options視需求加入適當的參數
usage: qemu-arm [options] program [arguments...]
先直接執行看看
$ qemu-arm ./hello
/lib/ld-linux.so.3: No such file or directory
qemu不知道去哪裡載入loader,手動指定路徑後再執行看看
$ qemu-arm /usr/arm-linux-gnueabi/lib/ld-2.19.so ./hello ./hello: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
這時loader需要載入相關library,手動指定動態鏈結檔目錄再執行看看
$ qemu-arm /usr/arm-linux-gnueabi/lib/ld-2.19.so --library-path /usr/arm-linux-gnueabi/lib ./hello
Hello World
這時應該就可以看到正確執行結果了!
2015/4/27
【Ubuntu】架設PXE Server
PXE開機運作原理是Bootloader(PC來說就是BIOS)在開機時動態要求分配IP,在取得IP資訊同時也會收到下一個伺服器的位址與該讀取的檔案資訊,接著透過TFTP服務取得開機核心與檔案系統。所以一台伺服器要提供PXE功能,至少要有DHCP與TFTP伺服器功能,首先安裝這兩個套件:
指定提供DHCP服務的網路卡
將interface指定為eth0
設定DHCP服務
若有domain name資訊則填入正確資訊,否則將相關兩的兩行敘述註解起來,否則啟動DHCP服務可能會帶不起來。這邊設定IP分配會從192.168.0.100到192.168.0.253,並指定client端取得IP資訊後接著要向192.168.0.254伺服器要求檔案pxelinux.0。
完成設定後重新啟動DHCP服務
修改tftp設定
增加敘述:
修改inet.conf
增加敘述
重新啟動tftp服務
到這邊PXE服務就算設定完成了,這時在client端選擇網路開機,應該會成功取得IP配置,但會卡在取得檔案階段,底下說明使用ubuntu server的安裝光碟裡面提供的netboot檔案,讓client可以透過PXE服務開啟安裝程式。
掛載安裝印象檔,並將需要的檔案複製到tftp目錄即可
這時client在選擇網路開機,就可以進到ubuntu安裝畫面了!
sudo apt-get install isc-dhcp-server apt-get install tftpd-hpa inetutils-inetd
指定提供DHCP服務的網路卡
sudo vi /etc/default/isc-dhcp-server
INTERFACES="eth0"
設定DHCP服務
sudo vi /etc/dhcp/dhcpd.conf
# option definitions common to all supported networks... #option domain-name "example.org"; #option domain-name-servers ns1.example.org, ns2.example.org; subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.100 192.168.0.253; option routers 192.168.0.254; option broadcast-address 192.168.0.255; } allow booting; allow bootp; option option-128 code 128 = string; option option-129 code 129 = text; next-server 192.168.0.254; filename "pxelinux.0"; default-lease-time 600; max-lease-time 7200;
完成設定後重新啟動DHCP服務
sudo service isc-dhcp-server restart
修改tftp設定
sudo vi /etc/default/tftpd-hpa
RUN_DAEMON="yes"
sudo vi /etc/inetd.conf
tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
重新啟動tftp服務
sudo service tftpd-hpa restart
到這邊PXE服務就算設定完成了,這時在client端選擇網路開機,應該會成功取得IP配置,但會卡在取得檔案階段,底下說明使用ubuntu server的安裝光碟裡面提供的netboot檔案,讓client可以透過PXE服務開啟安裝程式。
掛載安裝印象檔,並將需要的檔案複製到tftp目錄即可
sudo mount ubuntu-14.10-server-amd64.iso /mnt sudo cp -avr /mnt/install/netboot/* /var/lib/tftpboot/
這時client在選擇網路開機,就可以進到ubuntu安裝畫面了!
2015/3/30
【樹莓派】編譯一個Hello World程式在RPi上執行
要在PC上編譯一個可以在Raspberry Pi上執行的程式必須透過Cross-Compile才能達成。Cross-Compile的意思就是在A架構電腦(比如你用的一般電腦)上編譯B架構電腦(比如樹莓派)能執行的二進位程式,為了讓電腦能夠Cross-Compile出樹莓派能接受的執行檔,須要先在電腦上安裝Cross-Compiler:
這裡寫了一個簡單的Hello World程式做為示範
透過剛安裝的Cross-Compiler進行編譯:
產生的執行檔可以使用file指令查看執行檔格式是否為ARM架構
若正確則可將檔案放到樹莓派上執行,應該可以得到下列結果:
1 | sudo apt-get install gcc-arm-linux-gnueabi |
1 2 3 4 5 6 | #include <stdio.h> int main(int argc, char *argv[]) { printf("Hello Raspberry Pi!\n"); } |
1 | arm-linux-gnueabi-gcc -o hello hello.c |
若正確則可將檔案放到樹莓派上執行,應該可以得到下列結果:
2015/1/30
【PetaLinux】設定自動登入
PetaLinux預設要由使用者輸入帳號密碼登入後才能進行系統操作,但很多時候在嵌入式裝置應用上會希望能夠開機完成後能自動登入並執行後續指令功能。要設定自動登入主要就是修改/etc/inittab這個檔案,只要把修改後的inittab檔案塞進Root File System中即可完成。
首先使用開發套件產生一個安裝開發樣版
這會在開發目錄components/apps下產生一個名為autostart的樣板資料夾
把inittab與autologin.sh檔案放到autostart資料夾中
接著修改Makefile
回到開發環境最上層資料夾
進入Root File System編譯選單鉤選autostart安裝選項並存檔離開
執行編譯
最後將在images/linux目錄下的image.ub複製到SD Card中取代原本檔案即可。
Keyword: How to set auto login for PetaLinux, Push files into root file system
首先使用開發套件產生一個安裝開發樣版
1 | petalinux-create -t apps --template install --name autostart |
把inittab與autologin.sh檔案放到autostart資料夾中
接著修改Makefile
1 2 3 4 5 6 7 8 | install: # Please add commands below the comments to install data to target file system. # Use $(TARGETINST) to copy data into the target # E.g. there is data/acos_install in the current directory, and I want to # copy it into the target "/" directory: #$(TARGETINST) -d data/acos_install /acos_install $(TARGETINST) -d -p 0755 autologin.sh /home/autologin.sh $(TARGETINST) -d -p 0755 inittab /etc/inittab |
回到開發環境最上層資料夾
1 | petalinux-config -c rootfs |
執行編譯
1 | petalinux-build |
最後將在images/linux目錄下的image.ub複製到SD Card中取代原本檔案即可。
Keyword: How to set auto login for PetaLinux, Push files into root file system
2015/1/15
【Ubuntu】 開機自動登入Console
在Ubuntu上要設定開機後自動登入Console只需要三個步驟即可完成
- 安裝虛擬終端機程式mingetty
1 2
sudo apt-get update sudo apt-get install mingetty
- 修改開機到文字介面
將GRUB_CMDLINE_LINUX_DEFAULT設定值改為text(原本是quiet splash)
1
sudo vi /etc/default/grub
設定完成後更新grub1
sudo update-grub
- 設定自動登入
將exec /sbin/getty -8 38400 tty1修改成exec /sbin/mingetty --autologin root tty1即可
1
sudo vi /etc/init/tty1.conf

完成上述三個步驟,重新開機後就可以看到系統開啟文字終端機並且以root帳號自動登入,若要改成其他帳號登入,可將第三步驟的root改成對應帳號名稱。
2014/7/12
【Ubuntu】讓VLC可以播放中文字幕
要讓VLC可以正確顯示中文字幕需要確保兩件事:
第二點設定,開啟VLC後點選功能表單的工具→編號設定,接著選擇字幕/OSD頁面,將預設編碼設定為正體中文(Big5)並在偏好的字幕語言欄位填入字體路徑:
做完上述設定重新開啟VLC後應該就可以正確顯示繁體中文字幕了!
- 系統有安裝中文字體
- VLC選擇正確的字幕編碼格式
關於第一點,中文字體多數人推薦使用文泉驛正黑體,在Ubuntu系統可以使用以下指令完成安裝:
1 | sudo apt-get install ttf-wqy-zenhei |
第二點設定,開啟VLC後點選功能表單的工具→編號設定,接著選擇字幕/OSD頁面,將預設編碼設定為正體中文(Big5)並在偏好的字幕語言欄位填入字體路徑:
1 | /usr/share/fonts/truetype/wqy/wqy-zenhei.ttc |
做完上述設定重新開啟VLC後應該就可以正確顯示繁體中文字幕了!
2014/7/8
【Ubuntu】設定開機背光值
在Linux上背光值每次重開機都會被設成最亮,這個問題一直很困擾人,查了一下可以透過修改/sys/class/backlight/acpi_video*/brightness內容來調整背光設定。
底下寫了一個簡單的Script來修改這設定值:
使用方式如下:
根據觀察在Notebook上會有兩組設定值,分別是acpi_video0與acpi_video1,acpi_video0是插上電源線會參考的數值,而acpi_video1是沒接電源線參考的數值,不過沒找到相關說明文件不是很確認這兩者的區別。
底下寫了一個簡單的Script來修改這設定值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/sh if [ $# -ne 1 ]; then echo "Usage: $0 <back light percent>" echo "Example: $0 100: Set back light to maximum" exit 1 fi percent=$1 for acpi in /sys/class/backlight/acpi_video* do max=`cat ${acpi}/max_brightness` val=$((max*percent/100)) sudo sed -i "/exit 0$/i echo $val > ${acpi}/brightness" /etc/rc.local done |
使用方式如下:
- ./set_backlight.sh 100:背光調成最亮
- ./set_backlight.sh 0:關掉背光
根據觀察在Notebook上會有兩組設定值,分別是acpi_video0與acpi_video1,acpi_video0是插上電源線會參考的數值,而acpi_video1是沒接電源線參考的數值,不過沒找到相關說明文件不是很確認這兩者的區別。
【Ubuntu】開關筆電的觸控板功能
用Notebook打字最討厭被鍵盤下方的觸控面板干擾,如果筆電觸控板的快捷鍵開關是用Driver控制,這在Linux下就沒法直接用Fn+FunctionKey來作開關了,這時得用到xinput這隻工具來進行控制。
關鍵字:Touchpad、Toggle、Enable、Disable
參考:How to disable the touchpad?
後來在AskUbuntu討論區有看到別人用script來完成開關切換:執行一次功能就會由關閉變成開啟或是開啟變成關閉,直接看內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash declare -i ID ID=`xinput list | grep -iEo 'TouchPad\s*id\=[0-9]{1,2}' | grep -Eo '[0-9]{1,2}'` declare -i STATE STATE=`xinput list-props $ID|grep 'Device Enabled'|awk '{print $4}'` if [ $STATE -eq 1 ] then xinput disable $ID echo "Touchpad disabled." else xinput enable $ID echo "Touchpad enabled." fi |
關鍵字:Touchpad、Toggle、Enable、Disable
參考:How to disable the touchpad?
2014/6/11
【樹莓派】(Hidden SSID)無線網路連線
若無線網路環境並沒有取消SSID廣播功能(隱藏SSID),可以參考先前文章設定→http://inpega.blogspot.tw/2013/09/blog-post_15.html
無線網路的SSID是隱藏沒有廣播的話,則可以參考下面設定流程完成連線:
無線網路的SSID是隱藏沒有廣播的話,則可以參考下面設定流程完成連線:
- 在命令視窗輸入:wpa_passphrase "SSID" "PASSWORD"
SSID與PASSWORD需換成實際連線資訊,接著把psk後面推算出來的加密密碼(上圖紅色框起來的資料)記起來。 - 接著修改設定文件,sudo nano /etc/network/interfaces
iface wlan0 inet dhcp
wpa-scan-ssid 1
wpa-ap-scan 1
wpa-key-mgmt WPA-PSK
wpa-proto RSN WPA
wpa-pairwise CCMP TKIP
wpa-group CCMP TKIP
wpa-ssid "SSID"
wpa-psk d67cff074e68196339ea79313451616edfa4d8c3a3bfd0a64a5ebc06c02fd51d - 接著先關閉wlan功能:sudo ifdown wlan0
- 再重新開啟wlan功能:sudo ifup wlan0
- 這時可以用指令確認連線狀況:ifconfig wlan0
紅色框框記得更換成步驟一產生的加密密碼
2012/11/5
【Linux】Bochs模擬器模擬器
Bochs是一套用來模擬IA32架構的模擬器,可以模擬一台完整的PC:CPU, Memory, Disk...等,更棒的是在Debug模式中可以單步執行並隨時觀察CPU暫存器狀態或是記憶體資訊,對於學習PC底層有滿大的幫助,以下記錄下載Source包裝編譯安裝與執行的步驟。
- 到Bochs官網下載Source Code與Disk Image
目前最新Source Code版本是bochs-20121103.tar.gz
Disk Image這裡用FreeDos作為範例 - 完成下載後先對Source Code解壓縮
tar zxvf bochs-20121103.tar.gz - 作編譯前的設定:這邊開啟Debug與反組譯功能
./configure --enable-debugger --enable-disasm - 編譯與安裝
make
sudo make install - 以上步驟完成安裝程序, 接下來把下載好的FreeDos映像檔解壓縮
tar zxvf freedos-img.tar.gz - 切到解壓縮的目錄裡會看到會看到a.img, b.img, bochsrc, 與c.img這幾個檔案, 用gedit編輯器編輯bochsrc設定檔如下[註]
1 2 3 4 5 6 7 8 9 10 11
megs: 32 romimage: file=$BXSHARE/BIOS-bochs-latest vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest vga: extension=vbe floppya: 1_44=a.img, status=inserted ata0-master: type=disk, path=c.img, cylinders=306, heads=4, spt=17 boot: floppy log: bochsout.txt mouse: enabled=0 cpu: ips=15000000 vga_update_interval: 150000
- 接著執行bochs即可, 第一個選擇畫面直接選擇6. Begin simulation即可運行模擬器
- 但因為編譯設定時有選擇debug模式, 所以會先trap在一開始, 畫面如下:只要輸入c並按下enter模擬器就會繼續執行

- 最後成功進入Dos的畫面截圖如下:

- .bochsrc
- bochsrc
- bochsrc.txt
- bochsrc.bxrc (Windows Only)
訂閱:
文章 (Atom)






