2016年12月9日 星期五

把ethtool交叉編譯在arm平台上使用

首先去網站抓一包Source Code:
         http://ftp.kernel.org/pub/software/network/ethtool/

解壓縮之後,先在資料夾中新增一個檔案cross_configure.sh內容如下:
================= cross_configure.sh ==================

#!/bin/sh
ARM_TOOLCHAIN_DIR=/opt/arm/bin     #please type your toolchain path
export CROSS_COMPILE="${ARM_TOOLCHAIN_DIR}/arm-linux-gnueabi-"
export AR="${CROSS_COMPILE}ar"
export AS="${CROSS_COMPILE}as"
export LD="${CROSS_COMPILE}ld"
export NM="${CROSS_COMPILE}nm"
export CC="${CROSS_COMPILE}gcc"

export FC="${CROSS_COMPILE}gfortran "
export RANLIB="${CROSS_COMPILE}ranlib"
export STRIP="${CROSS_COMPILE}strip"
export OBJCOPY="${CROSS_COMPILE}objcopy"  
export CFLAGS="-Os -pipe -O2 -static"

./configure --target=arm-linux --host=arm-linux
===================================================

接下來幾個步驟分別為:
1. ./cross_configure.sh
2. make
3. cp ethtool 到目標板上
4. use "./ethtool -S eth0" to watch network status.


完成!!!


2016年12月7日 星期三

Cross-compile程式之後,放到板子上執行,卻顯示"/bin/ash: ./phyAccess: not found"(以我編譯phyAccess工具為範例)

今天編譯phyAccess tool準備要測試網路功能,編譯完成之後,放到板子執行時卻出現以下的錯誤訊息:
     



於是我先回到編譯的ubuntu電腦上使用file看一下編譯完成的檔案,是把程式編譯成甚麼CPU架構的,確認是ARM的無誤:




另外注意到了這個執行檔編譯完成後,是屬於dynamically linked(用file可看到如上圖),因此我用 readelf -l phyAccess | grep "program interpreter"(readelf -d phyAccess 也可看出需要哪些library) 來看看他動態連結了哪些library,發現他需要"ld-linux.so.3"的library(如下圖)
    



原來無法在板子上執行,是因為板子上缺少了這個library,因此最後的解決方法就是,編譯的時候在Makefile的 CFLAG參數裡面加上 -static(編譯成靜態)就解決此問題了。

2016年12月6日 星期二

Linux中devmem直接讀寫記憶體位置的用法

讀取
在位置0x98000000讀取32bit值
# devmem 0x98000000
0x11111111


在位置0x98000000讀取16bit值
# devmem 0x98000000 16
0x1111





寫入
在位置0x98000000寫入32bit值
# devmem 0x98000000 32 0x1111AAAA
# devmem 0x98000000
0x1111AAAA



另外如果出現以下訊息:
    devmem: can't open '/dev/mem': No such file or directory
表示Kernel端沒有開啟功能,請開啟下列選項:

=> Device Drivers                                                  
      => Character devices                                        
                       [*] /dev/mem virtual device support

這樣應該就可以了!!




2016年11月24日 星期四

linux中,格式化隨身碟的指令(ext4)

首先可以使用 "fdisk -l" 先確認好自己的隨身碟在檔案系統當中的名稱,可以在 /dev 資料夾底下找到,通常會是 /dev/sda 類似的 (/dev/sdb  or /dev/sdc 等等)

在確認完成之後就開始指令的部分了,假設我們的隨身碟是 /dev/sda:

1. sudo fdisk /dev/sda (作硬碟分割,可以做出partition table),進入fdisk後會要求你再下command,"h" 可以列出所有command,通常我們會先下"n"可以去增加一個partition,然後再下"p"會看到切出一個/dev/sda1的partition,最後再下"w"作儲存的動作

2. sudo mkfs.ext4 /dev/sda1 最後就是對剛剛切出的partition作檔案格式化,這邊的範例是格式化成ext4的格式.


作完以上步驟就可以了!!!

2016年11月17日 星期四

shell script的 字串處理,取代符號的用法,awk 以及 sed

awk

awk這個指令,可以用來處理字串,他的用法可以針對你想找的"符號"或"字串",來做切割然後可以單獨的取出,awk 使用說明如下

awk -F'要找的字符' '{print $1}'  

舉個實際例子,假設有個字串 =>  str="danny:12345:man"
那我現在想要取出danny,該怎麼做呢? 使用awk可以很簡的把他取出來
你只需下這段指令:
        echo $str | awk -F':' '{print $1}'





如果要取出12345,
        echo $str | awk -F':' '{print $2}'




如果要取出man,
        echo $str | awk -F':' '{print $3}'




如果是要取最後,也可以使用
        echo $str | awk -F':' '{print $NF}'

取倒數第二,寫法是
         echo $str | awk -F':' '{print $(NF-1)}'
        
        

sed

sed指令可以用來針對字串作以下功能  
1.以行為單位的新增/刪除   
2.以行為單位的取代與顯示
3.部分資料的搜尋並取代的功能

假設現在有一個檔案,名為hello,他的內容如下:










1.以行為單位的新增/刪除

(新增)我要印出hello的內容,並在第3行後面(也就是第四行)新增一些文字,作法如下:
       cat hello | sed '3a danny' 










(刪除)我要印出hello的內容,並刪除2~5行,作法如下:
       cat hello | sed '2,5d' 








2.以行為單位的取代與顯示

(取代)我要把2~5行取代為別的內容,作法如下:
       cat hello | sed '2,5c HHHHHHHHHHH' 






(顯示)我只要顯示2~5行的內容,作法如下:
       cat hello | sed -n '2,5p'







