实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译

模块 1:NFS 网络文件系统(主机 Ubuntu ↔ ARM 开发板文件互通)

1. 基础环境固定信息

  • 本机 Ubuntu IP:192.168.46.121
  • 本机共享目录:/NFS,目录下仅存在文件夹 1

2. 完整安装、配置、启停指令(Ubuntu 主机端)

  1. 安装 NFS 服务端

    sudo apt update
    sudo apt install nfs-kernel-server

  2. 创建共享目录并授权权限

    sudo mkdir -p /NFS
    sudo chmod 777 /NFS
    sudo chown nobody:nogroup /NFS

  3. 修改核心配置文件 /etc/exports

    sudo vim /etc/exports

    写入配置(伪根+nohide参数,允许局域网所有设备读写)

    /NFS *(rw,sync,no_subtree_check,all_squash,anonuid=65534,anongid=65534,nohide,fsid=0)

参数逐条解释:

  • rw:开发板读写权限;ro 只读
  • sync:同步写入,数据落盘后返回,防止文件损坏
  • all_squash:所有客户端访问映射为匿名用户 nobody,解决权限报错
  • nohide:嵌套子目录对外可见,不加该参数 /NFS/1 挂载后看不到
  • fsid=0:伪根机制,限制客户端仅能访问 /NFS 内部,无法跳转到主机 /etc/home 等系统目录
  1. 重载配置、启停 NFS 服务指令

    重新加载exports配置,无需重启服务

    sudo exportfs -arv

    查看当前生效共享目录

    exportfs -v

    停止/启动/重启服务

    sudo systemctl stop nfs-kernel-server
    sudo systemctl start nfs-kernel-server
    sudo systemctl restart nfs-kernel-server

    设置开机自启

    sudo systemctl enable nfs-kernel-server

    查看服务运行状态

    sudo systemctl status nfs-kernel-server

  2. 防火墙放行 NFS 端口(如开启 ufw)

    sudo ufw allow nfs
    sudo ufw reload

3. 嵌入式开发板挂载指令(ARM Linux 端)

复制代码
# 临时挂载(重启失效)
mount -t nfs 192.168.46.121:/NFS /mnt/nfs -o nolock
# 永久挂载(写入/etc/fstab,开机自动挂载)
192.168.46.121:/NFS  /mnt/nfs  nfs  defaults,nolock  0 0

挂载参数 -o nolock:嵌入式设备无文件锁服务,必须加,否则挂载卡死

4. 高频故障 & 排错指令

  1. 开发板提示 Permission denied

    • 排错:检查 exports all_squash 参数、目录权限 777、主机防火墙
  2. 挂载后看不到 /NFS/1 子文件夹

    • 修复:配置增加 nohide 参数,执行 exportfs -arv 重载
  3. 挂载超时连接失败

    • 排查网络连通:ping 192.168.46.121;检查主机 NFS 服务是否 running
  4. 查看 NFS 服务日志

    journalctl -u nfs-kernel-server -f

模块 2:Samba 跨 Windows ↔ Ubuntu 文件共享

1. 全套安装配置指令

1.安装服务

复制代码
sudo apt install samba samba-common-bin

2.备份配置文件,编辑 /etc/samba/smb.conf

复制代码
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo vim /etc/samba/smb.conf

3.共享段配置示例(共享 /NFS 目录给 Windows)

复制代码
[share]
    path = /NFS
    browseable = yes
    read only = no
    writable = yes
    guest ok = no
    create mask = 0777
    directory mask = 0777

4.创建 Samba 独立账号(必须为系统已存在用户)

复制代码
sudo smbpasswd -a 你的用户名
# 删除samba账号
sudo smbpasswd -x 用户名

5.重载配置、启停服务

复制代码
# 校验配置语法是否错误
testparm
# 重启服务
sudo systemctl restart smbd nmbd
sudo systemctl enable smbd nmbd
# 查看状态
sudo systemctl status smbd

2. Windows 访问方式

文件资源管理器地址栏输入:\\192.168.46.121\share,输入 samba 账号密码登录

3. 常见故障

  • Windows 无法发现主机:确保nmbd服务正常运行;关闭双方防火墙
  • 无写入权限:配置 writable=yes,本地目录权限 777

