admin 管理员组

文章数量: 887017

[上一篇]

配置用户账户

到目前为止,我们的最小Linux系统里面还没有任何用户账户,就连root账户也没有。
我们执行whoami命令查看当前登录的用户,提示找不到0号用户:

/ # whoami
whoami: unknown uid 0

用ls -l命令查看文件列表时,也只能看用户和组的ID号(root用户id为0),看不到名称:

/ # ls -l root
total 28
-rwxr-xr-x    1 0        0              170 Jan  1 00:13 adc.sh
drwxr-xr-x    2 1000     1000          4096 Aug 28  2021 hello
drwxr-xr-x    2 1000     1000          4096 Sep  1  2021 hello_dynamic
drwxr-xr-x    2 1000     1000          4096 Aug 30  2021 leds
-rwxr-xr-x    1 0        0              256 Jan  1  2000 leds.sh
drwxr-xr-x    2 1000     1000          4096 Sep  2  2021 libtest
drwxr-xr-x    2 1000     1000          4096 Sep  2  2021 sl

我们继续看:

/ # echo $USER
root
/ # echo $HOME
/
/ # echo ~
/
/ # echo $HOSTNAME
(none)

从$USER变量上倒是可以看到当前登录的是root账户。但家目录$HOME是根目录,不是/root目录。echo ~的输出也是根目录。$HOSTNAME主机名没有。

我们先用addgroup命令,添加root组,组号(GID)为0。执行addgroup命令前,必须先建立空白的/etc/group文件:

/ # touch /etc/group
/ # addgroup -g0 -S root

然后再用adduser命令,添加一个root账户,用户号(UID)为0,所属组为root组,家目录为/root,shell为/bin/sh。执行adduser命令前,必须先建立空白的/etc/passwd文件:

/ # touch /etc/passwd
/ # adduser -h/root -Groot -S -u0 -s/bin/sh root

现在可以看到root用户和root组了:

/ # whoami
root
/ # ls -l /root
total 28
-rwxr-xr-x    1 root     root           170 Jan  1 00:13 adc.sh
drwxr-xr-x    2 1000     1000          4096 Aug 28  2021 hello
drwxr-xr-x    2 1000     1000          4096 Sep  1  2021 hello_dynamic
drwxr-xr-x    2 1000     1000          4096 Aug 30  2021 leds
-rwxr-xr-x    1 root     root           256 Jan  1  2000 leds.sh
drwxr-xr-x    2 1000     1000          4096 Sep  2  2021 libtest
drwxr-xr-x    2 1000     1000          4096 Sep  2  2021 sl
/ # ls -l /etc
total 28
-rw-r--r--    1 root     root           150 Jan  1 00:04 fstab
-rw-r--r--    1 root     root            14 Jan  1 00:14 group
-rw-r--r--    1 root     root            10 Jan  1 00:14 group-
drwxr-xr-x    2 root     root          4096 Aug 27  2021 init.d
-rw-r--r--    1 root     root           296 Sep  3  2021 inittab
-rw-r--r--    1 root     root            39 Jan  1 00:14 passwd
-rw-r--r--    1 root     root             0 Jan  1 00:14 passwd-
-rw-r--r--    1 root     root           133 Aug 27  2021 profile
/ # cat /etc/group
root:x:0:root
/ # cat /etc/passwd
root:x:0:0:Linux User,,,:/root:/bin/sh

addgroup命令生成了group和group-文件。adduser命令生成了passwd和passwd-文件。
我们用passwd命令(不带任何参数)给root账户设置密码:

/ # passwd
Changing password for root
New password:
Retype password:
passwd: password for root changed by root
/ # cat /etc/passwd
root:7W5Zw34HC9p/M:0:0:Linux User,,,:/root:/bin/sh

现在root账户有了,cd /root后命令提示符也会变成~ #,不再是以前的/root #了。
但是有一个问题,cd ~不能切换到家目录/root,只能切换到根目录/。这是因为我们还没有给$HOME变量赋值。

