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的下載動作了。

2016年8月16日 星期二

交叉編譯 wpa_supplicant 移植到ARMv7板子

要交叉編譯wpa_supplicant,首先必須先編譯出for ARMv7的openssl

所以第一步先去抓最新版的openssl,到下面的官網下載,我這邊抓的是openssl-1.0.1t

https://www.openssl.org/

抓完之後就準備開始做openssl的cross compile了

=========== cross compile openssl for arm ================
1. ./config --prefix=/home/danny/ARMv7/

2.成功config完成之後,手動進入Makefile更改toolchain的路徑
      #++++++ Add+++
      CROSS_COMPILE=/home/danny/x-tool/armv7-rpi2-linux-gnueabihf/bin/armv7-rpi2-linux-gnueabihf-
      #======Modify =====
      CC=$(CROSS_COMPILE)gcc
      AR= $(CROSS_COMPILE)ar $(ARFLAGS) r
      RANLIB= $(CROSS_COMPILE)ranlib
      NM= $(CROSS_COMPILE)nm

3. make
    在這個步驟之後,我遇到的情形,會出現如下面所秀出的一堆ERROR訊息
     x86cpuid.s: Assembler messages:
     x86cpuid.s:4: Error: unrecognized symbol type ""
     x86cpuid.s:5: Error: alignment too large: 15 assumed
     x86cpuid.s:8: Error: bad instruction `pushl %ebp'
     x86cpuid.s:9: Error: bad instruction `pushl %ebx'
     x86cpuid.s:10: Error: bad instruction `pushl %esi'
     x86cpuid.s:11: Error: bad instruction `pushl %edi'
     x86cpuid.s:12: Error: bad instruction `xorl %edx,%edx'
     x86cpuid.s:13: Error: bad instruction `pushfl'
     x86cpuid.s:14: Error: bad instruction `popl %eax'
     x86cpuid.s:15: Error: bad instruction `movl %eax,%ecx'
     x86cpuid.s:16: Error: bad instruction `xorl $2097152,%eax'
     x86cpuid.s:17: Error: bad instruction `pushl %eax'
     x86cpuid.s:18: Error: bad instruction `popfl'
     x86cpuid.s:19: Error: bad instruction `pushfl'
     x86cpuid.s:20: Error: bad instruction `popl %eax'
     x86cpuid.s:21: Error: bad instruction `xorl %eax,%ecx'
     x86cpuid.s:22: Error: bad instruction `xorl %eax,%eax'      ..................

     請在重新config一次並在後面加入一些參數如下面指令

     ./config --prefix=/home/danny/ARMv7/ shared no-zlib no-asm no-threads no-sse2 no-gmp no-rfc3779 no-krb5 no-rc5 no-zlib-dynamic no-hw no-cipher no-md2 no-mdc2 no-rc2 no-idea no-camellia no-ec no-ripemd no-rc4 no-bf no-cast no-perlasm

     config完成之後,請記得再遵照步驟2,手動修改一下Makefile裡的toolchain路徑



4. make
    make install

這樣openssl就編譯完成,並安裝在你指定的路徑了,openssl會編譯出兩個library  分別是openssl與crypt,而wpa_supplicant還需要另一個libnl
=================================================================


============== cross compile libnl for arm ==========================
libnl我是下載 libnl-3.2.28 載點如下
http://www.linuxfromscratch.org/blfs/view/svn/basicnet/libnl.html

1. ./configure ARCH=arm --prefix=/home/danny/ARMv7/ CC=/home/danny/x-tool/armv7-rpi2-linux-gnueabihf/bin/armv7-rpi2-linux-gnueabihf-gcc --host=arm-linux LD=/home/danny/x-tool/armv7-rpi2-linux-gnueabihf/bin/armv7-rpi2-linux-gnueabihf-ld

2. make
    make install

這邊比較不會有甚麼問題,也可以成功編譯出libnl的library

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




最後是編譯wpa_supplicant的部分
=============== cross compile wpa_supplicant for arm =================
首先新進入到下面的資料夾當中

1. cd wpa_supplicant-2.5/wpa_supplicant
 
2. cp defconfig .config

3. 進入Makefile做修改
    CROSS_COMPILE=/home/danny/x-tools/armv7-rpi2-linux-gnueabihf/bin/armv7-rpi2-linux-gnueabihf-
    CC=$(CROSS_COMPILE)gcc

    export LIBDIR ?= /home/danny/ARMv7/wpa_supplicant/lib/
    export INCDIR ?= /home/danny/ARMv7/wpa_supplicant/include/
    export BINDIR ?= /home/danny/ARMv7/wpa_supplicant/bin/
    LIBS += -L/home/danny/ARMv7/lib -lssl -lcrypto

4. make


Q1. 首先會出現錯誤訊息如下所示,這是因為找不到openssl的header檔
../src/crypto/tls_openssl.c:19:25: fatal error: openssl/ssl.h: No such file or directory

請進入Makefile修改增加下面這一行,路徑是先前openssl的安裝路徑
CFLAGS += -I/home/danny/ARMv7/include



Q2. 接著會出現錯誤訊息如下所示,這是因為找不到libnl的header檔
../src/drivers/driver_nl80211.c:17:31: fatal error: netlink/genl/genl.h: No such file or directory

請進入Makefile修改增加下面這一行,路徑是先前libnl安裝的include檔路徑
CFLAGS += -I/home/danny/ARMv7/include/libnl3



Q3. 接著會出現如下的undefined reference訊息
        ../src/drivers/driver_nl80211.o: In function `get_channel_width':
        /home/danny/wpa_supplicant-2.5/wpa_supplicant/../src/drivers/driver_nl80211.c:6492: undefined reference to `genlmsg_attrdata'
        /home/danny/wpa_supplicant-2.5/wpa_supplicant/../src/drivers/driver_nl80211.c:6492: undefined reference to `genlmsg_attrlen'
        ../src/drivers/driver_nl80211.o: In function `netdev_info_handler':
        /home/danny/wpa_supplicant-2.5/wpa_supplicant/../src/drivers/driver_nl80211.c:519: undefined reference to `genlmsg_attrdata'

