嵌入式系统分区调整与 Tailscale 部署文档

一、操作概述

本文档详细描述嵌入式系统中调整 SD 卡分区、挂载指定目录,并部署 Tailscale 守护进程的完整流程,适用于基于/dev/mmcblk1存储设备的嵌入式 Linux 系统(如 Jetson 系列)。

二、分区调整操作

2.1 分区创建(fdisk)

通过fdisk工具对/dev/mmcblk1(SD 卡 / EMMC 设备)进行分区创建,新增 2 个主分区:

  • mmcblk1p3:大小 1GB,用于挂载/opt目录
  • mmcblk1p4:起始扇区 2277376,结束扇区默认(剩余全部空间),用于挂载/userdata/jetkvm/images目录

执行命令:

bash

运行

# 进入fdisk分区工具
fdisk /dev/mmcblk1

# 创建p3分区(1GB主分区)
n       # 新建分区
p       # 主分区
3       # 分区编号3
        # 起始扇区按回车(默认)
+1g     # 分区大小1GB

# 创建p4分区(剩余空间主分区)
n       # 新建分区
p       # 主分区
4       # 分区编号4
2277376 # 起始扇区(指定值)
        # 结束扇区按回车(默认剩余全部空间)

w       # 保存分区表并退出

# 查看分区结果
fdisk -l

# 重启系统使分区表生效
reboot

2.2 分区格式化

将新建的 p3、p4 分区格式化为 ext4 文件系统:

bash

运行

mkfs.ext4 /dev/mmcblk1p3
mkfs.ext4 /dev/mmcblk1p4

2.3 配置开机自动挂载

修改/etc/fstab文件,添加分区挂载规则,确保系统启动时自动挂载:

bash

运行

# 编辑fstab文件
nano /etc/fstab

# 添加以下两行(挂载规则)
/dev/mmcblk1p3  /opt  ext4  defaults  0  2
/dev/mmcblk1p4  /userdata/jetkvm/images  ext4  defaults  0  2

# 立即生效挂载配置(无需重启)
mount -a

2.4 注释原有挂载项

编辑/etc/init.d/S11partition文件,注释掉/userdata/jetkvm/images的原有挂载逻辑(避免冲突):

bash

运行

nano /etc/init.d/S11partition

# 找到对应挂载行,在行首添加#注释
# 示例:# mount /dev/xxx /userdata/jetkvm/images

三、Tailscale 部署

3.1 准备文件

  1. 将 Tailscale 程序包上传至/opt目录(需提前下载对应架构的 Tailscale 二进制包)
  2. 赋予程序执行权限:
    bash

    运行

    chmod u+x /opt/tailscale*
  3. 上传 SSL 证书(pem 格式)至/opt目录,并创建证书目录:
    bash

    运行

    mkdir -p /etc/ssl/certs
    # 可将pem证书复制到/etc/ssl/certs目录(若需要)
    # cp /opt/*.pem /etc/ssl/certs/

3.2 创建 Tailscale 守护进程启动脚本

创建/etc/init.d/S99tailscaled脚本,实现 Tailscale 服务的开机自启、启停管理(使用默认数据目录和端口):

脚本内容:

bash

运行

#!/bin/sh

### BEGIN INIT INFO
# Provides:          tailscaled
# Required-Start:    $network $local_fs
# Required-Stop:     $network $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stop tailscaled daemon
### END INIT INFO

DAEMON="/opt/tailscaled"
DAEMON_NAME="tailscaled"
PIDFILE="/var/run/$DAEMON_NAME.pid"

# 构建完整的启动命令(使用默认数据目录和端口)
DAEMON_OPTS=""

start() {
    printf "Starting %s: " "$DAEMON_NAME"
    start-stop-daemon -S -q -b -m -p "$PIDFILE" -x "$DAEMON" -- $DAEMON_OPTS
    status=$?
    if [ "$status" -eq 0 ]; then
        echo "OK"
    else
        echo "FAIL"
    fi
    return "$status"
}

stop() {
    printf "Stopping %s: " "$DAEMON_NAME"
    start-stop-daemon -K -q -p "$PIDFILE"
    status=$?
    if [ "$status" -eq 0 ]; then
        echo "OK"
    else
        echo "FAIL"
    fi
    return "$status"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload)
        stop
        start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

exit $?

赋予脚本执行权限:

bash

运行

chmod +x /etc/init.d/S99tailscaled

3.3 启动 Tailscale 服务

bash

运行

# 启动服务
/etc/init.d/S99tailscaled start

# 重启服务(如需)
/etc/init.d/S99tailscaled restart

# 停止服务(如需)
/etc/init.d/S99tailscaled stop

四、关键说明

  1. 分区操作风险​:fdisk操作会修改分区表,执行前请备份重要数据;重启系统是为了让新分区表生效。
  2. fstab 挂载规则​:

    • defaults:默认挂载选项(rw, suid, dev, exec, auto, nouser, async)
    • 第 5 列0:不进行 dump 备份
    • 第 6 列2:开机时 fsck 检查顺序(根分区为 1,其他分区为 2)
  3. Tailscale 配置​:

    • 移除了自定义TAILSCALE_DATA_DIRTAILSCALE_PORT,使用 Tailscale 默认配置(默认数据目录为/var/lib/tailscale,默认端口为 41641)。
    • 启动脚本使用start-stop-daemon管理进程,符合嵌入式 Linux 系统的服务管理规范。
  4. 脚本命名规则​:/etc/init.d/下的脚本以S开头表示启动脚本,数字99表示启动优先级(数字越大,启动越晚),确保网络等依赖服务启动后再启动 Tailscale。

五、验证操作

  1. 验证分区挂载:
    bash

    运行

    df -h # 查看/opt和/userdata/jetkvm/images是否正常挂载
  2. 验证 Tailscale 进程:
    bash

    运行

    ps -ef | grep tailscaled # 查看进程是否运行
    netstat -tulpn | grep 41641 # 查看端口是否监听(如需)
  3. 验证开机自启:重启系统后,再次执行上述命令,确认分区挂载和 Tailscale 进程正常。
最后修改:2025 年 12 月 11 日
如果觉得我的文章对你有用,请随意赞赏