另外補充 sed 帶入變數的取某一行的方法
例如我有個變數$count="2"
我要用這個變數來取第二行,作法如下:
sed -n "${count}p"  ==> 等同於 sed -n "2p"


3.部分資料的搜尋並取代的功能

作法如下:
sed 's/要被取代的字串/新的字串/g'


例如有個字串 => str="@danny",假設我想要改成 "Hi danny",作法如下:
       echo $str | sed 's/@/Hi /g'





假設我只想要改成"danny",作法如下:
       echo $str | sed 's/@//g'





另外補充 sed 帶入變數的取代法
假設我有有個字串 => str="0.1.20180709", 我有個變數 $Date="20180709",
現在我要把str後面的".20180709"去掉, 作法如下:
       echo $str | sed "s/.$Date//g"



最後附上一個shell script範例,此範例是從一個json格式的字串中截取出user_name, passwd然後再透過smbpasswd指令去更改Samba的密碼

=================== test.sh ==========================
#!/bin/sh

input='{"user":"danny","passwd":"1234"}'
user_name=$(echo $input | awk -F',' '{print $1}' | awk -F':' '{print $2}' | sed 's/"//g')
passwd=$(echo $input | awk -F',' '{print $2}' | awk -F':' '{print $2}' | sed 's/"//g' | sed 's/}//g' )
printf "$passwd\n$passwd\n" | smbpasswd -a -s "$user_name" > /dev/null

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




2016年10月3日 星期一

解決 apt-get install 遇到404 Not Found的問題

今天同事的Ubuntu 10.4版 要使用apt-get install 安裝套件的時候遇到了404 Not Found的問題,訊息大概如下:

Err http://archive.ubuntu.com quantal/main amd64 Packages
  404  Not Found [IP: 91.189.91.15 80]
Err http://archive.ubuntu.com quantal/restricted amd64 Packages
  404  Not Found [IP: 91.189.91.15 80]
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/quantal-security/main/binary-amd64/Packages  404  Not Found [IP: 91.189.91.15 80]
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/quantal-security/restricted/binary-amd64/Packages  404  Not Found [IP: 91.189.91.15 80]
Err http://security.ubuntu.com raring-security/main amd64 Packages      
  404  Not Found [IP: 91.189.91.15 80]
Err http://security.ubuntu.com raring-security/restricted amd64 Packages
  404  Not Found [IP: 91.189.91.15 80]
Err http://security.ubuntu.com raring-security/universe amd64 Packages  
  404  Not Found [IP: 91.189.91.15 80]
Err http://security.ubuntu.com raring-security/multiverse amd64 Packages
  404  Not Found [IP: 91.189.91.15 80]



找了一下原因與解決方法,原因大概是因為,舊版的LTS(Long Term Support)版本,ubuntu只支援5年的時間(如果不是LTS版本只支援9個月),五年後ubuntu就會把更新的Server從標準的Server "http://archive.ubuntu.com/ubuntu/dist/" (apt-get 會去找的地方),移到別的地方了。

所以解決無法apt-get install的方法有兩個:

1. 更新你的ubuntu版本,使用指令 sudo apt-get dist-upgrade 去做版本更新。

2. 另一個方法你可以不要更新,可以使用 sed command 去更改 /etc/apt/sources.list 這個檔案,我們要把source.list裡面的 "archive.ubuntu.com" 和 "security.ubuntu.com" 替換成 "old-releases.ubuntu.com",在使用替換的指令之前,請先備份一下source.list檔案,如果下面方法失敗還可以把source.list復原,接著就可以執行sed替換指令,兩個步驟(command)如下:

     一. cp /etc/apt/source.list /etc/apt/back_source.list
     二. sudo sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com

當我們的source.list內容替換完成之後,請先執行update,update完成之後再作apt-get install 接下來應該就不會有404 Not Found的問題了! update的命令如下:

     sudo apt-get update

2016年8月19日 星期五

git觀念, ssh-keygen的使用方式, github註冊金鑰

今天要紀錄的是git觀念以及ssh-keygen的使用方式

git分成Server端與client端,基本上以往用常常用到git指令去github抓取open source的code,使用git抓取的人就是client端,把source code分享到他自己的github上就是server端。

當你要去抓取別人的github裡的source code時,你必須先在自己的電腦端使用ssh-keygen產生一組key,然後把這組key給server端的人,server端要幫你把這組key註冊到他的github裡,這樣你才會有權限去抓取(git clone)這個source code.

下圖是沒有註冊key去抓取github上的東西,所回應的錯誤訊息(白色是我打馬賽克的部分@@)






以上是觀念的部分,接下來是實際操作的部分



================  分隔線 ==================
首先在你的電腦端(client) 新增ssh key,輸入指令:
           ssh-keygen -t rsa -C "your_email@example.com"
 
    會出現下圖的情形,他會告知你將要產生id_rsa的金鑰檔案,請按Enter跳過




    再來會請你輸入密碼,這個密碼是當你要用git clone抓東西時,所要輸入的密碼:







   這樣就可以成功產生一個ssh key了:
















下圖是key的內容,也就是待會要向github作註冊的key






================  分隔線 ==================
接下來是github端的要做的部分

首先進入github網站,你可以自行註冊帳號,這樣你也可以放一些東西到github上,也可以用git指令去下載。

下圖是我們要把剛剛產生出來的key註冊到github server端,讓client端有權限可以作git clone.
請點選右上角的部分,然後選擇settings



















接著選擇左邊的ssh and GPG keys選項



















接著請點選New SSH key來註冊一組新的key,我們也可以看到,已經有註冊了兩組ssh key




















接著填入Title以及key的內容,按下Add SSH key即完成註冊key的動作


















    我們可以看到,現在已經註冊了三組key

















   這樣你就可以順利在你的電腦端(client)執行git clone的下載動作了。