Categories
Uncategorized

Docker MySQL 8.0 主从复制集群完整搭建指南

概述

本文档详细介绍了如何使用 Docker Compose 搭建 MySQL 8.0 的主从复制集群,包含 1 个主节点(Master)和 2 个从节点(Slave),实现数据自动复制、读写分离和高可用。

系统要求

  • Docker Engine 19.03+
  • Docker Compose v2.0+
  • 至少 4GB 可用内存
  • 有足够的磁盘空间存储数据

文件结构

准备以下文件:

  • mysql.yml – Docker Compose 配置文件
  • setup-users.sql – 初始化用户脚本
  • init-replication.sh – 初始化复制脚本

步骤 1:创建 Docker Compose 配置文件

创建 mysql.yml 文件:

# MySQL 主从复制集群 Docker Compose 配置
# 📅 创建日期:2026-04-01
# 📌 端口:3306 (主), 3307 (从 1), 3308 (从 2)
# 🎯 架构:1 主节点 + 2 从节点
# 🔗 特性:数据自动复制、读写分离、高可用

version: '3.8'

services:
  # ==================== 主节点 (Master) ====================
  mysql-master:
    image: mysql:8.0
    container_name: mysql-master
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123456
      MYSQL_DATABASE: default_db
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass123
      TZ: Asia/Shanghai
    ports:
      - "0.0.0.0:3306:3306"
    volumes:
      - ~/docker-data/mysql/master/data:/var/lib/mysql:z
      - ~/docker-data/mysql/master/logs:/var/log/mysql:z
      - ~/docker-data/mysql/master/conf:/etc/mysql/conf.d:z
      - ./setup-users.sql:/docker-entrypoint-initdb.d/setup-users.sql:ro
    command:
      - --server-id=1
      - --log-bin=mysql-bin
      - --binlog-format=ROW
      - --gtid-mode=ON
      - --enforce-gtid-consistency=ON
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    networks:
      - mysql-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot123456"]
      interval: 30s
      timeout: 10s
      retries: 3

  # ==================== 从节点 1 (Slave 1) ====================
  mysql-slave-1:
    image: mysql:8.0
    container_name: mysql-slave-1
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123456
      MYSQL_DATABASE: default_db
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass123
      TZ: Asia/Shanghai
    ports:
      - "0.0.0.0:3307:3306"
    volumes:
      - ~/docker-data/mysql/slave-1/data:/var/lib/mysql:z
      - ~/docker-data/mysql/slave-1/logs:/var/log/mysql:z
      - ~/docker-data/mysql/slave-1/conf:/etc/mysql/conf.d:z
      - ./setup-users.sql:/docker-entrypoint-initdb.d/setup-users.sql:ro
    command:
      - --server-id=2
      - --relay-log=mysql-relay-bin
      - --read-only=ON
      - --gtid-mode=ON
      - --enforce-gtid-consistency=ON
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    networks:
      - mysql-network
    depends_on:
      - mysql-master
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot123456"]
      interval: 30s
      timeout: 10s
      retries: 3

  # ==================== 从节点 2 (Slave 2) ====================
  mysql-slave-2:
    image: mysql:8.0
    container_name: mysql-slave-2
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123456
      MYSQL_DATABASE: default_db
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass123
      TZ: Asia/Shanghai
    ports:
      - "0.0.0.0:3308:3306"
    volumes:
      - ~/docker-data/mysql/slave-2/data:/var/lib/mysql:z
      - ~/docker-data/mysql/slave-2/logs:/var/log/mysql:z
      - ~/docker-data/mysql/slave-2/conf:/etc/mysql/conf.d:z
      - ./setup-users.sql:/docker-entrypoint-initdb.d/setup-users.sql:ro
    command:
      - --server-id=3
      - --relay-log=mysql-relay-bin
      - --read-only=ON
      - --gtid-mode=ON
      - --enforce-gtid-consistency=ON
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    networks:
      - mysql-network
    depends_on:
      - mysql-master
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot123456"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  mysql-network:
    driver: bridge

步骤 2:创建用户初始化脚本

创建 setup-users.sql 文件:

-- 初始化脚本,确保root用户可以从任何主机连接
-- 并创建普通用户

-- 为root用户创建从任意主机访问的账户
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY 'root123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

-- 确保dbuser在所有节点上都存在
CREATE USER IF NOT EXISTS 'dbuser'@'%' IDENTIFIED BY 'dbpass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'dbuser'@'%';
FLUSH PRIVILEGES;

