欧拉操作系统项目环境配置

欧拉系统网络配置

第一次连接工控机不知道具体网口IP,可以用串口连接,具体详见:串口连接工控机
连接后查看某个网口IP,可以用于连接笔记本,方便操作,也可以直接在串口连接情况下执行以下操作

配置各个网口文件

之后配置各个网口文件,我们工控机有四个网口,我现在需要用三个,一个连接笔记本,另外两个连接激光雷达
因为后续工控机只能无线连接,所以还需要配置usb无线网卡

先来配置连接笔记本的网口eth0
创建 eth0 静态连接

nmcli connection add type ethernet con-name "eth0" ifname eth0 \
    ip4 192.168.137.20/24 gw4 192.168.137.1 \
    ipv4.dns "8.8.8.8 114.114.114.114" \
    ipv4.method manual \
    ipv4.never-default no \
    ipv6.method auto \
    ipv6.never-default no \
    ipv6.addr-gen-mode stable-privacy \
    connection.autoconnect yes

启用连接

nmcli connection up "eth0"

检查 IP 分配

ip addr show eth0

查看具体内容

sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0

eth0配置内容如下:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.137.20
PREFIX=24
GATEWAY=192.168.137.1
DNS1=8.8.8.8
DNS2=114.114.114.114
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=72db86eb-cf73-4a54-9214-3135e1e20a50
DEVICE=eth0
ONBOOT=yes

再来创建连接北醒激光雷达的网口文件eth1,具体查看激光雷达手册中激光雷达默认IP
创建 eth1 静态连接

nmcli connection add type ethernet con-name "eth1" ifname eth1 \
    ip4 192.168.0.10/24 gw4 192.168.0.1 \
    ipv4.method manual \
    ipv4.never-default no \
    ipv4.dns-priority 0 \
    ipv6.method auto \
    ipv6.never-default no \
    ipv6.addr-gen-mode stable-privacy \
    connection.autoconnect yes \
    +ipv4.routes "192.168.0.0/24 0.0.0.0 101"

启用连接

nmcli connection up "eth1"

检查 IP 分配

ip addr show eth1
sudo vim /etc/sysconfig/network-scripts/ifcfg-eth1

eth1配置内容如下:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.0.10
PREFIX=24
GATEWAY=192.168.0.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth1
UUID=b4338ff2-fb98-4d69-8943-f9db48f291d7
DEVICE=eth1
ONBOOT=yes
IP1_ROUTE=192.168.0.0/24 0.0.0.0 101

创建连接探维激光雷达的网口文件eth3,具体查看激光雷达手册中激光雷达默认IP
创建 eth3 静态连接

nmcli connection add type ethernet con-name "eth3" ifname eth3 \
    ip4 192.168.111.204/24 \
    ipv4.method manual \
    ipv4.never-default yes \
    ipv6.method disabled \
    connection.autoconnect yes \
    +ipv4.routes "192.168.111.0/24 0.0.0.0 103"

启用连接

nmcli connection up "eth3"

检查 IP 分配

ip addr show eth3
sudo vim /etc/sysconfig/network-scripts/ifcfg-eth3

eth3配置内容如下:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.111.204
PREFIX=24
DEFROUTE=no
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=no
IPV6_DEFROUTE=no
IPV6_FAILURE_FATAL=no
NAME=eth3
UUID=267d8561-9bae-429e-a1f2-4a114a542909
DEVICE=eth3
ONBOOT=yes
IP1_ROUTE=192.168.111.0/24 0.0.0.0 103

为了能够与激光雷达正常通信,查看一下路由表是否有刚刚添加的路由192.168.12.0和192.168.111.0

ip route
default via 192.168.137.1 dev eth0 proto static metric 100
default via 192.168.0.1 dev eth1 proto static metric 101
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.10 metric 101
192.168.12.0/24 dev wlp2s0u2u3u3 proto kernel scope link src 192.168.12.1
192.168.111.0/24 dev eth3 proto kernel scope link src 192.168.111.204 metric 103
192.168.137.0/24 dev eth0 proto kernel scope link src 192.168.137.20 metric 100

