[上一篇]
配置用户账户
到目前为止,我们的最小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指定了命令提示符的格式。PS1字符串必须用单引号,不能用双引号,否则超级用户下命令提示符不能变成#号。 修改完成后: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
自动挂载或卸载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 127.0.0.1 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.com却无法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.com -c 4
ping: bad address 'www.baidu.com'
于是我们建立/etc/resolv.conf文件,配置DNS服务器的地址为8.8.8.8,然后再试:
[root@exynos4412 /]# echo "nameserver 8.8.8.8" > /etc/resolv.conf
[root@exynos4412 /]# ping www.baidu.com -c 4
PING www.baidu.com (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.com 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.org/projects/lwip/
Connecting to savannah.nongnu.org (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通百度。
|