最需要注意的是:

  1. 不要设置启动时挂载硬盘 ​​/etc/fstab​​​ (可以启动后, 设置​​systemctl​​来自启动挂载)
  2. 不要修改​​/media/pi​​​下的权限 (否则会修改​​sudo​​权限然后无法修改回来, 重装系统)
  3. ssh 将22端口换成别的 (大家都知道默认用户密码是pi和pi 如果懒得改账户密码, 就改端口)


说明
最近由于硬盘频繁使用, 并且有一些web项目需要调试, 但是觉得自己的笔记本挂载硬盘啥的有点大财小用, 所以就想到买一块开发板来做专业的开发, 主要的功能如下:

  1. 能够流畅操作系统, 不像4B+这么垃圾
  2. 能够安装软件方便, 基于Ubuntu 18.04的系统系统, 并带有轻量级桌面(虽然不用)
  3. 具有WiFi, 千兆网,(可以做云盘和宿舍热点)
  4. 部署web项目简单
  5. 能够加nvme的固态硬盘, 无限扩展

之所以操作流程我想主要的原因还是Linux➕轻量级桌面, 毕竟桌面消耗了很大的资源

nanoPC-T4到手体验
T4是一块4G DDR3内存, 16Gemmc存储的板子, 4核CPU, GPU加速, NPU视频解析加速, 我个人觉得这配置应该够开发用了, 所以就想着入手试试, 因为之前入手树莓派4B+ 8G内存, 卡的不行, 挂载一个摄像头, 在进行人物分析时明明一个视频却解析成了一张张的图片(卡的), 所以这里是想告诉大家 树莓派整个系列是个坑, 虽然开源项目有很多好玩的, 但是硬件真的不行, 干啥都卡; ​​​T4​​真的给我惊艳到了, 直接说昨晚到货后, 安装完系统, 我把常用的需求都安装了, 比如MySQL, Apache, frp, VScode, 看着2倍速1080p视频, 后台还挂着sambd, , 完全不卡, 完全不卡, 完全不卡

总的来说, T4对我而言,完全可以替代我的电脑了, 日常开发完全OK, 我的日常要求如下:

  1. 二倍速看1080p视频不卡
  2. VScode能编辑运行 python/C/C++
  3. 挂载我的大硬盘实现校园网访问
  4. 能够运行docker
  5. 得了呀, 二倍速看1080p视频的浏览器如果不卡, 其他在浏览器上的操作那就完全能抗住, 比如web开发, 浏览器写个sphinx, Markdown, 论文啥的, 因为微软/腾讯文档都可以在浏览器上进行文档编写呀

重要链接
​​​nanoPC -T4中文资料​

1. 初始配置

1.1. 系统安装

rk3399-friendlyDesktop系统安装
这是一个具有图形化界面的系统, 可以理解成Ubuntu18.04
之所以使用这个系统:

  1. Ubuntu18.04对应的解决方案全网都能查到
  2. 有界面可以在没有电脑的时候使用这个小机子抗一抗
  3. 有界面性能也并没有变差, 开机3S

按照​​nanoPC -T4中文资料​​​教程擦除和执行烧写即可
默认 ​​​用户名pi 密码pi​​​​root用户 密码fa​

1.2. 更新下载源并更新

sudo mv /etc/apt/sources.list /etc/apt/sources.list.old # 修改文件之前给文件备份是个好习惯!!! 
sudo vi /etc/apt/sources.list # 下载源在这里
# 添加下面的下载源
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-proposed main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse

# 运行更新命令
sudo apt update -y && sudo apt upgrade -y

# 当遇到这种
W: GPG 错误:http://mirrors.ustc.edu.cn/ubuntu trusty Release: 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
E: 仓库 “http://mirrors.ustc.edu.cn/ubuntu trusty Release” 没有数字签名。

# 添加数字签名
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 # 最后这部分就是上面那个NO_PUBKEY 后面的一坨
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32

1.3. Python wiring

这是个什么东西? 程序员大部分都不知道, 尤其是我们AI实验室(我猜)
这个其实就是普通单片机的引脚操作包, 比如​​​stm32​​​中外部中断, ​​GPIO​​​与传感器​​IIC通信协议​​​, ​​SPI通信协议​​​, 这些都需要对​​GPIO​​​进行开关的时序操作完成, 所以这个​​wiring​​​包的作用就是这, 比如将一个​​IIC​​​的​​oled​​​连接到板子上, 通过​​wiring​​​设置 ​​gpio_x=0/1​​来实现数据信号的通信

1.4. 设置时区

sudo rm /etc/localtime
sudo ln -Ls /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

1.5. ssh连接

  1. 安装 ​​apt -y install openssh-server ssh​
  2. 修改配置 ​​sudo vi /etc/ssh/sshd_config​
