驱动程序开发:FTP服务器和OpenSSH的移植与搭建、以及一些笔记

一、FTP服务器移植与搭建

  将 ALPHA 开发板作为一个小型的 FTP 服务器,这样我们就可以通过 FileZilla 软件直接在开发板和 windows 之间通过网络进行文件互传。而在开发板上搭建 FTP 服务器很简单,就是 vsftpd 的移植。

1、在ubuntu下安装vsftpd

在这里插入图片描述

2、在window下安装FileZilla

  FileZilla官网下载,下载地址如下:点击链接。步骤省略。

3、移植vsftpd到开发板上

  现在需要在自己制作的根文件系统中安装 vsftpd,所以就需要我们自己移植 vsfpd。首先需要到 vsftpd 官网下载 vsftpd 源码,网址为:点击链接

移植步骤及注意点:
  将 vsftpd-3.0.3.tar.gz 发送到 ubuntu 中,然后使用如下命令进行解压:

tar -vxzf vsftpd-3.0.3.tar.gz //解压缩

  解压缩完成以后会得到一个名为“vsftpd-3.0.3”的文件夹,然后进入此文件夹内。
  打开 Makefile,我们需要配置一下,修改 Makefile 中的 CC 变量为我们所使用的交叉编译器:

CC = arm-linux-gnueabihf-gcc //CC 为交叉编译器

  Makefile 修改完成以后就可以编译:

make //编译 vsftpd

  等待编译完成,会得到两个文件: vsftpd 和 vsftpd.conf,我们需要这两个文件。将 vsftpd 拷贝到开发板根文件系统下的/usr/sbin 目录下,将 vsftpd.conf 拷贝到开发板根文件系统的/etc 目录下。
  拷贝完成以后给予 vsftpd 可执行权限,并且修改 vsfptd.conf 所属用户为 root,命令如下:

chmod +x /usr/sbin/vsftpd
chown root:root /etc/vsftpd.conf

  修改vsftpd配置 ,允许本地用户注册和允许任何FTP写命令,操作如下:
在这里插入图片描述
  如果第一次添加用户的话要先将 ubuntu 下的/etc/passwd 和/etc/group 这两个文件复制到开发板根文件系统的对应目录,命令如下:

sudo cp /etc/passwd /home/djw/linux/nfs/rootfs/etc/ -f
sudo cp /etc/group /home/djw/linux/nfs/rootfs/etc/ -f

  然后修改开发板根文件系统中的/etc/passwd 和/etc/group 这两个文件,只保留“root”这一项。 passwd 文件“root”行最后改为“/bin/sh”, 修改后的 passwd 和 group 文件内容如下图所示:
在这里插入图片描述
  vsftpd 默认需要两个用户,这两个用户名分别为:“ftp”和“nobody”。在创建这两个用户之前先检查一下下面几个文件和目录是否存在,如果不存在的话需要先创建下面这些文件和目录:

/home //目录,不存在的话自行创建
/usr/share/empty //目录,不存在的话自行创建
/var/log //目录,不存在的话自行创建
/var/log/vsftpd.log //文件,不存在的话自行创建

  创建命令如下:

mkdir /home
mkdir /usr/share/empty -p
mkdir /var/log -p
touch /var/log/vsftpd.log

  准备好以后就可以使用“adduser”命令创建“ftp”和“nobody”这两个用户,命令如下:(密码自定义即可)

adduser ftp //创建 ftp 用户
adduser nobody //创建 nobody 用户

  最后还需要创建一个登录用户, Filezilla 连接 FTP 服务器的时候一般需要输入用户名和密码,当然了, Filezilla 也支持匿名登录。使用用户名加密码登录的话就要创建一个用户,用户名自己定义,这里我创建一个名为“djw”的用户,命令如下:

adduser djw//创建登录要用户

  最终会在/home 目录下存在三个用户目录,分别对应“ftp”、“nobody”和“djw”,如下图所示
在这里插入图片描述

4、Filezilla 连接测试

  测试之前确保直接开发板网络连接正常,电脑可以 ping 通开发板!
  输入如下命令,启动 vsftpd 服务器:

vsftpd & //启动 vsftpd
这里也可以将”vsftpd &“指令添加到/etc/init.d/rsC文件下,让开发板开机自启动。

  vsftpd 启动以后就可以使用 filezilla 进行连接测试了,新建站点,站点设置如下图所示:
在这里插入图片描述
  设置好以后就可以连接了,连接成功以后如下图所示:文件拖拉即可传输文件
在这里插入图片描述

5、注意点

  如果使用FileZilla软件连接开发板时出现了500 OOPS: cannot change directory:/home/*******这样的错误信息,如下图所示:
在这里插入图片描述
  其实就是/home/djw这个目录权限不够,那我们可不可以将该目录直接”chmod 777 /home/djw“呢? 经过验证是不行的。因此我们需要在vsftpd.conf配置文件添加以下内容,如下图所示:
在这里插入图片描述

二、开发板 OpenSSH 移植与使用

在这里插入图片描述
  openssh库依赖于zlib 库 和 openssl 库。

1、移植 zlib 库

  zlib 源码下载地址为:点击链接,拷贝到 ubuntu 中并解压,命令如下:

tar -vxzf zlib-1.2.11.tar.gz //解压

  解压完成以后得到一个名为“zlib-1.2.11”的 zlib 源码文件。另外新建一个名为“zlib”的文件夹来保存 zlib 的编译结果。进入 zlib 源码目录,然后配置并编译,命令如下:

cd zlib-1.2.11/ //进去 zlib 源码
CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld AD=arm-linux-gnueabihfas ./configure --prefix=/home/djw/linux/IMX6ULL/tool/zlib //配置
make //编译
make install

  编译、安装完成以后的 zlib 目录内容如下图所示:
在这里插入图片描述
  将上图中的 lib 目录下的 zlib 库文件拷贝到开发板根文件系统的/lib 目录下,命令为:

sudo cp lib/* /home/djw/linux/nfs/rootfs/lib/ -rfa

2、移植 openssl 库

  openssl 源码下载地址为:点击链接
  将 openssl 源码压缩包拷贝到 Ubuntu 中前面创建的 tool 目录下,然后使用如下命令将其解压:

tar -vxzf openssl-1.1.1d.tar.gz

  解压完成以后就会生成一个名为 openssl-1.1.1d 的目录,然后在新建一个名为“openssl”的文件夹,用于存放 openssl 的编译结果。进入到解压出来的 openssl-1.1.1d 目录中,然后执行如下命令进行配置:

./Configure linux-armv4 shared no-asm --prefix=/home/djw/linux/IMX6ULL/tool/openssl CROSS_COMPILE=arm-linux-gnueabihf-

  上述配置中“ linux-armv4”表示 32 位 ARM 凭条,并没有“ linux-armv7”这个选项。CROSS_COMPILE 用于指定交叉编译器。配置成功以后会生成 Makefile,输入如下命令进行编译:

make
make install

  编译安装完成以后的 openssl 目录内容如下图所示:
在这里插入图片描述
  将图 上图中的 lib 目录是我们需要的,将 lib 目录下的 libcrypto 和 libssl 库拷贝到开发板根文件系统中的/usr/lib 目录下,命令如下:

sudo cp libcrypto.so* /home/djw/linux/nfs/rootfs/lib/ -af
sudo cp libssl.so* /home/djw/linux/nfs/rootfs/lib/ -af

3、移植 openssh 库

  openssh 源码下载地址为:点击链接,如下图所示:
在这里插入图片描述
  先解压 openssh 源码,命令如下:

tar -vxzf openssh-8.2.tar.gz

  解压完成以后就会生成一个名为“openssh-8.2”的文件夹,进入此文件夹里面,然后配置并编译 openssh,命令如下:

cd openssh-8.2/
./configure --host=arm-linux-gnueabihf --with-libs --with-zlib=/home/djw/linux/IMX6ULL/tool/zlib --with-ssl-dir=/home/djw/linux/IMX6ULL/tool/openssl --disable-etcdefault-login CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar //配置
make //编译

  在配置 openssh 的过程中,“–with-zlib”参数用于指定 zlib 库所在的目录,“–with-ssl-dir”参数用于指定 openssl 库所在的目录,编译 openssh 的时候不用“make install”。

  openssh 交叉编译完成以后在开发板中创建如下所示目录(如果存在的话就不需要创建):

/usr/local/bin
/usr/local/sbin
/usr/local/libexec
/usr/local/etc
/var/run
/var/empty

  创建命令如下:

mkdir /usr/local/bin -p
mkdir /usr/local/sbin -p
mkdir /usr/local/libexec/ -p
mkdir /usr/local/etc -p
mkdir /var/run -p
mkdir /var/empty/ -p

  上述目录创建好以后将如下文件拷贝到开发板的/usr/local/bin 目录下:
scp、sftp、ssh、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan
  将如下文件拷贝到开发板的/usr/local/sbin 目录下:
sshd
  将如下文件拷贝到开发板的/usr/local/etc 目录下:
moduli、ssh_config、sshd_config
  将如下文件拷贝到开发板的/usr/local/libexec 目录下:
sftp-server、ssh-keysign
  创建软连接,进入开发板中的/bin 目录下,输入如下命令创建软连接:

cd /bin/
ln -s /usr/local/bin/scp
ln -s /usr/local/bin/sftp
ln -s /usr/local/bin/ssh
ln -s /usr/local/bin/ssh-add
ln -s /usr/local/bin/ssh-agent
ln -s /usr/local/bin/ssh-keygen
ln -s /usr/local/bin/ssh-keyscan

  再进入开发板的/sbin 目录下,输入如下命令创建软连接:

cd /sbin/
ln -s /usr/local/sbin/sshd

  软连接创建完成以后就可以直接调用上面 ssh 相关命令了。
  打开/usr/local/etc/sshd_config 文件,找到“#PermitRootLogin”所在行,将其改为“PermitRootLogin yes”。

  当所需的文件都存在以后就可以使用 adduser 创建名为“sshd”的用户了,创建 sshd 用户的时候需要设置密码,大家一定要记得这个密码,这里我设置简单一点,为“123456”,创建过程如下图所示:
在这里插入图片描述
  一切准备好以后我们还需要在开发板中生成秘钥文件,使用我们上面移植 openssh 所编译出来的 ssh-keygen 软件即可。进入到开发板的/usr/local/etc 目录下,输入如下所示命令生成秘钥文件,由于 6ULL 性能比较差,有些秘钥文件生成过程可以会有点耗时,打开几十秒:

ssh-keygen -t rsa -f ssh_host_rsa_key -N “”
ssh-keygen -t dsa -f ssh_host_dsa_key -N “”
ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N “”
ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N “”

完成以后就会在/usr/local/etc 目录下产生 8 个以“ssh_host_”开头的秘钥文件,如下图所示:
在这里插入图片描述

4、openssh 使用测试

  openssh 移植已经移植到了开发板中,我们可以通过 sshd 软件在开发板上搭建 openssh 服务器,然后在其他的主机上通过 ssh 来登录开发板。我们可以同样使用 scp 命令来向开发板传输文件。首先要在开发板上启动 ssh 服务, sshd 软件用于启动 ssh 服务,注意要输入全路径!输入如下命令:

/sbin/sshd //启动 sshd 服务
也可以在/etc/init.d/rcS 文件中加入以上命令,实现 ssh 服务开机自启动。

  使用XobaXterm软件的SSH工具远程登陆开发板,如下图所示:
在这里插入图片描述
在这里插入图片描述
  也可以在 ubuntu 下通过 ssh 命令登录开发板,如下图所示:
在这里插入图片描述
  使用scp 命令拷贝文件,例如把ubuntu中的文件发送给开发板中,如下图所示:
在这里插入图片描述
  上图出现无效连接,这是因为/dev/null文件拒绝访问了,我们先看看开发板根文件系统下的/dev/null文件的信息,如下图所示:
在这里插入图片描述
  由上图可知,/dev/null文件只有文件所以者和用户组拥有读和写的权限,其他用户是没有权限的,因此导致ubuntu这边是没有权限操作的,所以我们需要给/dev/null文件增加其他用户的读写权限,因为每次系统重新启动,该文件权限会恢复默认的,所以我们需要在系统启动后给它赋予其他用户的读写权限,操作是:在/etc/init.d/rcS脚本文件中添加"chmod 666 /dev/null"即可。
  那么再次重新传输文件,如下图所示:
在这里插入图片描述
在这里插入图片描述
  已经文件传输成功了。

三、关于u-boot上的操作及根文件系统下的脚本文件知识点

简介:
Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader 程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH, SD, MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。当然了,bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动 Linux 内核, bootloader 和 Linux 内核的关系就跟 PC 上的 BIOS 和 Windows 的关系一样, bootloader 就相当于 BIOS。
Linux开发板中,EMMC是有3个分区的,第0个分区存放uboot;第1个分区存放Linux镜像文件和设备树文件;第2个分区存放根文件系统。

命令使用:

1、bdinfo - 查看开发板的相关信息

在这里插入图片描述

2、pri – 查看环境变量

在这里插入图片描述

3、version – 查看uboot版本信息

在这里插入图片描述

4、setenv name xxx; saveenv – 设置环境变量,并保存

  例如设置uboot倒计时设置为5秒,如下图所示:
在这里插入图片描述

5、dhcp 用于从路由器获取 IP 地址

  前提得开发板连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址,如下图所示:
在这里插入图片描述

6、uboot中的nfs命令格式如下所示:

nfs [loadAddress] [[hostIPaddr:]bootfilename]

  使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
在这里插入图片描述

7、uboot中的tftp命令格式如下所示:

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

  将 Ubuntu中的tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
在这里插入图片描述

8、查看当前开发板一共有几个 MMC 设备

在这里插入图片描述

9、切换当前 MMC 设备

在这里插入图片描述

10、查看 EMMC 的分区情况

在这里插入图片描述

11、mmc write 命令烧写数据到SD设备或者EMMC中

在这里插入图片描述
在这里插入图片描述

12、查询指定 MMC 设备分区的文件系统信息

在这里插入图片描述

13、查询 FAT 格式设备的目录和文件信息

在这里插入图片描述

14、查看 MMC 设备某个分区的文件系统格式

在这里插入图片描述
15、 用于将指定的文件读取到 DRAM 中
在这里插入图片描述

16、fatwrite 命令

在这里插入图片描述

17、通过tftp方式下载Linux镜像和设备树,然后通过bootz启动Linux系统

在这里插入图片描述

18、使用命令 fatload 将 zImage 和 imx6ull-14x14-emmc-7-1024x600-c.dtb 从EMMC 的分区 1 中拷贝到 DRAM 中,启动 Linux 系统

在这里插入图片描述

19、bootm命令

在这里插入图片描述

20、 环境变量 bootargs

在这里插入图片描述

21、USB WIFI启动

modprobe 8188eu.ko //加载 RTL8188 驱动模块
ifconfig wlan0 up //打开 wlan0 网卡
iwlist wlan0 scan //搜索当前环境下的所有 WIFI 热点
//使用 wpa_supplicant 工具让 RTL8188 USB WIFI 连接到热点上。
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &
udhcpc -i wlan0 //从路由器获取 IP 地址
ping -I 192.168.43.26 www.baidu.com //ping百度

22、开发板Linux启动方式

uboot 启动Linux内核和设备树,根文件系统的加载在emmc内部/dev/nfs 设置:
setenv ipaddr 192.168.1.119 //开发板IP地址
setenv ethaddr b8:ae:1d:01:00:00 //开发板的 MAC 地址
setenv gatewayip 192.168.1.1 //开发板网关
setenv netmask 255.255.255.0 //子网掩码
setenv serverip 192.168.1.111 //服务器IP地址,例如ubuntu的
setenv dnsip 114.114.114.114 //设置DNS域名
setenv bootdelay 5 //设置boot启动延时5秒
使用nfs远程挂载根文件系统到开发板上:
setenv bootargs ‘console=tty1 console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.1.111:/home/djw/linux/nfs/rootfs ip=192.168.1.119:192.168.1.111:192.168.1.1:255.255.255.0::eth0:off’
使用tftp下载linux内核、设备树到开发板DRAM中,再启动
setenv bootcmd ‘tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000;’
saveenv //保存环境变量

在emmc启动的,根文件系统的加载在emmc内部/dev/mmcblk1p2
setenv bootcmd ‘mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-evk.dtb;bootz 80800000 - 83000000;’
根文件系统在EMMC启动
setenv bootargs ‘console=tty1 console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw ip=192.168.1.119:192.168.1.111:192.168.1.1:255.255.255.0::eth0:off’

23、关于根文件系统中/etc/init.d/rcS、 /etc/fstab、 /etc/inittab文件的知识点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述