ubuntu 16.04 虚拟机-嵌入式LINUX开发实录
1 安装ubuntu时,VMware开始不选择LINUX的ISO文件,启动时选择ISO文件后可以进行中英文语言选项的选择。
2 uboot首次编译,首先在 Ubuntu 中安装 ncurses 库,否则编译会报错,安装命令如下:
sudo apt-get install libncurses5-dev
3 交叉编译环境安装:
解压:sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
开机初始化:sudo vi /etc/profile
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
安装相关库:sudo apt-get install lsb-core lib32stdc++6
验证:arm-linux-gnueabihf-gcc -v
不顺利的话参考:
3.1. 下载 gcc-linaro-arm-linux-gnueabihf-4.9.tar.gz
3.2. 解压,并放置在自己需要的文件夹内
1
|
sudo tar –zxvf gcc-linaro-arm-linux-gnueabihf-4.9.tar.gz |
3.3. 配置环境变量PATH
1. 编辑bash.bashrc文件
1
|
sudo gedit ~/.bashrc |
2. 在文件中添加变量
1
|
export PATH=$PATH:你的路径/gcc-linaro-arm-linux-gnueabihf-4.9/bin |
3. 更新环境变量
1
|
source ~/.bashrc |
4. 检查环境变量是否加入成功
1
|
echo $PATH |
下方出现刚添加的PATH即为成功
3.4. 运行arm-linux-gnueabihf-gcc -v出现bash: /usr/local/arm/ gcc-linaro-arm-linux-gnueabihf-4.9/bin/arm-linux-gnueabihf-gcc:No such file or directory错误,安装32位兼容包解决该问题
1
|
sudoapt-get install lib32ncurses5 lib32z1 |
参考:http://blog.csdn.net/xie0812/article/details/52672687
3.5. 运行arm-linux-gnueabihf-gcc –v出现arm-linux-gnueabihf-gcc: error while loadingshared libraries: libstdc++.so.6: cannot open shared object file: No such fileor directory错误,安装
1
|
sudo apt-get install lib32stdc++6 |
参考:http://bbs.csdn.net/topics/390999780?page=1#post-4028528529
6. 运行arm-linux-gnueabihf-gcc –v出现
4 搜索文件名:find / -name "*name*"
5 查看磁盘情况:df-hl fdisk -l
6 NFS/TFTP/ssh:
NFS:
sudo apt-get install nfs-kernel-server rpcbind
sudo vi /etc/exports
打开/etc/exports 以后在后面添加如下所示内容:
/home/zuozhongkai/linux/nfs *(rw,sync,no_root_squash)
TFTP:
执行以下指令,安装 xinetd。
sudo apt-get install xinetd
sudo vi /etc/xinetd.conf
创建出来的文件是空白的, 修改 xinetd.conf 文件内容如下:
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info
}
includedir /etc/xinetd.d
新建 TFTP 目录,这里建立在/home/alientek/linux 目录下,目录名为 tftp。将 tftp 目录赋予
可读可写可执行权限。
mkdir -p /home/alientek/linux/tftp
sudo chmod 777 /home/alientek/linux/tftp/
cd /home/alientek/linux/
执行以下程序安装 tftp-hpa 和 tftpd-hpa 服务程序
sudo apt-get install tftp-hpa tftpd-hpa
执行以下指令打开 tftpd-hpa 配置文件,修改 tftp 目录为 TFTP 服务器工作目录。
sudo vi /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/ly/linux/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"
执行以下指令创建/etc/xinetd.d/tftp 配置文件。 (如果没有 xinetd.d 这个目录,可以先自己手
动创建)
sudo vi /etc/xinetd.d/tftp
添加如下内容,保存即可。
server tftp
{
socket_type = dgram
wait = yes
disable = no
user = root
protocol = udp
server = /usr/sbin/in.tftpd
server_args = -s /home/alientek/linux/tftp -c
#log_on_success += PID HOST DURATION
#log_on_failure += HOST
per_source = 11
cps =100 2
flags =IPv4
}
修改/添加 tftp 文件后, 执行以下指令重启 tftpd-hpa。
sudo service tftpd-hpa restart
重启 xinetd 服务。
sudo service xinetd restar在开发板文件系统执行以下指令设置开发板 IP,将虚拟机(192.168.10.100) TFTP 工作目
录下的 test.c 文件拷贝到开发板中。
ifconfig eth0 192.168.10.50
tftp -g -r test.c 192.168.10.100
cat test.c
SSH:
sudo apt-get install openssh-serve
关闭虚拟机和电脑防火墙:ufw disable,WIN10直接关闭即可
7 VSFTP:
sudo apt-get install vsftpd
等待软件自动安装,安装完成以后使用 VI 命令打开/etc/vsftpd.conf,命令如下:
sudo vi /etc/vsftpd.conf
打开 vsftpd.conf 文件以后找到如下两行:
local_enable=YES
write_enable=YES
8 查看系统
cat /proc/version
9 复制文件及文件夹
linux下cp整个文件夹的文件到另一个文件夹
cp -ri A/B/* A1/B1/ 回车
若复制过程中询问是否覆盖,输入y按回车,若不想看到提示直接覆盖使用-rf
另外若A A1不在同一目录下,最好填绝对路径,就是/xxx/xxx/A/B/* /xxx/A1/B1/
实例:
cp -ri /home/server/tomcat/* /home/server/test/
cp: target `/home/server/test/' is not a directory
需要先创建目标文件夹
mkdir /home/server/test
10 改变文件用户及组
格式:chown 账号名称 文件或目录
实例:chown www vpsss
增加权限给当前用户 chmod +wx filename
chmod -R 777 /upload
用户组 chgrp -R foldname zdz
chown -R 所有者用户名.组名 文件夹名称
例如:chown -R zdz.nginx KooBox
11 ROOT/普通用户添加arm-linux-gnueabihf-gcc 使能
在安装了arm-linux-gcc以后,如果出现只有普通用户可以正常运行或者只有root用户可以正常运行的情况是因为环境变量需要分别设置:
1.切换到普通用户模式
2. 输入命令:vi ~/.bashrc编辑.bashrc文件,在文件末尾加入 export PATH=/usr/local/arm/4.3.2/bin:$PATH
3.输入命令:source ~/.bashrc
1.切换到root用户下
2.gedit /etc/profile 在文件的末尾加上PATH=/usr/local/arm/4.3.2/bin:$PATH
3.输入命令:source /etc/profile
注意这里的目录是自己的实际安装目录。修改完成后使用arm-linux-gcc -v验证是否成功,出现版本号就是成功。如果还是失败就在两种模式下分别使用echo $PATH看是否输出了刚才加进去的路径,如果出现了正面该模式下环境变量添加成功,如果有模式不成功,则在该模式下把上述两种操作都做一遍,知道echo $PATH输出添加的路径为止
如果上述都不行,直接终端输入命令:export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin ,保证当前用户使用正常。
12 imxdownload 使用
1将imxdownload拷贝到根目录中
2给予执行权限
3确定要扫写的SD卡: ls dev/sd* ,新增加的就是SD卡设备盘符
4向SD卡烧写BIN文件:./imxdownload <bin file> <sd card>
13 tar 使用详解
tar
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
下面的参数 -f 是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
tar -cf all.tar *.jpg
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
tar -rf all.tar *.gif
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
tar -uf all.tar logo.gif
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
tar -tf all.tar
这条命令是列出all.tar包中所有文件,-t是列出文件的意思
tar -xf all.tar
这条命令是解出all.tar包中所有文件,-t是解开的意思
压缩
tar -cvf jpg.tar *.jpg //将目录里所有jpg文件打包成jpg.tar
tar -czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
tar -cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar -cZf jpg.tar.Z *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
rar a jpg.rar *.jpg //rar格式的压缩,需要先下载rar for linux
zip jpg.zip *.jpg //zip格式的压缩,需要先下载zip for linux
解压
tar -xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2 //解压 tar.bz2
tar -xZvf file.tar.Z //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip
总结
*.tar 用 tar -xvf 解压
*.gz 用 gzip -d或者gunzip 解压
.tar.gz和.tgz 用 tar -xzf 解压
*.bz2 用 bzip2 -d或者用bunzip2 解压
*.tar.bz2用tar -xjf 解压
*.Z 用 uncompress 解压
*.tar.Z 用tar -xZf 解压
*.rar 用 unrar e解压
*.zip 用 unzip 解压
14 tar.xz 解压 压缩
xz压缩文件方法或命令
xz -z 要压缩的文件
如果要保留被压缩的文件加上参数 -k ,如果要设置压缩率加入参数 -0 到 -9调节压缩率。如果不设置,默认压缩等级是6.
xz解压文件方法或命令
xz -d 要解压的文件
同样使用 -k 参数来保留被解压缩的文件。
创建或解压tar.xz文件的方法
习惯了 tar czvf 或 tar xzvf 的人可能碰到 tar.xz也会想用单一命令搞定解压或压缩。其实不行 tar里面没有征对xz格式的参数比如 z是针对 gzip,j是针对 bzip2。
创建tar.xz文件:只要先 tar cvf xxx.tar xxx/ 这样创建xxx.tar文件先,然后使用 xz -z xxx.tar 来将 xxx.tar压缩成为 xxx.tar.xz
解压tar.xz文件:先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar xvf xxx.tar来解包。
以上方法不能解压的话,使用这个就可以解压成tar包:tar -xvJf mysql-8.0.25-linux-x64.tar.xz
14 SD卡更新固件
14.1
使用脚本固化到SD卡:拷贝开发板光盘 A-基础资料->5、开发工具->4、正点原子 MFG_TOOL 出厂固件烧录工具
->mfgtool->Profiles->Linux->OS Firmware->files 整个文件夹到 Ubuntu 虚拟机,如下图图 2.2.2.1
1,本文档已经拷贝 files 文件夹到 Ubuntu 虚拟机:chmod +x imx6mksdboot.sh
进入 files 目录后
sudo ./imx6mksdboot.sh -device /dev/sdb -flash emmc -ddrsize 512
按连接 TF 卡到 Ubuntu 的方法,再点击断开即可退出 TF 卡。 固化完成后,将拨码开关拨
至 TF 启动方式 10000010,启动系统即可。
14.2 更新UBOOT:
sudo dd if=u-boot-imx6ull-14x14-ddr512-emmc.imx of=/dev/sdb bs=1024 seek=1 conv=fsync
14.3 更新设备树
sudo cp 设备树到分区:/media/alientek/boot
setenv ipaddr 192.168.1.55 setenv ethaddr b8:ae:1d:01:00:00 setenv gatewayip 192.168.1.1 setenv netmask 255.255.255.0 setenv serverip 192.168.1.250 saveenv |
//开发板 IP 地址 //开发板网卡 MAC 地址 //开发板默认网关 //开发板子网掩码 //服务器地址,也就是 Ubuntu 地址 //保存环境变量 |
setenv dnsip 114.114.114.114
saveenv
dns www.baidu.com
14.4 更新内核
sudo cp zImage到分区:/media/alientek/boot
14.5 更新内核模块
sudo tar vxjf modules.tar.bz2 -C /media/alientek/roofs/lib/modules/
复制解压到SD卡的内核文件夹中
14.6 更新文件系统
1 首先先删除 rootfs 分区下的根文件系统,执行如下指令。
sudo rm -rf /media/alientek/rootfs/*
ls /media/alientek/rootfs/
2 然后将 rootfs.tar.bz2 解压至 SD 卡根文件系统分区即可,执行下面的指令。
sudo tar xf rootfs.tar.bz2 -C /media/alientek/rootfs/
ls /media/alientek/rootfs/
sync
14.7 SCP命令
scp 源(用户名@用户 ip :文件路径) 目标文件路径
比如:scp root@192.168.10.1:/a.c /home/lf/
15 sudo 无法输出命令:
sudo ln -s /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc
sudo ln -s /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ld /usr/bin/arm-linux-gnueabihf-ld
16 ubuntu apt-get 换源
cd /etc/apt/
tftp 83000000 imx6ull-alientek-emmc.dtb
bootz 80800000 – 83000000
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz
80800000 - 83000000'
saveenv
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000
imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;
sudo /etc/init.d/nfs-kernel-server restart
//// 2) 开发板 u-boot 的 bootargs 变量设置
setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.250:
/home/zuozhongkai/linux/nfs/rootfs ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:
off。
root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>
<server-ip>:服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP
地址,比如我的 Ubuntu 主机 IP 地址为 192.168.1.250。
<root-dir>: 根文件系统的存放路径,比如我的就是/home/zuozhongkai/linux/nfs/rootfs。
<nfs-options>: NFS 的其他可选选项,一般不设置。
<client-ip>: 客户端 IP 地址,也就是我们开发板的 IP 地址, Linux 内核启动以后就会使用
此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,并且没有被其他的设
备使用,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能
ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设置为
192.168.1.251。
<server-ip>: 服务器 IP 地址,前面已经说了。
<gw-ip>: 网关地址,我的就是 192.168.1.1。
<netmask>:子网掩码,我的就是 255.255.255.0。
<hostname>:客户机的名字,一般不设置,此值可以空着。
<device>: 设备名,也就是网卡名,一般是 eth0, eth1….,正点原子的 I.MX6U-ALPHA 开
发板的 ENET2 为 eth0, ENET1 为 eth1。如果你的电脑只有一个网卡,那么基本只能是 eth0。
这里我们使用 ENET2,所以网卡名就是 eth0。
<autoconf>: 自动配置,一般不使用,所以设置为 off。
<dns0-ip>: DNS0 服务器 IP 地址,不使用。
<dns1-ip>: DNS1 服务器 IP 地址,不使用。
根据上面的格式 bootargs 环境变量的 root 值如下:
root=/dev/nfs nfsroot=192.168.1.250:/home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw
ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off
“proto=tcp”表示使用 TCP 协议,“rw”表示 nfs 挂载的根文件系统为可读可写。 启动开发
板,进入 uboot 命令行模式,然后重新设置 bootargs 环境变量,命令如下:
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250:
/home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:
255.255.255.0::eth0:off' //设置 bootargs
saveenv //保存环境变量
我的设置:
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.3.60:/home/ly/linux/ly_portable/rootfs/rootfs, proto=tcp rw ip=192.168.3.67:192.168.3.60:192.168.3.1:255.255.255.0::eth0:off'
或者
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.3.66:/home/ly/linux/nfs/rootfs, proto=tcp rw ip=192.168.3.101:192.168.3.66:192.168.3.1:255.255.255.0::eth0:off'
saveenv //保存环境变量
vim /etc/exports
/home/ly/linux/ly_portable/rootfs/rootfs *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart
19 查找替换:
grep -rl 'oldstring' . | xargs sed -i 's/oldstring/newstring/g'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具