若没有相关两条路由,则命令手动添加

ip route add 192.168.0.0/24 dev eth1
ip route add 192.168.111.0/24 dev eth3

若关机重启后发现路由表被重置了,可以在/etc/rc.d/rc.local(记得chmod +x赋可执行权限)中添加以下内容

if ! ip route show | grep -q "192.168.111.0/24 dev eth3 src 192.168.111.204"; then
  /sbin/ip route add 192.168.111.0/24 dev eth3 src 192.168.111.204
fi
if ! ip route show | grep -q "192.168.0.0/24 dev eth1"; then
  /sbin/ip route add 192.168.0.0/24 dev eth1
fi

也可以添加让系统自动协商的命令

ethtool -s eth1 autoneg on
ethtool -s eth3 autoneg on

配置usb无线网卡
具体无线网卡选型和配置方案详见:工控机测试插入usb无线网卡并分享热点

sudo vim /etc/hostapd/hostapd.conf
interface=wlp2s0u2u3u3
driver=nl80211
ssid=OpenEulerAP
hw_mode=g
channel=6
wmm_enabled=0
auth_algs=1
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ignore_broadcast_ssid=0

开启usb无线网卡热点脚本

sudo vim /usr/local/bin/start_hotspot.sh
#!/bin/bash

IFACE="$1"
LOG="/var/log/hotspot_auto.log"

echo "$(date): Waiting for interface $IFACE to appear..." >> "$LOG"
for i in {1..30}; do
  if ip link show "$IFACE" &>/dev/null; then
    echo "$(date): Interface $IFACE found." >> "$LOG"
    break
  fi
  sleep 1
done
if ! ip link show "$IFACE" &>/dev/null; then
  echo "$(date): ERROR: Interface $IFACE not found after 30 seconds." >> "$LOG"
  exit 1
fi

nmcli device set "$IFACE" managed no
echo "$(date): Unmanaged $IFACE via NetworkManager." >> "$LOG"

pkill -f "wpa_supplicant .*$IFACE"
pkill -f "hostapd .*$IFACE"
echo "$(date): Killed conflicting processes for $IFACE." >> "$LOG"

modprobe -r rt2800usb rt2x00usb rt2x00lib mac80211 cfg80211 || modprobe -r --force "$_"
modprobe rt2800usb
sleep 2
echo "$(date): Reloaded wireless drivers." >> "$LOG"

ip link set "$IFACE" down
ip addr flush dev "$IFACE"
iw dev "$IFACE" set type __ap
ip link set "$IFACE" up

for i in {1..10}; do
  state=$(cat /sys/class/net/"$IFACE"/operstate)
  echo "$(date): operstate=$state (try $i)" >> "$LOG"
  if [[ "$state" == "up" ]]; then
    echo "$(date): Interface $IFACE operstate is up." >> "$LOG"
    break
  fi
  sleep 1
done
for i in {1..10}; do
  carrier=$(cat /sys/class/net/"$IFACE"/carrier 2>/dev/null)
  echo "$(date): carrier=$carrier (try $i)" >> "$LOG"
  if [[ "$carrier" == "1" ]]; then
    echo "$(date): Interface $IFACE carrier is up." >> "$LOG"
    break
  fi
  sleep 1
done
ip addr add 192.168.12.1/24 dev "$IFACE"
/usr/local/bin/hostapd -B /etc/hostapd/hostapd-"$IFACE".conf >> "$LOG" 2>&1
systemctl restart dnsmasq
echo "$(date): Hotspot started on $IFACE." >> "$LOG"

我把wifi热点启动的脚本加入了开机自启文件

sudo vim /etc/rc.d/rc.local

添加下面一行内容

/usr/local/bin/start_hotspot.sh wlp2s0u2u3u3

为了能够让wifi成功开机自启,我们先让networkmanager启动,随后rc.local启动
因此我们调整 rc-local.service 启动顺序
确保 rc-local 在网络设备初始化和 NetworkManager 之后启动,避免时机过早:

sudo vim /usr/lib/systemd/system/rc-local.service

在 [Unit] 部分添加依赖:

[Unit]
Description=/etc/rc.d/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
After=network.target NetworkManager.service systemd-udev-settle.service
Wants=network.target NetworkManager.service systemd-udev-settle.service

重新加载服务配置

sudo systemctl daemon-reload

启用并启动rc-local

sudo systemctl enable --now rc-local.service

查看状态(若失败,检查日志)

sudo systemctl status rc-local.service
cat /var/log/hotspot_auto.log

配置完成后,各个网口的情况如下

工控机联网方案

由于工控机无法联网,我需要将自己笔记本作为中继让工控机联网

笔记本连接校园网WiFi,笔记本流量转发到网口,网口接工控机网口,从而让工控机连接外网,为后续开发环境配置打下基础

具体方案详见本人博客:Ascend开发板镜像烧录、联网、其他设备访问

我笔记本的网络配置

将以太网配置到与工控机网口同一子网下,记得点确定

将校园网共享到这个以太网口,这是工控机就可以联网了

因为项目是课题组多人共同开发,所以需要允许其他成员经过我笔记本中转连接工控机
我们需要配置流量转发规则,让经由ssh连接的流量转发到工控机,具体方案详见本人博客:Ascend开发板镜像烧录、联网、其他设备访问

欧拉系统换源

确定使用的OS版本

cat /etc/*-release

备份原来的源

mv /etc/yum.repos.d/openEuler.repo /etc/yum.repos.d/openEuler.repo.bak

根据自己的版本找到对应 yum源
我的操作系统版本openEuler-22.03-LTS-SP3、架构aarch64

sudo vim /etc/yum.repos.d/openEuler.repo
[openEuler-everything]
name=openEuler-everything
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP3/everything/aarch64/
enabled=1
gpgcheck=0
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP3/everything/aarch64/RPM-GPG-KEY-openEuler

[openEuler-EPOL]
name=openEuler-epol
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP3/EPOL/main/aarch64/
enabled=1
gpgcheck=0

[openEuler-update]
name=openEuler-update
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP3/update/aarch64/
enabled=1
gpgcheck=0

谨慎更新!!!!无必要不更新!!!

sudo yum update -y

欧拉系统时间同步

安装chrony服务

sudo dnf install chrony -y
sudo vim /etc/chrony.conf

添加NTP服务器地址

server ntp.huaweicloud.com iburst
server ntp.aliyun.com iburst
server 0.cn.pool.ntp.org iburst
server 203.107.6.88 iburst
server s2d.time.edu.cn iburst
server s2h.time.edu.cn iburst
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
#pool pool.ntp.org iburst
#server ntp.huaweicloud.com iburst
server ntp.aliyun.com iburst
#server 0.cn.pool.ntp.org iburst
#server 203.107.6.88 iburst
#server s2d.time.edu.cn iburst
#server s2h.time.edu.cn iburst
#server 127.127.1.0
#fudge 127.127.1.0 stratum 10 prefer
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
#rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.
local stratum 10
# Require authentication (nts or key option) for all NTP sources.
#authselectmode require

# Specify file containing keys for NTP authentication.
#keyfile /etc/chrony.keys

# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony

# Insert/delete leap seconds by slewing instead of stepping.
#leapsecmode slew

# Get TAI-UTC offset and leap seconds from the system tz database.
#leapsectz right/UTC

# Specify directory for log files.
logdir /var/log/chrony

开机自启并立即启动

sudo systemctl enable chronyd --now

检查是否开启开机自启

systemctl is-enabled chronyd

时间同步状态检查

chronyc tracking

重启后验证

systemctl status chronyd && chronyc sources -v

​成功标志​​:服务状态显示active (running)

chronyc sources -v

输出中同步源标记为^*(表示已同步)

重启并确认服务运行正常

systemctl restart chronyd
systemctl status chronyd

将系统时间写入硬件时钟

sudo hwclock --systohc

验证硬件时钟

sudo hwclock --show

开发环境配置

NPU驱动安装

安装驱动

固件安装

安装固件

CANN安装

快速安装CANN

安装编译python
编译python前安装相关依赖

sudo dnf install -y gcc g++ make cmake sqlite-devel bzip2-devel zlib-devel openssl-devel libffi-devel

拉取python源码包

wget https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz

解压包

tar -zxvf Python-3.10.4.tgz

编译安装

cd Python-3.10.4
./configure --prefix=${HOME}/python3.10.4 --enable-loadable-sqlite-extensions --enable-shared
make
make install

设置python3.10.4环境变量

vi ~/.bashrc

添加下面两行

export LD_LIBRARY_PATH=${HOME}/python3.10.4/lib:$LD_LIBRARY_PATH
export PATH=${HOME}/python3.10.4/bin:$PATH

立即生效

source ~/.bashrc
python3 --version
pip3 --version

配置pip源

cd ~/.pip

目录若不存在则创建

mkdir ~/.pip
cd ~/.pip

编辑

vi pip.conf

添加以下行

[global]
#以华为源为例,请根据实际情况进行替换。
index-url = https://mirrors.huaweicloud.com/repository/pypi/simple
trusted-host = mirrors.huaweicloud.com
timeout = 120

python安装好的就可以安装CANN工具包了
下载CANN对应版本run包(下载地址

chmod +x Ascend-cann-toolkit_8.0.0_linux-aarch64.run
./Ascend-cann-toolkit_8.0.0_linux-aarch64.run --install

添加环境变量

vi ~/.bashrc

添加以下行

source /usr/local/Ascend/ascend-toolkit/set_env.sh

立即生效

source ~/.bashrc

安装miniconda

清华大学开源软件镜像站miniconda

拉取脚本

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py310_23.11.0-1-Linux-aarch64.sh

运行脚本

sh Miniconda3-py310_23.11.0-1-Linux-aarch64.sh

回车继续安装

同意安装协议
填写安装路径(默认安装路径则直接回车)

同意每次打开终端自动激活base虚拟环境

设置环境变量

vi ~/.bashrc

添加

export PATH="/root/miniconda3/bin:$PATH"

立即生效

source ~/.bashrc

验证是否安装成功

conda -V

安装conda镜像源

conda config --show-sources

添加conda镜像源

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes

深度学习框架pytorch

安装PyTorch

安装前的依赖

source /usr/local/Ascend/ascend-toolkit/set_env.sh
pip3 install pyyaml
pip3 install wheel
pip3 install setuptools

快速安装pytorch


pytorch安装包
下载PyTorch安装包

wget https://download.pytorch.org/whl/cpu/torch-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

安装命令

pip3 install torch-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

torch_npu插件包
下载torch_npu插件包

wget https://gitee.com/ascend/pytorch/releases/download/v6.0.0-pytorch2.1.0/torch_npu-2.1.0.post10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

安装命令

pip3 install torch_npu-2.1.0.post10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

若PyTorch版本为2.1.0,出现“找不到google或者protobuf或者protobuf版本过高”报错时,需执行如下命令:

pip3 install protobuf==3.20

检查是否可用

python3 -c "import torch;import torch_npu;print(torch_npu.npu.is_available())"

安装超分辨率conda环境

conda create -n SR python=3.8
conda activate SR
pip install -r requirements.txt
asttokens==2.4.1
astunparse==1.6.3
ATC==1.0.1
attrs==23.2.0
auto_tune @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/compiler/lib64/auto_tune-0.1.0-py3-none-any.whl
certifi==2024.2.2
charset-normalizer==3.3.2
contourpy==1.1.1
cycler==0.12.1
dataflow @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/compiler/lib64/dataflow-0.0.1-py3-none-any.whl
decorator==5.1.1
dill==0.3.8
einops==0.8.1
filelock==3.12.4
fonttools==4.43.1
fsspec==2023.10.0
hccl @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/hccl/lib64/hccl-0.1.0-py3-none-any.whl
hccl_parser @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/hccl_parser-0.1-py3-none-any.whl
idna==3.10
Jinja2==3.1.4
kiwisolver==1.4.5
llm_datadist @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/compiler/lib64/llm_datadist-0.0.1-py3-none-any.whl
MarkupSafe==2.1.3
matplotlib==3.7.1
mindspore==2.0.0
mpmath==1.3.0
msobjdump @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/msobjdump-0.1.0-py3-none-any.whl
networkx==3.1
numpy==1.24.4
onnx==1.14.1
op_compile_tool @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/compiler/lib64/op_compile_tool-0.1.0-py3-none-any.whl
op_gen @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/op_gen-0.1-py3-none-any.whl
op_test_frame @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/toolkit/tools/op_test_frame-0.1-py3-none-any.whl
opc_tool @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/compiler/lib64/opc_tool-0.1.0-py3-none-any.whl
packaging==23.2
pillow==9.5.0
protobuf==3.20.3
psutil==5.9.8
pyparsing==3.1.1
python-dateutil==2.9.0.post0
PyYAML==6.0.1
requests==2.31.0
safetensors==0.4.2
schedule_search @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/compiler/lib64/schedule_search-0.1.0-py3-none-any.whl
scipy==1.10.1
show_kernel_debug_data @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/tools/show_kernel_debug_data-0.1.0-py3-none-any.whl
six==1.17.0
sympy==1.13.3
tbe==0.0.4
te @ file:///usr/local/Ascend/ascend-toolkit/8.0.0/compiler/lib64/te-0.4.0-py3-none-any.whl
torch==2.1.0
torch-npu==2.1.0.post10
torchvision==0.16.0
tqdm==4.67.1
trimesh==4.2.0
typing_extensions==4.9.0
urllib3==2.2.1

安装昇腾推理引擎MindIE

安装依赖

首先使用以下命令单独安装tritonclient[all]依赖

pip3 install tritonclient[all]

mindie_dependency_requirements.txt

gevent==22.10.2
python-rapidjson>=1.6
geventhttpclient==2.0.11
urllib3>=2.1.0
greenlet==3.0.3
zope.event==5.0
zope.interface==6.1
prettytable~=3.5.0
jsonschema~=4.21.1
jsonlines~=4.0.0
thefuzz~=0.22.1
pyarrow~=15.0.0
pydantic~=2.6.3
sacrebleu~=2.4.2
rouge_score~=0.1.2
pillow~=10.3.0
requests~=2.31.0
matplotlib>=1.3.0
text_generation~=0.7.0
numpy~=1.26.3
pandas~=2.1.4
transformers~=4.39.3
numba==0.61.2
pip3 install -r mindie_dependency_requirements.txt

安装ATB Models

tar -zxf Ascend-mindie-atb-models_1.0.0_linux-aarch64_py310_torch2.1.0-abi0.tar

U盘自动识别挂载

U盘自动识别挂载,具体方案详见:OpenEuler操作系统中检测插入的USB设备并自动挂载

整体原理:
U盘插拔 -> 触发udev规则 -> 开启systemd服务 -> 调用实际挂载/卸除脚本

自动挂载udev规则

sudo vim /etc/udev/rules.d/99-usb-automount.rules
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="block", ACTION=="add", ENV{ID_BUS}=="usb", RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="block", ACTION=="remove", ENV{ID_BUS}=="usb", RUN+="/bin/systemctl stop usb-mount@%k.service"

自动挂载usb的systemd服务

sudo vim /etc/systemd/system/usb-mount@.service
[Unit]
Description=Mount USB Drive on %i

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/usb-mount.sh add %i
ExecStop=/usr/local/bin/usb-mount.sh remove %i

实际挂载脚本

sudo vim /usr/local/bin/usb-mount.sh
#!/bin/bash

ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"
MOUNT_POINT="/mnt/usb"

case "$ACTION" in
    add)
        if [ -n "$(lsblk -no FSTYPE ${DEVICE})" ]; then
            mkdir -p ${MOUNT_POINT}
            mount -o rw,noatime ${DEVICE} ${MOUNT_POINT}
        fi
        ;;
    remove)
        if mountpoint -q ${MOUNT_POINT}; then
            umount -l ${MOUNT_POINT}
            rmdir ${MOUNT_POINT}
        fi
        ;;
esac

exit 0

给脚本赋可执行权限

chmod +x /usr/local/bin/usb-mount.sh

查看插拔U盘时的日志

cat /var/log/usb_mount.log
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