-- 也保留localhost访问权限
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123456';
FLUSH PRIVILEGES;

步骤 3:创建复制初始化脚本

创建 init-replication.sh 文件:

#!/bin/bash
# MySQL 主从配置初始化脚本
# 📅 创建日期:2026-04-01
# 用途:配置主从复制关系

set -e

echo "🔧 开始配置 MySQL 主从复制..."
echo ""

# 等待主节点就绪
echo "⏳ 等待主节点就绪..."
for i in {1..30}; do
    if docker exec mysql-master mysql -u root -proot123456 -e "SELECT 1" > /dev/null 2>&1; then
        echo "✅ 主节点已就绪"
        break
    fi
    sleep 2
done

# 等待从节点就绪
echo "⏳ 等待从节点就绪..."
for i in {1..30}; do
    if docker exec mysql-slave-1 mysql -u root -proot123456 -e "SELECT 1" > /dev/null 2>&1; then
        echo "✅ 从节点1已就绪"
        break
    fi
    sleep 2
done

# 等待从节点2就绪
echo "⏳ 等待从节点2就绪..."
for i in {1..30}; do
    if docker exec mysql-slave-2 mysql -u root -proot123456 -e "SELECT 1" > /dev/null 2>&1; then
        echo "✅ 从节点2已就绪"
        break
    fi
    sleep 2
done


# 创建复制用户
echo "🔐 创建复制用户..."
docker exec mysql-master mysql -u root -proot123456 <<EOF
CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED BY 'repl123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
EOF

# 获取主节点位置
echo "📊 获取主节点位置..."
MASTER_STATUS=$(docker exec mysql-master mysql -u root -proot123456 -e "SHOW MASTER STATUS\G")
MASTER_FILE=$(echo "$MASTER_STATUS" | grep "File:" | awk '{print $2}')
MASTER_POS=$(echo "$MASTER_STATUS" | grep "Position:" | awk '{print $2}')

if [ -z "$MASTER_FILE" ] || [ -z "$MASTER_POS" ]; then
    echo "❌ 无法获取主节点状态"
    exit 1
fi

echo "✅ 主节点位置:$MASTER_FILE:$MASTER_POS"

# 配置从节点 1
echo "🔗 配置从节点 1 (mysql-slave-1)..."
docker exec mysql-slave-1 mysql -u root -proot123456 <<EOF
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='repl',
  MASTER_PASSWORD='repl123456',
  MASTER_LOG_FILE='$MASTER_FILE',
  MASTER_LOG_POS=$MASTER_POS,
  GET_MASTER_PUBLIC_KEY=1;
START SLAVE;
EOF

# 配置从节点 2
echo "🔗 配置从节点 2 (mysql-slave-2)..."
docker exec mysql-slave-2 mysql -u root -proot123456 <<EOF
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='repl',
  MASTER_PASSWORD='repl123456',
  MASTER_LOG_FILE='$MASTER_FILE',
  MASTER_LOG_POS=$MASTER_POS,
  GET_MASTER_PUBLIC_KEY=1;
START SLAVE;
EOF

# 等待同步
echo "⏳ 等待复制同步..."
sleep 5

# 验证复制状态
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📊 验证主从状态"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

echo ""
echo "📌 主节点状态:"
docker exec mysql-master mysql -u root -proot123456 -e "SHOW MASTER STATUS\G"

echo ""
echo "📌 从节点 1 状态:"
docker exec mysql-slave-1 mysql -u root -proot123456 -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Master_Host"

echo ""
echo "📌 从节点 2 状态:"
docker exec mysql-slave-2 mysql -u root -proot123456 -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Master_Host"

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ 主从配置完成!"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

步骤 4:设置文件权限

chmod +x init-replication.sh

步骤 5:启动集群

# 创建数据目录
mkdir -p ~/docker-data/mysql/{master,slave-1,slave-2}/{data,logs,conf}
chmod -R 777 ~/docker-data/mysql

# 启动集群
docker compose -f mysql.yml up -d

步骤 6:初始化主从复制

./init-replication.sh

连接信息

账户信息

  • Root 用户密码root123456
  • 普通用户dbuser / dbpass123

端口映射

  • 主节点 (读写): 3306
  • 从节点1 (只读): 3307
  • 从节点2 (只读): 3308

连接示例

# 主节点(写操作)
mysql -h 127.0.0.1 -P 3306 -u root -proot123456