模块 3:VNC 远程图形桌面(无显示器远程操控 Ubuntu)

1. 安装 + 启动全套指令

复制代码
# 安装vnc服务端
sudo apt install tigervnc-standalone-server
# 设置VNC访问密码
vncpasswd
# 启动vnc服务(:1 对应5901端口)
vncserver :1 -geometry 1920x1080
# 关闭指定桌面会话
vncserver -kill :1

2. systemd 托管 VNC 服务(开机自启)

编写 /etc/systemd/system/vncserver@.service 服务单元文件

复制代码
[Unit]
Description=VNC Remote Desktop
After=network.target

[Service]
User=你的用户名
ExecStart=/usr/bin/vncserver %i -geometry 1920x1080
ExecStop=/usr/bin/vncserver -kill %i

[Install]
WantedBy=multi-user.target

托管指令:

复制代码
sudo systemctl daemon-reload
sudo systemctl enable --now vncserver@1

3. 客户端连接

Windows/VNC Viewer 输入地址:192.168.46.121:5901

4. 故障排查

  • 连接黑屏:修改 vnc 启动脚本加载桌面环境;查看日志 journalctl -u vncserver@1 -f
  • 端口占用:vncserver -kill :1 杀掉旧会话重启

模块 4:Git 版本控制

1. 核心概念

  • remote/upstream:双远程仓库管理,origin 本地仓库,upstream 上游官方源码仓库
  • Git 子模块:项目嵌套依赖第三方源码仓库,单独管理版本

2. 高频操作流程 + 配套指令

  1. 远程仓库配置

    添加上游仓库

    git remote add upstream 仓库地址

    查看全部远程仓库

    git remote -v

    拉取上游最新代码

    git fetch upstream

    合并上游代码到本地master分支

    git merge upstream/master

    切换分支

    git checkout master

2.子模块完整同步流程(嵌入式项目高频)

复制代码
# 首次拉取包含子模块的项目
git clone 仓库地址 --recursive
# 已有项目,补全初始化子模块代码
git submodule update --init --recursive
# 更新所有子模块到上游最新版本
git submodule update --remote
# 单独进入子模块目录操作
cd 子模块文件夹 && git pull

3.基础提交推送流程

复制代码
git add .
git commit -m "提交注释"
git push origin master
git pull origin master
# 查看提交日志
git log --oneline
# 撤销未提交修改
git checkout -- .

3. 踩坑故障

  1. 子模块代码为空:克隆未加--recursive,未执行 submodule update 初始化
  2. 上游仓库代码不同步:未配置 upstream 远程,fetch 拉取不到官方更新
  3. 分支冲突:合并上游代码产生代码冲突,需手动编辑冲突文件后重新 add/commit

模块 5:CMake 嵌入式项目编译构建(补充完整指令、CMake 代码片段)

1. 完整编译流程指令

复制代码
# 1. 创建独立编译目录,隔离源码
mkdir build && cd build
# 2. 读取上级CMakeLists.txt生成Makefile
cmake ..
# 3. 多线程编译(-j后填CPU核心数,加速编译)
make -j8
# 4. 清理编译产物
make clean
# 5. 重新完整构建
rm -rf build && mkdir build && cd build && cmake .. && make -j8

2. 嵌入式关键 CMakeLists.txt 片段(Protobuf/Grpc 依赖解决)

复制代码
# 指定交叉编译工具链
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)

# 配置第三方库头文件路径
include_directories(
    ${PROJECT_SOURCE_DIR}/include
    /opt/protobuf/include
    /opt/grpc/include
)
# 链接库文件路径
link_directories(
    /opt/protobuf/lib
    /opt/grpc/lib
)
# 链接依赖库
target_link_libraries(你的可执行文件 protobuf grpc++)

3. 高频编译报错 & 解决方案

  1. protobuf/xxx.h: No such file or directory 原因:CMake 未配置 include 头文件路径,补充include_directories()
  2. undefined reference to protobuf函数 原因:未链接库文件,补充target_link_libraries
  3. 交叉编译生成 x86 程序:未指定 arm 交叉编译器,添加 CMAKE_C/CXX_COMPILER 配置

模块 6:systemd 系统服务管理

1. systemd 核心通用指令