~ # cd /
/ # HOME=/root
/ # cd ~
~ # ls

执行了HOME=/root后,cd ~就可以切换到/root了。为了使HOME变量的值永久生效,exit退出命令行或者reboot重启后也不会丢失,我们把这条命令加入到/etc/profile中。
我们可以用awk -F: "\$1==\"$USER\"{print \$6}" /etc/passwd来获取当前用户的家目录路径。

用vi编辑器打开/etc/profile,修改成如下内容:

# /etc/profile: system-wide .profile file for the Bourne shells

echo
echo -n "Processing /etc/profile... "
# no-op

awktext="\$1==\"$USER\"{print \$6}"
export HOME=`awk -F: "$awktext" /etc/passwd`
export PS1="[\\u@\\h \\w]\\$ "

echo "Done"
echo

其中PS1指定了命令提示符的格式:[用户名@主机名 当前路径]$。“\\$”表示超级用户(root)下以#结尾,其他用户下以$结尾。
这里HOME肯定不能直接写/root。后面搭建了telnet服务器后,一进去首先是要输入用户名和密码,万一登录的用户不是root,那么$USER就不是root了,但是开机时加载的还是/etc/profile文件。所以我们只好用awk去读取/etc/passwd文件,找到$USER用户对应的home目录,赋给HOME全局变量。
/etc/passwd文件的权限是644,所属用户和组都为root,root账户对这个文件有读写权限,其他用户都只有读权限。所有用户都有读权限,那就没问题。
修改inittab文件,也可以做到开机后串口里面要求输入用户名和密码,但是这对嵌入式设备没有必要。因为嵌入式设备的终端是用来调试的,产品的用户是看不到的。开机后自动登录root账户就行了。

修改完成后:wq保存文件。exit退出命令行,然后按回车键重新进入命令行,可以看到$HOME变量生效了,cd ~也能成功进入家目录/root了:

/ # vi /etc/profile
/ # exit
fracval = 0004
config: 8bits/char
setting ulcon to 00000003, brddiv to 53, udivslot 00000004
uart: ulcon = 0x00000003, ucon = 0x0000f3c5, ufcon = 0x00000131

Please press Enter to activate this console.

Processing /etc/profile... Done

[root@(none) /]# echo $HOME
/root
[root@(none) /]# cd ~
[root@(none) ~]# ls -l
total 28
-rwxr-xr-x    1 root     root           170 Jan  1 00:13 adc.sh
drwxr-xr-x    2 1000     1000          4096 Aug 28  2021 hello
drwxr-xr-x    2 1000     1000          4096 Sep  1  2021 hello_dynamic
drwxr-xr-x    2 1000     1000          4096 Aug 30  2021 leds
-rwxr-xr-x    1 root     root           256 Jan  1  2000 leds.sh
drwxr-xr-x    2 1000     1000          4096 Sep  2  2021 libtest
drwxr-xr-x    2 1000     1000          4096 Sep  2  2021 sl
[root@(none) ~]#

命令提示符也变了,可以同时显示当前登录的用户名,设备名称,还有当前路径。
设备名(主机名)目前仍然是(none),我们可以用hostname命令修改设备名:

[root@(none) /]# hostname exynos4412
[root@exynos4412 /]#

然而重启板子后设备名又消失了。解决办法是把设备名保存到/etc/hostname文件里面,然后在开机脚本/etc/init.d/rcS中用hostname命令读取/etc/hostname文件:

[root@(none) /]# echo exynos4412 > /etc/hostname
[root@(none) /]# vi /etc/init.d/rcS

rcS文件内容如下:

#! /bin/sh

/bin/mount -a
/bin/hostname -F /etc/hostname

这样重启后,设备名就不会丢失了,并且echo $HOSTNAME也能输出正确的设备名:

[root@exynos4412 /]# echo $HOSTNAME
exynos4412