# 从节点(读操作)
mysql -h 127.0.0.1 -P 3307 -u root -proot123456
mysql -h 127.0.0.1 -P 3308 -u root -proot123456

# 普通用户连接
mysql -h 127.0.0.1 -P 3306 -u dbuser -pdbpass123

验证复制

检查主节点状态

docker exec mysql-master mysql -u root -proot123456 -e "SHOW MASTER STATUS;"

检查从节点状态

docker exec mysql-slave-1 mysql -u root -proot123456 -e "SHOW SLAVE STATUS\G;"

测试数据同步

在主节点创建表并插入数据,然后在从节点验证数据是否同步。

常见问题

1. Public Key Retrieval 错误

如果应用程序连接时出现 “Public Key Retrieval is not allowed” 错误,请在连接字符串中添加 allowPublicKeyRetrieval=true 参数。

2. 从节点无法连接

检查复制用户权限和网络连接,确保主节点的复制用户允许从从节点IP连接。

3. 复制延迟

使用 SHOW SLAVE STATUS\G; 检查 Seconds_Behind_Master 字段确认延迟。

管理命令

停止集群

docker compose -f mysql.yml down

查看日志

docker logs mysql-master
docker logs mysql-slave-1
docker logs mysql-slave-2

备份数据

docker exec mysql-master mysqldump -u root -proot123456 --all-databases > backup.sql

注意事项

  1. 安全性: 生产环境请使用更强的密码
  2. 备份: 定期备份主节点数据
  3. 监控: 监控复制延迟和错误
  4. 容量: 确保从节点有足够存储空间
  5. 网络: 保证主从节点间网络稳定

这个配置提供了高可用的 MySQL 主从复制集群,适合读多写少的应用场景,如 WordPress 博客等。

Categories
Uncategorized

幸狐派 CM4 Lite 32G EMMC 扩容操作系统安装记录

📅 安装日期:2026-03-31
📦 硬件版本:幸狐派 CM4 Lite(无 EMMC 版本)
💾 扩容方案:焊接 32GB EMMC + SD 卡克隆
🐧 操作系统:Debian 12 (Bookworm) 64-bit
🔌 SoC 芯片:瑞芯微 RK3566
🖥️ 烧写平台:Windows 10/11
🔧 烧写工具:RKDevTool


一、前言

幸狐派 CM4 Lite 是不带 EMMC 存储的版本,采用瑞芯微 RK3566 SoC 芯片。本文记录从零开始焊接 32GB 江波龙 EMMC 芯片,使用 RKDevTool 烧写 Debian 系统到 SD 卡,从 SD 卡启动后通过 dd 命令克隆到 EMMC,最后使用 parted 和 resize2fs 完成分区扩容的完整过程。

技术路线

┌──────────────────────────────────────────────────────────
│  步骤 1: 焊接 32G EMMC 芯片到 CM4 Lite 主板                    │
│  步骤 2: 使用 RKDevTool 烧写 Debian 系统到 SD 卡               │
│  步骤 3: 从 SD 卡启动系统并验证                               │
│  步骤 4: 使用 dd 命令将 SD 卡系统克隆到 EMMC                    │
│  步骤 5: 使用 parted 重建分区表并扩容根分区                    │
│  步骤 6: 使用 resize2fs 强制扩展文件系统                       │
│  步骤 7: 通过 lsblk 检查 EMMC 和 df -h 检查系统分区情况         │
│  步骤 8: 移除 SD 卡,从 EMMC 启动                              │
└──────────────────────────────────────────────────────────

为什么先烧写 SD 卡?

优势:
├─ 安全:SD 卡启动验证系统正常后再克隆到 EMMC
├─ 可逆:如 EMMC 有问题可重新从 SD 卡启动修复
├─ 灵活:可在系统运行时操作 EMMC 分区
└─ 调试方便:串口 + SSH 双重调试通道

流程:
SD 卡启动 (16GB) → dd 克隆 → EMMC (32GB) → parted 扩容 → resize2fs 扩展

硬件平台说明

项目规格
SoC瑞芯微 RK3566 (Quad-core Cortex-A55)
GPUMali-G52 2EE
NPU0.8 TOPS
内存LPDDR4/LPDDR4X 1GB/2GB/4GB/8GB
存储EMMC 5.1 / SD 卡 / SPI Flash
系统Debian 12 (Bookworm)

二、硬件准备

2.1 所需材料