Port 22 # 开启默认端口22
ListenAddress 0.0.0.0 # 所有人都能登录
PubkeyAuthentication yes # 开启验证
PermitRootLogin yes
PasswordAuthentication yes # 开启密码验证
  1. 重启 ​​sudo service ssh start​
  • 配置秘钥, 免密登录
  1. 本地主机
ssh-keygen -t rsa # 生成私钥跟秘钥, 三次输入都直接回车
ssh-copy-id user@15.15.15.15 # 将本机公钥拷贝到目标主机
ssh 'user@15.15.15.15' # 免密登录, 不用输入密码直接登陆上去

令人惊艳的NanoPC-T4(RK3399)作为工作站的初始配置和相关应用_mysql

1.6. 1.6 google拼音

左上角–>deference–>language support --> install

令人惊艳的NanoPC-T4(RK3399)作为工作站的初始配置和相关应用_mysql_02


令人惊艳的NanoPC-T4(RK3399)作为工作站的初始配置和相关应用_nanoPC-T4_03

sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin -y
sudo apt-get install fcitx fcitx-googlepinyin -y

点击 左上角–>deference 有个小熊, 就可以了有谷歌拼音了

1.7. 开源矩阵计算库

​export OPENBLAS_CORETYPE=ARMV8​

1.8. Linux查看CPU温度

cat /sys/devices/virtual/thermal/thermal_zone0/temp

1.9. 设置进程最大pid

pi@NanoPC-T4:~$ cat /proc/sys/kernel/pid_max
32768
# 设置最大进程数为100 0000 一百万
pi@NanoPC-T4:~$ echo "kernel.pid_max=1000000 " >> /etc/sysctl.conf

# 查看最大进程
root@NanoPC-T4:/home/pi# sysctl -p
vm.swappiness = 10
kernel.pid_max = 1000000
root@NanoPC-T4:/home/pi# sysctl kernel.pid_max
kernel.pid_max = 1000000

# 查看当前最大进程数
ps -eLf | wc -l

1.10. 创建新用户 给root权限 挂载新硬盘 设置tab补全功能

sudo adduser zjq
sudo adduser zjq sudo
su zjq

然后再将上面的硬盘挂载到这个用户下
mount UUID="**" /home/zjq

sudo vi /etc/passwd # 打开, 修改zjq用户对应的bash
zjq:x:60000:60000::/home/zjq:/bin/bash # 这里默认是/bin/sh来着

1.11. 连接wifi

# 创建和删除连接
nmcli device wifi connect wifi名 password 12345678
nmcli con del wifi名

# 连接
nmcli connection up wifi名
nmcli device con wlan0

# 断开
nmcli connection down wifi名
nmcli device dis wlan0

1.12. 使用NVME SSD高速固态硬盘

由于nanoPC-T4这款过于经验, 使得我不得不进一步开发其资源
毕竟emmc才16G, 因此又在某宝买了个500G的m.2 nvme 的闪迪SSD, 挂载到板子上, 以至于后面就可以直接当成我的小主机来用了, 一想到回老家只需要带一个比手机还小的东西就解决设备问题, 就很香!!!

个人建议把​​SSD​​​挂载到上面新创建的用户​​zjq​​上, 这是因为很多软件和个人数据都在/home/zjq路径下的.中, 因此当系统出故障需要恢复的时候, 重新挂载SSD后, 个人数据直接恢复不会丢失, 且相关配置文件也都在这里面, 安全

1.12.1. 测试和重新分区

# 1. 检测是否有ssd
cat /proc/partitions
major minor #blocks name
1 0 4096 ram0
259 0 125034840 nvme0n1 # 这个就是ssd盘符

# 2. 分区 上面命令是将整个ssd分成一个整的分区
(echo o; echo n; echo p; echo 1; echo ""; echo ""; echo w; echo q) | fdisk /dev/nvme0n1

# 3. 分区格式化为ext4格式
$ cat /proc/partitions # 查看分区
major minor #blocks name

1 0 4096 ram0
259 0 125034840 nvme0n1
259 2 125033816 nvme0n1p1
$ mkfs.ext4 /dev/nvme0n1p1 # 格式化为ext4格式

1.12.2. 挂载和自动挂载

# 4. 开机自动挂载ssd分区
$ sudo blkid /dev/nvme0n1p1 # 查看分区的block ID
/dev/nvme0n1p1: UUID="d15c4bbf-a6c3-486f-8f81-35a8dbd46057" TYPE="ext4" PARTUUID="887628f0-01"

# 配置开机自动挂载 修改/etc/fstab 文件 格式为, 注意有可能在启动出现问题, 整个系统就进不去了,
UUID=<Block ID> /home/zjq ext4 defaults 0 0
$ vi /etc/fstab # 在结尾添加下行
UUID=d15c4bbf-a6c3-486f-8f81-35a8dbd46057 /home/zjq ext4 defaults 0 0

