在進行嵌入式Linux的學習筆記的學習過程中,開發過程也遇到很多Ubuntu系統,編譯,Makefile語法,設備樹,網絡以及線程,進程等細節知識,這部分知識十分零散,卻是應用開發的基礎,如果將其放在學習筆記系列中,又干擾整個開發的節奏,所以就在上個系列的基礎上,新增加關於嵌入式Linux問題的總結,這里面記錄的可能是常用命令,編譯報錯的解決方法,特殊的bash語法知識等,如果后面再遇到問題,解決后,也會持續維護更新這篇文章,算是個小的問題資料庫了。
1.常用資料網絡路徑
gcc下載官方路徑: http://ftp.gnu.org/gnu/gcc
gcc下載鏡像路徑: http://mirror.hust.edu.cn/gnu/
淘寶源的git文件: https://npm.taobao.org/mirrors/git-for-windows/
綜合的開源QT基礎DEMO: https://github.com/feiyangqingyun/QWidgetDemo
在線工具,資料: http://tool.oschina.net/
算法學習: https://leetcode-cn.com/
windows國內備份站點: https://msdn.itellyou.cn/
清華Ubuntu鏡像站路徑: https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
代碼編譯結果直接查看: https://godbolt.org/
2.常用Ubuntu指令匯總
sudo su 獲取root權限 clear 清除當前界面 ifconfig 網絡相關執行
ifconfig eth0 up 啟動網口0
top 查看當前系統的各程序的占有率 mkdir -p filepath 創建路徑,可遞歸創建 apt-get install filename 安裝指定文件 alias ll='ls -alF' 列出當前文件夾內狀態 ls /dev/ 查詢當前的設備 ls /dev/sd* 查詢當前的是的sd卡設備 ps -a | grep sshd 查詢當前執行的sshd后台應用
ps -ef 查詢當前執行的所有后台應用 kill -9 xxx 關閉指定ID的后台應用 tar -xvf xxx 解壓到當前文件夾,后面可指定目錄 cat /proc/devices 查詢當前的設備總線 scp -r file_name system_usr@ip_addr:/filepath 例如: scp -r uart_proto root@192.168.1.251:/usr/app 通過ssh快速上傳文件到指定地址 insmod/rmmod/modprobe/lsmod 加載/刪除/帶關聯加載/顯示內核模塊 modinfo xx.ko 列出模塊的信息 tar -vcjf xxx.tar.bz2 * 將當前路徑下的文件打包 mknode /dev/... c main_id slave_id
例如: mknod /dev/led c 1 0 根據主從設備號創建設備節點 ls /proc/slabinfo 查看內存占用情況
3. Linux下掛載SD卡方法
使用指令ls /dev/mmc* 查看當前的sd卡分區,如我的sd卡為/dev/mmblk0p1~4
使用指令
mount -t vfat /dev/mmcblk0p1 /mnt/sdb1 將SD卡掛載到指定路徑下,並可以通過指令
umount /mnt/sdb1 取消u盤的掛載
錯誤問題解決:
mount: mounting /dev/mmcblk0p1 on /mnt/sdb2 failed: No such file or directory
此時如果mnt路徑下沒有該目錄,會掛載失敗
mount -n -o remount,rw / 解鎖只讀權限,
mkdir /mnt/sdb1 創建掛載路徑
此后可通過
ls /mnt/sdb1 查看掛載的U盤的數據
4. 編譯和命令行錯誤問題解決
1) 嵌入式平台斷電或者硬件復位保存文件會無效
原因: 這是因為嵌入式文件的保存分為程序讀寫---->緩沖區----->內核------>磁盤,直接硬件重啟可能會導致來不及寫入。
解決指令: 使用reboot指令進行復位,盡量不要使用硬件復位。
2)Makefile編譯出錯
內核編譯報如下顯示找不到Makefile
make[2]: *** No rule to make target `/usr/kernel/hello/Makefile'. Stop.
make[1]: *** [_module_/usr/kernel/hello] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-23-generic'
解決辦法:Makefile必須大寫,否則找不到文件
/bin/sh: 1: lzop: not found問題
解決方案是:
安裝lzop,執行下面語句
sudo apt-get install lzop
Makefile:5: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.
解決辦法:make命令需要以Tab對齊,直接復制可能是空格對齊,使用vim指令修改帶make行的語句,用tab對齊。
curses.h: No such file or directory
解決辦法:sudo apt-get install libncurses5-dev
bc:command no found
解決辦法:sudo apt-get install bc
3)普通模式和root模式命令狀態執行不一致
原因:管理員模式和普通模式對應的PATH不一致,在普通模式下能找到指令,管理員模式下無法找到。
解決辦法:
在普通模式下PATH對應路徑為/etc/profile中的export PATH="xxx:添加路徑",
在管理員模式下PATH對應路徑為/etc/environment中的PATH="xxx:添加路徑"
修改后可用source /etc/environment來更新PATH,有問題可及時修改。
另外,可通過echo $PATH查看當前的全局路徑。
4)內核模塊加載錯誤
insmod: error inserting 'memdev.ko': -1 Device or resource busy
原因:驅動的設備號已經被占用
解決辦法:如果占用設備號的設備同樣為獨立於內核的模塊,可用rmmod刪除后,在添加,如果為內核集成的模塊,則需要重新編譯內核模塊或Linux模塊,避免被占用。
5)使用SSH指令傳輸數據出錯
如scp -r uart_proto root@192.168.1.251:/usr/app報如下錯誤
no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
原因:ssh客戶端使用的配置為ssh_config, ssh服務器端使用配置為sshd_config
vim /etc/ssh/ssh_config(路徑可能根據實際情況改變,我的系統是該路徑)
將ssh服務器下sshd_config中的KexAlgorithms, Ciphers, MACs添加到該文件末尾即可。
6)編譯node顯示
'print' no acceptable C compiler found
如果gcc, g++在全局下都能正常使用,那么原因是默認系統python的版本使用的是python3,而不是python2,可通過
cd /usr/bin
rm -rf python
ln -s /usr/bin/python2.7 /usr/bin/python