物品规格/型号备注
幸狐派 CM4 Lite 主板无 EMMC 版本RK3566 SoC
EMMC 芯片32GB BGA153江波龙 SDAE32G-10 ⭐
SD 卡16GB Class 10 以上系统烧写介质
SD 卡读卡器USB 3.0烧写用
热风枪/焊台恒温可调温焊接 EMMC 用
助焊剂/锡膏优质无铅提高焊接质量
USB-A 转 USB-C 数据线支持数据传输烧写/调试用
5V/3A 电源适配器USB-C 接口稳定供电
散热片/风扇可选长时间运行建议加装
短接帽/镊子可选进入烧写模式用

2.2 EMMC 芯片选型

推荐型号:

  • FORESEE SDAE32G-10 (江波龙 32GB) ⭐ 本文使用
  • KLM32HEHB-B041 (三星 32GB)
  • H26M36203GMR (海力士 32GB)
  • MTFC32GAKAECQ (美光 32GB)

⚠️ 注意:EMMC 芯片焊接需要一定 BGA 焊接经验,如无经验建议找专业维修店代焊

2.3 江波龙 EMMC 芯片信息

本文使用的江波龙(FORESEE)32GB EMMC 芯片:

参数规格
品牌江波龙 (Longsys)
系列FORESEE SDAE
型号SDAE32G-10
容量32GB
封装BGA153
工作电压3.3V
接口标准eMMC 5.1
工作温度-25°C ~ 85°C

江波龙芯片特点

  • 国产芯片,性价比高
  • 兼容 RK3566 存储规范
  • 稳定性良好,适合嵌入式应用
  • 市场常见,采购方便

三、软件工具准备

3.1 烧写工具(Windows)

瑞芯微创建磁盘工具(本文使用)⭐

工具信息:
- 工具名称:瑞芯微创建磁盘工具(Rockchip Create Disk Tool)
- 版本:v2.86 或更高版本
- 来源:瑞芯微官方 / 幸狐派提供的资料包 / 厂商技术支持
- 文件大小:约 10-20 MB
- 用途:创建可启动磁盘/烧写系统镜像

功能特点:
├─ 支持 RK3566 平台
├─ 支持 SD 卡/EMMC 烧写
├─ 图形界面操作简单
├─ 支持自定义镜像文件
└─ 自动验证写入数据

3.2 Windows 驱动安装(首次使用必备)⭐

Rockchip 驱动安装步骤

方法一:使用驱动助手(推荐)
├─ 下载:Rockchip_Driver_Assistant_v1.9.zip
├─ 解压后运行:DriverInstall.exe
├─ 点击 "安装" 按钮
├─ 等待驱动安装完成
└─ 显示 "驱动安装成功"

方法二:手动安装
├─ 设备进入烧写模式并连接电脑
├─ 打开设备管理器
├─ 找到 "未知设备" 或 "Rockchip USB Device"
├─ 右键 → 更新驱动程序
├─ 选择 "浏览我的电脑以查找驱动程序"
├─ 指向驱动文件夹(包含 usb_driver.inf)
└─ 完成安装

验证驱动安装:
├─ 设备管理器 → 通用串行总线设备
├─ 应看到 "Rockchip USB Device" 或 "Rockchip Composite Device"
└─ 无黄色感叹号表示驱动正常

3.3 系统镜像

Debian 12 for RK3566

从幸狐派官方或社区获取适配 RK3566 的 Debian 镜像
文件名示例:2023-09-13-debian-arm64+HDMI-lite.img

⚠️ 重要:必须使用适配 RK3566 和幸狐派 CM4 Lite 的镜像,通用 Debian 镜像无法启动!


四、系统烧写步骤

4.1 步骤一:焊接 32G EMMC 芯片

┌────────────────────────────────────────┐
│  EMMC 焊接流程                          │
├────────────────────────────────────────┤
│  1. 清理主板焊盘,去除氧化层            │
│  2. 植锡球到 EMMC 芯片底部              │
│  3. 涂抹助焊剂,对齐芯片方向(注意 Pin1)│
│  4. 热风枪 280-300°C 加热焊接           │
│  5. 冷却后检查短路和虚焊                │
│  6. 万用表测试电源对地阻值              │
└────────────────────────────────────────┘

焊接完成后检查:

测量 EMMC 电源引脚对地阻值
VCC (eMMC 电源) 正常阻值:约 100-500Ω
如短路(接近 0Ω)需重新焊接

4.2 步骤二:使用瑞芯微创建磁盘工具烧写系统到 SD 卡