复制代码
# 重新加载所有service单元文件(修改服务配置后必执行)
sudo systemctl daemon-reload

# 启停/重启服务
sudo systemctl start 服务名
sudo systemctl stop 服务名
sudo systemctl restart 服务名

# 设置开机自启/取消开机自启
sudo systemctl enable 服务名
sudo systemctl disable 服务名
# 启动+开机自启一步执行
sudo systemctl enable --now 服务名

# 查看服务运行状态、报错
sudo systemctl status 服务名
# 实时打印服务日志
journalctl -u 服务名 -f
# 查看系统全部运行中的服务
systemctl list-units --type=service
# 查看开机自启服务列表
systemctl list-unit-files --type=service

2. 自定义后台服务单元文件模板(xxx.service,存放路径 /etc/systemd/system/

复制代码
[Unit]
# 服务描述
Description=嵌入式后台业务服务
# 网络就绪后再启动
After=network.target nfs-kernel-server.service
# 依赖服务启动
Wants=nfs-kernel-server

[Service]
# 运行用户
User=root
# 程序绝对路径
ExecStart=/opt/app/main
# 进程崩溃自动重启
Restart=always
# 重启间隔秒数
RestartSec=3
# 进程退出信号
KillSignal=SIGINT

[Install]
# 开机多用户模式下启动
WantedBy=multi-user.target

3. 嵌入式常用 systemd 服务示例

NFS、Samba、VNC、自定义设备业务程序均使用 systemd 托管,统一启停、日志查看、开机自启。

模块 7:Ubuntu 内核降级操作(完整步骤 + 指令)

  1. 查看当前内核、可安装内核列表

    uname -r
    apt search linux-image | grep amd64

2.安装指定版本内核镜像 + 头文件

复制代码
sudo apt install linux-image-5.15.0-xx-generic linux-headers-5.15.0-xx-generic

3.修改 grub 启动项,默认使用降级内核

复制代码
sudo vim /etc/default/grub
# 修改配置
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-xx-generic"
GRUB_SAVEDEFAULT=true
# 更新grub引导
sudo update-grub
# 重启生效
sudo reboot

4.重启后验证内核版本

复制代码
uname -r

故障:降级后无法启动

  • 修复:开机长按 Shift 调出 grub 菜单,手动选择旧内核启动,重新核对 grub 配置

模块 8:交叉编译工具链(ARM 嵌入式编译)

1. 工具链安装指令

复制代码
# 安装ARM Linux交叉编译器
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
# 验证工具链是否可用
arm-linux-gnueabihf-gcc -v

2. 单文件交叉编译指令

复制代码
# 编译arm架构可执行程序
arm-linux-gnueabihf-gcc main.c -o app_arm
# 验证程序架构(确认是ARM,而非x86)
file app_arm

3. CMake 交叉编译配套

在 CMakeLists 内指定交叉编译器,或编译时传参:

复制代码
cmake .. -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++

4. 部署流程

交叉编译生成 arm 程序 → NFS 共享目录存放 → 开发板挂载 NFS 直接运行

模块 10:嵌入式技术栈清单

  • 编程语言:C、C++
  • 硬件架构:ARM
  • 图形界面:Qt
  • 厂商 SDK:NX-SDK
  • 通信组件:Protobuf、Grpc
  • 操作系统:Ubuntu PC、嵌入式 Linux 设备
相关推荐
牛艺翔1 小时前
C++基础
开发语言·c++
键盘会跳舞2 小时前
C++ :容器适配器stack源码级拆解
开发语言·c++··stack·先进后出
美味蛋炒饭.2 小时前
Git 版本控制(下)
开发语言·git·学习·总结·后端开发
yyy(十一月限定版)2 小时前
017【入门】最小栈
linux·运维·服务器
互联网中的一颗神经元2 小时前
09 — .git 地图:打开那个隐藏文件夹
大数据·git·elasticsearch
不负岁月无痕2 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试
余额瞒着我当琳3 小时前
C++模板初阶与STL初探
android·java·c++
萧瑟其中~3 小时前
多线程锁详解:互斥锁·自旋锁·读写锁(CAS + futex 原理)
开发语言·c++
Zguigo3 小时前
第25-26讲:计算机操作系统存储管理——分页机制、页表与快表(TLB)
linux·windows·笔记