# 因此不建议这样搞, 可以写一个脚本, 设置开机自动运行这个命令, 这样即使该命令失败, 系统照常启动, 而不会因为找不到硬盘而启动失败
sudo umount UUID=d15c4bbf-a6c3-486f-8f81-35a8dbd46057
sudo mount UUID=d15c4bbf-a6c3-486f-8f81-35a8dbd46057 /home/zjq

# 5. 测试挂载成功?
mount /home/zjq

# 6. 重启测试, 开机应该就能够看到挂载的ssd分区了
df -h

1.13. 扩大swap空间(挂载到固态硬盘上)

由于本身有4G内存, 不太够用, 所以创建个16G的swap空间用来进行骚操作; 在后期编译运行一些文件时还真的因为4G内存太小导致了编译失败的问题, 开启swap后直接就好用了

# 创建文件
mdkir -p /home/zjq/01_software/swap && cd /home/zjq/01_software/swap

# 下载创建swap文件的工具
git clone https://github.com/jetsonhacks/postFlashTX1.git && cd postFlashTX1/

# 利用工具创建swap空间, 挂载的位置是/home/zjq/01_software/swap文件中
sudo ./createSwapfile.sh -d /home/zjq/01_software/swap -s 16

# cd /home/zjq/01_software/swap

# 打开swap
sudo swapon -a

# 挂载到/home/swap
sudo swapon swapfile

# 卸载 /swap
sudo swapoff swapfile

# 产看swap
free -h
total used free shared buff/cache available
Mem: 3.8G 234M 3.1G 17M 426M 3.4G
Swap: 15G 0B 15G


# 注意加入下面的开机自启动后, 系统启动速度大大降低, 正常开机可能5s, 但是加上swap后, 可能需要2分钟....
# 设置开机自动加载
sudo blkid swapfile
# swapfile: UUID="40fc7d6d-73b9-4717-b8ba-a6c9f56f65ed" TYPE="swap"

sudo vi /etc/fstab
# swap
UUID=40fc7d6d-73b9-4717-b8ba-a6c9f56f65ed none swap sw 0 0
/home/zjq/01_software/swap swap swap defaults 0 0

为了验证一波在固态硬盘上开启一波swap的真实有效性, 我创建了一个 10G的txt文件, 然后利用python f.read()

# test.py  准备test.txt 大于4G的文件, 运行下面的代码
with open("test.txt", "r") as f:
data = f.read()

效果如下所示:

(base) pi@NanoPC-T4:~$ top
top - 20:38:16 up 5:15, 5 users, load average: 5.65, 5.01, 3.40
Tasks: 247 total, 5 running, 242 sleeping, 0 stopped, 0 zombie
%Cpu(s): 31.9 us, 33.9 sy, 0.0 ni, 21.3 id, 12.2 wa, 0.0 hi, 0.6 si, 0.0 st
KiB Mem : 3938220 total, 28260 free, 3821968 used, 87992 buff/cache
KiB Swap: 16777212 total, 15458932 free, 1318280 used. 25332 avail Mem

1.14. 设置开机自启动的模式

sudo vim /lib/systemd/system/<自启动服务名>.service

# ---------------------------添加下面内容
[Unit]
Description="自启动服务描述"
After=multi-user.target

[Service]
Type=simple
ExecStart="自启动服务指令, 注意绝对路径, 可执行文件"

[Install]
WantedBy=multi-user.target

# -------------------------------------完成

# sudo systemctl start <自启动服务名> #开始服务
# sudo systemctl enable <自启动服务名> # 启动服务
# sudo systemctl restart <自启动服务名> # 重启服务
# sudo systemctl status <自启动服务名> # 启动状态

1.15. 格式化sd卡并建立新分区修改格式和分区名称

# The disk contains an unclean file system (0, 0). 如果出现这个问题, 运行下面的命令修复一下即可
$ sudo ntfsfix /dev/sdb1
# 卸载sdb*
sudo blkid /dev/sdb* # 这里显示分区的UUID, 下面使用
sudo umount UUID="**"

sudo fdisk /dev/sdb # 使用工具fdisk
m # 显示可用命令
# Generic
# d 删除分区
# F list free unpartitioned space
# l 显示分区类型
# n 创建新分区
# p 打印分区列表
# t 改变分区类型
# v verify the partition table
# i print information about a partition

# Misc
# m print this menu
# x extra functionality (experts only)

# Script
# I load disk layout from sfdisk script file
# O dump disk layout to sfdisk script file

# Save & Exit
# w 保存并退出
# q 退出不保存

1. 删除所有分区, 记得备份数据 d
2. 创建一个分区 n
3. 保存 w

# ls /dev/sdb* 会显示sdb1, 刚创建的分区

# 格式化分区为etx4
sudo mkfs.ext4 /dev/sdb1

# 重命名分区为zjq, 下次挂载后, 文件夹名称就是/media/pi/zjq
sudo e2label /dev/sdb1 zjq