步骤 1:准备工具
├─ 确保已下载瑞芯微创建磁盘工具
├─ 解压工具包(如为压缩格式)
└─ 以管理员身份运行工具

步骤 2:连接 SD 卡
├─ SD 卡插入 USB 读卡器
├─ 读卡器连接电脑 USB 端口
└─ 电脑识别 SD 卡盘符(如 G: 盘)

步骤 3:选择镜像文件
├─ 点击 "选择镜像" 或 "Browse" 按钮
├─ 找到并选择解压后的 .img 镜像文件
│   └─ 文件名示例:debian10-rk3566-幸狐派-cm4-lite.img
└─ 确认镜像加载成功

步骤 4:选择目标磁盘
├─ 在磁盘列表中选择 SD 卡
│   └─ 根据容量识别(16GB 卡显示约 14.9GB)
│   └─ 或根据盘符识别
└─ ⚠️ 确认选择正确的设备(避免选错硬盘!)

步骤 5:开始烧写
├─ 点击 "创建" 或 "Start" 按钮
├─ 确认警告提示(将擦除 SD 卡数据)
├─ 等待烧写完成(约 5-10 分钟)
│   ├─ 擦除 SD 卡
│   ├─ 写入镜像
│   ├─ 验证数据
│   └─ 完成
└─ 显示 "创建成功" 或 "Success"

步骤 6:安全移除
├─ 等待工具提示完成
├─ 在 Windows 中安全移除 USB 设备
└─ 拔出 SD 卡

工具界面说明

┌─────────────────────────────────────────────────────────┐
│  瑞芯微创建磁盘工具                          - □ ×    │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  镜像文件:[C:\images\debian10-rk3566.img] [浏览]      │
│                                                         │
│  目标磁盘:                                             │
│  ┌──────────────────────────────────────────────────┐  │
│  │  ☐ 本地磁盘 (C:)          232GB  NTFS           │  │
│  │  ☑ 可移动磁盘 (G:)         14.9GB  FAT32        │  │ ← SD 卡
│  │  ☐ 本地磁盘 (H:)          931GB  NTFS           │  │
│  └──────────────────────────────────────────────────┘  │
│                                                         │
│  [开始创建]  [退出]  [帮助]                             │
│                                                         │
│  进度:                                                 │
│  └──────────────────────────────────────────────────┘  │
│  状态:准备就绪                                         │
└─────────────────────────────────────────────────────────┘

4.3 步骤三:从 SD 卡启动系统(本地 HDMI+ 键盘操作)⭐

连接方式说明

本文采用本地直连方式操作,无需 SSH:
├─ HDMI 显示器:输出图像
├─ USB 键盘:输入控制
├─ 网线/WiFi:网络连接(可选)
└─ 5V/3A 电源:供电
步骤 1:插入 SD 卡
├─ 将烧写好的 SD 卡插入幸狐派 CM4 Lite
└─ 确保插入到位(听到"咔哒"声)

步骤 2:连接显示器
├─ HDMI 线连接幸狐派和显示器
├─ 打开显示器电源
└─ 切换到对应 HDMI 输入源

步骤 3:连接键盘
├─ USB 键盘插入幸狐派 USB 端口
└─ 如使用无线键盘,插入接收器

步骤 4:连接网络(可选)
├─ 插入网线(有线网络)
└─ 或使用 WiFi(如镜像已配置)

步骤 5:上电启动
├─ 连接 5V/3A 电源
├─ 等待系统启动(约 1-2 分钟)
└─ 观察屏幕输出:
    ├─ U-Boot 启动信息
    ├─ Linux 内核加载
    ├─ 系统服务启动
    └─ 登录提示符

步骤 6:登录系统
├─ 看到登录提示后输入用户名
├─ 输入密码(不显示)
└─ 成功进入命令行界面

默认登录凭据(参考镜像说明):

常见默认账户:
└─ 用户名:linaro      密码:linaro

⚠️ 首次登录后建议立即修改密码!

首次登录验证

# 确认启动设备(应为 SD 卡)
lsblk
# 输出:
# NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
# mmcblk0     179:0    0  14.9G  0 disk  # SD 卡
# ├─mmcblk0p1 179:2    0  *****  0 part  /boot
# ├─mmcblk0p2 179:2    0  *****  0 part  
# ├─mmcblk0p3 179:2    0  *****  0 part  
# ├─mmcblk0p4 179:2    0  *****  0 part  
# ├─mmcblk0p5 179:2    0  *****  0 part  
# ├─mmcblk0p6 179:2    0  *****  0 part  
# ├─mmcblk0p7 179:2    0  *****  0 part  
# ├─mmcblk0p8 179:2    0  *****  0 part  / # 根分区
# mmcblk1     179:8    0  29.1G  0 disk  # EMMC (32GB, 未使用)

