Clone Alpine Linux (树莓派)

完成 树莓派环境安装Alpine Linux 之后,我需要构建多个树莓派环境的Alpine Linux,这样可以部署 K3s - 轻量级Kubernetes 集群。从头开始安装系统显然太繁琐了,最简单的方法,就是先配置好一台主机,然后通过clone方式完成复制。这样,只需要修订一些配置,就可以快速完成系统部署。

初始模版主机

模版主机是采用 sys 模式安装的系统,磁盘分区如下:

Disk /dev/mmcblk0: 59 GB, 63864569856 bytes, 124735488 sectors
60906 cylinders, 64 heads, 32 sectors/track
Units: sectors of 1 * 512 = 512 bytes

Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk0p1 *  1,0,1       256,63,32         2048     526335     524288  256M  c Win95 FAT32 (LBA)
/dev/mmcblk0p2    257,0,1     489,63,32       526336  124735487  124209152 59.2G 83 Linux

启动后,系统挂载:

Filesystem                Size      Used Available Use% Mounted on
devtmpfs                 10.0M         0     10.0M   0% /dev
shm                     455.7M         0    455.7M   0% /dev/shm
/dev/mmcblk0p2           58.0G    156.9M     54.9G   0% /
tmpfs                   182.3M    100.0K    182.2M   0% /run
/dev/mmcblk0p1          252.0M     51.1M    201.0M  20% /media/mmcblk0p1

操作系统归档

通过 通过tar备份和恢复Linux系统 可以备份和恢复Ubuntu这样的操作系统,对于Alpine Linux也类似。不过,可能更为简单(没有 grub ),可以通过TF卡取出进行备份,然后再clone到新的TF卡。

  • 源模版Alpine Linux的文件系统挂载:

    Filesystem                Size      Used Available Use% Mounted on
    devtmpfs                 10.0M         0     10.0M   0% /dev
    shm                     455.7M         0    455.7M   0% /dev/shm
    /dev/mmcblk0p2           58.0G    158.0M     54.9G   0% /
    tmpfs                   182.3M    100.0K    182.2M   0% /run
    /dev/mmcblk0p1          252.0M     51.1M    201.0M  20% /media/mmcblk0p1
    

需要将:

/dev/mmcblk0p2           58.0G    158.0M     54.9G   0% /
/dev/mmcblk0p1          252.0M     51.1M    201.0M  20% /media/mmcblk0p1

完成clone出来

  • Alpine Linux自带的 tar 是基于 BusyBox 的,所以不支持 GNU tar 的 --one-file-system 参数,所以处于谨慎,我还是将TF卡取出,挂载在标准Linux的 /mnt 目录下进行备份和恢复:

    mount /dev/sdf2 /mnt
    mount /dev/sdf1 /mnt/media/mmcblk0p1
    
  • 在源模版系统上对整个系统备份:

    cd /mnt
    tar -cvpzf alpine-sys.tar.gz --exclude=alpine-sys.tar.gz --exclude=var/cache .
    

备注

这里使用了相对路径,因为我是进入 /mnt 挂载目录下进行打包的

此外,根据 GNU tar: Crossing File System Boundaries 说明,如果使用 --one-file-system 就只会打包指定目录的单个文件系统,不会打包该文件系统下其他挂载,所以,如果使用 --one-file-system . 就不会打包 media/mmcblk0p1 ,除非明确指出:

tar -cvpzf alpine-sys.tar.gz --exclude=alpine-sys.tar.gz --exclude=var/cache \
    --one-file-system . media/mmcblk0p1

不过,对于我这个特殊的采用挂载TF卡的打包,可以不使用 --one-file-system ,这样会完整打包所有子目录,也就包括了 media/mmcblk0p1

  • 将归档文件移动到HOME目录,然后卸载挂载:

    mv alpine-sys.tar.gz ~/
    umount /mnt/media/mmcblk0p1
    umount /mnt
    

准备TF卡

将新TF卡插入读卡器,然后插入模版主机的USB接口,此时,这个TF卡识别为 /dev/sdf

  • 对新TF卡进行分区,分区1是FAT32,分区2是EXT4:

    Disk /dev/sdf: 59.49 GiB, 63864569856 bytes, 124735488 sectors
    Disk model: MassStorageClass
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x00000000
    
    Device     Boot  Start       End   Sectors  Size Id Type
    /dev/sdb1  *      2048    526335    524288  256M  c W95 FAT32 (LBA)
    /dev/sdf2       526336 124735487 124209152 59.2G 83 Linux
    
  • 文件系统格式化:

    sudo mkdosfs -F 32 /dev/sdf1
    sudo mkfs.ext4 /dev/sdf2
    

复制系统

  • 同样挂载系统:

    mount /dev/sdf2 /mnt
    mkdir -p /mnt/media/mmcblk0p1
    mount /dev/sdf1 /mnt/media/mmcblk0p1
    
  • 恢复备份:

    cd /mnt
    tar zxvf ~/alpine-sys.tar.gz
    
  • 由于磁盘的UUID不同,需要修订恢复后的磁盘挂载配置:

    • boot/cmdline.txt

    • etc/fstab

通过 blkid 命令获取磁盘的UUID:

blkid /dev/sdf2

可以看到输出:

/dev/sdf2: UUID="7ffc2989-d85a-4600-a9b2-25d45090f466" TYPE="ext4"

将获得的这个 UUID 替换上述两个配置文件中对应内容

  • 修订主机名和IP地址配置:

    • etc/hostname

    • etc/hosts

    • etc/network/interfaces

  • 卸载:

    cd /
    umount /mnt/media/mmcblk0p1
    umount /mnt
    
  • 将clone后的TF卡插入 树莓派Raspberry Pi 3 就可以以配置好的Alpine Linux启动