2. 应用配置

注意先使用命令​​uname -a​​ 确定一下版本号

pi@NanoPC-T4:~$ uname -a
Linux NanoPC-T4 4.4.179 #1 SMP Wed Sep 29 13:26:52 CST 2021 aarch64 aarch64 aarch64 GNU/Linux

2.1. 软路由 创建热点

​官网介绍​

​点击这里下载 create_ap GitHub​

cd create_ap
sudo make install
sudo apt-get install util-linux procps hostapd iproute2 iw haveged dnsmasq

# 如果依赖库下载失败请更新软件源后再试试
# 注意:在创建WiFi热点之前,我们需要确认树莓派已经打开WiFi设置,并且不连接任何WiFi信号。插入可上网的网线。 虽然这个注意值得注意, 但是我依然连着宿舍WiFi也开启了热点
sudo create_ap wlan0 eth0 热点名 密码

2.2. MySQL(建议使用docker)

sudo apt-get install mysql-server mysql-client
sudo mysql -u root -p # 回车直接进入

​​mysql学习链接​​

2.3. Frp远程登录

2.3.1. 安装

期初以为这个板子跟树莓派4B+一样结果发现内核不一样,需要选择对应的内核版本才行, 这里使用 ​​uname -a​​​ 测试是​​aarch64​​​ 所以在 ​​点击跳转GitHub-frp​​点击跳转到我的frp介绍

2.3.2. 设置开机启动

利用​​systemctl ​​创建对应的开机自启动

sudo vim /lib/systemd/system/frpc.service # frpc就是对应的systemctl服务

# 写入下面内容---------------------------------------------------------------
[Unit]
Description=fraps client service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/home/pi/zjq/01_software/02_software/frp/frpc -c /home/pi/zjq/01_software/02_software/frp/frpc.ini

[Install]
WantedBy=multi-user.target
# --------------------------------------------------------------


sudo systemctl start frpc # 然后就启动frpc
sudo systemctl enable frpc # 再打开开机自启动
sudo systemctl restart frpc # 重启服务
sudo systemctl stop frps # 停止服务
sudo systemctl status frps # 查看服务日志

2.4. owncloud私有云服务(建议使用docker)

2.4.1. 先安装依赖

# 1. 数据库 见2.2节的mysql
# 2. Apache2
sudo apt-get install apache2 # 浏览器输入127.0.0.1判断安装成功
# 3. php
sudo apt install php7.1
sudo apt-get install php7.2-zip php7.2-cURL
sudo apt-get install php7.2-intl
# 4. phpmyadmin并设置mysql密码
sudo apt-get install phpmyadmin
# 软件下载完成后, 出现配置界面, 直接回车即可
# 然后是设置MySQL的账户和密码
# 5. 测试php成功?
sudo vi /var/www/html/test.php
# 输入
<?php
phpinfo();
?>

sudo /etc/init.d/apache2 restart # 重启Apache
# 浏览器http://127.0.0.1/test.php

2.4.2. 安装owncloud