遇到這個問題,請修改.config檔,把原本被註解掉的這兩個項目打開
CONFIG_LIBNL20=y
CONFIG_LIBNL32=y


Q4. 遇到如下的錯誤訊息
      Package libnl-3.0 was not found in the pkg-config search path.
      Perhaps you should add the directory containing `libnl-3.0.pc'
      to the PKG_CONFIG_PATH environment variable
      No package 'libnl-3.0' found

請在terminal底下,設定如下環境變數,路徑為libnl安裝的資料夾底下lib有一個pkgconfig資料夾
export PKG_CONFIG_PATH=/home/danny/ARMv7/lib/pkgconfig


Q5. 遇到找不到libcrypto的問題,錯誤訊息如下
     ...armv7-rpi2-linux-gnueabihf/bin/ld.bfd: cannot find -lcrypto collect2: error: ld returned 1 exit status

請在Makefile中搜尋 -lcrypto,把找到的項目 前面都指定 先前編譯好安裝的openssl路徑,例如
LIBS += -L/home/danny/ARMv7/lib -lcrypto
LIBS_p += -L/home/danny/ARMv7/lib -lcrypto
總共有兩個地方要加



最後就可以順利make成功了!!!


       

  

apt-file search 的使用

當你在Ubuntu上做一些open source的編譯時

如果遇到類似這樣的訊息 ===> fatal error: openssl/ssl.h: No such file or directory

有可能是你host端(PC)缺少了一些套件

可以先使用apt-file search /openssl/ssl.h 他會跟你說你缺少的套件名稱

你就可以使用apt-get install去做安裝