本地操作优势

├─ 无需网络配置,开机即用
├─ 可以看到完整启动日志
├─ 调试更方便,无网络延迟
├─ 适合系统安装和故障排查
└─ 操作响应更快

4.4 步骤四:使用 dd 命令将 SD 卡系统克隆到 EMMC ⭐

确认存储设备

# 本地登录后,查看存储设备
lsblk

# 输出示例
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0  14.9G  0 disk  # SD 卡
 ├─mmcblk0p1 179:2    0  *****  0 part  /boot
 ├─mmcblk0p2 179:2    0  *****  0 part  
 ├─mmcblk0p3 179:2    0  *****  0 part  
 ├─mmcblk0p4 179:2    0  *****  0 part  
 ├─mmcblk0p5 179:2    0  *****  0 part  
 ├─mmcblk0p6 179:2    0  *****  0 part  
 ├─mmcblk0p7 179:2    0  *****  0 part  
 ├─mmcblk0p8 179:2    0  15.5GB  0 part  / # 根分区
mmcblk1     179:8    0  29.1G  0 disk  # EMMC 32GB (目标)

# ⚠️ 重要:确认设备名称!
# mmcblk0 = SD 卡 (源)
# mmcblk1 = EMMC (目标)
# 切勿搞反!

执行 dd 克隆

# 先清空emmc
sudo dd if=/dev/zero of=/dev/mmcblk1 bs=1M status=progress conv=fsync
# 完整克隆整个 SD 卡到 EMMC(推荐)
sudo dd if=/dev/mmcblk0 of=/dev/mmcblk1 bs=4M status=progress conv=fsync

# 参数说明:
# if=/dev/mmcblk0  = 输入文件(SD 卡,源)
# of=/dev/mmcblk1  = 输出文件(EMMC,目标)
# bs=4M           = 块大小 4MB,提高速度
# status=progress = 显示进度
# conv=fsync      = 完成后强制同步写入

# 输出示例
# 100+0 records in
# 100+0 records out
# 4294967296 bytes (4.3 GB, 4.0 GiB) copied, 180 s, 23.9 MB/s
# 100% [========================================] 14.9 GB / 14.9 GB

# 耗时参考:约 5-10 分钟(取决于数据量)

克隆完成后同步

# 确保所有数据写入完成
sync

# 重新读取分区表
sudo partprobe /dev/mmcblk1

# 验证克隆
lsblk
# 应看到 mmcblk1 的分区结构与 mmcblk0 相同
mmcblk0     179:0    0  14.9G  0 disk  # SD 卡
 ├─mmcblk0p1 179:2    0  *****  0 part  /boot
 ├─mmcblk0p2 179:2    0  *****  0 part  
 ├─mmcblk0p3 179:2    0  *****  0 part  
 ├─mmcblk0p4 179:2    0  *****  0 part  
 ├─mmcblk0p5 179:2    0  *****  0 part  
 ├─mmcblk0p6 179:2    0  *****  0 part  
 ├─mmcblk0p7 179:2    0  *****  0 part  
 ├─mmcblk0p8 179:2    0  15.5GB  0 part  / # 根分区
mmcblk1     179:8    0  29.1G  0 disk  # EMMC 32GB (目标)
 ├─mmcblk1p1 179:2    0  *****  0 part  /boot
 ├─mmcblk1p2 179:2    0  *****  0 part  
 ├─mmcblk1p3 179:2    0  *****  0 part  
 ├─mmcblk1p4 179:2    0  *****  0 part  
 ├─mmcblk1p5 179:2    0  *****  0 part  
 ├─mmcblk1p6 179:2    0  *****  0 part  
 ├─mmcblk1p7 179:2    0  *****  0 part  
 ├─mmcblk1p8 179:2    0  28.5GB  0 part  / # 根分区

4.5 步骤五:使用 parted 重建分区表并扩容根分区 ⭐

查看当前 EMMC 分区

# 查看 EMMC 分区表
sudo parted /dev/mmcblk1 print

# 输出示例(克隆后,分区大小与 SD 卡相同)
Model: MMC SDAE32G (sd/mmc)
Disk /dev/mmcblk1: 32.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      17.4MB  537MB   520MB   fat32        boot     boot, esp
 ...
 8      *****   16.0GB  15.5GB  ext4         rootfs