wget https://download.owncloud.org/community/owncloud-10.2.1.tar.bz2
tar -xvf owncloud-10.2.1.tar.bz2 # 解压
sudo mv owncloud/* /var/www/html # 复制
sudo vi /etc/apache2/apache2.conf # 修改Apache配置文件

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All # 这里的None改为All
Require allgranted
</Directory>

# 创建owncloud存文件的文件夹

# 修改文件夹权限
sudo chown -R www-data:www-data /var/www/html/
sudo chmod 777 /var/www/html/config/

2.4.3. 创建数据库

# 创建一个数据库owncloud, 并且创建一个mysql用户test123密码是111111, 将所有的权限都给这个test123
sudo mysql -u root -p
create database owncloud; # 数据库的名字叫做owncloud

grant all ON owncloud.*TO test123@localhost IDENTIFIED BY '111111';
flush privileges;
exit

2.4.4. 安装完成, 测试owncloud

sudo /etc/init.d/apache2 restart # 重启Apache

2.5. VScode

令人惊艳的NanoPC-T4(RK3399)作为工作站的初始配置和相关应用_mysql_04

# 下载完成后, 移动到软件保存位置, 在配置软连接, 比如在命令行输入vscode既可以打开

sudo vi ~/.bashrc # 添加下面的export路径
export PATH=$PATH:/home/pi/zjq/01_software/02_software/VSCode-linux-arm64/bin
alias vscode="code-insiders" # 命令行访问vscode就直接打开了

2.6. C/C++编译环境

# 默认就是7.4版本的, 所以直接在vscode上面调用即可
pi@NanoPC-T4:~$ cat ~/.bashrc ^C
pi@NanoPC-T4:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/7/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 7.4.0-1ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=aarch64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04)

2.7. python编译环境之conda

​ is not a supported wheel on this platform​​错误, 是因为直接使用conda自带的base环境, 应该重新创建, 按照下面的介绍操作, 才能安装tf2

channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
show_channel_urls: true
envs_dirs:
- /media/pi/sd_card/install/mambaforge-pypy3/envs
pkgs_dirs:
- /media/pi/sd_card/install/mambaforge-pypy3/pkgs

​点击去GitHub下载miniforge-conda​

sudo chmod 777 Mambaforge-pypy3-Linux-aarch64.sh
./Mambaforge-pypy3-Linux-aarch64.sh
# 注意运行这个最好都是yes, 一次同意证书, 一次同意本地, 一次同意添加到配置文件(这一步就不用下面echo到.bashrc中了) 最后一个如果不是yes还会出问题
source ~/.bashrc

​​其他操作跳转到python全解​​

2.7.1. 安装TensorFlow 2.4.0

  1. 去Github下载对应的​​TensorFlow​​​版本, 我看到​​GitHub​​​只有​​python3.6 ​​​和 ​​python3.7​​​版本的, 因此下载​​tensorflow-2.4.0-cp37-none-linux_aarch64.whl​
  2. 使用​​conda​​​创建一个新的环境, ​​python​​​版本设置为​​3.7​
  3. 使用​​pip​​ 安装下载下来的whl包即可

​lhelontra/tensorflow-on-arm​

# 创建新环境
conda create -n py3.7 python=3.7

# 添加到环境变量
echo 'alias py3.7="conda activate py3.7"' >> ~/.bashrc

# 安装依赖
sudo pip install cython
sudo apt-get install libhdf5-dev
sudo pip install h5py==2.10.0 # 这个可以查询一下
# h5py-2.10.0-cp37-cp37m-linux_armv7l.whl

# 安装tf2
pip install tensorflow-2.4.0-cp37-none-linux_aarch64.whl

# 测试
python
import h5py
import tensorflow as tf2

2.7.2 直接安装python3.9

# 安装依赖
sudo apt install -y wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev

# 下载源码编译安装
wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0b4.tgz
tar -zxvf Python-3.9.0b4.tgz

#编译参数设置
./configure --prefix=/usr/local/python3.9
make -4
sudo make install

# 设置软连接 (可选项), 可以直接python3.9运行和pip3.9安装包
sudo ln -s /usr/local/python3.9/bin/python3.9 /usr/bin/python3.9
sudo ln -s /usr/local/python3.9/bin/pip3.9 /usr/bin/pip3.9


# 使用测试
# 1. 安装包
/usr/local/python3.9/bin/python3.9 -m pip install pandas
# 2. 直接运行
./usr/local/python3.9/bin/python3.9

2.8. friendlydestTop远程桌面 vnc

2.8.1. 安装启动服务

# 不确定下面两个命令有没有用
# sudo apt install tigervnc-standalone-server tigervnc-common
# sudo apt-get install dconf-editor # 注册表
sudo apt-get install xrdp vnc4server xbase-clients

# 如有问题, 执行下面的命令解决依赖
sudo apt --fix-broken install
# 安装x11vnc
sudo apt-get install x11vnc
# 设置密码
x11vnc -storepasswd
123456
# 启动x11vnc服务
x11vnc -rfbport 5900 -rfbauth ~/.vnc/passwd -display :0 -forever -bg -repeat -nowf -o ~/.vnc/x11vnc.log

# 查看服务是否启动
ps -aux | grep x11vnc

2.8.2. win10链接到NanoPC-T4

令人惊艳的NanoPC-T4(RK3399)作为工作站的初始配置和相关应用_Python_05

2.8.3. 开机启动

sudo vim /lib/systemd/system/x11vnc.service

# ---------------------------添加下面内容
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /home/pi/.vnc/passwd -rfbport 5900 -shared

[Install]
WantedBy=multi-user.target

# -------------------------------------完成

sudo systemctl start x11vnc.service #开始服务
sudo systemctl enable x11vnc.service # 启动服务

2.9. 移动硬盘挂载和自动挂载(NTFS)

# 移动硬盘自动挂载
cat /proc/partitions # 查看硬盘判读
sudo blkid /dev/sda1 # 查看UUID
sudo chmod 777 /etc/fstab
echo "UUID=16585EA0585E7F05 /sda/sda1 ntfs-3g defaults 0 0" >> /etc/fstab
echo "UUID=00039B64000811F9 /sda/sda2 ntfs-3g defaults 0 0" >> /etc/fstab

# 注意这里其实不用创建文件夹, 开机会自动创建并挂载的
sudo mdkir /mydev_sda
sudo mkdir -p /sda/sda1
sudo mkdir -p /sda/sda2


# 测试
mount /dev/sda1 /mydev_sda/sda1 # 将硬盘的sda1分区挂载到本地/mydev_sda/sda1路径下
mount /dev/sda3 /mydev_sda/sda2 # 将硬盘的sda3分区挂载到本地/mydev_sda/sda2路径下

# 给添加权限
sudo chown -R pi:pi /mydev_sda

# 卸载硬盘
umount /mydev_sda/sda1 #
umount /mydev_sda/sda2 #

2.10. sambd文件共享 (上面挂载的硬盘)

如果想要使用别的用户, 比如新建用户hello

sudo useradd hello

sudo apt-get install samba samba-common-bin # 安装sambd文件共享工具

sudo vi /etc/samba/smb.conf
[share]
comment = share folder
#共享文件的服务器所在文件路径
path = /mydev_sda
# 允许浏览
browseable = yes
# 设置允许的访问的用户, 必须是系统包含的人
valid user = pi,hello
#共享开放
public = no
#可写
writable = yes
# 可直接读写使用, 比如视频可以直接播放
available = yes
create mask = 0777
directory mask = 0777
force user = nobody
force group = nogroup

sudo smbpasswd -a pi # 设置外部用户pi的密码
sudo smbpasswd -a hello # 设置外部用户hello的密码

# 重启服务
sudo /etc/init.d/samba-ad-dc restart
# 注意 不用设置开机自动启动, 因为是默认的
# 启动nmbd服务:
sudo service nmbd start
# 启动smbd服务:
sudo service smbd start

在文件管理路径框中输入 ​​\\IP地址​​​ IP地址查看命令 ​​ifconfig​

令人惊艳的NanoPC-T4(RK3399)作为工作站的初始配置和相关应用_nanoPC-T4_06

2.11. oled显示时间,温度, 天气

​​NanoPC-T4(RK3399) game1 oled(I2C)显示时间天气温度​​

2.12. docker安装

​见我的gitee直接下载安装即可​

  • 安装完成后修改路径
sudo vim /etc/systemd/system/multi-user.target.wants/docker.service
# 更改
ExecStart=/usr/bin/dockerd --graph=<your_new_docker_img_path> --storage-driver=overlay

sudo systemctl daemon-reload
  • 设置下载源
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
sudo service docker restart
sudo docker run hello-world
  • 设置用户权限
zjq@NanoPC-T4:~$ sudo groupadd docker
groupadd: group 'docker' already exists
zjq@NanoPC-T4:~$ sudo usermod -aG docker $USER
zjq@NanoPC-T4:~$ sudo usermod -aG docker pi
zjq@NanoPC-T4:~$ sudo gpasswd -a $USER docker
Adding user zjq to group docker
zjq@NanoPC-T4:~$ sudo gpasswd -a pi docker
Adding user pi to group docker
zjq@NanoPC-T4:~$ newgrp docker
zjq@NanoPC-T4:~$ docker run hello-world

​​其他docker命令见连接​​

2.13. 固定IP

一共涉及两个文件的修改

$ uname -a
Linux nanopct4 5.15.25-rockchip64 #22.02.1 SMP PREEMPT Sun Feb 27 09:05:47 UTC 2022 aarch64 GNU/Linux

$ route -n
Kernel IP routing table
Destination Gateway这是网关 Genmask Flags Metric Ref Use Iface
0.0.0.0 10.15.15.254 0.0.0.0 UG 100 0 0 eth0

# 默认安装Debian的时候是用dhcp服务的,有时我们需要设置一下静态IP
sudo vi /etc/network/interfaces

auto eth0
iface eth0 inet static
address 10.15.14.111
netmask 255.255.254.0
gateway 10.15.15.254

sudo vi /etc/resolv.conf # 添加gateway
nameserver 10.15.15.254

# 重启
/etc/init.d/networking restart

3. 三. 开发

3.1. make设置指定路径安装

下面命令是指定到了路径 ​​/home/zjq/01_software/install​​​ 放到这个路径下的目的是因为: 我已经将固态硬盘256G的挂载到了/home路径下, 因此将所有的代码, 软件, 都安装部署到/home路径下, 等下次系统出问题恢复的时候, 我只需要更新一下系统后, 直接挂在这个硬盘, 所以的软件就都还在, ​​~/.bashrc​​里面的全局变量也都在, 不用在重新安装了

# 方法一. cmake生成Makefile时设置 (应用案例 GoogleTest)
cmake .. -DCMAKE_INSTALL_PREFIX=/home/zjq/01_software/install
make -j4 && sudo make install

# 方法二. ./configure设置 (应用案例 protoc)
./configure --prefix=/home/zjq/01_software/install
sudo make install

# 方法三. make install直接指定 (应用案例 grpc)
sudo make install DISTDIR=/home/zjq/01_software/install

make并且插入到了指定路径下, 一些头文件都动态链接库以及二进制文件都在哪里呢

令人惊艳的NanoPC-T4(RK3399)作为工作站的初始配置和相关应用_nanoPC-T4_07

如果其他程序想要调用怎么办呢?

  • 首先了解库文件的知识
  • ​LIBRARY_PATH​​​: gcc在编译之前使用​​LIBRARY_PATH​​来搜索包含静态和共享库的目录,这些目录需要链接到您的程序
  • ​LD_LIBRARY_PATH​​​:程序已经成功编译并且链接成功后,使用​​LD_LIBRARY_PATH​​来搜索目录
  • 我的理解就是 ​​LIBRARY_PATH ​​在程序编译调用静态库和共享库时会扫描这个路径; 而程序在执行时, 会去扫描​​LD_LIBRARY_PATH​​这个路径; 因此对于​​make install​​不同路径的库, 我们需要设置三个全局变量
  • 第一步: 指定 ​​C/C++​​​ , ​​JAVA​​​, ​​PYTHON​​ 对应的头文件路径
  • 第二步: 指定编译过程中的静态和动态库路径
  • 第三步: 指定运行过程中调用的动态库路径(因为静态库在编译的过程中已经拷贝到项目中生成了​​.o​​文件)
# 第0步 将可执行的二进制添加到系统中
export my_stall=/home/zjq/01_software/install
export PATH=${my_stall}/bin:$PATH
echo ${PATH} # 查看当前系统添加的路径

# 第一步
export C_INCLUDE_PATH=C_INCLUDE_PATH:${my_stall}/include #c
export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:${my_stall}/include #c++
export OBJC_INCLUDE_PATH=OBJC_INCLUDE_PATH:${my_stall}/include #java

# 第二步
export LIBRARY_PATH=${my_stall}/lib:$LIBRARY_PATH # 设置静态和动态链接库路径, 这些目录的路径是链接到程序中

# 第三步
export LD_LIBRARY_PATH=${my_stall}/lib:$LD_LIBRARY_PATH # 设置动态链接库路径, 当程序运行的时候才会用到这个

# 第四步
export PKG_CONFIG_PATH=${my_stall}/lib/pkgconfig:$PKG_CONFIG_PATH # 设置包配置路径



# 上面的命令只在当前的bash有效, 关闭terminal后在新打开就无效了, 为了长期有效, 可以将上面的export放到~/.bashrc中

到此, make 插入到不同的路径, 并且能够全局使用了

3.2. 查找文件 locate

sudo apt -y install mlocate  # 安装
locate stdio.h # 查找头文件stdio.h位置

# locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory # 报错的原因是因为刚安装, 还没有扫描系统中的文件并且保存到数据库中, 因此使用下面命令更新数据库
sudo updatedb
# 在使用locate 就可以了

# 注意对于文件进行mv后, locate需要通过updatedb更新路径

3.3. 关闭后台运行的python-jupyter

netstat -tunlp| grep 8888 # 查看占用8888的进程等信息
# netstat -tunlp| grep 8888
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 63/python
tcp6 0 0 :::8888 :::* LISTEN 63/python

# 显然是63号进程
# 在确认一下63号进程真的是jupyter么
# ps -ef | grep jupyter
root 63 28 0 Oct21 pts/1 00:42:00
# 好了可以关闭了
kill -9 63

# 默认参数下,kill 发送SIGTERM(15)信号给进程,告诉进程,你需要被关闭,请自行停止运行并退出。
# kill -9 发送SIGKILL信号给进程,告诉进程,你被终结了,请立刻退出。
# TERM(或数字9)表示“无条件终止”;

3.4. 安装llvm

/* c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-7/README.Bugs> for instructions.
tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/obj.clangDynamicASTMatchers.dir/build.make:134: recipe for target 'tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/obj.clangDynamicASTMatchers.dir/Registry.cpp.o' failed
make[2]: *** [tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/obj.clangDynamicASTMatchers.dir/Registry.cpp.o] Error 4
CMakeFiles/Makefile2:27740: recipe for target 'tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/obj.clangDynamicASTMatchers.dir/all' failed
make[1]: *** [tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/obj.clangDynamicASTMatchers.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
*/

