ARM-LINUX學(xué)習(xí)筆記
昨天安裝了ssh服務(wù)之后今天在windows上用xshell登陸發(fā)現(xiàn)登錄不上,原因是使用了virtualbox的NAT模式,在NAT模式下,客戶機(jī)可以很方便地上網(wǎng),但是想要鏈接宿主機(jī)就需要打開網(wǎng)絡(luò)地址映射
首先要知道ssh服務(wù)使用的是22端口,然后打開windows主機(jī)上的適配器,virtualbox安裝了一張?zhí)摂M網(wǎng)卡,如下
虛擬地址為192.168.56.1,接下來在虛擬機(jī)的設(shè)置界面設(shè)置網(wǎng)絡(luò)地址映射,首先還要知道虛擬機(jī)的IP地址,如下
地址為10.0.2.15,就可以去做端口轉(zhuǎn)發(fā)了,位置如下
按照步驟來,設(shè)置名稱隨意,主機(jī)IP設(shè)置為虛擬機(jī)網(wǎng)卡的IP,端口可以寫一個(gè)未被占用的任意端口,子系統(tǒng)IP為linux宿主機(jī)ip,端口為ssh服務(wù)端口,相當(dāng)于說我們連接ssh的時(shí)候連接192.168.56.1的2222端口的時(shí)候,wirtualbox將數(shù)據(jù)轉(zhuǎn)發(fā)到宿主機(jī)的22端口上,經(jīng)過這一次中轉(zhuǎn)就可以登錄ssh了,接下來新建ssh連接如下
注意主機(jī)和端口號(hào)的設(shè)置,和我之前說的一樣,這樣就可在輸入用戶名密碼之后連接上了,如下
共享文件夾的設(shè)置
virtualbox提供共享文件夾的功能,雖然寫著自動(dòng)掛載,但是通常ubuntu是不會(huì)自動(dòng)掛載的,如下
這個(gè)時(shí)候就需要我們手動(dòng)在系統(tǒng)中掛在共享文件夾了,首先你需要安裝增強(qiáng)功能包,一般都會(huì)安裝,安裝了之后虛擬機(jī)用著才爽嘛
然后建立一個(gè)文件夾用于掛載共享文件夾
mkdir /mnt/linuxshare
可以建立在別的位置,但是我習(xí)慣在這里,建立之后就可以掛載了
mount -t vboxsf linuxshare /mnt/linuxshare
第一個(gè)linuxshare是你創(chuàng)建共享文件夾的時(shí)候自己制定的名稱
第二個(gè)/mnt/linuxshare是你創(chuàng)建的掛載文件夾的目錄
命令執(zhí)行完沒有錯(cuò)誤信息掛載就成功了,然后關(guān)閉終端,重新打開終端
vim /mnt/linuxshare/text.c保存之后查看,應(yīng)該在windows下的共享文件夾出現(xiàn)text.c文件了
有時(shí)候命令不太記得,看英文文檔比較麻煩的時(shí)候我們可以選擇安裝中文的幫助包使用命令
sudo apt-get update 更新源
sudo apt-get install manpages-zh 安裝中文manual
安裝完成之后man ls應(yīng)該就是中文提示了
接下來是串口的共享問題,我使用的是usb轉(zhuǎn)串口的芯片ft232,這個(gè)芯片ubuntu14.02自帶了驅(qū)動(dòng),不需要額外安裝,但是我們要將這個(gè)物理usb轉(zhuǎn)串口切換到虛擬機(jī)里面,首先要安裝一個(gè)包,是wirtualbox的usb2.0增強(qiáng)包,名字叫做Oracle_VM_VirtualBox_Extension_Pack-4.3.26-98988.vbox-extpack,百度搜索一下在oracle的官方網(wǎng)站下載,下載之后安裝就能啟動(dòng)usb2.0的支持了,接下來如下設(shè)置
按照設(shè)置添加這個(gè)usb,然后重啟系統(tǒng),重啟完成之后應(yīng)該就能看到usb轉(zhuǎn)串口設(shè)備,這樣查看
如果沒有這個(gè)設(shè)備看看是不是自己彈出了,可以在這里彈出
串口設(shè)備安裝好了之后打開設(shè)備,我們知道設(shè)備在linux上對(duì)應(yīng)的都是文件,串口設(shè)備對(duì)應(yīng)文件在這里
/dev/ttyUSB0
接下來是串口通訊,我們安裝兩個(gè)串口通訊軟件,一個(gè)命令行一個(gè)圖形化的,使用命令
sudo apt-get install minicom //命令行調(diào)試助手
sudo apt-get install cutecom //圖形化調(diào)試助手
安裝好minicom之后需要進(jìn)行設(shè)置,命令為
sudo minicom -s
設(shè)置截圖如下
設(shè)置完成之后保存為默認(rèn)配置文件,退出界面,再次輸入
minicom,自動(dòng)打開串口(要是打開失敗,屏幕右下角顯示offline的)
然后將我手上的TQ2440開發(fā)板打到norflash啟動(dòng)(nor中已經(jīng)有了bootloader),顯示界面如下
好,到這里串口通訊完成,接下里為了擺脫windows我們還需要把usb完成
首先第一步是下載安裝libusb-dev,如下
sudo apt-get install libusb-dev
安裝完成之后,記得將TQ2440的USB端口導(dǎo)入linux,如下
到這里快成功啦,下載程序我們需要一個(gè)工具,windows有一個(gè)dnw,有人做了dnw2,源代碼如下
/*dnw2linuxmainfile.Thisdependsonlibusb.**Author:Fox*License:GPL**/#include #include #include #include #include #include #defineQQ2440_SECBULK_IDVENDOR0x5345#defineQQ2440_SECBULK_IDPRODUCT0x1234structusb_dev_handle*open_port(){structusb_bus*busses,*bus;usb_init();usb_find_busses();usb_find_devices();busses=usb_get_busses();for(bus=busses;bus;bus=bus->next){structusb_device*dev;for(dev=bus->devices;dev;dev=dev->next){if(QQ2440_SECBULK_IDVENDOR==dev->descriptor.idVendor&&QQ2440_SECBULK_IDPRODUCT==dev->descriptor.idProduct){printf("Targetusbdevicefound!n");structusb_dev_handle*hdev=usb_open(dev);if(!hdev){perror("Cannotopendevice");}else{if(0!=usb_claim_interface(hdev,0)){perror("Cannotclaiminterface");usb_close(hdev);hdev=NULL;}}returnhdev;}}}printf("Targetusbdevicenotfound!n");returnNULL;}voidusage(){printf("Usage:dnw2 nn");}unsignedchar*prepare_write_buf(char*filename,unsignedint*len){unsignedchar*write_buf=NULL;structstatfs;intfd=open(filename,O_RDONLY);if(-1==fd){perror("Cannotopenfile");returnNULL;}if(-1==fstat(fd,&fs)){perror("Cannotgetfilesize");gotoerror;}write_buf=(unsignedchar*)malloc(fs.st_size+10);if(NULL==write_buf){perror("mallocfailed");gotoerror;}if(fs.st_size!=read(fd,write_buf+8,fs.st_size)){perror("Readingfilefailed");gotoerror;}printf("Filename:%sn",filename);printf("Filesize:%dbytesn",fs.st_size);*((u_int32_t*)write_buf)=0x30000000;//downloadaddress*((u_int32_t*)write_buf+1)=fs.st_size+10;//downloadsize;*len=fs.st_size+10;returnwrite_buf;error:if(fd!=-1)close(fd);if(NULL!=write_buf)free(write_buf);fs.st_size=0;returnNULL;}intmain(intargc,char*argv[]){if(2!=argc){usage();return1;}structusb_dev_handle*hdev=open_port();if(!hdev){return1;}unsignedintlen=0;unsignedchar*write_buf=prepare_write_buf(argv[1],&len);if(NULL==write_buf)return1;unsignedintremain=len;unsignedinttowrite;printf("Writingdata...n");while(remain){towrite=remain>512?512:remain;if(towrite!=usb_bulk_write(hdev,0x03,write_buf+(len-remain),towrite,3000)){perror("usb_bulk_writefailed");break;}remain-=towrite;printf("r%d%t%dbytes",(len-remain)*100/len,len-remain);fflush(stdout);}if(0==remain)printf("Done!n");return0;}