IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(四) -> 正文阅读

[系统运维]【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(四)

[上一篇]

配置用户账户

到目前为止,我们的最小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通百度。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:57:06  更:2021-09-04 17:58:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 13:25:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码