不过现在还有一个问题,我们这个时候如果再创建几个普通用户的话,除了第一个用户(也就是用户号为1000的那个用户)能登录外,其他用户都无法登录,提示su: can't execute '/bin/sh': Permission denied,这个是不是很奇怪?
还有,1000号用户为什么有权限在根目录下创建文件夹?根目录下的其他文件夹里面就没有权限,这是为什么?
猜猜看是什么原因?答案见:嵌入式Linux Busybox创建用户后无法登录的解决方案_ZLK1214的专栏-CSDN博客

自动挂载或卸载U盘(热插拔)

我们插上U盘后,/mnt文件夹里面并不会自动出现U盘的文件夹,得我们手动用mount命令挂载上去。能不能插上U盘后,/mnt文件夹里面自动就挂载好文件夹呢?
Linux内核里面有热插拔检测的功能,我们只要配置好Busybox根文件系统里面的mdev,就可以实现热插拔自动挂载和卸载U盘了。
提示:
(1)虽然U盘拔下后会自动卸载并删除/mnt/xxx文件夹,但是为了防止文件系统被破坏,拔出U盘前最好手动执行umount /mnt/xxx,安全弹出U盘,然后再拔U盘。
(2)后面我们讲telnetd服务器的时候也会用到mdev。

我们先把之前建立的/mnt/myusbdisk文件夹删了:rmdir /mnt/myusbdisk。现在这个文件夹没有用了。
建立/etc/mdev.conf配置文件,内容如下:

sd[a-z][0-9]+   0:0 660 */etc/hotplug.sh

建立/etc/hotplug.sh脚本,内容如下:

#!/bin/sh
if [ "$ACTION" = "add" ]
then
        mkdir -p /mnt/$MDEV
        mount /dev/$MDEV /mnt/$MDEV
else
        umount /mnt/$MDEV
        rmdir /mnt/$MDEV
fi

给/etc/hotplug.sh添加可执行权限:chmod +x /etc/hotplug.sh
修改/etc/init.d/rcS文件,内容如下(在原来的基础上添加了最后四行代码):

#! /bin/sh

/bin/mount -a
/bin/hostname -F /etc/hostname

mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