⚠️ 此时 EMMC 根分区只有 15.5GB(与 SD 卡相同),需要扩容到 32GB

删除并重建分区(扩容)

# 进入 parted 交互模式
sudo parted /dev/mmcblk1

# 在 parted 提示符下执行:
(parted) print                    # 查看当前分区 会提示是否把GPT标记放到磁盘最末端 不停输入Fix
(parted) resize                   # 调整分区大小
(parted) 8                        # 指定分区序号
(parted) 100%                     # 设定分区大小
(parted) print                    # 验证新分区表
(parted) quit                     # 退出

# 新分区表应显示:
# Number  Start   End     Size    File system  Name     Flags
#  1      17.4MB  537MB   520MB   fat32        boot     boot, esp
# ...
#  8      *****   32.0GB  31.5GB  ext4         rootfs

重新加载分区表

# 通知内核重新读取分区表
sudo partprobe /dev/mmcblk1

# 验证新分区
lsblk
# 输出:
# mmcblk1     179:8    0  29.1G  0 disk
# ├─mmcblk1p1 179:9    0   512M  0 part
# ├─......
# └─mmcblk1p8 179:10   0  28.6G  0 part  # 已扩容到 28.6GB

4.6 步骤六:使用 resize2fs 强制扩展文件系统 ⭐

检查文件系统

# 检查文件系统完整性
sudo e2fsck -f /dev/mmcblk1p2

# 输出示例
# e2fsck 1.47.0 (5-Feb-2023)
# Pass 1: Checking inodes, blocks, and sizes
# Pass 2: Checking directory structure
# Pass 3: Checking directory connectivity
# Pass 4: Checking reference counts
# Pass 5: Checking group summary information
# /dev/mmcblk1p2: 12345/123456 files (0.5% non-contiguous), 1234567/12345678 blocks

扩展文件系统

# 强制扩展 ext4 文件系统到分区最大容量
sudo resize2fs -f /dev/mmcblk1p2

# 输出示例
# resize2fs 1.47.0 (5-Feb-2023)
# Resizing the filesystem on /dev/mmcblk1p2 to 7628800 (4k) blocks.
# The filesystem on /dev/mmcblk1p2 is now 7628800 (4k) blocks long.

# 耗时:约 1-2 分钟

验证文件系统

# 查看文件系统信息
sudo dumpe2fs -h /dev/mmcblk1p2 | grep "Block count"

# 输出
# Block count:  7628800

4.7 步骤七:通过 lsblk 检查 EMMC 和 df -h 检查系统分区 ⭐

lsblk 检查 EMMC 分区

# 查看块设备
lsblk

# 预期输出(扩容完成后)
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0  14.9G  0 disk  # SD 卡 (源)
├─mmcblk0p1 179:1    0   512M  0 part  /boot
├─......
└─mmcblk0p8 179:2    0  14.4G  0 part  /
mmcblk1     179:8    0  29.1G  0 disk  # EMMC 32GB
├─mmcblk1p1 179:9    0   512M  0 part  # boot 分区
├─......
└─mmcblk1p8 179:10   0  28.6G  0 part  # 根分区(已扩容)

# 详细信息
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,LABEL

# 输出
# NAME        SIZE TYPE FSTYPE MOUNTPOINT LABEL
# mmcblk0    14.9G disk                    
# ├─mmcblk0p1 512M part vfat   /boot      boot
# ├─......
# └─mmcblk0p2 14.4G part ext4   /         rootfs
# mmcblk1    29.1G disk                    
# ├─mmcblk1p1 512M part vfat              boot
# ├─......
# └─mmcblk1p2 28.6G part ext4             rootfs

4.8 步骤八:切换到 EMMC 启动

移除 SD 卡测试

# 1. 安全关闭系统
sudo shutdown now

# 2. 移除 SD 卡

# 3. 重新上电

# 4. 本地登录验证(HDMI+ 键盘)
# 直接在显示器上看到启动过程
# 输入用户名密码登录

# 5. 确认从 EMMC 启动
lsblk
# 应只显示 mmcblk1(EMMC),mmcblk0(SD 卡)不应出现

df -h
# /dev/root 应显示 28GB(EMMC 容量)

验证启动设备

# 查看根设备
cat /proc/mounts | grep " / "

# 输出应为
/dev/mmcblk1p2 / ext4 rw,relatime 0 0

