◸code

目标

步骤

  1. 先刷个能用的 linux 系统,这里选用 海纳思系统 系统,这个系统的 linux kernel 版本比较旧但是起码能用,我采用 ttl 刷机步骤,我的 soc 是 hi3798mv100
  2. 刷个高版本 linux 内核,这一步采用 loonpn/ec6108v9c-linux-kernel 的代码,我选的是 v6.14.3 版本,可以自己编译也可以使用开发者编译好的,具体步骤就是 dd 进对应分区
  3. 想办法扩充 rootfs,我的解决方案是用 sdcard,具体步骤如下
  1. 然后,插回 sdcard,重启,按照正常的 armbian 初始化流程做就好了

优势

弊端

Init 源码

酌情修改就好,记得编译成 armhf 架构,静态编译

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/mount.h>
#include <sys/syscall.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define NEWROOT "/newroot"
#define OLDROOT "/newroot/oldroot"
#define DEV "/dev"
#define PROC "/proc"
#define SYS "/sys"
#define RUN "/run"

static void die(const char *msg) {
    perror(msg);
    _exit(1);
}

int main(void) {
    mount("proc", PROC, "proc", 0, NULL);
    mount("sysfs", SYS, "sysfs", 0, NULL);
    mount("devtmpfs", DEV, "devtmpfs", 0, NULL);
    mount("tmpfs", RUN, "tmpfs", 0, "mode=0755");

    if (mount("/dev/mmcblk1p1", NEWROOT, "ext4", 0, NULL) != 0) die("mount newroot");
    mkdir(OLDROOT, 0755);

    if (syscall(SYS_pivot_root, NEWROOT, OLDROOT) != 0) die("pivot_root");
    if (chdir("/") != 0) die("chdir /");

    mount("/dev", DEV, NULL, MS_MOVE, NULL);
    mount("/proc", PROC, NULL, MS_MOVE, NULL);
    mount("/sys", SYS, NULL, MS_MOVE, NULL);
    mount("/run", RUN, NULL, MS_MOVE, NULL);

    umount2("/oldroot", MNT_DETACH);
    rmdir("/oldroot");

    execl("/sbin/init.real", "init", NULL);
    die("exec init failed");

    return 0;
}