这是因为交换空间不足造成的, 跳转到 扩大swap空间 见1.13节

cmake ../llvm-10.0.0.src -DLLVM_TARGETS_TO_BUILD=ARM -DCMAKE_BUILD_TYPE=Release -DLLVM_USE_LINKER=gold -DCMAKE_INSTALL_PREFIX=/home/zjq/01_software/install
make -j4 && sudo make install

...
# -- Installing: /home/zjq/01_software/install/lib/cmake/llvm/./HandleLLVMStdlib.cmake
# -- Installing: /home/zjq/01_software/install/lib/cmake/llvm/./GenerateVersionFromVCS.cmake

llvm-as -version
# LLVM (http://llvm.org/):
# LLVM version 10.0.0
# Optimized build.
# Default target: aarch64-unknown-linux-gnu
# Host CPU: cortex-a53

# 下面是另一种安装方式, 还没测试过
git clone https://github.com/llvm/llvm-project llvm-project
cd llvm-project
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=lld -DCMAKE_INSTALL_PREFIX=/home/install ../../llvm-project/llvm
make -j4 && sudo make install

3.5. 升级cmake到3.14.4

wget https://github.com/Kitware/CMake/releases/download/v3.14.4/cmake-3.14.4.tar.gz
tar xvf cmake-3.14.4.tar.gz
cd cmake-3.14.4
./bootstrap --prefix=/home/zjq/01_software/install
make
sudo make install
cmake --version