# 查看内核启动信息
dmesg | grep mmc

# 确认 EMMC 为启动设备
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

五、江波龙 EMMC 芯片验证

5.1 内核识别信息

# 查看 EMMC 识别信息
dmesg | grep -i mmc

# 输出示例(江波龙芯片)
[    1.234567] mmc_host mmc0: Bus speed (slot 0) = 400000Hz
[    1.345678] mmc0: new HS200 MMC card at address 0001
[    1.356789] mmcblk0: mmc0:0001 SDAE32G 29.1 GiB
[    1.367890] mmcblk0boot0: mmc0:0001 SDAE32G 16.0 MiB
[    1.378901] mmcblk0boot1: mmc0:0001 SDAE32G 16.0 MiB
[    1.389012] mmcblk0rpmb: mmc0:0001 SDAE32G 4.0 MiB, chardev (242:0)

5.2 芯片详细信息

# 查看 EMMC 芯片名称
cat /sys/class/mmc_host/mmc0/mmc0:0001/name
# 输出:SDAE32G (江波龙 32GB 标识)

# 查看生产日期
cat /sys/class/mmc_host/mmc0/mmc0:0001/date
# 输出:生产日期代码(如 052023 表示 2023 年 5 月)

# 查看 CID 寄存器(芯片唯一标识)
cat /sys/class/mmc_host/mmc0/mmc0:0001/cid
# 输出:1301334544453207204635203247ff

江波龙 SDAE32G 识别特征

  • 内核标识:SDAE32G
  • 显示容量:约 29.1GB(实际 32GB,二进制换算)
  • 启动分区:boot0/boot1 各 16MB
  • RPMB 分区:4MB(安全存储区)
  • CID 前缀:13 (江波龙厂商 ID)
Categories
Uncategorized

OpenClaw

OpenClaw 安装

https://open-claw.org.cn/guide/getting-started

Categories
Uncategorized

Rust raspberry GPIO

[dependencies] gpio-cdev = “0.4”

Categories
Uncategorized

K3S

本地 kubernetes dashboard访问路径 https://kubernetes.local/

本地nexus访问路径 http://nexus.local/

本地kibana访问路径 http://kibana.local/app/home

本地grafana访问路径 http://grafana.local/

Categories
Uncategorized

Blender 3D打印

使用blender画模型后

导出STL文件 然后bamboo connect 加载STL发送打印任务到 3D打印机

Categories
sol Uncategorized

solana 入门

安装环境

windows下使用WSL 带翻墙功能(需要配置linux 网络代理)

官网安装文档

https://solana.com/zh/docs/intro/installation

第一步:安装rust

curl –proto ‘=https’ –tlsv1.2 -sSf https://sh.rustup.rs | sh -s — -y

安装完成截图

第二步:安装 Solana CLI

sh -c “$(curl -sSfL https://release.anza.xyz/stable/install)”

solana –version 检测是否安装成功

agave-install update 用作更新 solana的版本

第三步:安装 anchor & avm

cargo install –git https://github.com/coral-xyz/anchor avm –force

anchor 是solana 的项目构建器

avm 是 anchor 的版本管理器

anchor –version 检测anchor是否安装成功

第四步:安装Node.js 和 Yarn

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash

nvm install node

npm install –global yarn

Categories
Uncategorized

Bambu Connect (beta)

简介:一款能连接和发送打印到 Bambu Lab 3D 打印机的精简工具

bambu-connect://import-file?path=%2Ftmp%2Fcube.gcode.3mf&name=Cube&version=1.0.0

浏览器打开这个链接会启用bambooconnect 执行模型导入

具体教程:

https://wiki.bambulab.com/zh/software/bambu-connect

Categories
Uncategorized

拓竹 3D 打印 与 bambustudio 的通讯

bambustudio://open?file=https%3A%2F%2Fmakerworld.bblmw.cn%2Fmakerworld%2Fmodel%2FCN5139cd3ed4128%2F27338432%2Finstance%2Fcc8b73a0-2635-4556-ae20-9b52f9f350d7.3mf%3Fat%3D1746121131%26exp%3D1746121431%26key%3Db7425e4b9ef6f417d7334deb194efee6%26uid%3D683076520%26name%3Dmini%E5%

打开这个链接会启用 bambustudio 导入项目

Categories
Uncategorized

finclip

https://www.finclip.com/

新一代 小程序基座 可以自定义小程序 提供小程序上架等功能

比单纯跨平台 走得更远一点