1. 依赖工具的准备
1.1. Netcat编译安装
1.1.1. netcat编译
从以下地址获取netcat_1.10.orig.tar.gz与netcat_1.10-38.diff.gz 其中 netcat_1.10.orig.tar.gz是原生的 nc,netcat_1.10- 38.diff.gz 是升级包。由于atlas200的架构是arm架构,所以执行文件要编译成支持arm架构,建议在atlas200系统中编译。
下载完成后先解压:
$ ls netcat_1.10-38.diff.gz* netcat_1.10.orig.tar.gz* $ tar xvf netcat_1.10.orig.tar.gz ... $ ls netcat-1.10.orig/ netcat_1.10-38.diff.gz* netcat_1.10.orig.tar.gz*
接着是释放补丁
$ cd netcat-1.10.orig $ ls Changelog README generic.h netcat.c stupidh* Makefile data/ netcat.blurb scripts/ $ zcat ../netcat_1.10-38.diff.gz | patch -p1 $ ls Changelog README debian/ nc.1 netcat.c stupidh* Makefile data/ generic.h netcat.blurb scripts/
补丁被释放到 debian 目录下。然后就是给源代码打补丁了。
$ sed 's#^#patch -Np1 -i debian/patches/#' debian/patches/series | sh patching file Makefile patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file debian/nc.1 patching file netcat.c patching file debian/nc.1 patching file netcat.c patching file debian/nc.1 patching file data/rservice.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file netcat.c patching file scripts/webproxy $
最后,为了能使用 -c 和 -e 选项,还要再修改一下 Makefile 文件。将 Makefile 的第 11 行“# DFLAGS = - DTEST -DDEBUG”替换成“DFLAGS = -DDEBIAN_VERSION=‘“1.10-38”’ -DGAPING_SECURITY_HOLE -DIP_TOS -DTELNET” ,保存退出。这样,就可以运行“make nc”来编译了。
解决编译报错
当编译报一下错误时:
/tmp/ccjGX0yn.o: In function `main':
netcat.c:(.text+0x1e64): undefined reference to `res_init'
collect2: error: ld returned 1 exit status
Makefile:32: recipe for target 'nc' failed
make: *** [nc] Error 1
通过修改netcat.c文件,将下面的代码中的res_init()行注释掉,保存代码即可解决。
#ifdef HAVE_BIND
/* can *you* say "cc -yaddayadda netcat.c -lresolv -l44bsd" on SunLOSs? */
res_init();
#endif
1.1.2. 安装
编译完成后会在当前目录下生成一个“nc”。你可以试试运行“nc -h”看看版本号是否正确。先保存nc工具,后续在恢复atlas200模块的系统时通过网络copy到装备系统中的“/bin”目录下,并将“nc.1”复制到 “/usr/share/man/man1”目录里。这样就安装完成了。
$ nc -h [v1.10-38] connect to somewhere: nc [-options] hostname port[s] [ports] ... listen for inbound: nc -l -p port [-options] [hostname] [port] options: -c shell commands as `-e'; use /bin/sh to exec [dangerous!!] -e filename program to exec after connect [dangerous!!] -b allow broadcasts -g gateway source-routing hop point[s], up to 8 -G num source-routing pointer: 4, 8, 12, ... -h this cruft -i secs delay interval for lines sent, ports scanned -k set keepalive option on socket -l listen mode, for inbound connects -n numeric-only IP addresses, no DNS -o file hex dump of traffic -p port local port number -r randomize local and remote ports -q secs quit after EOF on stdin and delay of secs -s addr local source address -T tos set Type Of Service -t answer TELNET negotiation -u UDP mode -v verbose [use twice to be more verbose] -w secs timeout for connects and final net reads -z zero-I/O mode [used for scanning] port numbers can be individual or ranges: lo-hi [inclusive]; hyphens in port names must be backslash escaped (e.g. 'ftp/-data').
1.2. dd 工具
Atlas200模块自带的系统中已经有了dd工具,需要把它提取出来,后续在恢复atlas200模块的系统时通过网络copy到装备系统中。
2. 备份Atlas200模块的系统
可以通过网路将atlas200模块的系统备份到AES100的主控COME板的磁盘中,以下我们将以AES100中A2设备(atlas200模块)为例来讲解如何备份A2的系统Image
2.1. 环境准备
AES100设备正常开机,前面板A1的灯亮绿色代表A1设备工作正常。
远程登录到AES100的主控系统
$ ssh aes100@<你的aes100的外网ip地址>
输入aes100用户的密码:123
2.2. 接收端配置
主控系统作为接收端开启nc服务(AES100主控系统中默认已经安装了netcat,如果没有请运行,apt install netcat-openbsd来安装netcat)监听,将接收到的数据通过管道导出到dd命令,然后写入文件中。注意,先配置接收端,然后配置发送端!
$ nc -l -p 1234|dd of=<你的image保存路径> bs=1M status=progress
2.3. 发送端配置
atlas200模块作为数据的发送端,通过nc与接收端连接,将dd命令从磁盘读出来的数据发送给接收端。
通过AES100的主控系统登录到atlas200模块的系统
$ ssh HwHiAiUser@<你的atlas200模块的ip地址> #HwHiAiUser的默认密码是:Mind@123
运行
$ su root #切换到root用户,root默认密码为Mind@123
$ dd if=/dev/mmcblk0 bs=1M status=progress|nc <接收端ip地址> 1234
启动后,你会在接收端和发送端的终端界面上看到类似一下的进度信息:
31280070656 bytes (31 GB, 29 GiB) copied, 2222 s, 14.1 MB/s
当出现以下信息,并且输入回车也不更新上面的进度信息后,代表备份完成。
29832+0 records in
29832+0 records out
这是可以查看你的Image文件大小,检查是否备份成功。
3. 恢复Atlas200模块系统
当恢复atlas200模块系统时,atlas200装备系统作为接收端,AES100主控系统作为发送端,通netcat建立的网络连接,发送端通过dd命令读取image文件数据,通过网络发送给接收端,接收端收到数据通过管道命令导入到dd命令,然后写入emmc(/dev/mmcblk0)设备。
3.1. 进入Atlas200装备系统
Atlas200模块内部flash装有一个openEuler的精简版Linux系统,你可以认为它是一个live sytem,我们称之为:装备系统。我们可以通过控制让atlas200模块重启进入装备系统,通过在系统中运行dd命令将系统Image写入emmc设备(/dev/mmcblk0)。
在AES100主控系统,找到AES100脚本的安装目录,在目录中运行:
$ ./atlas_emmc_icp.sh 1 connect #让设备1下次启动自动进入装备系统,注意“1”代表你要指定哪个设备
$ ./atlas_reset.sh 1 #让设备1重启
根据《AES100快速上手指南》找到主控系统中管理设备1的网卡设备名,将网卡的IP设置成与设备1的同一网段,atlas200的装备系统的网卡ip地址默认为:192.168.0.2,例如:目前主控系统中管理设备1的网卡名为enp2s0。
$ ifconfig enp2S0 192.168.0.100
登录到装备系统
$ ssh HwHiAiUser@192.168.0.2 #HwHiAiUser的用户名密码为:Huawei2012#
$ su root #切换到root用户,root密码为:Huawei12#$
3.2. 安装工具
我们在第1部分准备了nc和dd,现在将这两个工具传到装备系统上来,在装备系统上运行一下命令拷贝工具到/root目录下。
$ scp aes100@192.168.0.100:~/nc /root #注意这里nc和dd都放在主控系统的aes100用户目录中
$ scp aes100@192.168.0.100:~/dd /root
3.3. 接收端配置
装备系统作为接收端开启nc服务监听,将接收到的数据通过管道导入到dd命令,然后写入到emmc设备中。注意,先配置接收端,然后配置发送端!
$ /root/nc -l -p 1234 | dd of=/dev/mmcblk0 bs=1M status=progress conv=noerror
3.4. 发送端配置
AES100主控系统作为数据的发送端,通过nc与接收端连接,将dd命令从Image文件中读取数据发送给接收端。
在AES100的主控系统中运行一下命令:
$ dd if=<你的image存放的路径> bs=1M status=progress|nc 192.168.0.2 1234
启动后,你会在接收端和发送端的终端界面上看到类似一下的进度信息:
31280070656 bytes (31 GB, 29 GiB) copied, 2222 s, 14.1 MB/s
当出现以下信息,并且输入回车也不更新上面的进度信息后,代表备份完成。
29832+0 records in
29832+0 records out
3.5. 重启设备并验证
当3.4和3.5的操作完成后,可以在主控系统上运行一下命令来控制设备正常启动,并进入工作系统。
$ ./atlas_emmc_icp.sh 1 disconnect #让设备1退出装备系统模式
$ ./atlas_reset.sh 1 #重启设备
$ ./atlas_con.sh 1 #切换串口到设备1
$ minicom -D /dev/ttyS4 #这里ttyS4连接到设备1的串口,具体设备对应的串口号,请参考《AES100快速指南》
切换到串口,你可以看到正常的系统启动过程,然后可以登录到系统。
4. 注意事项
- 由于AES100支持24个atlas200模块,这些模块分为6组,每组4个模块共享一个串口输出和一个网段。所以如果要并行烧录,只能组间并行,并且要修改装备系统的ip,确保组与组在不通的子网段。