3.6. 安装gcc4.9版本并与gcc7版本共存

https://mirrors.sjtug.sjtu.edu.cn/gnu/gcc/gcc-4.9.3/
# gcc-4.9.3.tar.gz
# 下载完解压
tar -vxf gcc-4.9.3.tar.gz && cd gcc-4.9.3
mkdir build && build
sudo ../gcc/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --prefix=/home/zjq/01_software/install
make -j4 && make install

# 添加软连接 将gcc-4.9/7 -> gcc
$ sudo update-alternatives --install /usr/bin/gcc gcc /home/zjq/01_software/install/bin/gcc-4.9 100
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 5

# 设置默认gcc版本为gcc
$ sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
* 0 /home/zjq/01_software/install/bin/gcc-4.9 100 auto mode
1 /home/zjq/01_software/install/bin/gcc-4.9 100 manual mode
2 /usr/bin/gcc-7 5 manual mode

# 添加g++软连接和设置默认版本
$ sudo update-alternatives --install /usr/bin/g++ g++ /home/zjq/01_software/install/g++-4.9 100
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 5
$ sudo update-alternatives --config g++

# 删除软连接
sudo update-alternatives --remove gcc /usr/bin/gcc-7

3.7. GitHub加速

在GitHub后面添加​​cnpmjs.org​