reboot重启开发板。
起初,/mnt里面只有myfat文件夹。
插上U盘后,/mnt里面出现了sda1文件夹,进入sda1文件夹后可以看到U盘里面的内容。
拔出U盘,/mnt里面的sda1文件夹自动消失,只剩下myfat文件夹。
由于我们拔出U盘前没有手动执行umount /mnt/sda1命令安全弹出U盘,所以再插上U盘就会提示文件系统有问题,需要修复:
[   25.360519] FAT-fs (sda1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

U盘插到Windows电脑上,也会提示需要修复磁盘:

不过有了这个功能,假如设备上一直插着一个U盘的话,那么开机就会自动挂载这个U盘到/mnt目录下,关机前也会自动卸载,非常方便。不需要把U盘的信息写入到/etc/fstab里面。
只要中途不突然拔出U盘,无论怎么开关机,U盘文件系统都不会提示需要修复。
提示:关机前自动卸载U盘,靠的是/etc/inittab里面的:shutdown:/bin/umount -a -r这句话。

配置有线网络

迅为开发板上搭载的有线网口是HanRun HR911105A,网络芯片是Davicom公司的DM9621ANP。此芯片支持RMII接口和USB接口,迅为开发板采用的是USB接口与此芯片相连。
如下图所示,开发板左下角有两个大的USB口,还有一个小的micro USB OTG口,右下角就是DM9621A网口了。

exynos4412芯片带有一个USB_OTG接口,和两个HSIC接口。开发板上的USB_OTG接的就是那个小的micro USB OTG接口(CON7)。而两个HSIC只用了HSIC1,连接了USB3503A芯片(核心板右下角最小的那个正方形黑芯片,标号为U8),通过这个芯片扩展了三个USB口出来,其中两个就是那两个大的USB口,另一个接的就是板上的DM9621A芯片。
简单来说,就是exynos4412的HSIC1接了USB3503A芯片,这个芯片扩展出了3个USB端口。第一个口接的是中间那个大USB口(CON15),第二个口接的是DM9621A芯片,第三个口接的是左边那个大USB口(CON14)。
我们前面已经在两个大USB口上插过U盘了,U盘能正常识别和读写,mdev自动挂载/卸载U盘也没问题,这说明,USB3503A芯片是正常工作的,我们只需要在内核里面选中网口驱动,就能联网了。

DM9621A芯片的LED灯是无法通过寄存器配置的,芯片上三个灯的作用是固定的,低电平点亮,高阻态(Hi-Z)熄灭,属于开漏输出。三个灯的作用如下表所示。

引脚灯的颜色说明
USB_LED

USB处于高速模式:亮

USB处于全速模式:灭

USB正在传输数据:闪烁

SPD_LED绿

以太网速率为100Mbps:亮

以太网速率为10Mbps:灭

未插网线:灭

LNK_LED

插了网线:亮

没插网线:灭

插了网线,且正在传输数据:闪烁

习惯上,绿灯的亮灭表示连接状态,黄灯闪烁表示在收发数据。笔记本和台式电脑的网口基本都是这样设计的。那为什么迅为板子上是绿灯闪烁,黄灯不闪呢?因为迅为画板子的时候,把LNK和SPD灯接反了。如下图红框中所示,29脚LNK_LED本来该接LNK&ACT(黄灯)的,28脚SPD_LED本来该接sPEED(绿灯)的,但是红框中却接反了!大家画板子抄电路的时候一定要注意这个问题。

我们打开内核配置菜单(make menuconfig),进入到Device Drivers ---> Network device support ---> USB Network Adapters,选中Davicom DM96xx based USB 10/100 ethernet devices选项:

勾选的这个DM96xx网口驱动的驱动文件是drivers/net/usb/dm9601.c。虽然源文件的名称叫dm9601.c,但是这个文件是支持DM9621A芯片的,可以在文件内的struct usb_device_id products[]数组里面看到:

保存内核配置,重新编译内核并烧写到开发板中。启动开发板,我们就可以看到内核识别到了DM9621设备了:

DM9621 USB设备的VID为0x0a46,PID就是0x9621。用lsusb命令,也能看到这个9621设备:

[root@exynos4412 /]# lsusb
Bus 001 Device 003: ID 0a46:9621
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 0424:3503

然而,我们执行ifconfig命令,什么输出也没有,因为我们还没有配置网口的IP地址:

[root@exynos4412 /]# ifconfig
[root@exynos4412 /]#

我们执行下面三条命令,手动配置一下IP地址:
ifconfig lo up
ifconfig eth0 192.168.137.2 netmask 255.255.255.0
route add default gw 192.168.137.1

现在再执行ifconfig命令,就能看到eth0和lo两个网络接口了。
lo是本地回环接口,IP地址为127.0.0.1(localhost)。
eth0就是DM9621A网口,IP地址为192.168.137.2,子网掩码为255.255.255.0,默认网关为192.168.137.1(路由器的IP地址)。

我们ping一下IP地址,已经可以ping通了,但是www.baidu却无法ping通,原因是我们还没有配置DNS服务器的地址:

[root@exynos4412 /]# ping 8.8.8.8 -c 4
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=107 time=431.978 ms
64 bytes from 8.8.8.8: seq=1 ttl=107 time=63.421 ms
64 bytes from 8.8.8.8: seq=2 ttl=107 time=72.447 ms
64 bytes from 8.8.8.8: seq=3 ttl=107 time=298.730 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 63.421/216.644/431.978 ms
[root@exynos4412 /]# ping 8.8.4.4 -c 4
PING 8.8.4.4 (8.8.4.4): 56 data bytes
64 bytes from 8.8.4.4: seq=0 ttl=109 time=229.352 ms
64 bytes from 8.8.4.4: seq=1 ttl=109 time=250.390 ms
64 bytes from 8.8.4.4: seq=2 ttl=109 time=282.585 ms
64 bytes from 8.8.4.4: seq=3 ttl=109 time=240.822 ms

--- 8.8.4.4 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 229.352/250.787/282.585 ms
[root@exynos4412 /]# ping www.baidu -c 4
ping: bad address 'www.baidu'

于是我们建立/etc/resolv.conf文件,配置DNS服务器的地址为8.8.8.8,然后再试:

[root@exynos4412 /]# echo "nameserver 8.8.8.8" > /etc/resolv.conf
[root@exynos4412 /]# ping www.baidu -c 4
PING www.baidu (14.215.177.39): 56 data bytes
64 bytes from 14.215.177.39: seq=0 ttl=48 time=97.472 ms
64 bytes from 14.215.177.39: seq=1 ttl=48 time=92.706 ms
64 bytes from 14.215.177.39: seq=2 ttl=48 time=66.773 ms
64 bytes from 14.215.177.39: seq=3 ttl=48 time=72.480 ms

--- www.baidu ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 66.773/82.357/97.472 ms
[root@exynos4412 /]# cd ~
[root@exynos4412 ~]# wget http://savannah.nongnu/projects/lwip/
Connecting to savannah.nongnu (209.51.188.72:80)
index.html           100% |*******************************| 26455   0:00:00 ETA
[root@exynos4412 ~]# ls -l index.html
-rw-r--r--    1 root     root         26455 Jan  1 00:09 index.html
[root@exynos4412 ~]#

这下就能ping通百度了,wget也能成功下载网页,保存为index.html文件。
为了使IP地址永久生效,关机后也不会丢失,我们把之前那三条命令加入到/etc/init.d/rcS开机脚本中:

这样,开机后网口就能直接使用,可以直接ping通百度。

使用Busybox HTTP服务器

Busybox自带了一个http服务器,使用httpd命令就能启动这个服务器,用-h参数指定网页文件的存放位置。
服务器启动后会进入后台运行,可以用ps | grep httpd命令查看服务器是否正在后台运行。

[root@exynos4412 /]# mkdir -p /var/www/html
[root@exynos4412 /]# httpd -h /var/www/html
[root@exynos4412 /]# ps | grep httpd
  177 root       0:00 httpd -h /var/www/html
  179 root       0:00 grep httpd

http服务器启动后,用电脑上的浏览器访问一下试试看,访问的网址是http://板子IP。

提示404错误,找不到网页。这是因为我们还没有建立网页文件。
我们建立一个/var/www/html/index.html网页文件试试:

[root@exynos4412 /]# cd /var/www/html
[root@exynos4412 /var/www/html]# vi index.html

网页内容如下(采用了React前端框架):

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Hello Busybox</title>
<script src="https://unpkg/react@17/umd/react.development.js"></script>
<script src="https://unpkg/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
class Clock extends React.Component {
	constructor(props) {
		super(props)
		this.state = {date: new Date()}
	}
	componentDidMount() {
		this.timerID = setInterval(() => this.tick(), 1000)
	}
	componentWillUnmount() {
		clearInterval(this.timerID)
	}
	tick() {
		this.setState({date: new Date()})
	}
	render() {
		return (
			<div>
				<h1>Hello World</h1>
				<h2>It is {this.state.date.toLocaleString()}.</h2>
			</div>
		)
	}
}
ReactDOM.render(<Clock />, document.getElementById("root"))
</script>
</head>

<body>
<div id="root"></div>
</body>
</html>

网页保存后,不用重启httpd服务器,就能直接在浏览器中看到网页:

HTTP服务器支持IPv6,用http://[fe80::200:ffff:feff:0]/这个网址也可以访问。

使用Busybox FTP服务器

Busybox自带了一个ftp服务器,使用tcpsvd 0 21 ftpd -w / &命令就能启动这个服务器,其中-w参数指定的是FTP服务器根目录的位置。
和httpd服务器不同,ftpd服务器启动后不会进入后台运行,而是在前台占用命令行。
要想使服务器在后台运行,启动服务器的命令末尾要加“&”符号。服务器启动后,可以用ps | grep ftpd命令查看服务器是否正在后台运行。

[root@exynos4412 /]# tcpsvd 0 21 ftpd -w / &
[root@exynos4412 /]# ps | grep tcpsvd
  230 root       0:00 tcpsvd 0 21 ftpd -w /
  233 root       0:00 grep tcpsvd

用Windows文件管理器打开FTP服务器,使用root账户登录,密码为之前用passwd命令设置的内容。

密码输入正确,登录成功后,我们就能看到根目录下的内容了:

可以新建文件夹,上传和下载文件,重命名和删除文件。不过唯一不足的是,这个ftp服务器对中文支持不好。中文文件上传上去,文件名就会变成问号,而且无法在ftp中删除这些文件,只能去命令行里面用rm命令删除。

经测试,FTP服务器不支持IPv6,无法通过IPv6地址访问。

使用Busybox Telnet服务器

telnet服务器依赖于mdev,所以使用telnet服务器前,一定要先配置好U盘的自动挂载/卸载功能。
执行telnetd命令就能启动服务器了,服务器启动后自动转入后台运行。
如果telnetd命令执行后,用ps | grep telnetd看不到telnetd进程,说明mdev没有配置好,telnetd服务器启动失败。

[root@exynos4412 /]# telnetd
[root@exynos4412 /]# ps | grep telnetd
  274 root       0:00 telnetd
  276 root       0:00 grep telnetd

打开Windows系统的控制台(cmd),执行telnet 192.168.137.2命令,就能连接板子的telnet服务器了。连接成功后首先输入root账号的用户名和密码,然后进入的是shell界面。
提示:如果Windows里面提示找不到telnet命令,则需要在 控制面板--->程序和功能-->打开或关闭Windows功能 里面安装telnet客户端。

而且还能同时打开多个telnet终端,终端里面还可以运行sl程序跑一下小火车:

有了telnet服务器,我们就可以不要串口线,直接通过网口连接板子的shell终端,操作板子了!
板子的IPv6地址为fe80::200:ffff:feff:0,我们还可以通过IPv6连接板子。
在/dev/pts文件夹里面可以看到当前一共连接了多少个终端。

到现在,HTTP、FTP和Telnet服务器都已经正常工作了,我们将其加入开机脚本/etc/init.d/rcS中,让它们开机自动启动:

使用ftpget和ftpput命令

除了使用Busybox FTP服务器外,我们可以在自己电脑上搭建一个FTP服务器,让板子来访问。用ftpget命令下载文件,用ftpput命令上传文件。
我们可以使用Windows里面的Internet 信息服务(IIS)来搭建FTP服务器。在“打开或关闭Windows功能”里面安装好IIS(要勾选FTP),然后打开IIS管理器,我们要配置成登录用户和匿名用户访问不同的文件夹,登录用户有读写权限,匿名用户只有读权限,操作步骤如下。
添加FTP站点,文件夹路径为C:\inetpub\ftproot:

选择No SSL:

勾选Anonymous(匿名)和Basic认证方式,打开登录用户(All users)的读写权限,然后点击Finish按钮:

进入FTP User Isolation(用户文件夹隔离)配置:

选择Isolate users. User name physical directory (enable global virtual directories),然后点击Apply:

建立C:\inetpub\ftproot\LocalUser\Public文件夹,供匿名用户使用,在里面放置一个from_public.c文件。
建立C:\inetpub\ftproot\LocalUser\Oct1158文件夹,供登录用户Oct1158(选择自己电脑的用户名)使用,在里面放置一个from_oct1158.c文件。

关闭Windows防火墙:

现在,匿名用户可以登录FTP,只有读权限。登录用户Oct1158后,可读可写。让我们在板子上试试看。
匿名登录服务器,下载from_public.c文件:ftpget 192.168.137.1 from_public.c
通过Oct1158账户登录服务器,密码为XXXXXX,下载from_oct1158.c文件:ftpget -u oct1158 -p XXXXXX 192.168.137.1 from_oct1158.c
匿名登录服务器,上传leds.sh文件:ftpput 192.168.137.1 leds.sh
(上传失败,提示ftpput: unexpected server response to STOR: 550 Access is denied.)
通过Oct1158账户登录服务器,密码为XXXXXX,上传leds.sh文件:ftpput -u oct1158 -p XXXXXX 192.168.137.1 leds.sh
如果执行ftpget/ftpput命令后,一直停住不动,就说明电脑防火墙没关,板子访问不了电脑上的ftp服务器。

通过网络烧写uboot、内核和设备树

以前要烧写uboot、内核和设备树,板子要先关机,取下内存卡,拿一个读卡器把内存卡插到电脑上,插入虚拟机中,再使用dd命令烧写。烧写完了,安全弹出读卡器,把内存卡插到板子上,板子再开机,很麻烦。
但是现在有了网络,就要简单很多了。我们事先把uboot、内核和设备树文件放到电脑的IIS FTP服务器上(C:\inetpub\ftproot\LocalUser\Public),在板子上通过ftpget命令下载,然后直接在板子上执行dd命令烧写,再reboot重启板子就可以了。

exynos4412 login: root
Password:

Processing /etc/profile... Done

[root@exynos4412 ~]# mkdir kernel
[root@exynos4412 ~]# cd kernel
[root@exynos4412 ~/kernel]# ftpget 192.168.137.1 u-boot-iTOP-4412.bin
[root@exynos4412 ~/kernel]# ftpget 192.168.137.1 uImage
[root@exynos4412 ~/kernel]# ftpget 192.168.137.1 myexynos4412-itop-elite.dtb
[root@exynos4412 ~/kernel]# ls
myexynos4412-itop-elite.dtb  u-boot-iTOP-4412.bin         uImage
[root@exynos4412 ~/kernel]# dd if=u-boot-iTOP-4412.bin of=/dev/mmcblk0 seek=1
781+1 records in
781+1 records out
400112 bytes (390.7KB) copied, 0.073484 seconds, 5.2MB/s
[root@exynos4412 ~/kernel]# dd if=uImage of=/dev/mmcblk0 seek=4096
10776+1 records in
10776+1 records out
5517576 bytes (5.3MB) copied, 1.042179 seconds, 5.0MB/s
[root@exynos4412 ~/kernel]# dd if=myexynos4412-itop-elite.dtb of=/dev/mmcblk0 seek=2048
109+1 records in
109+1 records out
55843 bytes (54.5KB) copied, 0.010244 seconds, 5.2MB/s
[root@exynos4412 ~/kernel]# reboot
[root@exynos4412 ~/kernel]#

Connection to host lost.

通过DHCP自动从路由器获取IP地址

Busybox里面自带了udhcpc和udhcpd两种程序。
udhcpc是DHCP客户端,板子和路由器之间插了一根网线,板子通过路由器上网,板子是从路由器那里获取IP地址和DNS服务器的地址。
udhcpd是DHCP服务器,板子本身做路由器,其他设备插到板子上,通过板子来上网。
显然我们这里应该采用的是udhcpc。
有了DHCP,我们就不需要手工配置网口的IP地址和DNS服务器地址,直接就能上网,ping通百度。以下是udhcpc的配置过程。
首先我们删除之前手工配置的DNS服务器地址:

[root@exynos4412 /]# rm /etc/resolv.conf

将busybox压缩包里面的examples/udhcp/simple.script复制到根文件系统的usr/share/udhcpc文件夹下,并重命名为default.script:

[oct1158@fedora df9ab0e3-4168-4efe-8175-fb6eb4af4e03]$ sudo mkdir -p usr/share/udhcpc/
[sudo] password for oct1158: 
[oct1158@fedora df9ab0e3-4168-4efe-8175-fb6eb4af4e03]$ sudo cp ~/Downloads/busybox-1.26.2/examples/udhcp/simple.script usr/share/udhcpc/default.script

修改根文件系统的/etc/init.d/rcS开机脚本,删除一切关于eth0的配置,然后添加udhcpc命令:
ifconfig lo up
udhcpc -b -x hostname:$(hostname) &

#! /bin/sh

/bin/mount -a
/bin/hostname -F /etc/hostname

mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

ifconfig lo up
udhcpc -b -x hostname:$(hostname) &

httpd -h /var/www/html
tcpsvd 0 21 ftpd -w / &
telnetd

udhcpc的-b参数是必须要加的,防止板子没插网线,开机时一直在那里获取IP地址,一直打印udhcpc: sending discover。
有了-b参数,打印几次udhcpc: sending discover后就会提示udhcpc: no lease, forking to background,程序自动转入后台运行。等到有网的时候,程序在后台自动获取IP地址,不向控制台打印任何信息。
加-x hostname:$(hostname)参数是为了能在路由器的管理页面里面看到设备名称。注意$(hostname)不能换成$HOSTNAME,因为开机时$HOSTNAME的值为(none)。
加&的目的是开机时udhcpc立即转入后台运行,缩短开机时间。

配置完毕,重新启动开发板,一开机就能够直接ping通百度:

[root@exynos4412 /]# ping www.baidu -c 4
PING www.baidu (36.152.44.95): 56 data bytes
64 bytes from 36.152.44.95: seq=0 ttl=52 time=34.727 ms
64 bytes from 36.152.44.95: seq=1 ttl=52 time=61.846 ms
64 bytes from 36.152.44.95: seq=2 ttl=52 time=161.664 ms
64 bytes from 36.152.44.95: seq=3 ttl=52 time=65.887 ms

--- www.baidu ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 34.727/81.031/161.664 ms

用ps命令可以看到,udhcpc进程一直在后台运行,没有退出:

[root@exynos4412 /]# ps | grep udhcpc
  573 root       0:00 udhcpc -b -x hostname exynos4412
  585 root       0:00 grep udhcpc

此外还可以发现,udhcpc运行后,/etc/resolv.conf文件又自动重新生成了:

[root@exynos4412 /]# cat /etc/resolv.conf
search mshome
nameserver 192.168.137.1

路由器管理页面里面可以看到exynos4412这个设备:

让板子通过笔记本电脑上网

有些环境下,特别是公司里面,路由器往往离桌子很远,板子上又只有有线网口。如果找不到那么长的网线,那调试起来就很不方便。
现在的笔记本电脑一般同时拥有有线网口和无线网卡(WiFi),如果笔记本电脑通过WiFi连接远处的无线路由器上网,然后板子的网线插到电脑的有线网口上,通过电脑上网,那就好了。
Windows系统提供了Internet 连接共享(ICS)的功能,笔记本的无线网卡连接了无线路由器,能上网之后,我们在无线网卡上启用ICS,将连接共享到有线网卡上,板子插一根网线到这个有线网卡上,板子就能上网了。

此时,有线网卡的IP地址和子网掩码自动变为192.168.137.1 255.255.255.0,默认网关为空。这说明Windows在有线网卡上成功启用了DHCP服务器,板子可以从电脑自动获取到IP地址。
也就是说,Windows系统不仅有DHCP客户端的功能,也有DHCP服务器的功能。

[下一篇]

本文标签: 最小 精英 开发板 教程 系统