git clone https://github.com/friendlyarm/prebuilts.git
# 下面的是加速链接 cnpmjs.org
git clone https://github.com.cnpmjs.org/friendlyarm/prebuilts.git

# 如果报错
# fatal: unable to access 'https://github.com.cnpmjs.org*':
# server certificate verification failed.
# CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
# 表示证书验证失败, 也就是说计算机觉得这个链接有问题, 拒绝访问, 这个时候关闭验证即可
# 但是注意, 等下载完成后记得把验证打开, 不然电脑就相当于没穿衣服在大街上瞎逛游
export GIT_SSL_NO_VERIFY=1 # 关闭验证

export GIT_SSL_NO_VERIFY=0 # 打开验证

对于子模块,可以先不要在​​git clone​​​的时候加上​​--recursive​​​,等主体部分下载完之后,该文件夹中有个隐藏文件称为:​​.gitmodules​​​,把子项目中的url地址同样加上​​.cnpmjs.org​​​后缀,然后利用​​git submodule sync​​​更新子项目对应的​​url​​​,最后再​​git submodule update --init --recursive​​,即可正常网速clone完所有子项目。

3.8 java-idea-maven-springboot

java install and idea start

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-11-jdk

cd /home/zjq/01_software/packages/idea-IU-222.4167.29/bin
./idea.sh

maven

cd /home/zjq/01_software/packages/apache-maven-3.8.6/bin
./mvn -version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /home/zjq/01_software/packages/apache-maven-3.8.6
Java version: 11.0.16, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-arm64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.179", arch: "aarch64", family: "unix"

4. 关键命令

updatedb # 更新数据库
locate findFile # 查找文件

history | grep make install # 查找历史命令

alias mypy="conda activate mypy" # 设置别名

5. k8s

sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated

echo "deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main" >> /etc/apt/sources.list
apt-get update
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB FEEA9169307EA071
sudo apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated

5.2 错误

5.2.1

Process: 2226953 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE)

Main PID: 2226953 (code=exited, status=1/FAILURE)

```shell
# 查看docker驱动
docker info|grep Driver
# Cgroup Driver: cgroupfs

# 查看kubelet驱动
systemctl show --property=Environment kubelet |cat

# 修改docker驱动,查看/etc/docker/daemon.json文件,没有的话,手动创建,添加以下内容
{
"exec-opts": ["native.cgroupdriver=systemd"]
}

# 重启服务
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet

5.2.2

$kubeadm init
[init] Using Kubernetes version: v1.25.1
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: E0921 08:07:06.893549 27522 remote_runtime.go:948] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
time="2022-09-21T08:07:06+08:00" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher


$mv /etc/containerd/config.toml /etc/containerd/config.toml.old
$systemctl restart containerd
$kubeadm init
[init] Using Kubernetes version: v1.25.1
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'

还有什么创意, 大家可以在评论中提出来, 感谢阅读!!!

结尾

本文主要是一些简单的应用和配置介绍, 下一文将利用docker实现一些有趣的应用, 比如利用docker搭建一个博客系统, 文件同步系统等