Repository: ophub/amlogic-s9xxx-armbian Branch: main Commit: 026e1fe6fa6b Files: 595 Total size: 1.4 MB Directory structure: gitextract_cfuts_n6/ ├── .github/ │ ├── .gitkeep │ ├── ISSUE_TEMPLATE/ │ │ └── bug-report.md │ └── workflows/ │ ├── build-armbian-arm64-docker-image.yml │ ├── build-armbian-arm64-server-image.yml │ ├── build-armbian-using-official-image.yml │ ├── build-armbian-using-releases-files.yml │ ├── build-armbian-x86-server-image.yml │ ├── compile-kernel.yml │ └── delete-older-releases-workflows.yml ├── .gitignore ├── CONTRIBUTORS.md ├── LICENSE ├── README.cn.md ├── README.ja.md ├── README.md ├── action.yml ├── build-armbian/ │ ├── README.cn.md │ ├── README.ja.md │ ├── README.md │ └── armbian-files/ │ ├── common-files/ │ │ ├── etc/ │ │ │ ├── balance_irq │ │ │ ├── custom_service/ │ │ │ │ └── start_service.sh │ │ │ ├── default/ │ │ │ │ └── cpufrequtils │ │ │ ├── fstab │ │ │ ├── model_database.conf │ │ │ ├── modprobe.d/ │ │ │ │ └── brcmfmac.conf │ │ │ ├── modules-load.d/ │ │ │ │ └── ophub-load-list.conf │ │ │ └── sysctl.conf │ │ └── usr/ │ │ ├── bin/ │ │ │ └── uuidgen │ │ ├── sbin/ │ │ │ ├── armbian-apt │ │ │ ├── armbian-ddbr │ │ │ ├── armbian-docker │ │ │ ├── armbian-fix │ │ │ ├── armbian-kernel │ │ │ ├── armbian-software │ │ │ ├── armbian-swap │ │ │ ├── armbian-sync │ │ │ ├── armbian-tf │ │ │ ├── armbian-update │ │ │ └── balethirq.pl │ │ └── share/ │ │ ├── alsa/ │ │ │ └── cards/ │ │ │ └── axg-sound-card.conf │ │ └── ophub/ │ │ └── armbian-software/ │ │ ├── 201-desktop-chinese-fonts.sh │ │ ├── 301-frps.sh │ │ ├── 302-frpc.sh │ │ ├── command-desktop.sh │ │ ├── command-docker.sh │ │ ├── command-service.sh │ │ ├── software-command.sh │ │ └── software-list.conf │ ├── different-files/ │ │ ├── a311d-oes/ │ │ │ ├── bootfs/ │ │ │ │ ├── extlinux/ │ │ │ │ │ └── extlinux.conf.bak │ │ │ │ └── uEnv.txt │ │ │ └── rootfs/ │ │ │ ├── etc/ │ │ │ │ ├── armbian-board-release.conf │ │ │ │ └── fw_env.config │ │ │ └── usr/ │ │ │ └── bin/ │ │ │ └── oes_sata_leds.sh │ │ ├── alark35-3500/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── anas3035/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── bdkj-bd-one/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ ├── boot.scr │ │ │ │ └── extlinux/ │ │ │ │ └── extlinux.conf.bak │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ ├── modules-load.d/ │ │ │ │ └── bridge.conf │ │ │ └── sysctl.d/ │ │ │ └── 99-custom.conf │ │ ├── bdy-g18-pro/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ ├── boot.scr │ │ │ │ └── extlinux/ │ │ │ │ └── extlinux.conf.bak │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ ├── modules-load.d/ │ │ │ │ └── bridge.conf │ │ │ └── sysctl.d/ │ │ │ └── 99-custom.conf │ │ ├── beikeyun/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── boca-tcn100/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── cd1000/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── chainedbox/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── usr/ │ │ │ └── bin/ │ │ │ └── pwm-fan.pl │ │ ├── cm3588-nas/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── dc-a588/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── e20c/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── armbian_first_run.txt.template │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── e25/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── firefly-rk3399/ │ │ │ └── bootfs/ │ │ │ ├── boot.cmd │ │ │ ├── boot.scr │ │ │ └── extlinux/ │ │ │ └── extlinux.conf.bak │ │ ├── gzpeite-p01/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ ├── boot.scr │ │ │ └── extlinux/ │ │ │ └── extlinux.conf.bak │ │ ├── h28k/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── h66k/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── h68k/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── h69k/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── h88k/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── h88k-v3/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── h96-max-m2/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── hk1-rbox-k8s/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── ht2/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── hugsun-zm/ │ │ │ └── rootfs/ │ │ │ └── root/ │ │ │ └── led-control/ │ │ │ ├── aw2028 │ │ │ └── aw2028.c │ │ ├── ipc-r/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── jp-tvbox/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── lckfb-tspi/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── lz-d3588/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── mrkaio-m68s/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── nanopc-t6/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── nanopi-m5/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── nsy-g16-plus/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ ├── boot.scr │ │ │ │ └── extlinux/ │ │ │ │ └── extlinux.conf.bak │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ ├── modules-load.d/ │ │ │ │ └── bridge.conf │ │ │ └── sysctl.d/ │ │ │ └── 99-custom.conf │ │ ├── nsy-g68-plus/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ ├── boot.scr │ │ │ │ └── extlinux/ │ │ │ │ └── extlinux.conf.bak │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ ├── modules-load.d/ │ │ │ │ └── bridge.conf │ │ │ └── sysctl.d/ │ │ │ └── 99-custom.conf │ │ ├── orangepi-3b/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── orangepi-5-plus/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── orangepi-5b/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── panther-x2/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── photonicat/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── r66s/ │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── r68s/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── rock-5-itx/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── rock5b/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── rock5c/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── ruisen-box/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── s922x-oes-plus/ │ │ │ ├── bootfs/ │ │ │ │ ├── extlinux/ │ │ │ │ │ └── extlinux.conf.bak │ │ │ │ └── uEnv.txt │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ ├── armbian-board-release.conf │ │ │ └── fw_env.config │ │ ├── smart-am60/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── station-m2/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── swan1-w28/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ └── boot.scr │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ └── balance_irq │ │ ├── vplus/ │ │ │ └── rootfs/ │ │ │ └── usr/ │ │ │ └── bin/ │ │ │ └── rgb-vplus │ │ ├── wocyber-a3/ │ │ │ └── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── boot.cmd │ │ │ └── boot.scr │ │ ├── wxy-oect/ │ │ │ ├── bootfs/ │ │ │ │ ├── armbianEnv.txt │ │ │ │ ├── boot.cmd │ │ │ │ ├── boot.scr │ │ │ │ └── extlinux/ │ │ │ │ └── extlinux.conf.bak │ │ │ └── rootfs/ │ │ │ └── etc/ │ │ │ ├── armbian-board-release.conf │ │ │ └── fw_env.config │ │ └── wxy-oect-mod/ │ │ └── bootfs/ │ │ ├── armbianEnv.txt │ │ ├── boot.cmd │ │ ├── boot.scr │ │ └── extlinux/ │ │ └── extlinux.conf.bak │ └── platform-files/ │ ├── allwinner/ │ │ ├── bootfs/ │ │ │ ├── armbianEnv.txt │ │ │ ├── armbian_first_run.txt.template │ │ │ ├── boot.cmd │ │ │ ├── boot.scr │ │ │ ├── dtb/ │ │ │ │ └── allwinner/ │ │ │ │ ├── sun50i-h6-tanix-tx6.dtb │ │ │ │ ├── sun50i-h6-tqc-a01.dtb │ │ │ │ ├── sun50i-h6-vplus-cloud.dtb │ │ │ │ ├── sun50i-h618-devboard.dtb │ │ │ │ └── sun50i-h618-orangepi-zero3.dtb │ │ │ └── extlinux/ │ │ │ └── extlinux.conf.bak │ │ └── rootfs/ │ │ └── usr/ │ │ └── sbin/ │ │ └── armbian-install │ ├── amlogic/ │ │ ├── bootfs/ │ │ │ ├── aml_autoscript │ │ │ ├── aml_autoscript.cmd │ │ │ ├── armbian_first_run.txt.template │ │ │ ├── boot-emmc.cmd │ │ │ ├── boot-emmc.ini │ │ │ ├── boot-emmc.scr │ │ │ ├── boot.cmd │ │ │ ├── boot.ini │ │ │ ├── boot.scr │ │ │ ├── dtb/ │ │ │ │ └── amlogic/ │ │ │ │ ├── meson-a1-ad401.dtb │ │ │ │ ├── meson-axg-jethome-jethub-j100.dtb │ │ │ │ ├── meson-axg-jethome-jethub-j110-rev-2.dtb │ │ │ │ ├── meson-axg-jethome-jethub-j110-rev-3.dtb │ │ │ │ ├── meson-axg-s400.dtb │ │ │ │ ├── meson-g12a-hg680-fj.dtb │ │ │ │ ├── meson-g12a-radxa-zero.dtb │ │ │ │ ├── meson-g12a-s905l3a-cm311.dtb │ │ │ │ ├── meson-g12a-s905l3a-e900v22c.dtb │ │ │ │ ├── meson-g12a-s905l3a-m401a.dtb │ │ │ │ ├── meson-g12a-sei510.dtb │ │ │ │ ├── meson-g12a-tanix-tx5max.dtb │ │ │ │ ├── meson-g12a-u200.dtb │ │ │ │ ├── meson-g12a-x96-max-rmii.dtb │ │ │ │ ├── meson-g12a-x96-max.dtb │ │ │ │ ├── meson-g12b-a311d-khadas-vim3.dtb │ │ │ │ ├── meson-g12b-a311d-oes-00050000.dtb │ │ │ │ ├── meson-g12b-a311d-oes-a.dtb │ │ │ │ ├── meson-g12b-a311d-oes-b.dtb │ │ │ │ ├── meson-g12b-a311d-oes.dtb │ │ │ │ ├── meson-g12b-a311d-onethingcloud-oes-rgmii-rx-delay-3000ps.dtb │ │ │ │ ├── meson-g12b-a311d-onethingcloud-oes.dtb │ │ │ │ ├── meson-g12b-ali-ct2000.dtb │ │ │ │ ├── meson-g12b-dreambox-one.dtb │ │ │ │ ├── meson-g12b-dreambox-two.dtb │ │ │ │ ├── meson-g12b-gsking-x.dtb │ │ │ │ ├── meson-g12b-gtking-oc.dtb │ │ │ │ ├── meson-g12b-gtking-pro-h-oc.dtb │ │ │ │ ├── meson-g12b-gtking-pro-h.dtb │ │ │ │ ├── meson-g12b-gtking-pro-rev_a-oc.dtb │ │ │ │ ├── meson-g12b-gtking-pro-rev_a.dtb │ │ │ │ ├── meson-g12b-gtking-pro.dtb │ │ │ │ ├── meson-g12b-gtking.dtb │ │ │ │ ├── meson-g12b-odroid-n2-plus.dtb │ │ │ │ ├── meson-g12b-odroid-n2.dtb │ │ │ │ ├── meson-g12b-oes.dtb │ │ │ │ ├── meson-g12b-radxa-zero2.dtb │ │ │ │ ├── meson-g12b-s922x-khadas-vim3.dtb │ │ │ │ ├── meson-g12b-s922x-oes-plus-00050000.dtb │ │ │ │ ├── meson-g12b-s922x-oes-plus-a.dtb │ │ │ │ ├── meson-g12b-s922x-oes-plus-b.dtb │ │ │ │ ├── meson-g12b-s922x-oes-plus-v2.dtb │ │ │ │ ├── meson-g12b-s922x-oes-plus.dtb │ │ │ │ ├── meson-g12b-ugoos-am6-plus.dtb │ │ │ │ ├── meson-g12b-ugoos-am6.dtb │ │ │ │ ├── meson-g12b-ugoos-am6b-plus-oc.dtb │ │ │ │ ├── meson-g12b-ugoos-am6b-plus.dtb │ │ │ │ ├── meson-g12b-ugoos-am6b1.dtb │ │ │ │ ├── meson-gxbb-beelink-mini-mx.dtb │ │ │ │ ├── meson-gxbb-beelink-mini-mxiii.dtb │ │ │ │ ├── meson-gxbb-kii-pro.dtb │ │ │ │ ├── meson-gxbb-mecool-ki-plus.dtb │ │ │ │ ├── meson-gxbb-mecool-kii-pro.dtb │ │ │ │ ├── meson-gxbb-minix-neo-u1.dtb │ │ │ │ ├── meson-gxbb-mxq-pro-plus.dtb │ │ │ │ ├── meson-gxbb-nanopi-k2.dtb │ │ │ │ ├── meson-gxbb-nexbox-a95x.dtb │ │ │ │ ├── meson-gxbb-odroidc2.dtb │ │ │ │ ├── meson-gxbb-p200.dtb │ │ │ │ ├── meson-gxbb-p201.dtb │ │ │ │ ├── meson-gxbb-vega-s95-meta.dtb │ │ │ │ ├── meson-gxbb-vega-s95-pro.dtb │ │ │ │ ├── meson-gxbb-vega-s95-telos.dtb │ │ │ │ ├── meson-gxbb-wetek-hub.dtb │ │ │ │ ├── meson-gxbb-wetek-play2.dtb │ │ │ │ ├── meson-gxl-s805x-libretech-ac.dtb │ │ │ │ ├── meson-gxl-s805x-p241.dtb │ │ │ │ ├── meson-gxl-s905d-libretech-pc.dtb │ │ │ │ ├── meson-gxl-s905d-mecool-ki-plus.dtb │ │ │ │ ├── meson-gxl-s905d-mecool-ki-pro.dtb │ │ │ │ ├── meson-gxl-s905d-mecool-kii-pro.dtb │ │ │ │ ├── meson-gxl-s905d-mecool-m8s-plus.dtb │ │ │ │ ├── meson-gxl-s905d-p230.dtb │ │ │ │ ├── meson-gxl-s905d-p231.dtb │ │ │ │ ├── meson-gxl-s905d-phicomm-n1-thresh.dtb │ │ │ │ ├── meson-gxl-s905d-phicomm-n1.dtb │ │ │ │ ├── meson-gxl-s905d-sml5442tw.dtb │ │ │ │ ├── meson-gxl-s905d-vero4k-plus.dtb │ │ │ │ ├── meson-gxl-s905l-venz-v10.dtb │ │ │ │ ├── meson-gxl-s905l2-ipbs9505.dtb │ │ │ │ ├── meson-gxl-s905l2-x7-5g.dtb │ │ │ │ ├── meson-gxl-s905l3b-e900v22e.dtb │ │ │ │ ├── meson-gxl-s905l3b-m302a.dtb │ │ │ │ ├── meson-gxl-s905w-jethome-jethub-j80.dtb │ │ │ │ ├── meson-gxl-s905w-p281.dtb │ │ │ │ ├── meson-gxl-s905w-tx3-mini.dtb │ │ │ │ ├── meson-gxl-s905w-x96-mini.dtb │ │ │ │ ├── meson-gxl-s905w-x96w.dtb │ │ │ │ ├── meson-gxl-s905x-b860h.dtb │ │ │ │ ├── meson-gxl-s905x-hwacom-amazetv.dtb │ │ │ │ ├── meson-gxl-s905x-khadas-vim.dtb │ │ │ │ ├── meson-gxl-s905x-libretech-cc-v2.dtb │ │ │ │ ├── meson-gxl-s905x-libretech-cc.dtb │ │ │ │ ├── meson-gxl-s905x-nexbox-a95x.dtb │ │ │ │ ├── meson-gxl-s905x-p212.dtb │ │ │ │ ├── meson-gxl-s905x-tbee.dtb │ │ │ │ ├── meson-gxl-s905x-tx9.dtb │ │ │ │ ├── meson-gxl-s905x-vero4k.dtb │ │ │ │ ├── meson-gxm-beelink-gt1.dtb │ │ │ │ ├── meson-gxm-fake-octopus-planet.dtb │ │ │ │ ├── meson-gxm-gt1-ultimate.dtb │ │ │ │ ├── meson-gxm-gt1.dtb │ │ │ │ ├── meson-gxm-khadas-vim2.dtb │ │ │ │ ├── meson-gxm-mecool-kiii-pro.dtb │ │ │ │ ├── meson-gxm-minix-neo-u9h.dtb │ │ │ │ ├── meson-gxm-nexbox-a1.dtb │ │ │ │ ├── meson-gxm-nexbox-a2.dtb │ │ │ │ ├── meson-gxm-octopus-planet.dtb │ │ │ │ ├── meson-gxm-phicomm-t1.dtb │ │ │ │ ├── meson-gxm-q200-mod.dtb │ │ │ │ ├── meson-gxm-q200.dtb │ │ │ │ ├── meson-gxm-q201.dtb │ │ │ │ ├── meson-gxm-rbox-pro.dtb │ │ │ │ ├── meson-gxm-s912-libretech-pc.dtb │ │ │ │ ├── meson-gxm-t95z-plus.dtb │ │ │ │ ├── meson-gxm-tx8-max.dtb │ │ │ │ ├── meson-gxm-tx9-pro.dtb │ │ │ │ ├── meson-gxm-vega-s96.dtb │ │ │ │ ├── meson-gxm-wetek-core2.dtb │ │ │ │ ├── meson-gxm-x92.dtb │ │ │ │ ├── meson-s4-s805x2-aq222.dtb │ │ │ │ ├── meson-sm1-a95xf3-air-gbit.dtb │ │ │ │ ├── meson-sm1-a95xf3-air.dtb │ │ │ │ ├── meson-sm1-bananapi-m5.dtb │ │ │ │ ├── meson-sm1-h96-max-x3-oc.dtb │ │ │ │ ├── meson-sm1-h96-max-x3.dtb │ │ │ │ ├── meson-sm1-h96-max.dtb │ │ │ │ ├── meson-sm1-hk1box-vontar-x3-oc.dtb │ │ │ │ ├── meson-sm1-hk1box-vontar-x3.dtb │ │ │ │ ├── meson-sm1-khadas-vim3l.dtb │ │ │ │ ├── meson-sm1-odroid-c4.dtb │ │ │ │ ├── meson-sm1-odroid-hc4.dtb │ │ │ │ ├── meson-sm1-sei610.dtb │ │ │ │ ├── meson-sm1-skyworth-lb2004-a4091.dtb │ │ │ │ ├── meson-sm1-tox1.dtb │ │ │ │ ├── meson-sm1-tx3-bz-oc.dtb │ │ │ │ ├── meson-sm1-tx3-bz.dtb │ │ │ │ ├── meson-sm1-tx3-qz-oc.dtb │ │ │ │ ├── meson-sm1-tx3-qz.dtb │ │ │ │ ├── meson-sm1-ugoos-x3-oc.dtb │ │ │ │ ├── meson-sm1-ugoos-x3.dtb │ │ │ │ ├── meson-sm1-x88-pro-x3-4g.dtb │ │ │ │ ├── meson-sm1-x88-pro-x3.dtb │ │ │ │ ├── meson-sm1-x96-air-gbit.dtb │ │ │ │ ├── meson-sm1-x96-air.dtb │ │ │ │ ├── meson-sm1-x96-max-plus-100m.dtb │ │ │ │ ├── meson-sm1-x96-max-plus-2101.dtb │ │ │ │ ├── meson-sm1-x96-max-plus-a100.dtb │ │ │ │ ├── meson-sm1-x96-max-plus-ip1001m-2.dtb │ │ │ │ ├── meson-sm1-x96-max-plus-ip1001m.dtb │ │ │ │ ├── meson-sm1-x96-max-plus-oc.dtb │ │ │ │ ├── meson-sm1-x96-max-plus-q1.dtb │ │ │ │ ├── meson-sm1-x96-max-plus-q2.dtb │ │ │ │ └── meson-sm1-x96-max-plus.dtb │ │ │ ├── emmc_autoscript │ │ │ ├── emmc_autoscript.cmd │ │ │ ├── extlinux/ │ │ │ │ └── extlinux.conf.bak │ │ │ ├── s905_autoscript │ │ │ ├── s905_autoscript.cmd │ │ │ ├── u-boot.sd │ │ │ ├── u-boot.usb │ │ │ └── uEnv.txt │ │ └── rootfs/ │ │ └── usr/ │ │ ├── bin/ │ │ │ └── ampart │ │ ├── sbin/ │ │ │ ├── armbian-install │ │ │ └── armbian-openvfd │ │ └── share/ │ │ └── openvfd/ │ │ ├── conf/ │ │ │ ├── h96max-x3.conf │ │ │ ├── hk1-x3.conf │ │ │ ├── hk1box.conf │ │ │ ├── t95.conf │ │ │ ├── t95z-plus.conf │ │ │ ├── tx3-mini.conf │ │ │ ├── tx3.conf │ │ │ ├── tx9-pro.conf │ │ │ ├── whale.conf │ │ │ ├── x88pro-x3.conf │ │ │ ├── x92.conf │ │ │ ├── x96air.conf │ │ │ ├── x96max.conf │ │ │ └── x96maxplus.conf │ │ └── vfdservice │ └── rockchip/ │ └── bootfs/ │ ├── armbianEnv.txt │ ├── armbian_first_run.txt.template │ ├── boot.cmd │ ├── boot.scr │ ├── dtb/ │ │ └── rockchip/ │ │ ├── rk3318-box.dtb │ │ ├── rk3328-beikeyun-1200mhz.dtb │ │ ├── rk3328-beikeyun-1296mhz.dtb │ │ ├── rk3328-beikeyun-1392mhz.dtb │ │ ├── rk3328-beikeyun-1512mhz.dtb │ │ ├── rk3328-box-trn9.dtb │ │ ├── rk3328-chainedbox.dtb │ │ ├── rk3328-l1pro-1296mhz.dtb │ │ ├── rk3328-l1pro-1392mhz.dtb │ │ ├── rk3328-l1pro-1512mhz.dtb │ │ ├── rk3328-nanopi-r2-rev00.dtb │ │ ├── rk3328-nanopi-r2-rev06.dtb │ │ ├── rk3328-nanopi-r2-rev20.dtb │ │ ├── rk3328-nanopi-r2s.dtb │ │ ├── rk3328-roc-cc.dtb │ │ ├── rk3399-aio-3399b.dtb │ │ ├── rk3399-aio-3399c-ai.dtb │ │ ├── rk3399-aio-3399c.dtb │ │ ├── rk3399-am40.dtb │ │ ├── rk3399-bozz-sw799.dtb │ │ ├── rk3399-crrc.dtb │ │ ├── rk3399-dg3399.dtb │ │ ├── rk3399-dlfr100.dtb │ │ ├── rk3399-eaidk-610-v2.dtb │ │ ├── rk3399-eaidk-610.dtb │ │ ├── rk3399-emb3531-old.dtb │ │ ├── rk3399-emb3531.dtb │ │ ├── rk3399-fine3399.dtb │ │ ├── rk3399-firefly-150.dtb │ │ ├── rk3399-firefly-core-3399-jd4.dtb │ │ ├── rk3399-firefly.dtb │ │ ├── rk3399-fmx1-pro-b.dtb │ │ ├── rk3399-fmx1-pro.dtb │ │ ├── rk3399-gea-6319.dtb │ │ ├── rk3399-gea6319.dtb │ │ ├── rk3399-hs530r.dtb │ │ ├── rk3399-hugsun-x99.dtb │ │ ├── rk3399-hugsun-zm.dtb │ │ ├── rk3399-king3399.dtb │ │ ├── rk3399-kylin3399.dtb │ │ ├── rk3399-leez-p710.dtb │ │ ├── rk3399-lx-r3s.dtb │ │ ├── rk3399-nanopc-t4.dtb │ │ ├── rk3399-nanopi-r4s.dtb │ │ ├── rk3399-smart-am40-oc.dtb │ │ ├── rk3399-smart-am40.dtb │ │ ├── rk3399-sv-33a6x-vpu.dtb │ │ ├── rk3399-sv-33a6x.dtb │ │ ├── rk3399-taram.dtb │ │ ├── rk3399-tb-ls3399.dtb │ │ ├── rk3399-tn3399-v3.dtb │ │ ├── rk3399-tn3399.dtb │ │ ├── rk3399-tpm312.dtb │ │ ├── rk3399-tvi3315a.dtb │ │ ├── rk3399-xiaobao.dtb │ │ ├── rk3399-yskj.dtb │ │ ├── rk3399-zcube1-max.dtb │ │ ├── rk3399-zk-r39a.dtb │ │ ├── rk3399-zysj.dtb │ │ ├── rk3528-cd1000.dtb │ │ ├── rk3528-hk1-rbox-k8s.dtb │ │ ├── rk3528-hlink-h28k.dtb │ │ ├── rk3528-ht2.dtb │ │ ├── rk3528-mangopi-m28k.dtb │ │ ├── rk3528-radxa-e20c.dtb │ │ ├── rk3566-jp-tvbox.dtb │ │ ├── rk3566-nanopi-r3s-lts.dtb │ │ ├── rk3566-nanopi-r3s.dtb │ │ ├── rk3566-onethingcloud-oec.dtb │ │ ├── rk3566-orangepi-3b-v1.1.dtb │ │ ├── rk3566-orangepi-3b-v2.1.dtb │ │ ├── rk3566-orangepi-3b.dtb │ │ ├── rk3566-panther-x2.dtb │ │ ├── rk3566-radxa-cm3-rpi-cm4-io.dtb │ │ ├── rk3566-roc-pc.dtb │ │ ├── rk3566-taishanpi-v10.dtb │ │ ├── rk3566-wxy-oec-turbo-4g.dtb │ │ ├── rk3568-alark35-3500.dtb │ │ ├── rk3568-bd-one.dtb │ │ ├── rk3568-bdy-g18-pro.dtb │ │ ├── rk3568-dg-tn3568.dtb │ │ ├── rk3568-fastrhino-r66s.dtb │ │ ├── rk3568-fastrhino-r68s.dtb │ │ ├── rk3568-gzpeite.dtb │ │ ├── rk3568-hinlink-h66k.dtb │ │ ├── rk3568-hinlink-h68k.dtb │ │ ├── rk3568-hlink-h66k.dtb │ │ ├── rk3568-hlink-h68k.dtb │ │ ├── rk3568-hlink-h69k.dtb │ │ ├── rk3568-lyt-t68m.dtb │ │ ├── rk3568-lz-d3568-v3.dtb │ │ ├── rk3568-lz-k3568.dtb │ │ ├── rk3568-mmbox-anas3035.dtb │ │ ├── rk3568-mrkaio-m68s.dtb │ │ ├── rk3568-nanopi-r5c.dtb │ │ ├── rk3568-nanopi-r5s.dtb │ │ ├── rk3568-nsy-g16-plus.dtb │ │ ├── rk3568-nsy-g68-plus.dtb │ │ ├── rk3568-photonicat.dtb │ │ ├── rk3568-radxa-e25.dtb │ │ ├── rk3568-roc-pc.dtb │ │ ├── rk3568-ruisen-box.dtb │ │ ├── rk3568-seewo-sv21.dtb │ │ ├── rk3568-swan1-w28.dtb │ │ ├── rk3568-wocyber-a3.dtb │ │ ├── rk3576-nanopi-m5.dtb │ │ ├── rk3588-beelink-ipc-r.dtb │ │ ├── rk3588-dc-a588.dtb │ │ ├── rk3588-friendlyelec-cm3588-nas.dtb │ │ ├── rk3588-hlink-h88k-v3.dtb │ │ ├── rk3588-hlink-h88k-v31.dtb │ │ ├── rk3588-hlink-h88k.dtb │ │ ├── rk3588-lz-d3588.dtb │ │ ├── rk3588-nanopc-t6.dtb │ │ ├── rk3588-orangepi-5-plus.dtb │ │ ├── rk3588-rock-5-itx.dtb │ │ ├── rk3588-rock-5b.dtb │ │ ├── rk3588-smart-am60.dtb │ │ ├── rk3588s-boca-tcn100.dtb │ │ ├── rk3588s-orangepi-5b.dtb │ │ └── rk3588s-rock-5c.dtb │ └── extlinux/ │ └── extlinux.conf.bak ├── compile-kernel/ │ ├── README.cn.md │ ├── README.ja.md │ ├── README.md │ └── tools/ │ ├── config/ │ │ └── .gitkeep │ ├── patch/ │ │ └── .gitkeep │ └── script/ │ ├── armbian-compile-kernel-depends │ ├── armbian_compile_kernel.sh │ ├── docker/ │ │ ├── Dockerfile │ │ ├── build_armbian_docker_image.sh │ │ ├── build_armbian_rootfs_file.sh │ │ └── docker_startup.sh │ ├── ubuntu2204-build-armbian-depends │ └── ubuntu2404-build-armbian-depends ├── documents/ │ ├── README.cn.md │ ├── README.ja.md │ ├── README.md │ ├── android_partition_table_template.xlsx │ ├── armbian_software.md │ └── led_screen_display_control.md ├── rebuild └── recompile ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/.gitkeep ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/bug-report.md ================================================ --- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- **Device Information | 设备信息** - SOC: [e.g. S095x3] - Model [e.g. HK1] **Armbian Version | 系统版本** - Kernel Version: [e.g. 6.18.16] - Release: [e.g. resolute/trixie] **Describe the bug | 问题描述** All issues will only remain open for one week to prioritize resolving them. After that period, they will be closed but can still continue to be discussed in the thread. 所有的问题都只保留一周的开启状态供重点关注解决,超时将关闭,但仍然可以长期继续跟帖讨论。 Please provide a detailed description of the issue and, if necessary, attach a screenshot. 详细描述问题,并在必要时附上屏幕截图。 ================================================ FILE: .github/workflows/build-armbian-arm64-docker-image.yml ================================================ #===================================================================================== # https://github.com/ophub/amlogic-s9xxx-armbian # Description: Build and publish Armbian arm64 Docker image # Instructions: https://github.com/docker/build-push-action # Build and Push to: https://hub.docker.com/ #===================================================================================== name: Build Armbian arm64 Docker image on: repository_dispatch: workflow_dispatch: inputs: source_branch: description: "Select the source branch" required: false default: "trixie" type: choice options: - trixie - bookworm - resolute - noble docker_img: description: "Set the docker image" required: false default: "ophub/armbian" type: choice options: - ophub/armbian env: TZ: Etc/UTC MAKE_DOCKER_SH: compile-kernel/tools/script/docker/build_armbian_docker_image.sh jobs: build: runs-on: ubuntu-24.04-arm if: ${{ github.event.repository.owner.id == github.event.sender.id }} steps: - name: Checkout uses: actions/checkout@v6 - name: Download Armbian rootfs file [ ${{ inputs.source_branch }} ] id: down if: (!cancelled()) run: | # Retrieve the latest Armbian rootfs file from releases latest_version=$(curl -s \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/releases?per_page=20 | \ jq -r --arg RTK "Armbian_${{ inputs.source_branch }}_arm64_" \ --arg BOARD "rootfs" \ '[.[] | select(.tag_name | contains($RTK)) | {tag: .tag_name} + (.assets[] | select(.name | contains($BOARD) and endswith(".tar.gz")) | {data: .updated_at, url: .url, name: .name})] | sort_by(.data) | reverse | .[0]') [[ -z "${latest_version}" || "${latest_version}" == "null" ]] && { echo "Error: Failed to resolve Armbian rootfs download URL." exit 1 } # Extract download URL, filename, and release tag latest_url="$(echo ${latest_version} | jq -r '.url')" armbian_filename="$(echo ${latest_version} | jq -r '.name')" release_tag="$(echo ${latest_version} | jq -r '.tag')" echo "Matched release tag: ${release_tag}" echo "build_tag=${release_tag}" >> ${GITHUB_OUTPUT} # Download asset via GitHub API (binary stream) echo "Downloading: ${armbian_filename}" [[ -d "armbian" ]] || mkdir -p armbian curl -fsSL \ -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/octet-stream" \ "${latest_url}" \ -o "armbian/${armbian_filename}" [[ "${?}" -ne "0" ]] && echo "Error: Download failed." && exit 1 echo "status=success" >> ${GITHUB_OUTPUT} - name: Build the Docker image id: make if: ${{ steps.down.outputs.status == 'success' && !cancelled() }} run: | chmod +x ${MAKE_DOCKER_SH} ${MAKE_DOCKER_SH} ${{ inputs.source_branch }} arm64 echo "status=success" >> ${GITHUB_OUTPUT} - name: Upload rebuilt images to Release uses: ncipollo/release-action@main if: ${{ steps.make.outputs.status == 'success' && !cancelled() }} with: tag: ${{ steps.down.outputs.build_tag }} artifacts: out/*.tar.gz allowUpdates: true removeArtifacts: false replacesArtifacts: true makeLatest: true token: ${{ secrets.GITHUB_TOKEN }} body: | ### Armbian Image Information - Default username: `root` - Default password: `1234` - Install command: `armbian-install` - Update command: `armbian-update` ### Applicable Platform - 🐧 `arm64` - 🐋 Docker image: https://hub.docker.com/u/ophub - name: Login to Docker Hub id: login if: ${{ steps.make.outputs.status == 'success' && !cancelled() }} uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Load and push image to Docker Hub id: push if: ${{ steps.make.outputs.status == 'success' && !cancelled() }} run: | # Load the offline Docker image built by build_armbian_docker_image.sh offline_image="$(ls out/*.tar.gz 2>/dev/null | head -n 1)" [[ -z "${offline_image}" ]] && echo "Error: No offline image found." && exit 1 loaded_image="$(docker load -i "${offline_image}" | grep -oP 'Loaded image: \K.*')" [[ -z "${loaded_image}" ]] && echo "Error: Failed to load Docker image." && exit 1 echo "Loaded image: ${loaded_image}" # Tag for Docker Hub docker tag "${loaded_image}" "${{ inputs.docker_img }}-${{ inputs.source_branch }}:arm64" docker tag "${loaded_image}" "${{ inputs.docker_img }}-${{ inputs.source_branch }}:latest" # Push to Docker Hub docker push "${{ inputs.docker_img }}-${{ inputs.source_branch }}:arm64" docker push "${{ inputs.docker_img }}-${{ inputs.source_branch }}:latest" echo "status=success" >> ${GITHUB_OUTPUT} ================================================ FILE: .github/workflows/build-armbian-arm64-server-image.yml ================================================ #========================================================================== # Description: Build Armbian arm64 server image # Copyright (C) 2021 https://github.com/ophub/amlogic-s9xxx-armbian #========================================================================== name: Build Armbian arm64 server image on: repository_dispatch: workflow_dispatch: inputs: set_release: description: "Select OS Release." required: false default: "trixie" type: choice options: - trixie - bookworm - resolute - noble armbian_board: description: "Select device board." required: false default: "all" type: choice options: - all - first50 - range50_100 - range100_150 - last20 - a311d-oes_s922x-oes-plus_wxy-oect - nsy-g16-plus_nsy-g68-plus_bdy-g18-pro - s905d_s905x3_s912_s922x-ct2000 - a311d - a311d-oes - alark35-3500 - anas3035 - aio-3399b - aio-3399c - aio-3399c-ai - bdkj-bd-one - bdy-g18-pro - beikeyun - boca-tcn100 - cd1000 - chainedbox - cm3588-nas - crrc - dc-a588 - dg3399 - dg-tn3568 - dlfr100 - e20c - e25 - eaidk-610 - emb3531 - fine3399 - firefly-jd4 - firefly-rk3399 - fmx1-pro - fmx1-pro-b - gea-6319 - gzpeite-p01 - h28k - h618-devboard - h66k - h68k - h69k - h88k - h88k-v3 - h96-max-m2 - hk1-rbox-k8s - hs530r - ht2 - hugsun-x99 - ipc-r - jp-tvbox - king3399 - kylin3399 - lckfb-tspi - leez - lx-r3s - lyt-t68m - lz-d3568 - lz-d3588 - lz-k3568 - mrkaio-m68s - nanopc-t4 - nanopc-t6 - nanopi-m5 - nanopi-r5c - nanopi-r5s - nsy-g16-plus - nsy-g68-plus - orangepi-3b - orangepi-5-plus - orangepi-5b - orangepi-zero3 - panther-x2 - photonicat - r66s - r68s - renegade-rk3328 - rk3318-box - rock-5-itx - rock5b - rock5c - ruisen-box - s905 - s905-beelink-mini - s905-mxqpro-plus - s905d - s905d-ki-pro - s905d-sml5442tw - s905l - s905l-aurora-1s - s905l-b860av21u - s905l-mg101 - s905l2 - s905l2-e900v21e - s905l2-wojia - s905l3 - s905l3-cm211 - s905l3-unt400g1 - s905l3-unt402a - s905l3a - s905l3a-cm311 - s905l3a-m401a - s905l3b - s905l3b-e900v21d - s905l3b-e900v22d - s905l3b-e900v22e - s905l3b-ip103h - s905l3b-rg020et-ca - s905l3b-unt403a - s905lb-ipbs9505 - s905lb-q96-mini - s905lb-r3300l - s905mb - s905w - s905w-w95 - s905w-x96-mini - s905w-x96w - s905x - s905x-b860h - s905x-nexbox-a95x - s905x-t95 - s905x-tbee - s905x-tx9 - s905x2 - s905x2-km3 - s905x2-x96max-2g - s905x2-hg680fj - s905x3 - s905x3-2101 - s905x3-a100 - s905x3-a95xf3 - s905x3-a95xf3-gb - s905x3-b - s905x3-h96max - s905x3-hk1 - s905x3-ip1001m - s905x3-q1 - s905x3-q2 - s905x3-tox1 - s905x3-tx3 - s905x3-tx3-bz - s905x3-ugoosx3 - s905x3-whale - s905x3-x88-pro-x3 - s905x3-x96air - s905x3-x96air-gb - s905x3-x96max - s912 - s912-h96pro-plus - s912-m8s-pro - s912-nexbox-a1 - s912-nexbox-a2 - s912-onecloudpro - s912-phicomm-t1 - s912-t95z-plus - s912-tx8-max - s912-tx9-pro-2g - s912-tx9-pro-3g - s912-x92 - s912-zyxq-fake - s922x - s922x-ct2000 - s922x-gtking - s922x-gtkingpro-h - s922x-odroid-n2 - s922x-oes-plus - s922x-reva - s922x-ugoos-am6 - seewo-sv21 - smart-am40 - smart-am60 - station-m1 - station-m2 - station-p2 - sv-33a6x - sv-33a6x-vpu - swan1-w28 - sw799 - taram - tanix-tx6 - tb-ls3399 - tn3399 - tpm312 - tqc-a01 - tvi3315a - vplus - wocyber-a3 - wxy-oect - wxy-oect-mod - xiaobao - yskj - zcube1-max - zk-r39a - zysj armbian_kernel: description: "Select kernel version." required: false default: "6.12.y_6.18.y" type: choice options: - 5.10.y - 5.15.y - 6.1.y - 6.6.y - 6.12.y - 6.18.y - 5.10.y_5.15.y - 6.1.y_6.6.y - 6.12.y_6.18.y - 6.1.y_6.12.y - 6.1.y_6.18.y auto_kernel: description: "Auto use the latest kernel." required: false default: true type: boolean kernel_repo: description: "Set the kernel repository." required: false default: "ophub/kernel" type: choice options: - ophub/kernel kernel_usage: description: "Set the tags of the stable kernel." required: false default: "stable" type: choice options: - stable - flippy - beta armbian_fstype: description: "Select armbian rootfs type." required: false default: "ext4" type: choice options: - ext4 - btrfs armbian_edition: description: "Select image edition type." required: false default: "server" type: choice options: - server - desktop - beta builder_name: description: "Set Armbian builder signature." required: false default: "ophub" type: choice options: - ophub - angel env: TZ: Etc/UTC ROOTFS_SCRIPT: compile-kernel/tools/script/docker/build_armbian_rootfs_file.sh jobs: build: runs-on: ubuntu-24.04 if: ${{ github.event.repository.owner.id == github.event.sender.id }} steps: - name: Checkout uses: actions/checkout@v6 - name: Initialize the build environment id: init env: DEBIAN_FRONTEND: noninteractive run: | docker rmi -f $(docker images -q) 2>/dev/null || true [[ -n "${AGENT_TOOLSDIRECTORY}" ]] && sudo rm -rf "${AGENT_TOOLSDIRECTORY}" sudo rm -rf /usr/share/dotnet /usr/local/lib/android 2>/dev/null sudo swapoff -a sudo rm -f /swapfile /mnt/swapfile sudo -E apt-get -y update sudo -E apt-get -y purge azure-cli ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true sudo -E apt-get -y install $(curl -fsSL https://ophub.org/ubuntu2404-build-armbian-depends) sudo -E systemctl daemon-reload #sudo -E apt-get -y full-upgrade sudo -E apt-get -y autoremove --purge sudo -E apt-get clean sudo sed -i '/NVM_DIR/d;/skel/d' /root/{.bashrc,.profile} sudo rm -rf ~/{.cargo,.dotnet,.rustup} sudo -E timedatectl set-timezone "${TZ:-Etc/UTC}" sudo -E ntpdate ntp.ubuntu.com 0.pool.ntp.org || true sudo -E timedatectl set-ntp true date -u timedatectl status || true echo "status=success" >> ${GITHUB_OUTPUT} - name: Create virtual disk for extended storage run: | mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1) root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4) sudo truncate -s "${mnt_size}"G /mnt/mnt.img sudo truncate -s "${root_size}"G /root.img sudo losetup /dev/loop6 /mnt/mnt.img sudo losetup /dev/loop7 /root.img sudo pvcreate /dev/loop6 sudo pvcreate /dev/loop7 sudo vgcreate github /dev/loop6 /dev/loop7 sudo lvcreate -n runner -l 100%FREE github sudo mkfs.xfs -f -i sparse=0 -b size=4096 /dev/github/runner sudo mkdir -p /builder sudo mount /dev/github/runner /builder sudo chown -R runner:runner /builder df -Th echo "status=success" >> ${GITHUB_OUTPUT} - name: Download Armbian source code id: down working-directory: /builder if: ${{ steps.init.outputs.status == 'success' && !cancelled() }} run: | df -hT ${PWD} git clone -q --single-branch --depth=1 --branch=main https://github.com/armbian/build.git build ln -sf /builder/build ${{ github.workspace }}/build ln -sf /builder/build /home/runner/work/_actions/ophub/amlogic-s9xxx-armbian/main/build echo "status=success" >> ${GITHUB_OUTPUT} - name: Compile Armbian [ ${{ inputs.set_release }} ] id: compile working-directory: /builder if: ${{ steps.down.outputs.status == 'success' && !cancelled() }} run: | # Enable QEMU emulation for ARM cross-compilation docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 2>/dev/null || true # Compile options reference: https://docs.armbian.com/Developer-Guide_Build-Options cd build/ ./compile.sh RELEASE=${{ inputs.set_release }} BOARD=odroidn2 BRANCH=current BUILD_MINIMAL=no \ BUILD_ONLY=default HOST=armbian BUILD_DESKTOP=no EXPERT=yes KERNEL_CONFIGURE=no \ COMPRESS_OUTPUTIMAGE="sha" SHARE_LOG=yes echo "status=success" >> ${GITHUB_OUTPUT} - name: Organize output files and reclaim disk space id: clean if: ${{ steps.compile.outputs.status == 'success' && !cancelled() }} run: | # Extract essential artifacts and remove build files chmod +x ${ROOTFS_SCRIPT} ${ROOTFS_SCRIPT} -v ${{ inputs.set_release }} -s true -c true -k true -p arm64 # Remove build files while preserving output cd build/ rm -rf $(ls . | grep -v "^output$" | xargs) 2>/dev/null # Display disk usage after cleanup df -hT ${PWD} echo "build_tag=Armbian_${{ inputs.set_release }}_arm64_${{ inputs.armbian_edition }}_$(date +"%Y.%m")" >> ${GITHUB_ENV} echo "status=success" >> ${GITHUB_OUTPUT} - name: Upload Armbian image to Release uses: ncipollo/release-action@main if: ${{ steps.clean.outputs.status == 'success' && !cancelled() }} with: tag: ${{ env.build_tag }} artifacts: build/output/images/* allowUpdates: true makeLatest: true token: ${{ secrets.GITHUB_TOKEN }} - name: Rebuild Armbian for target boards uses: ophub/amlogic-s9xxx-armbian@main if: ${{ steps.clean.outputs.status == 'success' && !cancelled() }} with: build_target: armbian armbian_path: build/output/images/*.img.gz armbian_board: ${{ inputs.armbian_board }} armbian_kernel: ${{ inputs.armbian_kernel }} auto_kernel: ${{ inputs.auto_kernel }} kernel_repo: ${{ inputs.kernel_repo }} kernel_usage: ${{ inputs.kernel_usage }} armbian_fstype: ${{ inputs.armbian_fstype }} builder_name: ${{ inputs.builder_name }} - name: Upload rebuilt images to Release uses: ncipollo/release-action@main if: ${{ env.PACKAGED_STATUS == 'success' && !cancelled() }} with: tag: ${{ env.build_tag }} artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/* allowUpdates: true removeArtifacts: false replacesArtifacts: true makeLatest: true token: ${{ secrets.GITHUB_TOKEN }} body: | ### Armbian Image Information - Default username: `root` - Default password: `1234` - Install command: `armbian-install` - Update command: `armbian-update` ### Applicable Platform - 🐧 `arm64` - 🐋 Docker image: https://hub.docker.com/u/ophub ================================================ FILE: .github/workflows/build-armbian-using-official-image.yml ================================================ #========================================================================== # Description: Build Armbian from official upstream images # Copyright (C) 2021 https://github.com/ophub/amlogic-s9xxx-armbian #========================================================================== name: Build Armbian from official images on: repository_dispatch: workflow_dispatch: inputs: armbian_url: description: "Set the Armbian source image URL." required: false default: "" armbian_board: description: "Select device board." required: false default: "all" type: choice options: - all - first50 - range50_100 - range100_150 - last20 - a311d-oes_s922x-oes-plus_wxy-oect - nsy-g16-plus_nsy-g68-plus_bdy-g18-pro - s905d_s905x3_s912_s922x-ct2000 - a311d - a311d-oes - alark35-3500 - anas3035 - aio-3399b - aio-3399c - aio-3399c-ai - bdkj-bd-one - bdy-g18-pro - beikeyun - boca-tcn100 - cd1000 - chainedbox - cm3588-nas - crrc - dc-a588 - dg3399 - dg-tn3568 - dlfr100 - e20c - e25 - eaidk-610 - emb3531 - fine3399 - firefly-jd4 - firefly-rk3399 - fmx1-pro - fmx1-pro-b - gea-6319 - gzpeite-p01 - h28k - h618-devboard - h66k - h68k - h69k - h88k - h88k-v3 - h96-max-m2 - hk1-rbox-k8s - hs530r - ht2 - hugsun-x99 - ipc-r - jp-tvbox - king3399 - kylin3399 - lckfb-tspi - leez - lx-r3s - lyt-t68m - lz-d3568 - lz-d3588 - lz-k3568 - mrkaio-m68s - nanopc-t4 - nanopc-t6 - nanopi-m5 - nanopi-r5c - nanopi-r5s - nsy-g16-plus - nsy-g68-plus - orangepi-3b - orangepi-5-plus - orangepi-5b - orangepi-zero3 - panther-x2 - photonicat - r66s - r68s - renegade-rk3328 - rk3318-box - rock-5-itx - rock5b - rock5c - ruisen-box - s905 - s905-beelink-mini - s905-mxqpro-plus - s905d - s905d-ki-pro - s905d-sml5442tw - s905l - s905l-aurora-1s - s905l-b860av21u - s905l-mg101 - s905l2 - s905l2-e900v21e - s905l2-wojia - s905l3 - s905l3-cm211 - s905l3-unt400g1 - s905l3-unt402a - s905l3a - s905l3a-cm311 - s905l3a-m401a - s905l3b - s905l3b-e900v21d - s905l3b-e900v22d - s905l3b-e900v22e - s905l3b-ip103h - s905l3b-rg020et-ca - s905l3b-unt403a - s905lb-ipbs9505 - s905lb-q96-mini - s905lb-r3300l - s905mb - s905w - s905w-w95 - s905w-x96-mini - s905w-x96w - s905x - s905x-b860h - s905x-nexbox-a95x - s905x-t95 - s905x-tbee - s905x-tx9 - s905x2 - s905x2-km3 - s905x2-x96max-2g - s905x2-hg680fj - s905x3 - s905x3-2101 - s905x3-a100 - s905x3-a95xf3 - s905x3-a95xf3-gb - s905x3-b - s905x3-h96max - s905x3-hk1 - s905x3-ip1001m - s905x3-q1 - s905x3-q2 - s905x3-tox1 - s905x3-tx3 - s905x3-tx3-bz - s905x3-ugoosx3 - s905x3-whale - s905x3-x88-pro-x3 - s905x3-x96air - s905x3-x96air-gb - s905x3-x96max - s912 - s912-h96pro-plus - s912-m8s-pro - s912-nexbox-a1 - s912-nexbox-a2 - s912-onecloudpro - s912-phicomm-t1 - s912-t95z-plus - s912-tx8-max - s912-tx9-pro-2g - s912-tx9-pro-3g - s912-x92 - s912-zyxq-fake - s922x - s922x-ct2000 - s922x-gtking - s922x-gtkingpro-h - s922x-odroid-n2 - s922x-oes-plus - s922x-reva - s922x-ugoos-am6 - seewo-sv21 - smart-am40 - smart-am60 - station-m1 - station-m2 - station-p2 - sv-33a6x - sv-33a6x-vpu - swan1-w28 - sw799 - taram - tanix-tx6 - tb-ls3399 - tn3399 - tpm312 - tqc-a01 - tvi3315a - vplus - wocyber-a3 - wxy-oect - wxy-oect-mod - xiaobao - yskj - zcube1-max - zk-r39a - zysj armbian_kernel: description: "Select kernel version." required: false default: "6.12.y_6.18.y" type: choice options: - 5.10.y - 5.15.y - 6.1.y - 6.6.y - 6.12.y - 6.18.y - 5.10.y_5.15.y - 6.1.y_6.6.y - 6.12.y_6.18.y - 6.1.y_6.12.y - 6.1.y_6.18.y auto_kernel: description: "Auto use the latest kernel." required: false default: true type: boolean kernel_repo: description: "Set the kernel repository." required: false default: "ophub/kernel" type: choice options: - ophub/kernel kernel_usage: description: "Set the tags of the stable kernel." required: false default: "stable" type: choice options: - stable - flippy - beta armbian_fstype: description: "Set armbian rootfs type." required: false default: "ext4" type: choice options: - ext4 - btrfs armbian_edition: description: "Select image edition type." required: false default: "server" type: choice options: - server - desktop - beta builder_name: description: "Set Armbian builder signature." required: false default: "ophub" type: choice options: - ophub - angel - yourname env: TZ: Etc/UTC jobs: build: runs-on: ubuntu-24.04 if: ${{ github.event.repository.owner.id == github.event.sender.id }} steps: - name: Checkout uses: actions/checkout@v6 - name: Initialize the build environment id: init env: DEBIAN_FRONTEND: noninteractive run: | docker rmi -f $(docker images -q) 2>/dev/null || true [[ -n "${AGENT_TOOLSDIRECTORY}" ]] && sudo rm -rf "${AGENT_TOOLSDIRECTORY}" sudo rm -rf /usr/share/dotnet /usr/local/lib/android 2>/dev/null sudo swapoff -a sudo rm -f /swapfile /mnt/swapfile sudo -E apt-get -y update sudo -E apt-get -y purge azure-cli ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true sudo -E apt-get -y install $(curl -fsSL https://ophub.org/ubuntu2404-build-armbian-depends) sudo -E systemctl daemon-reload #sudo -E apt-get -y full-upgrade sudo -E apt-get -y autoremove --purge sudo -E apt-get clean sudo sed -i '/NVM_DIR/d;/skel/d' /root/{.bashrc,.profile} sudo rm -rf ~/{.cargo,.dotnet,.rustup} sudo -E timedatectl set-timezone "${TZ:-Etc/UTC}" sudo -E ntpdate ntp.ubuntu.com 0.pool.ntp.org || true sudo -E timedatectl set-ntp true date -u timedatectl status || true echo "status=success" >> ${GITHUB_OUTPUT} - name: Create virtual disk for extended storage run: | mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1) root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4) sudo truncate -s "${mnt_size}"G /mnt/mnt.img sudo truncate -s "${root_size}"G /root.img sudo losetup /dev/loop6 /mnt/mnt.img sudo losetup /dev/loop7 /root.img sudo pvcreate /dev/loop6 sudo pvcreate /dev/loop7 sudo vgcreate github /dev/loop6 /dev/loop7 sudo lvcreate -n runner -l 100%FREE github sudo mkfs.xfs -f -i sparse=0 -b size=4096 /dev/github/runner sudo mkdir -p /builder sudo mount /dev/github/runner /builder sudo chown -R runner:runner /builder df -Th echo "status=success" >> ${GITHUB_OUTPUT} - name: Set Armbian download source id: down working-directory: /builder run: | # Resolve the Armbian image download URL armbian_url="${{ inputs.armbian_url }}" if [[ -z "${armbian_url}" ]]; then armbian_site="https://armbian.tnahosting.net/dl/odroidn2/archive/" armbian_name="Armbian.*noble.*.img.xz" armbian_file=$(curl -s "${armbian_site}" | grep -oE "${armbian_name}" | head -n 1) if [[ -n "${armbian_file}" ]]; then armbian_url="${armbian_site}${armbian_file}" else echo -e "Error: No valid Armbian image found at: [ ${armbian_site} ]" exit 1 fi fi echo "ARMBIAN_URL=${armbian_url}" >> ${GITHUB_ENV} # Detect the OS release name from the URL set_release="" ARR_RELEASE=("resolute" "noble" "trixie" "bookworm") i=1 for r in ${ARR_RELEASE[*]}; do if [[ "${armbian_url}" == *"${r}"* ]]; then set_release="_${r}" break fi let i++ done mkdir -p /builder/build ln -sf /builder/build ${{ github.workspace }}/build ln -sf /builder/build /home/runner/work/_actions/ophub/amlogic-s9xxx-armbian/main/build sudo timedatectl set-timezone "${TZ}" echo "build_tag=Armbian${set_release}_arm64_${{ inputs.armbian_edition }}_$(date +"%Y.%m")" >> ${GITHUB_ENV} echo "status=success" >> ${GITHUB_OUTPUT} - name: Rebuild Armbian for target boards uses: ophub/amlogic-s9xxx-armbian@main if: ${{ env.ARMBIAN_URL != '' && !cancelled() }} with: build_target: armbian armbian_path: ${{ env.ARMBIAN_URL }} armbian_board: ${{ inputs.armbian_board }} armbian_kernel: ${{ inputs.armbian_kernel }} auto_kernel: ${{ inputs.auto_kernel }} kernel_repo: ${{ inputs.kernel_repo }} kernel_usage: ${{ inputs.kernel_usage }} armbian_fstype: ${{ inputs.armbian_fstype }} builder_name: ${{ inputs.builder_name }} - name: Upload Armbian images to Release uses: ncipollo/release-action@main if: ${{ env.PACKAGED_STATUS == 'success' && !cancelled() }} with: tag: ${{ env.build_tag }} artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/* allowUpdates: true removeArtifacts: false replacesArtifacts: true makeLatest: true token: ${{ secrets.GITHUB_TOKEN }} body: | ### Armbian Image Information - Default username: `root` - Default password: `1234` - Install command: `armbian-install` - Update command: `armbian-update` ### Applicable Platform - 🐧 `arm64` - 🐋 Docker image: https://hub.docker.com/u/ophub ================================================ FILE: .github/workflows/build-armbian-using-releases-files.yml ================================================ #========================================================================== # Description: Build Armbian using releases files # Copyright (C) 2021 https://github.com/ophub/amlogic-s9xxx-armbian #========================================================================== name: Build Armbian using releases files on: repository_dispatch: workflow_dispatch: inputs: set_release: description: "Select OS Release." required: false default: "trixie" type: choice options: - trixie - bookworm - resolute - noble armbian_board: description: "Select device board." required: false default: "all" type: choice options: - all - first50 - range50_100 - range100_150 - last20 - a311d-oes_s922x-oes-plus_wxy-oect - nsy-g16-plus_nsy-g68-plus_bdy-g18-pro - s905d_s905x3_s912_s922x-ct2000 - a311d - a311d-oes - alark35-3500 - anas3035 - aio-3399b - aio-3399c - aio-3399c-ai - bdkj-bd-one - bdy-g18-pro - beikeyun - boca-tcn100 - cd1000 - chainedbox - cm3588-nas - crrc - dc-a588 - dg3399 - dg-tn3568 - dlfr100 - e20c - e25 - eaidk-610 - emb3531 - fine3399 - firefly-jd4 - firefly-rk3399 - fmx1-pro - fmx1-pro-b - gea-6319 - gzpeite-p01 - h28k - h618-devboard - h66k - h68k - h69k - h88k - h88k-v3 - h96-max-m2 - hk1-rbox-k8s - hs530r - ht2 - hugsun-x99 - ipc-r - jp-tvbox - king3399 - kylin3399 - lckfb-tspi - leez - lx-r3s - lyt-t68m - lz-d3568 - lz-d3588 - lz-k3568 - mrkaio-m68s - nanopc-t4 - nanopc-t6 - nanopi-m5 - nanopi-r5c - nanopi-r5s - nsy-g16-plus - nsy-g68-plus - orangepi-3b - orangepi-5-plus - orangepi-5b - orangepi-zero3 - panther-x2 - photonicat - r66s - r68s - renegade-rk3328 - rk3318-box - rock-5-itx - rock5b - rock5c - ruisen-box - s905 - s905-beelink-mini - s905-mxqpro-plus - s905d - s905d-ki-pro - s905d-sml5442tw - s905l - s905l-aurora-1s - s905l-b860av21u - s905l-mg101 - s905l2 - s905l2-e900v21e - s905l2-wojia - s905l3 - s905l3-cm211 - s905l3-unt400g1 - s905l3-unt402a - s905l3a - s905l3a-cm311 - s905l3a-m401a - s905l3b - s905l3b-e900v21d - s905l3b-e900v22d - s905l3b-e900v22e - s905l3b-ip103h - s905l3b-rg020et-ca - s905l3b-unt403a - s905lb-ipbs9505 - s905lb-q96-mini - s905lb-r3300l - s905mb - s905w - s905w-w95 - s905w-x96-mini - s905w-x96w - s905x - s905x-b860h - s905x-nexbox-a95x - s905x-t95 - s905x-tbee - s905x-tx9 - s905x2 - s905x2-km3 - s905x2-x96max-2g - s905x2-hg680fj - s905x3 - s905x3-2101 - s905x3-a100 - s905x3-a95xf3 - s905x3-a95xf3-gb - s905x3-b - s905x3-h96max - s905x3-hk1 - s905x3-ip1001m - s905x3-q1 - s905x3-q2 - s905x3-tox1 - s905x3-tx3 - s905x3-tx3-bz - s905x3-ugoosx3 - s905x3-whale - s905x3-x88-pro-x3 - s905x3-x96air - s905x3-x96air-gb - s905x3-x96max - s912 - s912-h96pro-plus - s912-m8s-pro - s912-nexbox-a1 - s912-nexbox-a2 - s912-onecloudpro - s912-phicomm-t1 - s912-t95z-plus - s912-tx8-max - s912-tx9-pro-2g - s912-tx9-pro-3g - s912-x92 - s912-zyxq-fake - s922x - s922x-ct2000 - s922x-gtking - s922x-gtkingpro-h - s922x-odroid-n2 - s922x-oes-plus - s922x-reva - s922x-ugoos-am6 - seewo-sv21 - smart-am40 - smart-am60 - station-m1 - station-m2 - station-p2 - sv-33a6x - sv-33a6x-vpu - swan1-w28 - sw799 - taram - tanix-tx6 - tb-ls3399 - tn3399 - tpm312 - tqc-a01 - tvi3315a - vplus - wocyber-a3 - wxy-oect - wxy-oect-mod - xiaobao - yskj - zcube1-max - zk-r39a - zysj armbian_kernel: description: "Select kernel version." required: false default: "6.12.y_6.18.y" type: choice options: - 5.10.y - 5.15.y - 6.1.y - 6.6.y - 6.12.y - 6.18.y - 5.10.y_5.15.y - 6.1.y_6.6.y - 6.12.y_6.18.y - 6.1.y_6.12.y - 6.1.y_6.18.y auto_kernel: description: "Auto use the latest kernel." required: false default: true type: boolean kernel_repo: description: "Set the kernel repository." required: false default: "ophub/kernel" type: choice options: - ophub/kernel kernel_usage: description: "Set the tags of the stable kernel." required: false default: "stable" type: choice options: - stable - flippy - beta armbian_fstype: description: "Select armbian rootfs type." required: false default: "ext4" type: choice options: - ext4 - btrfs armbian_edition: description: "Select image edition type." required: false default: "server" type: choice options: - server - desktop - beta builder_name: description: "Set Armbian builder signature." required: false default: "ophub" type: choice options: - ophub - angel env: TZ: Etc/UTC jobs: build: runs-on: ubuntu-24.04 if: ${{ github.event.repository.owner.id == github.event.sender.id }} steps: - name: Checkout uses: actions/checkout@v6 - name: Initialize the build environment id: init env: DEBIAN_FRONTEND: noninteractive run: | docker rmi -f $(docker images -q) 2>/dev/null || true [[ -n "${AGENT_TOOLSDIRECTORY}" ]] && sudo rm -rf "${AGENT_TOOLSDIRECTORY}" sudo rm -rf /usr/share/dotnet /usr/local/lib/android 2>/dev/null sudo swapoff -a sudo rm -f /swapfile /mnt/swapfile sudo -E apt-get -y update sudo -E apt-get -y purge azure-cli ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true sudo -E apt-get -y install $(curl -fsSL https://ophub.org/ubuntu2404-build-armbian-depends) sudo -E systemctl daemon-reload #sudo -E apt-get -y full-upgrade sudo -E apt-get -y autoremove --purge sudo -E apt-get clean sudo sed -i '/NVM_DIR/d;/skel/d' /root/{.bashrc,.profile} sudo rm -rf ~/{.cargo,.dotnet,.rustup} sudo -E timedatectl set-timezone "${TZ:-Etc/UTC}" sudo -E ntpdate ntp.ubuntu.com 0.pool.ntp.org || true sudo -E timedatectl set-ntp true date -u timedatectl status || true echo "status=success" >> ${GITHUB_OUTPUT} - name: Create virtual disk for extended storage run: | mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1) root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4) sudo truncate -s "${mnt_size}"G /mnt/mnt.img sudo truncate -s "${root_size}"G /root.img sudo losetup /dev/loop6 /mnt/mnt.img sudo losetup /dev/loop7 /root.img sudo pvcreate /dev/loop6 sudo pvcreate /dev/loop7 sudo vgcreate github /dev/loop6 /dev/loop7 sudo lvcreate -n runner -l 100%FREE github sudo mkfs.xfs -f -i sparse=0 -b size=4096 /dev/github/runner sudo mkdir -p /builder sudo mount /dev/github/runner /builder sudo chown -R runner:runner /builder df -Th echo "status=success" >> ${GITHUB_OUTPUT} - name: Download Armbian from Releases id: down working-directory: /builder if: ${{ steps.init.outputs.status == 'success' && !cancelled() }} run: | armbian_buildpath="build/output/images" [[ -d "${armbian_buildpath}" ]] || mkdir -p "${armbian_buildpath}" ln -sf /builder/build ${{ github.workspace }}/build ln -sf /builder/build /home/runner/work/_actions/ophub/amlogic-s9xxx-armbian/main/build # Query the latest release asset via GitHub API latest_version=$(curl -s \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/releases?per_page=20 | \ jq -r --arg RTK "Armbian_${{ inputs.set_release }}_arm64_" \ --arg BOARD "-trunk_" \ '[.[] | select(.tag_name | contains($RTK))] | map(.assets[] | select(.name | contains($BOARD) and endswith(".img.gz"))) | sort_by(.updated_at) | reverse | .[0] | {data: .updated_at, url: .url, name: .name}') [[ -z "${latest_version}" || "${latest_version}" == "null" ]] && { echo "Error: Failed to resolve Armbian image download URL." exit 1 } # Extract download URL and filename latest_url="$(echo ${latest_version} | jq -r '.url')" armbian_filename="$(echo ${latest_version} | jq -r '.name')" # Download asset via GitHub API (binary stream) echo "Downloading: ${armbian_filename}" curl -fsSL \ -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/octet-stream" \ "${latest_url}" \ -o "${armbian_buildpath}/${armbian_filename}" [[ "${?}" -ne "0" ]] && echo "Error: Download failed." && exit 1 # Decompress the image cd "${armbian_buildpath}" && gzip -df *.img.gz && sync echo "build_tag=Armbian_${{ inputs.set_release }}_arm64_${{ inputs.armbian_edition }}_$(date +"%Y.%m")" >> ${GITHUB_ENV} echo "status=success" >> ${GITHUB_OUTPUT} - name: Rebuild Armbian [ ${{ inputs.set_release }} ] uses: ophub/amlogic-s9xxx-armbian@main if: ${{ steps.down.outputs.status == 'success' && !cancelled() }} with: build_target: armbian armbian_path: build/output/images/*.img armbian_board: ${{ inputs.armbian_board }} armbian_kernel: ${{ inputs.armbian_kernel }} auto_kernel: ${{ inputs.auto_kernel }} kernel_repo: ${{ inputs.kernel_repo }} kernel_usage: ${{ inputs.kernel_usage }} armbian_fstype: ${{ inputs.armbian_fstype }} builder_name: ${{ inputs.builder_name }} - name: Upload Armbian images to Release uses: ncipollo/release-action@main if: ${{ env.PACKAGED_STATUS == 'success' && !cancelled() }} with: tag: ${{ env.build_tag }} artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/* allowUpdates: true removeArtifacts: false replacesArtifacts: true makeLatest: true token: ${{ secrets.GITHUB_TOKEN }} body: | ### Armbian Image Information - Default username: `root` - Default password: `1234` - Install command: `armbian-install` - Update command: `armbian-update` ### Applicable Platform - 🐧 `arm64` - 🐋 Docker image: https://hub.docker.com/u/ophub ================================================ FILE: .github/workflows/build-armbian-x86-server-image.yml ================================================ #========================================================================== # Description: Build Armbian x86 server image # Copyright (C) 2021 https://github.com/ophub/amlogic-s9xxx-armbian #========================================================================== name: Build Armbian x86 server image on: repository_dispatch: workflow_dispatch: inputs: set_release: description: "Select OS Release." required: false default: "noble" type: choice options: - trixie - bookworm - resolute - noble publish_docker: description: "Publish Docker image" required: false default: "ophub/armbian" type: choice options: - ophub/armbian - none env: TZ: Etc/UTC ROOTFS_SCRIPT: compile-kernel/tools/script/docker/build_armbian_rootfs_file.sh MAKE_DOCKER_SH: compile-kernel/tools/script/docker/build_armbian_docker_image.sh jobs: build: runs-on: ubuntu-24.04 if: ${{ github.event.repository.owner.id == github.event.sender.id }} steps: - name: Checkout uses: actions/checkout@v6 - name: Initialize the build environment id: init env: DEBIAN_FRONTEND: noninteractive run: | docker rmi -f $(docker images -q) 2>/dev/null || true [[ -n "${AGENT_TOOLSDIRECTORY}" ]] && sudo rm -rf "${AGENT_TOOLSDIRECTORY}" sudo rm -rf /usr/share/dotnet /usr/local/lib/android 2>/dev/null sudo swapoff -a sudo rm -f /swapfile /mnt/swapfile sudo -E apt-get -y update sudo -E apt-get -y purge azure-cli ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true sudo -E apt-get -y install $(curl -fsSL https://ophub.org/ubuntu2404-build-armbian-depends) sudo -E systemctl daemon-reload #sudo -E apt-get -y full-upgrade sudo -E apt-get -y autoremove --purge sudo -E apt-get clean sudo sed -i '/NVM_DIR/d;/skel/d' /root/{.bashrc,.profile} sudo rm -rf ~/{.cargo,.dotnet,.rustup} sudo -E timedatectl set-timezone "${TZ:-Etc/UTC}" sudo -E ntpdate ntp.ubuntu.com 0.pool.ntp.org || true sudo -E timedatectl set-ntp true date -u timedatectl status || true echo "status=success" >> ${GITHUB_OUTPUT} - name: Create virtual disk for extended storage run: | mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1) root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4) sudo truncate -s "${mnt_size}"G /mnt/mnt.img sudo truncate -s "${root_size}"G /root.img sudo losetup /dev/loop6 /mnt/mnt.img sudo losetup /dev/loop7 /root.img sudo pvcreate /dev/loop6 sudo pvcreate /dev/loop7 sudo vgcreate github /dev/loop6 /dev/loop7 sudo lvcreate -n runner -l 100%FREE github sudo mkfs.xfs -f -i sparse=0 -b size=4096 /dev/github/runner sudo mkdir -p /builder sudo mount /dev/github/runner /builder sudo chown -R runner:runner /builder df -Th echo "status=success" >> ${GITHUB_OUTPUT} - name: Download source code id: down working-directory: /builder if: ${{ steps.init.outputs.status == 'success' && !cancelled() }} run: | df -hT ${PWD} git clone -q --single-branch --depth=1 --branch=main https://github.com/armbian/build.git build ln -sf /builder/build ${{ github.workspace }}/build echo "status=success" >> ${GITHUB_OUTPUT} - name: Compile Armbian [ ${{ inputs.set_release }} ] id: compile working-directory: /builder if: ${{ steps.down.outputs.status == 'success' && !cancelled() }} run: | # Enable QEMU emulation for ARM cross-compilation docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 2>/dev/null || true # Compile options reference: https://docs.armbian.com/Developer-Guide_Build-Options cd build/ ./compile.sh RELEASE=${{ inputs.set_release }} BOARD=uefi-x86 BRANCH=current BUILD_MINIMAL=no \ BUILD_ONLY=default HOST=armbian BUILD_DESKTOP=no EXPERT=yes KERNEL_CONFIGURE=no \ COMPRESS_OUTPUTIMAGE="sha" SHARE_LOG=yes echo "status=success" >> ${GITHUB_OUTPUT} - name: Organize output files and reclaim disk space id: clean if: ${{ steps.compile.outputs.status == 'success' && !cancelled() }} run: | # Extract essential artifacts and remove build files chmod +x ${ROOTFS_SCRIPT} ${ROOTFS_SCRIPT} -v ${{ inputs.set_release }} -s true -c true -k false -p amd64 # Remove build files while preserving output [[ -d "armbian" ]] || mkdir armbian cp -af build/output/images/* armbian/ rm -rf build # Display disk usage after cleanup df -hT ${PWD} echo "build_tag=Armbian_amd64_server_$(date +"%Y.%m")" >> ${GITHUB_ENV} echo "status=success" >> ${GITHUB_OUTPUT} - name: Build the Docker image id: makedocker if: ${{ inputs.publish_docker != 'none' && !cancelled() }} run: | chmod +x ${MAKE_DOCKER_SH} ${MAKE_DOCKER_SH} ${{ inputs.set_release }} amd64 echo "status=success" >> ${GITHUB_OUTPUT} - name: Upload Armbian image to Release uses: ncipollo/release-action@main if: ${{ steps.clean.outputs.status == 'success' && !cancelled() }} with: tag: ${{ env.build_tag }} artifacts: "armbian/*,out/*" allowUpdates: true makeLatest: false token: ${{ secrets.GITHUB_TOKEN }} body: | ### Armbian Image Information - Default username: `root` - Default password: `1234` ### Applicable Platform - 💻 `amd64(uefi-x86)` - 🐋 Docker image: https://hub.docker.com/u/ophub - name: Login to Docker Hub id: login if: ${{ steps.makedocker.outputs.status == 'success' && !cancelled() }} uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Load and push image to Docker Hub id: push if: ${{ steps.makedocker.outputs.status == 'success' && !cancelled() }} run: | # Load the offline Docker image built by build_armbian_docker_image.sh offline_image="$(ls out/*.tar.gz 2>/dev/null | head -n 1)" [[ -z "${offline_image}" ]] && echo "Error: No offline image found." && exit 1 loaded_image="$(docker load -i "${offline_image}" | grep -oP 'Loaded image: \K.*')" [[ -z "${loaded_image}" ]] && echo "Error: Failed to load Docker image." && exit 1 echo "Loaded image: ${loaded_image}" # Tag for Docker Hub docker tag "${loaded_image}" "${{ inputs.publish_docker }}-${{ inputs.set_release }}:amd64" # Push to Docker Hub docker push "${{ inputs.publish_docker }}-${{ inputs.set_release }}:amd64" echo "status=success" >> ${GITHUB_OUTPUT} ================================================ FILE: .github/workflows/compile-kernel.yml ================================================ #========================================================================== # Description: Compile the kernel # Copyright (C) 2021 https://github.com/unifreq/openwrt_packit # Copyright (C) 2021 https://github.com/ophub/amlogic-s9xxx-armbian #========================================================================== name: Compile the kernel on: repository_dispatch: workflow_dispatch: inputs: kernel_source: description: "Select the kernel source" required: false default: "unifreq" type: choice options: - unifreq - ophub kernel_version: description: "Select kernel version" required: false default: "6.12.y" type: choice options: - 5.10.y - 5.15.y - 6.1.y - 6.6.y - 6.12.y - 6.18.y kernel_auto: description: "Auto use the latest kernel" required: false default: true type: boolean delete_source: description: "Delete source after compilation" required: false default: true type: boolean kernel_package: description: "Select compile package list" required: false default: "all" type: choice options: - all - dtbs kernel_toolchain: description: "Select the compilation toolchain" required: false default: "gcc" type: choice options: - clang - gcc - gcc-15.2 - gcc-14.3 - gcc-14.2 ccache_clear: description: "Set whether to clear the cache" required: false default: false type: boolean docker_image: description: "Select Armbian docker image" required: false default: "trixie" type: choice options: - trixie - bookworm - resolute - noble kernel_sign: description: "Set the kernel custom signature" required: false default: "-ophub" type: choice options: - -ophub - -yourname env: TZ: Etc/UTC jobs: build: runs-on: ubuntu-24.04-arm if: ${{ github.event.repository.owner.id == github.event.sender.id }} steps: - name: Checkout uses: actions/checkout@v6 - name: Initialize the build environment id: init env: DEBIAN_FRONTEND: noninteractive run: | docker rmi -f $(docker images -q) 2>/dev/null || true [[ -n "${AGENT_TOOLSDIRECTORY}" ]] && sudo rm -rf "${AGENT_TOOLSDIRECTORY}" sudo rm -rf /usr/share/dotnet /usr/local/lib/android 2>/dev/null sudo swapoff -a sudo rm -f /swapfile /mnt/swapfile sudo -E apt-get -y update sudo -E apt-get -y purge azure-cli ghc* zulu* llvm* firefox google* dotnet* powershell openjdk* mongodb* moby* || true sudo -E apt-get -y install $(curl -fsSL https://ophub.org/ubuntu2404-build-armbian-depends) sudo -E systemctl daemon-reload #sudo -E apt-get -y full-upgrade sudo -E apt-get -y autoremove --purge sudo -E apt-get clean sudo sed -i '/NVM_DIR/d;/skel/d' /root/{.bashrc,.profile} sudo rm -rf ~/{.cargo,.dotnet,.rustup} sudo -E timedatectl set-timezone "${TZ:-Etc/UTC}" sudo -E ntpdate ntp.ubuntu.com 0.pool.ntp.org || true sudo -E timedatectl set-ntp true date -u timedatectl status || true echo "status=success" >> ${GITHUB_OUTPUT} - name: Create virtual disk for extended storage id: disk run: | mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1) root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4) sudo truncate -s "${mnt_size}"G /mnt/mnt.img sudo truncate -s "${root_size}"G /root.img sudo losetup /dev/loop6 /mnt/mnt.img sudo losetup /dev/loop7 /root.img sudo pvcreate /dev/loop6 sudo pvcreate /dev/loop7 sudo vgcreate github /dev/loop6 /dev/loop7 sudo lvcreate -n runner -l 100%FREE github sudo mkfs.xfs -f -i sparse=0 -b size=4096 /dev/github/runner sudo mkdir -p /builder sudo mount /dev/github/runner /builder sudo chown -R runner:runner /builder df -Th echo "status=success" >> ${GITHUB_OUTPUT} - name: Get kernel source commit hash id: kernelhash run: | # Get the latest source hash from the kernel repository api_url="https://api.github.com/repos/${{ inputs.kernel_source }}/linux-${{ inputs.kernel_version }}/git/ref/heads/main" source_hash=$(curl -fsSL -m 20 \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ ${api_url} | jq -r '.object.sha' ) [[ -z "${source_hash}" || "${source_hash}" == "null" ]] && source_hash="${{ github.sha }}" echo "source_hash=${source_hash}" >> ${GITHUB_ENV} echo "status=success" >> ${GITHUB_OUTPUT} - name: Cache ccache uses: actions/cache@v5 with: path: /builder/ccache key: kernel-${{ inputs.kernel_toolchain }}-${{ inputs.kernel_version }}-${{ env.source_hash }} restore-keys: | kernel-${{ inputs.kernel_toolchain }}-${{ inputs.kernel_version }}- - name: Compile the kernel [ ${{ inputs.kernel_version }} ] uses: ophub/amlogic-s9xxx-armbian@main if: ${{ steps.disk.outputs.status == 'success' && !cancelled() }} with: build_target: kernel kernel_source: ${{ inputs.kernel_source }} kernel_version: ${{ inputs.kernel_version }} kernel_auto: ${{ inputs.kernel_auto }} delete_source: ${{ inputs.delete_source }} kernel_package: ${{ inputs.kernel_package }} kernel_sign: ${{ inputs.kernel_sign }} kernel_toolchain: ${{ inputs.kernel_toolchain }} ccache_clear: ${{ inputs.ccache_clear }} docker_hostpath: /builder docker_image: ophub/armbian-${{ inputs.docker_image }}:arm64 - name: Upload Kernel to Release uses: ncipollo/release-action@main if: ${{ env.PACKAGED_STATUS == 'success' && !cancelled() }} with: tag: kernel_stable artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/* allowUpdates: true removeArtifacts: false replacesArtifacts: true makeLatest: false token: ${{ secrets.GITHUB_TOKEN }} body: | - These are Mainline LTS(Long Term Support) kernels that provide `stable` support for Armbian. - It works with most `Amlogic`, `Rockchip`, and `Allwinner` devices. For specific details, please refer to the instructions on the homepage of repository. - Dedicated BSP kernels for other Rockchip and Allwinner devices can be downloaded from the [ophub/kernel](https://github.com/ophub/kernel) repository. - 这些是主线 LTS(长期支持)内核,为 Armbian 提供`稳定`的支持。 - 适用于 `amlogic`,`rockchip`,`allwinner` 的大部分设备,具体可以参考仓库首页的说明。 - 其他的 Rockchip 和 Allwinner 设备专用 BSP 内核可以在 [ophub/kernel](https://github.com/ophub/kernel) 仓库里下载使用。 ================================================ FILE: .github/workflows/delete-older-releases-workflows.yml ================================================ #========================================================================== # https://github.com/ophub/amlogic-s9xxx-armbian # Description: Delete older releases and workflows runs #========================================================================== name: Delete older releases and workflows on: repository_dispatch: workflow_dispatch: inputs: delete_releases: description: "Delete Releases file?" required: true default: true type: boolean delete_tags: description: "Delete related Tags?" required: false default: true type: boolean prerelease_option: description: "Whether to differentiate pre-release." required: false default: "all" type: choice options: - all - true - false releases_keep_latest: description: "How many latest releases to keep." required: false default: "2" type: choice options: - 30 - 20 - 10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0 releases_keep_keyword: description: "Keyword of the keep releases." required: false default: "v0/server_/kernel_" delete_workflows: description: "Delete workflows records?" required: true default: true type: boolean workflows_keep_day: description: "Days to keep workflows." required: false default: "1" type: choice options: - 30 - 20 - 10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0 workflows_keep_keyword: description: "keywords for keep workflows." required: false default: "" out_log: description: "Output detailed JSON logs." required: false default: true type: boolean env: TZ: Etc/UTC jobs: build: runs-on: ubuntu-24.04-arm if: ${{ github.event.repository.owner.id == github.event.sender.id }} steps: - name: Checkout uses: actions/checkout@v6 - name: Initialize the environment id: init env: DEBIAN_FRONTEND: noninteractive run: | sudo timedatectl set-timezone "${TZ}" echo "status=success" >> ${GITHUB_OUTPUT} - name: Delete releases and workflows runs uses: ophub/delete-releases-workflows@main with: delete_releases: ${{ inputs.delete_releases }} delete_tags: ${{ inputs.delete_tags }} prerelease_option: ${{ inputs.prerelease_option }} releases_keep_latest: ${{ inputs.releases_keep_latest }} releases_keep_keyword: ${{ inputs.releases_keep_keyword }} delete_workflows: ${{ inputs.delete_workflows }} workflows_keep_day: ${{ inputs.workflows_keep_day }} workflows_keep_keyword: ${{ inputs.workflows_keep_keyword }} out_log: ${{ inputs.out_log }} gh_token: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .gitignore ================================================ !.gitignore /build /tmp_dir /build-armbian/kernel /build-armbian/u-boot /compile-kernel/kernel /compile-kernel/output /compile-kernel/tools/armbian .DS_Store npm-debug.log* *.rej *.orig *~ \#*# ================================================ FILE: CONTRIBUTORS.md ================================================ # Armbian Contributors First of all, thanks to [150balbes](https://github.com/150balbes) for the outstanding contributions and the solid foundation laid for running Armbian on Amlogic TV boxes. The [Armbian](https://github.com/armbian/build) system compiled here directly uses the latest official source code for real-time compilation. The program's design draws on tutorials from authors such as [ebkso](https://www.kflyo.com/howto-compile-armbian-for-n1-box). Thank you all for your dedication and sharing, enabling us to run the Armbian system on more devices. The [u-boot](https://github.com/ophub/u-boot), [kernel](https://github.com/ophub/kernel), and other resources used in this system are primarily derived from the [unifreq/openwrt_packit](https://github.com/unifreq/openwrt_packit) project. Some files were contributed by users through [Pull Requests](https://github.com/ophub/amlogic-s9xxx-armbian/pulls) and [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues) in projects such as [amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt), [amlogic-s9xxx-armbian](https://github.com/ophub/amlogic-s9xxx-armbian), [luci-app-amlogic](https://github.com/ophub/luci-app-amlogic), [u-boot](https://github.com/ophub/u-boot), and [kernel](https://github.com/ophub/kernel). To acknowledge these pioneers and contributors, their contributions have been recorded in this document since the repository's creation on `2021-09-19`. Thanks again to everyone for breathing new life and purpose into these devices. | Innovation and Contributors | Record of Achievements | | ---- | ---- | | [150balbes](https://github.com/150balbes) | Made outstanding contributions and laid a solid foundation for running Armbian on Amlogic TV boxes. | | [unifreq](https://github.com/unifreq) | Developed numerous Armbian and OpenWrt systems, provided boot and firmware build solutions for SoCs ranging from s905d to s922x and beyond, and shared extensive resources and tutorials. The [u-boot](https://github.com/ophub/u-boot), [kernel](https://github.com/ophub/kernel), and other resources used on this site are fully based on his work. He opened the door to the world of Armbian and OpenWrt on TV boxes. | | [NewbieOrange](https://github.com/NewbieOrange) | 01. [2021-11-14] He provided the `meson-gxm-t95z-plus.dtb` file and [usage method](build-armbian/armbian-files/platform-files/amlogic/bootfs/extlinux/) of the new device `T95Z-Plus` in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/22#issuecomment-968260448); Shared the `meson-gxl-s905l2-p281.dtb` file of s905l2 (p281 board) in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/29). Now called `meson-gxl-s905l2-x7-5g.dtb` | | [pulpoff](https://github.com/pulpoff) | 02. [2021-11-24] He shared how to adjust [dtb freq](https://github.com/armbian/build/commit/d0831a7ce191759011d8a0f23019acebc2348149) and add new [display resolution](https://github.com/tobetter/linux/commit/248da29964751908c36e2c5558385ec09aed87ad) in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/31#issuecomment-974982500), and provided test firmware [download](https://vp5.net/king/); In [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/36), the test method for `supporting sound` is shared; In [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/34), the test method for `enabling Bluetooth` is shared. | | [flymike](https://github.com/flymike) | 03. [2021-12-28] He shared the available `meson-gxbb-vega-s95-telos.dtb` and `u-boot-s905.bin` of the `Beelink-Mini-MX 2G` `s905` box in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/57) | | [martinlanger90](https://github.com/martinlanger90) | 04. [2022-01-01] He tested and shared the `MECOOL-KI-Pro 2G/16G` `s905d` box using armbian system in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/59). The available dtb is `meson-gxl-s905d-mecool-ki-pro.dtb`, u-boot is `u-boot-p201.bin`, and it can be used in `5.4`, `5.10`, and `5.15` kernels. | | [ErikPelli](https://github.com/ErikPelli) | 05. [2022-01-14] He reported in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72#issuecomment-1013071513) that [Tanix-TX92](http://www.tanix-box.com/project-view/tanix-tx92-android-tv-box-powered-amlogic-s912/) and [VORKE-Z6-Plus](http://www.vorke.com/project/vorke-z6-2/) boxes can use the same configuration as [H96-Pro-Plus](https://www.gearbest.com/tv-box-mini-pc/pp_503486.html), and support writing to `eMMC` for use. Supports the use of `mouse` and `keyboard` under the `5.10 kernel`. | | [JFLim1](https://github.com/JFLim1) | 06. [2022-01-15] He shared the available `dtb` and `u-boot` of the `Beelink-GT-King-Pro (Revision A, Serial #SA9HH...)` `s922x` box in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72#issuecomment-1012127495). After his tests, it was finally determined that the combination of `meson-g12b-gtking-pro.dtb` and `u-boot-gtkingpro-rev-a.bin` could be used. Mouse, keyboard, bluetooth, wireless are normal. | | [flymike](https://github.com/flymike) | 07. [2022-01-16] After his test in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/79), in the `MECOOL-KM3-4G` `s905x2` box, the combination of `meson-g12a-sei510.dtb` and `u-boot-x96max.bin` can be used normally, supporting the `5.10 kernel`. Network, bluetooth, wireless are normal. | | [JFLim1](https://github.com/JFLim1) | 08. [2022-01-18] After his test in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/81), He provided a solution to the `black screen` of the `gtking-pro-rev-a` box by disabling the `/etc/udev/rules.d/hdmi.rules` file. | | [DiogoSilva48](https://github.com/DiogoSilva48) | 09. [2022-02-02] After his test in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/98), The `tbee-box` can use the default firmware of the `s905x`. He provided two ways to enable `wifi`. | | [darkliang](https://github.com/darkliang) | 10. [2022-02-18] He submitted support for `Khadas-VIM3` box with SoC `A311D` in [Pull](https://github.com/ophub/amlogic-s9xxx-openwrt/pull/210), provided mainline U-BOOT file(`khadas-vim3-u-boot.sd.bin`) and configuration information. After his feedback, this box supports writing to `eMMC` and supports `5.4.y` and `5.10.y` kernels. | | [atsdai](https://github.com/atsdai) | 11. [2022-03-01] He feedback the `Beelink-Mini-MX-2G` RTL8211F Ethernet TX fix in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/127). Now [unifreq](https://github.com/unifreq) has added this scheme to the default kernel ([5.4](https://github.com/unifreq/linux-5.4.y/commit/456817db17ec67621d347963e2100a331b5a089d) / [5.10](https://github.com/unifreq/linux-5.10.y/commit/86fb0e941db620ff8851ec95100d414dc95f13ad) / [5.15](https://github.com/unifreq/linux-5.15.y/commit/c4d36d65651570e0ef2d00541e3b9058f2182e93) / [5.16](https://github.com/unifreq/linux-5.16.y/commit/2cc6ab2ced2221235e39ef33e83b62b55bc3b28b) have been added), the name is: `meson-gxbb-beelink-mini-mx.dtb` | | [Calmact](https://github.com/Calmact/e900v22c) | 12. [2022-03-02] He shared the solution of using Armbian system in `Skyworth E900V22C/D` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/129). After testing, the kernel 5.15 support `booting from USB` for use, support `100Mb wired network`, no wireless and Bluetooth. He plans to provide more support for this device, you can check the latest progress in his repository. | | [danboid](https://github.com/danboid) | 13. [2022-03-09] He shared the `openvfd LED display driver and related resources` in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/143). After debugging and sharing by [unifreq](https://github.com/unifreq), it is now [supported](build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd) to be used in six devices through the [armbian-openvfd](build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/sbin/armbian-openvfd) command. | | [parkjw0117](https://github.com/parkjw0117) | 14. [2022-03-12] After his test in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/158), in the `Mecool-M8S-PRO-L` `s912` box, the combination of `meson-gxm-q201.dtb` and `u-boot-s905x-s912.bin` can be used normally, supporting the `5.4/5.10 kernel`. The wired network is normal. Wireless and Bluetooth are not available. | | [lx7741](https://github.com/lx7741) | 15. [2022-03-23] After his test in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/192), in the `X96 Air` `s905x3` box, the `x96air.conf` can be used normally. Same configuration as x96max.conf | | [danboid](https://github.com/danboid) | 16. [2022-04-13] In [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/234) he shares the how-to to disable the IR receiver | | [KryptonLee](https://github.com/KryptonLee) | 17. [2022-04-22] He developed and shared `u-boot-e900v22c.bin` and `e900v22c-u-boot.bin.sd.bin`. After his test, the firmware that supports `e900v22c/d` is written to `eMMC` for use. | | [lanyucomputer](https://github.com/lanyucomputer) | 18. [2022-04-22] After his test in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/253), Determined the `octopus-planet (fake)` usage scheme, added the corresponding `bootloader` (`bl-fake-octopus-planet.bin`) and `armbian-install` options. | | [rapdodge](https://github.com/rapdodge) | 19. [2022-04-24] After his test in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/262), `HG680P(s905x)` box can be installed in eMMC, dtb uses `meson-gxl-s905x-p212.dtb` file, u-boot uses `u-boot-p212.bin` file, can use `5.4.y/5.15.y` kernels. The 100Mb wired network works fine. | | [psergeevich](https://github.com/psergeevich) | 20. [2022-04-27] Thanks to him for providing detailed motherboard layout, phy pin level test, iperf3 test and other very detailed test reports for x96max plus v5.1 (ip1001m phy) in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/258). The parameter scheme of `meson-sm1-x96-max-plus-ip1001m.dtb` is finally determined. Thanks to [unifreq](https://github.com/unifreq) for all the technical guidance and [kernel](https://github.com/unifreq/linux-5.15.y/commit/bca00ac86c16105b3f359bcb4e6c5d4011ae26b8) support for this NIC, which has now been added to his kernel repository. | | [chris4git](https://github.com/chris4git) | 21. [2022-05-07] According to his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/285), added support for the use of `T95(s905x)` devices, and the corresponding `t95.conf` LED file. | | [Smim0](https://github.com/Smim0) | 22. [2022-05-18] According to his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/315), added support for the use of `TX9-Pro(s912)(3G+32G+1Gb)` devices. Thanks to [unifreq](https://github.com/unifreq) for adding a dedicated dtb with `wifi` module for the device: `meson-gxm-tx9-pro.dtb` | | [kodokskoprol](https://github.com/kodokskoprol) | 23. [2022-05-29] According to his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/260), `A95X(s912)` and `Nexbox A1(s912)` devices can use gigabit wired (`meson-gxm-nexbox-a1.dtb, u-boot-p212.bin`) normally, support kernels such as `5.10.y` and `5.15.y` etc. but the wireless network cannot be used (`ath10k`, `qca9377` chip, the wireless module is `Fn-Link 8223A-SR C07001 1727`) | | [danboid](https://github.com/danboid) | 24. [2022-06-08] According to his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/366), `X96 Max Plus Q2(s905x3)` and `X96 Air Q1000(s905x3)` devices can use gigabit wired, Wireless and Bluetooth(qca9377) normally. According to his shared results, now `meson-sm1-x96-max-plus-q2.dtb` has been added to unifreq's 5.4.y, 5.10.y and [5.15.y](https://github.com/unifreq/linux-5.15.y/commit/5ed890ac09aaec7c0f2f2fc43a92212eaace41ac) series of kernels. | | [SajjadSabzkar](https://github.com/SajjadSabzkar) | 25. [2022-06-15] Thanks for adding the question template in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/374). | | [yujincheng08](https://github.com/yujincheng08) | 26. [2022-06-16] He added choice and boolean options to Actions in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/377) to make the operation more convenient. | | sibondt | 27. [2022-07-16] He shared the `meson-gxm-nexbox-a2.dts` file of the `Nexbox A95X A2(s912)`, and he tested the Gigabit wired network, wireless, and bluetooth all working fine. He also reported that `B860H(s905x)` can be installed in emmc for use, dtb uses `meson-gxl-s905x-b860h.dtb` , and u-boot uses `u-boot-p212.bin` file. | | [Fengke6](https://github.com/Fengke6) | 28. [2022-08-20] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/500), the `Tanix TX8 Max(s912)` box can be used normally, and the Gigabit wired, wireless, and Bluetooth all work normally, use `meson-gxm-tx8-max.dtb` file. | | [xcray](https://github.com/xcray) | 29. [2022-08-27] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/517), A secure partition has been added to the `CM311-1a-YST(s905l3a)` box, and the data read and write operation errors under the btrfs partition have been resolved after testing. | | [d5stick](https://github.com/d5stick) | 30. [2022-08-30] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/525), Added `Vontar X92(s912)` box support, Gigabit wired, wireless, bluetooth works fine. Added corresponding `meson-gxm-x92.dtb` support. | | [livelier](https://github.com/livelier) | 31. [2022-09-01] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/506), Added `Tencent Aurora 3Pro(s905x3-b)` box support, Gigabit wired, wireless, bluetooth works fine. Added corresponding `meson-sm1-skyworth-lb2004-a4091.dtb` support. | | [xcray](https://github.com/xcray) | 32. [2022-09-16] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/557), Added `Bluetooth` support for `CM311-1a-YST (s905l3a)`, `enhanced` wired network stability, and added dedicated `meson-g12a-s905l3a-cm311.dtb` file. | | [skysurf](https://github.com/skysurf) | 33. [2022-09-23] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/570), `W95(s905w)` box can be installed in eMMC, dtb uses `meson-gxl-s905w-p281.dtb` file. | | [janko888](https://github.com/janko888/MBH-M30xA) | 34. [2022-10-10] After his test feedback in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/615), add `M302A/M304A(s905l3-b)` box, can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file. | | [livelier](https://github.com/livelier) | 35. [2022-10-13] After his shared and test feedback in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/619) and [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/736), add `Tencent Aurora 3Pro (s905x3-b)` box, dtb uses `meson-sm1-skyworth-lb2004-a4091.dtb` file, UBOOT_OVERLOAD is `u-boot-skyworth-lb2004.bin` file, MAINLINE_UBOOT is `skyworth-lb2004-u-boot.bin.sd.bin`, can be installed in eMMC, bluetooth and wireless use normally. supports `5.10.y`, `5.15.y`, `5.19.y` kernels and adds box partition table. | | [TThanhXuan](https://github.com/TThanhXuan) | 36. [2022-10-16] According to his guidance, the `max-frequency` of eMMC is lowered so that the `X96 mini(s905w)` box can correctly identify the eMMC partition. After [box-automation1](https://github.com/box-automation1) test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/621), can be installed in eMMC, dtb uses `meson-gxl-s905w-x96-mini.dtb` file. | | [skysurf](https://github.com/skysurf) | 37. [2022-10-26] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/648), `MGV2000(s905l2)` box can be installed in eMMC, dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, The 100Mb wired network works fine. | | [thumsl](https://github.com/thumsl) | 38. [2022-10-28] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/645), `TX9(s905x)` box can be installed in eMMC, dtb uses `meson-gxl-s905x-tx9.dtb` file. He added wireless drivers and dts file for this device. The 100Mb wired network, wireless and bluetooth works fine. | | [7Ji](https://github.com/7Ji) | 39. [2022-11-10] He shared the [ampart](https://github.com/7Ji/ampart/) partition tool developed by himself in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/689), which supports eMMC partition table adjustment of `Amlogic series devices`, and realizes all the space after `117 MiB`. This tool has now become the default tool for Armbian systems. | | [puccio823](https://github.com/puccio823) | 40. [2022-11-20] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/337), `Sunvell T95M(s905)` box can be uses `meson-gxbb-p201.dtb` file. The 100Mb wired network works fine. | | [birdxs](https://github.com/birdxs) | 41. [2022-11-20] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/522), `Phicomm-T1(s912)` box can be installed in eMMC, dtb uses `meson-gxm-phicomm-t1.dtb` file. The 100Mb wired network, wireless, bluetooth works fine. | | [marchmin](https://github.com/marchmin) | 42. [2022-11-20] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/648), `Wojia-TV-IPBS9505(s905l2)` box can be installed in eMMC, dtb uses `meson-gxl-s905l2-ipbs9505.dtb` file. The 100Mb wired network works fine. | | [janko888](https://github.com/janko888) | 43. [2022-11-27] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/732) and Configuration submitted in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/735), `M401A(s905l3a)` box can be installed in eMMC, dtb uses `meson-g12a-s905l3a-m401a.dtb` file. The 100Mb wired network works fine. | | [CarlKuhligk](https://github.com/CarlKuhligk) | 44. [2022-11-27] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/734), `Q96 mini(s905lb)` box can be installed in eMMC, dtb uses `meson-gxl-s905x-p212.dtb` file. The 100Mb wired network works fine. | | [rainups](https://github.com/rainups) | 45. [2022-11-29] According to his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/740), added support for the use of `TX9-Pro(s912)(2G+16G+100Mb)` devices, dtb uses `meson-gxm-q201.dtb` file, and u-boot uses `u-boot-p212.bin` file. | | [yangzhuang2333](https://github.com/yangzhuang2333) | 46. [2022-12-03] According to his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/741), added support for the use of `ZTE-B863AV3.2-M(s905l3a)` devices, First flash the Android system of `M401A(s905l3a)`, and use the same configuration, select `btrfs` format to write to eMMC. dtb uses `meson-g12a-s905l3a-m401a.dtb` file, and u-boot uses `u-boot-e900v22c.bin` file. | | [ours1505](https://github.com/ours1505) | 47. [2022-12-05] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/763), `CM311-1(s905l3)` box can be installed in eMMC, dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, and u-boot uses `u-boot-p212.bin` file. The 100Mb wired network works fine. | | [dicsonpan](https://github.com/dicsonpan) | 48. [2022-12-07] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/779), `X96-Max-A100(s905x3)` box can be installed in eMMC, dtb uses `meson-sm1-sei610.dtb` file, and u-boot uses `u-boot-x96maxplus.bin` file. The 100Mb wired network, wireless and bluetooth works fine. | | [livelier](https://github.com/livelier) | 49. [2022-12-09] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/782), `Ugoos-X3(s905x3)` box can be installed in eMMC, It can be used on the device with `the bootloader lock`. He shared the developed `ugoos-x3-u-boot.bin.sd.bin` and `u-boot-ugoos-x3.bin` files in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/786). | | [mreser99](https://github.com/mreser99) | 50. [2022-12-10] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/351), `Tanix-Tx5-Max(S905x2)` box can be installed in eMMC, dtb uses `meson-g12a-x96-max.dtb` file, and u-boot uses `u-boot-x96max.bin` file, and MAINLINE_UBOOT uses `x96max-u-boot.bin.sd.bin` file. The 1Gb wired network works fine. | | [tv4you2016](https://github.com/tv4you2016) | 51. [2022-12-10] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/788), `X96 Max+ Q1(S905x3)` box can be installed in eMMC, dtb uses `meson-sm1-x96-max-plus-q1.dtb` file, and u-boot uses `u-boot-x96max.bin` file. The 100Mb wired network works fine. | | [RomanKozyrev](https://github.com/RomanKozyrev) | 52. [2022-12-24] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/851), `A95X-F2(S905x2)` box can be installed in eMMC, dtb uses `meson-g12a-x96-max-rmii.dtb` file, and u-boot uses `u-boot-x96max.bin` file. The 100Mb wired network works fine. | | [trvqhuy](https://github.com/trvqhuy) | 53. [2023-01-10] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/909), `X96-Max+ 100W(S905x3)` box can be installed in eMMC, dtb uses `meson-sm1-x96-air.dtb` file, and u-boot uses `u-boot-x96maxplus.bin` file. The 100Mb wired network works fine. | | [texaszc](https://github.com/texaszc) | 54. [2023-01-14] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/921), `MGV3000(S905l3)` box can be installed in eMMC, kernel uses `5.15.y`, dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, and u-boot uses `u-boot-s905x-s912.bin` file. The 100Mb wired network works fine. | | [tuzhis](https://github.com/tuzhis) | 55. [2023-01-18] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/939), `E900V22E(S905l3b)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-e900v22e.dtb` file, and u-boot uses `u-boot-s905x-s912.bin` file. The 100Mb wired network works fine (Need to flash to `Android 9` system). | | [OPMonday](https://github.com/OPMonday) | 56. [2023-01-24] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/970), `UNT403A(S905l3a)` box can be installed in eMMC, dtb uses `meson-g12a-s905l3a-m401a.dtb` file, and u-boot uses `u-boot-e900v22c.bin` file. The 100Mb wired network works fine. | | [1904688138](https://github.com/1904688138) | 57. [2023-01-27] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/978), `HG680-LC(S905l3)` box can be installed in eMMC, dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, and u-boot uses `u-boot-p212.bin` file. The 100Mb wired network works fine. | | [13584452567](https://github.com/13584452567) | 58. [2023-02-01] He shared his support for `eaidk-610(rk3399)` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/991), This device can be installed in eMMC, dtb uses `rk3399-eaidk-610.dtb` file. The Gigabit wired, wireless, bluetooth works fine. | | [JordanPlayz158](https://github.com/JordanPlayz158) | 59. [2023-02-02] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/988), `X88 King(S922x)` can use the same configuration as `GT-King-Pro(S922x)`, Gigabit wired and Bluetooth work fine. But USB (keyboard, mouse, etc.) won't work. | | [7Ji](https://github.com/7Ji) | 60. [2023-02-02] He shared his support for `BesTV R3300L(s905lb)` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/993), This device can be installed in eMMC, dtb uses `meson-gxl-s905x-p212.dtb` file, MAINLINE_UBOOT uses `r3300l-u-boot.bin.sd.bin` file, UBOOT_OVERLOAD uses `u-boot-r3300l.bin` file. The 100Mb wired works fine. He also shared some source code for [making u-boot](https://github.com/7Ji/u-boot), how to use the [ampart tool](https://github.com/7Ji/ampart), etc. For details, see Pull Merge Information. | | [d5stick](https://github.com/d5stick) | 61. [2023-02-04] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1006), `Vontar-X3(S905x3)` box can be installed in eMMC, dtb uses `meson-sm1-hk1box-vontar-x3.dtb` file, and u-boot uses `u-boot-x96maxplus.bin` file. The Gigabit wired network works fine. When using it, you need to flash into the Android system of HK1-Box(s905x3). | | [daniyo27](https://github.com/daniyo27) | 62. [2023-02-12] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1044), `X96W/FunTV(S905w)` box can be installed in eMMC, dtb uses `meson-gxl-s905w-x96w.dtb` file. The 100Mb wired network, Wifi and Bluetooth all works fine. | | [piotrekcrash](https://github.com/piotrekcrash) | 63. [2023-02-14] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1062), `Tx3-mini(s905w)` box can be installed in eMMC, dtb uses `meson-gxl-s905w-tx3-mini.dtb` file and u-boot use `u-boot-s905x-s912.bin` file. The 100Mb wired network. | | [13584452567](https://github.com/13584452567) | 64. [2023-02-19] He shared his support for `king3399(rk3399)` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1080), This device can be installed in eMMC, dtb uses `rk3399-king3399.dtb` file. The Gigabit wired, wireless, bluetooth works fine. | | [irfanjunaid](https://github.com/irfanjunaid) | 65. [2023-02-20] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1077), `TX3-BZ(s905x3)` box can be installed in eMMC, dtb uses `meson-sm1-tx3-bz.dtb` file, Mainline u-boot is required. The 100Mb wired network, Wifi and Bluetooth all works fine. | | [13584452567](https://github.com/13584452567) | 66. [2023-02-22] He shared his support for `tn3399(rk3399)` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1094), This device can be installed in eMMC, dtb uses `rk3399-tn3399.dtb` file. The Gigabit wired, wireless, bluetooth works fine. | | [yu13740000](https://github.com/yu13740000) | 67. [2023-02-23] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1100), `Vplus(allwinner-h6)` can start from `USB`, use `armbian-install` to write eMMC, and use `armbian-update` to update the kernel and use it normal. The u-boot and other resources used are from the OpenWrt project repository of [unifreq](https://github.com/unifreq/openwrt_packit). | | [13584452567](https://github.com/13584452567) | 68. [2023-02-27] He shared his support for `TQC-A01(allwinner-h6)` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1111), This device can be installed in eMMC, dtb uses `sun50i-h6-tqc-a01.dtb` file. The Gigabit wired, wireless, bluetooth works fine. | | [yhxxm](https://github.com/yhxxm) | 69. [2023-03-03] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/921#issuecomment-1453143251), `M401A(s905l3)` box can be installed in eMMC, dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, and u-boot uses `u-boot-p212.bin` file. The 100Mb wired network. | | [13584452567](https://github.com/13584452567) | 70. [2023-03-04] He shared his support for `KYLIN3399(rk3399)` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1132), This device can be installed in eMMC, dtb uses `rk3399-kylin3399.dtb` file. The Gigabit wired, wireless, bluetooth works fine. | | [salsabilng](https://github.com/salsabilng) | 71. [2023-03-04] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1086), He provided bluetooth support for `X96 Max+ 2101(s905x3)` box, can be installed in eMMC, dtb uses `meson-sm1-x96-max-plus-2101.dtb` file, and u-boot uses `u-boot-x96maxplus.bin` file. The Gigabit wired, wireless, bluetooth works fine. | | [Choomai](https://github.com/Choomai) | 72. [2023-03-08] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1140), `MXQ-Pro-4K(s905w)` box can be installed in eMMC, dtb uses `meson-gxl-s905w-x96w.dtb` file, and u-boot uses `u-boot-s905x-s912.bin` file. The 100Mb wired network. | | [gbsadmin](https://github.com/gbsadmin) | 73. [2023-03-10] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1154), `Hisense-IP103H(s905l3b)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file, and u-boot uses `u-boot-s905x-s912.bin` file. He also tested several other possible combinations. The 100Mb wired network. | | [God-JohnDiamond](https://github.com/God-JohnDiamond) | 74. [2023-03-18] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1180), `CM211-1(s905l3b)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file, and u-boot uses `u-boot-s905x-s912.bin` file. The 100Mb wired network. | | [ketaksaan](https://github.com/ketaksaan) | 75. [2023-03-18] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1181), `Infinity-B32(s905x3)` box can be installed in eMMC, dtb uses `meson-sm1-h96-max-x3.dtb` file, and u-boot uses `u-boot-x96maxplus.bin` file. The Gigabit wired network and wireless works fine. | | [taotao108](https://github.com/taotao108) | 76. [2023-03-20] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1190), `SumaVision-Q7(s905lb)` box dtb uses `meson-gxl-s905x-p212.dtb` file, and u-boot uses `u-boot-r3300l.bin` file. The 100Mb wired network and wireless works fine. | | [qianbinbin](https://github.com/qianbinbin) | 77. [2023-03-21] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1175), `SumaVision-Q5(s905)` box need use `/boot/extlinux/extlinux.conf` file, dtb uses `meson-gxbb-p201.dtb` file, and u-boot uses `u-boot-s905.bin` file. The 100Mb wired network works fine. | | [champion0117](https://github.com/champion0117) | 78. [2023-03-22] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/405), `M301A(s905l2)` box can be installed in eMMC(Downclock to 26Mhz), dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, and u-boot uses `u-boot-s905x-s912.bin` file. The 100Mb wired network works fine. | | [buglloc](https://github.com/buglloc) | 79. [2023-03-26] He shared his support for `NanoPi-R5S(rk3568)` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1217), dtb uses `rk3568-nanopi-r5.dtb` file. The Gigabit wired, wireless, bluetooth works fine. | | [13584452567](https://github.com/13584452567) | 80. [2023-04-05] He shared his support for `ZCube1-Max(rk3399)` device in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1247), This device can be installed in eMMC, dtb uses `rk3399-hugsun-zm.dtb` file. The Gigabit wired works fine. | | [piaoliuchong](https://github.com/piaoliuchong) | 81. [2023-04-07] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1256), `E900V22D(s905l3b)` box can be installed in eMMC, dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, and u-boot uses `u-boot-s905x-s912.bin` file. The 100Mb wired network works fine. | | [signigelchan](https://github.com/signigelchan) | 82. [2023-04-13] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1277), `UNT400G1(s905l3)` box can be installed in eMMC, dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, u-boot uses `u-boot-s905x-s912.bin` file, and use `extlinux.conf`. The 100Mb wired network works fine. | | [lovl88](https://github.com/lovl88) | 83. [2023-04-13] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1278), `E900v21E(s905l2)` dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, u-boot uses `u-boot-s905x-s912.bin` file, and use `extlinux.conf`. The 100Mb wired network works fine. | | [peagsus](https://github.com/peagsus) | 84. [2023-04-13] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1268), `CM311-1(s905l3b)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file, u-boot uses `u-boot-s905x-s912.bin` file. The 100Mb wired network works fine. | | [GD2021](https://github.com/GD2021) | 85. [2023-04-13] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1280), `CRRC(rk3399)` box can be installed in eMMC, dtb uses `rk3399-crrc.dtb` file. The Gigabit wired network works fine. | | [giovEra](https://github.com/giovEra) | 86. [2023-04-23] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1313), `Station-M1,Bqeel-MVR9(rk3328)` box can be installed in eMMC, dtb uses `rk3328-box-trn9.dtb` file. The Gigabit wired network works fine. | | [Ivanriver](https://github.com/Ivanriver) | 87. [2023-04-23] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1318), `CM211-1(s905l3)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file, u-boot uses `u-boot-p212.bin` file. The 100Mb wired network works fine. | | [GD2021](https://github.com/GD2021) | 88. [2023-04-23] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1317), `SMART-AM40(rk3399)` box can be installed in eMMC, dtb uses `rk3399-smart-am40.dtb` file. The Gigabit wired network works fine. | | [inoeud](https://github.com/inoeud) | 89. [2023-04-24] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1326), `SW799(rk3399)` box can be installed in eMMC, dtb uses `rk3399-bozz-sw799.dtb` file. The Gigabit wired network works fine. | | [tdleiyao](https://github.com/tdleiyao) | 90. [2023-04-25] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1319), `Panther-X2(rk3566)` box can be installed in eMMC, dtb uses `rk3566-panther-x2.dtb` file. The Gigabit wired network works fine. | | [Jeagarm](https://github.com/Jeagarm) | 91. [2023-04-25] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1332), `TY1608(s905l3b)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file, u-boot uses `u-boot-s905x-s912.bin` file, and Android 9.0 system. The 100Mb wired network works fine. | | [gwx11111111](https://github.com/gwx11111111) | 92. [2023-05-04] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/415), `Beelink-IPC-R(rk3588)` box can be installed in eMMC, dtb uses `rk3588-nvr-demo-v10-android.dtb` file, Bluetooth and wireless are working properly, and `4*1G` + `2*2.5G` network cards are working fine. | | [GD2021](https://github.com/GD2021) | 93. [2023-05-09] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1380), `ZYSJ(rk3399)` box can be installed in eMMC, dtb uses `rk3399-zysj.dtb` file. The Gigabit wired network works fine. The source of `zysj-rk3399_defconfig(u-boot)` and `k3399-zysj.dts` used is [cm9vdA/build-linux](https://github.com/cm9vdA/build-linux) repository. | | [9runner](https://github.com/9runner) | 94. [2023-05-18] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1166), `Whale(s905x3)` box can be installed in eMMC. You can use the same configuration as `x96-max+(s905x3)`. When using the `6.1.y` kernel series, it is necessary to use the mainline u-boot (`armbian-install -m yes`). The Gigabit wired network works fine. | | [shuye1728](https://github.com/shuye1728) | 95. [2023-05-18] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1405), `XiaoMI-3S(s905x)` box can use the `T95(s905x)` image. This device does not have an Ethernet port and can be used `wirelessly`. It can be written to eMMC for use, and the 6.1.y series kernel can also be used. | | [Drafteed](https://github.com/Drafteed) | 96. [2023-06-13] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1480), `X96(s905x)` box can use the `T95(s905x)` image. It can be written to eMMC for use, and the 6.1.y series kernel can also be used. | | [orientzane](https://github.com/orientzane) | 97. [2023-06-14] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1481), the `UNT402A(s905l3)` box can use the default image for `s905l3` and is compatible with the 5.15.y and 6.1.y series kernels. Currently, it can only be used with `USB` and is unable to write to NAND storage. | | [lauren12133](https://github.com/lauren12133) | 98. [2023-06-20] After his test feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1492), `DG-3399(rk3399)` box can be installed in eMMC, dtb uses `rk3399-dg3399.dtb` file. The Gigabit wired network works fine. | | [janko888](https://github.com/janko888) | 99. [2023-06-22] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1481) and [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1499), the `UNT402A(s905l)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file, and u-boot use `u-boot-p212.bin`. The 100Mb wired network works fine. | | [w2xg2022](https://github.com/w2xg2022) | 100. [2023-06-27] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1512), the `ZXV10-BV310(s905l3)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file, and u-boot use `u-boot-s905x-s912.bin`. The 100Mb wired network works fine. | | [yu6zhou](https://github.com/yu6zhou) | 101. [2023-06-27] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1508), the `CM311-1a-CH(s905l3a)` box can be installed in eMMC, dtb uses `meson-g12a-s905l3a-e900v22c.dtb` file, and u-boot use `u-boot-e900v22c.bin`. The 100Mb wired network works fine. | | [hzlyu123](https://github.com/hzlyu123) | 102. [2023-06-29] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/444), the `M201-S(s905l)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-m302a.dtb` file, and u-boot use `u-boot-p212.bin`. The 100Mb wired network works fine. | | [WallcroftUK](https://github.com/WallcroftUK) | 103. [2023-06-30] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/451), the `SmartLabs SML-5442TW(s905d)` box can be installed in eMMC, dtb uses `meson-gxl-s905d-sml5442tw.dtb` file, and u-boot use `u-boot-s905x-s912.bin`. The 100Mb wired network works fine. | | [jietech17](https://github.com/jietech17) | 104. [2023-06-30] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1514), the `e900v21e(s905l3b)` box can be installed in eMMC, dtb uses `meson-gxl-s905l3b-e900v22e.dtb` file, and u-boot use `u-boot-s905x-s912.bin`. The 100Mb wired network works fine. | | [orientzane](https://github.com/orientzane) | 105. [2023-07-05] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1520), the `IP112H(s905l3a)` box dtb uses `meson-g12a-s905l3a-e900v22c.dtb` file, and u-boot use `u-boot-e900v22c.bin`. The 100Mb wired network and Bluetooth works fine. | | [rongchuan17](https://github.com/rongchuan17) | 106. [2023-07-17] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1549) and [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1556), the `Emb3531(rk3399)` box dtb uses `rk3399-emb3531.dtb` file. The Gigabit wired network works fine. | | [aaftio](https://github.com/aaftio) | 107. [2023-07-25] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1568), the `TY1608(s905l3b)` box dtb uses `meson-gxl-s905l2-x7-5g.dtb` file, and u-boot use `u-boot-s905x-s912.bin`. The 100Mb wired network and Bluetooth works fine. | | [aaftio](https://github.com/aaftio) | 108. [2023-07-25] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1570), the `MG101(s905lb)` box dtb uses `meson-gxl-s905x-p212.dtb` file, and u-boot use `u-boot-r3300l.bin`. The 100Mb wired network and Bluetooth works fine. | | [inoeud](https://github.com/inoeud) | 109. [2023-08-12] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1609), the `Leez-p710(rk3399)` box dtb uses `rk3399-leez-p710.dtb` file. The Gigabit wired network and Bluetooth works fine. | | [locAtt](https://github.com/locAtt) | 110. [2023-08-15] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1613), the `MGV2000(s905l3b)` box dtb uses `meson-gxl-s905l3b-e900v22e.dtb` file, u-boot use `u-boot-s905x-s912.bin` file. Using the 5.15.y kernel, it is possible to write to eMMC for usage. The 6.1.y kernel can only be used when running from USB. The 100Mb wired network works fine. | | [aolin2000](https://github.com/aolin2000) | 111. [2023-08-15] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1598), the `B860AV-2.1M(s905l3b)` box dtb uses `meson-gxl-s905l3b-m302a.dtb` file, u-boot use `u-boot-s905x-s912.bin` file. The 100Mb wired network works fine. | | [araczkowski](https://github.com/araczkowski) | 112. [2023-08-18] According to his feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), the `X88-Pro-X3(s905x3)` box dtb uses `meson-sm1-x88-pro-x3.dtb` file, u-boot use `u-boot-x96maxplus.bin` and `x96maxplus-u-boot.bin.sd.bin` files. Gigabit wired, wireless, and Bluetooth are functioning properly. | | [kongjun0](https://github.com/kongjun0) | 113. [2023-08-18] According to his feedback in [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1217), the `NanoPi-R5C(rk3568)` box dtb uses `rk3568-nanopi-r5c.dtb` file. The Gigabit wired network works fine. The `u-boot` and `dtb` used are from the project [inindev/nanopi-r5](https://github.com/inindev/nanopi-r5). | | [13584452567](https://github.com/13584452567) | 114. [2023-08-21] According to his feedback in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1638) request, the `TQC-A01(h6)` box has received support. The used dtb is `sun50i-h6-tqc-a01.dtb`, and the u-boot version is `u-boot-sunxi-with-spl.bin`. The 100Mbps wired network works fine. | | [shijifeizhai](https://github.com/shijifeizhai) | 115. [2023-08-23] According to his feedback in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1644) request, the `S65(s905m-b)` box has received support. The used dtb is `meson-gxl-s905x-p212.dtb`, and the u-boot version is `u-boot-r3300l.bin`. The 100Mbps wired network works fine. | | [13584452567](https://github.com/13584452567) | 116. [2023-09-06] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1687) request, the `tvi3315a(rk3399)` box has received support. The used dtb is `rk3399-tvi3315a.dtb`. The Gigabit wired network works fine. | | [khancyr](https://github.com/khancyr) | 117. [2023-09-11] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1714) request, the `nexbox-a95x(s905x)` box has received support. The used dtb is `meson-gxl-s905x-nexbox-a95x.dtb`, and u-boot is `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [yycvip](https://github.com/yycvip) | 118. [2023-09-18] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1712) request, the `unt403a(s905l3b)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, and u-boot is `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [doyoman](https://github.com/doyoman) | 119. [2023-09-23] Based on the feedback he provided in the [chat group](https://github.com/ophub/amlogic-s9xxx-armbian/issues/852), `Beikeyun(rk3328)` has implemented a `new u-boot` scheme and `GPT` partition format for their devices, allowing for smooth startup and operation. Both MSDOS and GPT formats are supported for partitioning. | | [liaoya](https://github.com/liaoya) | 120. [2023-10-19] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/491) request, the `firefly(rk3399)` box has received support. The used dtb is `rk3399-firefly.dtb`. The Gigabit wired network works fine. The DTS and U-Boot used are from `150balbes` | | [r1172464137](https://github.com/r1172464137) | 121. [2023-10-28] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1790) request, the `Fine3399(rk3399)` box has received support. The used dtb is `rk3399-fine3399.dtb`. The Gigabit wired network works fine. The DTS and U-Boot used are from [cm9vdA/build-linux](https://github.com/cm9vdA/build-linux) | | [foobarjimmy](https://github.com/foobarjimmy) | 122. [2023-10-31] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1817) request, the `M411A(s905l3)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, and u-boot is `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [foobarjimmy](https://github.com/foobarjimmy) | 123. [2023-11-03] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1826) request, the `MiBox-4C(s905l-s)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb` / `meson-gxl-s905l-venz-v10.dtb` / `meson-gxl-s905l2-x7-5g.dtb`, and u-boot is `u-boot-p212.bin` / `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [sleepwalkera](https://github.com/sleepwalkera) | 124. [2023-11-08] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1839) request, the `MGV2000-K(s905l2)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, and u-boot is `u-boot-s905x-s912.bin`. The 100Mbps wired network works and Bluetooth fine. | | [shijifeizhai](https://github.com/shijifeizhai) | 125. [2023-11-15] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1860) request, the `RG020ET-CA(s905l3b)` box has received support. The used dtb is `meson-gxl-s905l3b-e900v22e.dtb`, and u-boot is `u-boot-s905x-s912.bin`, boot config use `extlinux.conf`. The 100Mbps wired network works fine. | | [sehczaa](https://github.com/sehczaa) | 126. [2023-11-16] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1861) request, the `Renegade(RK3328)` box has received support. The used dtb is `rk3328-roc-cc.dtb`. The Gigabit wired network works fine. | | [unifreq](https://github.com/unifreq) | 127. [2023-11-16] Support for the `jp-tvbox(rk3566)` device has been added using configuration files such as dtb from `unifreq`, used dtb is `rk3566-jp-tvbox.dtb`. It includes support for the `SATA` interface, and the Gigabit Ethernet is functioning properly. Your feedback on the usage in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1861) is welcome. | | [unifreq](https://github.com/unifreq) | 128. [2023-11-18] Support for `HLink-h28k/h66k/h68k/h69k/h88k/h88k-v3` devices has been added to the series of files, including u-boot and dtb, etc. developed by `unifreq`. We welcome feedback on usage in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1726) location. | | [phuonganh2601](https://github.com/phuonganh2601) | 129. [2023-11-21] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1882) request, the `TX3-Mini(s912)` box has received support. The used dtb is `meson-gxm-q201.dtb`, and u-boot is `u-boot-s905x-s912.bin`, boot config use `extlinux.conf`. The 100Mbps wired network works fine. | | [dz515704201](https://github.com/dz515704201) | 130. [2023-12-03] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1912) request, the `MG101(s905l)` box has received support. The used dtb is `meson-gxl-s905l-venz-v10.dtb`, and u-boot is `u-boot-p212.bin`. The 100Mbps wired network and HDMI works fine. | | [chiqianjiqi](https://github.com/chiqianjiqi) | 131. [2024-01-11] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2012) request, the `ZXV10 B860AV3.2-M(s905l3)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [sehczaa](https://github.com/sehczaa) | 132. [2024-01-13] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2017) request, the `Seewo-sv21(rk3568)` box has received support. The used dtb is `rk3568-seewo-sv21.dtb`. Two Gigabit wired network works fine. | | [kuuer](https://github.com/kuuer) | 133. [2024-01-19] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2026) request, the `LX-R3S(rk3399)` box has received support. The used dtb is `rk3399-lx-r3s.dtb`. The Gigabit wired network works fine. | | [kuuer](https://github.com/kuuer) | 134. [2024-01-24] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2050) request, the `hugsun-x99(rk3399)` box has received support. The used dtb is `rk3399-hugsun-x99.dtb`. The Gigabit wired network works fine. | | [Cp0204](https://github.com/Cp0204) | 135. [2024-01-29] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2058) request, the `E900V22D-2(S905L3)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [yicheng42](https://github.com/yicheng42) | 136. [2024-02-22] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2101) request, the `MiBox-4(S905L)` box has received support. The used dtb is `meson-gxl-s905l-venz-v10.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [shijifeizhai](https://github.com/shijifeizhai) | 137. [2024-03-02] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2127) request, the `e900v21d(S905L2)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [shijifeizhai](https://github.com/shijifeizhai) | 138. [2024-03-02] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2127) request, the `s65(S905LB)` box has received support. The used dtb is `meson-gxl-s905x-p212.dtb`, u-boot used `u-boot-r3300l.bin`. The 100Mbps wired network works fine. | | [13584452567](https://github.com/13584452567) | 139. [2024-03-02] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2129) request, the `rk3318-box(rk3318)` box has received support. The used dtb is `rk3318-box.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [chute8427](https://github.com/chute8427) | 140. [2024-03-10] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2146) request, the `tb-ls3399(rk3399)` box has received support. The used dtb is `rk3399-tb-ls3399.dtb`, u-boot used `uboot.img`, `trust.bin` and `idbloader.bin`. The Gigabit wired network works fine. | | [bnaand](https://github.com/bnaand) | 141. [2024-03-12] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2155) request, the `Mrkaio-m68s(rk3568)` box has received support. The used dtb is `rk3568-mrkaio-m68s.dtb`, u-boot used `u-boot.itb`, `idbloader.img`. The Gigabit wired network works fine. | | [haochn](https://github.com/haochn) | 142. [2024-03-24] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2188) request, the `CM201-1-YS(s095l2)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-s905x-s912.bin`, boot config add `extlinux.conf`. The 100Mbps wired network works fine. | | [wgbingo](https://github.com/wgbingo) | 143. [2024-04-04] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2209) request, the `CM201-1-YS(s095l3b)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [longjuanfeng05](https://github.com/longjuanfeng05) | 144. [2024-04-15] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2241) request, the `OneCloudPro-V1.1_V1.2(s912)` box has received support. The used dtb is `meson-gxm-octopus-planet.dtb`, u-boot used `u-boot-zyxq.bin`. The Gigabit wired network works fine. | | [shuzhizhi](https://github.com/shuzhizhi) | 145. [2024-04-26] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2273) request, the `ZXV10-B860AV2.1-U(s905l3)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [hunter24099](https://github.com/hunter24099) | 146. [2024-04-27] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2246) request, the `Hisense-hs530r(rk3399)` box has received support. The used dtb is `rk3399-hs530r.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [Pat-78](https://github.com/Pat-78) | 147. [2024-05-01] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2282) request, the `A95X-F3-Air(s905x3)` box has received support. The used dtb is `meson-sm1-a95xf3-air.dtb`, u-boot used `u-boot-x96maxplus.bin`. The 100Mbps wired network works fine. | | [AboutCXJ](https://github.com/AboutCXJ) | 148. [2024-05-03] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2292) request, the `B863AV3.1-M2(s905l3ab)` box has received support. The used dtb is `meson-g12a-s905l3a-e900v22c.dtb`, u-boot used `u-boot-e900v22c.bin`. The 100Mbps wired network works fine. | | [unifreq](https://github.com/unifreq) | 149. [2024-05-19] Copied u-boot and other relevant information from [unifreq's](https://github.com/unifreq) repository for radxa `rock5c(rk3588s)` & `e20c(rk3528)`, and added support for these two devices. | | [Jstzo2u](https://github.com/Jstzo2u) | 150. [2024-06-01] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2341) request, the `E900V21C(s905l)` box has received support. The used dtb is `meson-gxl-s905l-venz-v10.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [shirakawa-poi](https://github.com/shirakawa-poi) | 151. [2024-06-02] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2347) request, the `UNT402A(s905l3)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [shijifeizhai](https://github.com/shijifeizhai) | 151. [2024-06-09] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2357) request, the `IP108H-53u1m(s905l)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [yonggedebaqi](https://github.com/yonggedebaqi) | 152. [2024-07-01] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2400) request, the `Orange-Pi-5-Plus(rk3588)` box has received support. The used dtb is `rk3588-orangepi-5-plus.dtb`, u-boot is the same as rock5b(rk3588). The 2.5-Gigabit wired network works fine. | | [wanglixiang90](https://github.com/wanglixiang90) | 153. [2024-07-03] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2403) request, the `Tpm312(rk3588)` box has received support. The used dtb is `rk3399-tpm312.dtb`. The Gigabit wired network works fine. | | [dy008](https://github.com/dy008) | 154. [2024-07-05] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2407) request, the `Swan1-w28(rk3568)` box has received support. The used dtb is `rk3568-swan1-w28.dtb`. The Gigabit wired network works fine. | | [d5stick](https://github.com/d5stick) | 155. [2024-07-09] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2404) request, the `H96-Max-M2(rk3528)` box has received support. The used dtb is `rk3528-mangopi-m28k.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [Leona233](https://github.com/Leona233) | 156. [2024-07-26] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2447) request, the `E900V21D(s905l3b)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [hunter24099](https://github.com/hunter24099) | 157. [2024-07-26] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2446) request, the `ZK-rk39a(rk3399)` box has received support. The used dtb is `rk3399-zk-r39a.dtb`, u-boot used `trust.bin`, `uboot.img` and `idbloader.bin`. The Gigabit wired network works fine. | | [Hx0531](https://github.com/Hx0531) | 158. [2024-08-09] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/pull/993#issuecomment-2276804591) request, the `IPBS9505(s905lb)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [DavidTsou](https://github.com/DavidTsou) | 159. [2024-08-09] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2465) request, the `Tencent-Aurora-1s(s905l)` box has received support. The used dtb is `meson-gxl-s905x-p212.dtb`, u-boot used `u-boot-s905x-s912.bin`. The wireless network works fine. | | [qfnuzlr](https://github.com/qfnuzlr) | 160. [2024-08-19] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2491) request, the `B860AV2.1(s905l)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [Xianleewu](https://github.com/Xianleewu) | 161. [2024-08-29] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2508) request, we also thank [ysuolmai](https://github.com/ysuolmai) for providing relevant information and feedback. the `ruisen-box(rk3568)` box has received support. The used dtb is `rk3568-ruisen-box.dtb`, u-boot used `bootloader.bin`. The 2x1Gigabit wired network works fine. | | [ccu6](https://github.com/ccu6) | 162. [2024-09-10] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2538) request. the `lckfb-tspi(rk3566)` box has received support. The used dtb is `rk3566-taishanpi-v10.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [DavidTsou](https://github.com/DavidTsou) | 163. [2024-09-10] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2499) request. the `ZXV10-B860AV2.1U(s905l)` box has received support. The used dtb is `meson-gxl-s905x-tx9.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [tinytinycn](https://github.com/tinytinycn) | 164. [2024-09-26] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2539) request. the `CM201-1-6-YS(s905l3)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [ASFLY61](https://github.com/ASFLY61) | 165. [2024-10-06] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2585) request. the `HM201(s905l)` box has received support. The used dtb is `meson-gxl-s905x-tx9.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [w2xg2022](https://github.com/w2xg2022) | 166. [2024-10-21] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2598) request. the `IP108H(s905l2)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [w2xg2022](https://github.com/w2xg2022) | 167. [2024-10-29] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2616) request. the `MGV2000-CW(s905l2)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [bambizlu](https://github.com/bambizlu) | 168. [2024-11-03] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2625) request. the `UNT400G(s905l3)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [bambizlu](https://github.com/bambizlu) | 169. [2024-11-24] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2658) request. the `IP108H(s905l3)` box has received support. The used dtb is `meson-gxl-s905l2-x7-5g.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [stevenliuit](https://github.com/stevenliuit) | 170. [2024-11-27] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2661) request. the `DG-TN3568(rk3568)` box has received support. The used dtb is `rk3568-dg-tn3568.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [doyoman](https://github.com/doyoman) | 171. [2024-12-05] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2691) request. the `Fmx1-Pro(rk3399)` box has received support. The used dtb is `rk3399-fmx1-pro.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [zakuwaki](https://github.com/zakuwaki) | 172. [2024-12-06] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2673) request. the `yskj(rk3399)` box has received support. The used dtb is `rk3399-yskj.dtb`, u-boot used `trust.bin`, `uboot.img` and `idbloader.bin`. The Gigabit wired network works fine. | | [andyfanybo](https://github.com/andyfanybo) | 173. [2025-01-18] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2736) request. the `WXY-OEC-turbo-4g(Replaced-Chip-and-eMMC)(rk3566)` box has received support. The used dtb is `rk3566-wxy-oec-turbo-4g.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [dy008](https://github.com/dy008) | 174. [2025-03-01] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2817) request. the `Smart-Am60(rk3588)` box has received support. The used dtb is `rk3588-smart-am60.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [stevenliuit](https://github.com/stevenliuit) | 175. [2025-04-15] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2911) request. the `Alark35-3500(rk3568)` box has received support. The used dtb is `rk3568-alark35-3500.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 100Mbps wired network works fine. | | [loadnl](https://github.com/loadnl) | 176. [2025-05-20] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/748) request. the `Sv-33a6x(rk3399)` box has received support. The used dtb is `rk3399-sv-33a6x.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [Kwonelee](https://github.com/Kwonelee) | 177. [2025-06-06] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/744) request. the `Station-M2(rk3566)` box has received support. The used dtb is `rk3566-roc-pc.dtb`, u-boot used `u-boot.bin`. The Gigabit wired network works fine. | | BeiXiang | 178. [2025-06-15] According to the contribution shared by `BeiXiang`, support for the `wxy-oes (a311d)` device has been provided. You can join the discussion in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2666) section. this box has received support. The used dtb is `meson-g12b-oes.dtb`. The Gigabit wired network works fine. | | [dd-ray](https://github.com/dd-ray) | 179. [2025-06-29] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2736) request. the `WXY-OEC-turbo-4g(Original-Edition)(rk3566)` box has received support. The used dtb is `rk3566-wxy-oec-turbo-4g.dtb`, u-boot used `bootloader.bin`. The SATA and Gigabit wired network works fine. | | [caojiezi2003](https://github.com/caojiezi2003) | 180. [2025-07-20] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3029) request. the `WXY-OES-Plus(s922x)` box has received support. The used dtb is `meson-g12b-oes-plus.dtb`. The 3xSATA and 1xGigabit/1x300M wired network works fine. This DTB was designed through reverse engineering based on the `kaitian888` DTB. Thanks to extensive testing and feedback from `retro98boy`, `zjycb`, `caojiezi2003`, `yesterday666`, `yaodmin`, and others, we finally arrived at a fully functional version. Sincere thanks to all these contributors for their valuable support. | | [lighthx](https://github.com/lighthx) | 181. [2025-07-27] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3052) request. the `Orangepi-5B(rk3588s)` box has received support. The used dtb is `rk3588s-orangepi-5b.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [JiaHeWG](https://github.com/JiaHeWG) | 182. [2025-07-30] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3055) request. the `M301A(s905l3)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, u-boot used `u-boot-p212.bin`. The 100Mbps wired network works fine. | | [bluemeda](https://github.com/bluemeda) | 183. [2025-08-16] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3089) request. the `HG680-FJ(s905x2)` box has received support. The used dtb is `meson-g12a-hg680-fj.dtb`, u-boot used `u-boot-x96max.bin`. The 100Mbps wired network works fine. | | [Arthur97172](https://github.com/Arthur97172) | 184. [2025-09-11] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2978) request. the `Wocyber-A3(rk3568)` box has received support. The used dtb is `rk3568-wocyber-a3.dts`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [sib0ndt](https://github.com/sib0ndt) | 185. [2025-10-09] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-openwrt/pull/827) request. the `Photonicat(rk3568)` box has received support. The used dtb is `rk3568-photonicat.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The Gigabit wired network works fine. | | [fgpx78](https://github.com/fgpx78) | 186. [2025-11-25] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3245) request. the `MeCool-m8s-pro-W(s905w)` box has received support. The used dtb is `meson-gxl-s905w-tx3-mini.dtb`, u-boot used `u-boot-s905x-s912.bin`. The Gigabit wired network works fine. | | [rickmschulz](https://github.com/rickmschulz) | 187. [2025-12-02] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3256) request. the `BTV9(s905x)` box has received support. The used dtb is `meson-gxl-s905x-p212.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [liubei1998](https://github.com/liubei1998) | 188. [2025-12-09] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/845) request. the `nsy-g68-plus(rk3568)` box has received support. The used dtb is `rk3568-nsy-g68-plus.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 5xGigabit wired network works fine, Wireless works normally. | | [linai081795](https://github.com/linai081795) | 189. [2025-12-12] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/847) request. the `bdy-g18-pro(rk3568)` box has received support. The used dtb is `rk3568-bdy-g18-pro.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 5xGigabit wired network works fine, Wireless works normally. | | [xiaomeng9597](https://github.com/xiaomeng9597) | 190. [2025-12-12] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/845) request. the `nsy-g16-plus(rk3568)` box has received support. The used dtb is `rk3568-nsy-g16-plus.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 5xGigabit wired network works fine, Wireless works normally. | | [siliconbanana](https://github.com/siliconbanana) | 191. [2025-12-13] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3272) request. the `M411A(s905l3b)` box has received support. The used dtb is `meson-gxl-s905l3b-e900v22e.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [Eksol](https://github.com/Eksol) | 192. [2025-12-19] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3282) request. the `Tanix-TX9S(s912)` box has received support. The used dtb is `meson-gxm-octopus-planet.dtb`, u-boot used `u-boot-zyxq.bin`. The Gigabit wired network works fine. | | [lakalin](https://github.com/lakalin) | 193. [2025-12-26] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3221) request. the `Gzpeite-P01(rk3568)` box has received support. The used dtb is `rk3568-gzpeite.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 2xGigabit wired network works fine. | | [dengweiwen](https://github.com/dengweiwen) | 194. [2026-01-08] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3306) request. the `CM3588-NAS(rk3588)` box has received support. The used dtb is `rk3588-friendlyelec-cm3588-nas.dtb`, u-boot used `u-boot-rockchip.bin`. The 1xGigabit wired network works fine. | | [xzq849](https://github.com/xzq849) | 195. [2026-01-13] According to his sharing in the [Issues](https://github.com/ophub/fnnas/issues/158) request. the `Orange-Pi-Zero3(H618)` box has received support. The used dtb is `sun50i-h618-orangepi-zero3.dtb`, u-boot used `u-boot-sunxi-with-spl.bin`. The 1xGigabit wired network works fine. | | [Haaooo](https://github.com/Haaooo) | 196. [2026-01-18] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3207) request. the `NanoPi-m5(rk3576)` box has received support. The used dtb is `rk3576-nanopi-m5.dtb`, u-boot used `u-boot-rockchip.bin`. The 2xGigabit wired network works fine. | | [chongshengB](https://github.com/chongshengB) | 197. [2026-01-20] According to his sharing in the [Pull](https://github.com/ophub/u-boot/pull/28) request. the `TaraM(rk3399)` box has received support. The used dtb is `rk3399-taram.dtb`, u-boot used `trust.bin`, `uboot.img` and `idbloader.bin`. The 1xGigabit wired network works fine. | | [chengdataon-source](https://github.com/chengdataon-source) | 198. [2026-01-21] According to his sharing in the [Issues](https://github.com/ophub/fnnas/issues/250) request. the `Fmx1-Pro-B(rk3399)` box has received support. The used dtb is `rk3399-fmx1-pro-b.dtb`, u-boot used `trust.bin`, `uboot.img` and `idbloader.bin`. The 1xGigabit wired network works fine. | | [GinRyan](https://github.com/GinRyan) | 199. [2026-01-22] According to his sharing in the [Issues](https://github.com/ophub/fnnas/issues/261) request. the `Orange-Pi-3B(rk3566)` box has received support. The used dtb is `rk3566-orangepi-3b.dtb`, u-boot used `u-boot-rockchip.bin`. The 1xGigabit wired network works fine. | | [siasbaily](https://github.com/siasbaily) | 200. [2026-01-23] According to his sharing in the [Issues](https://github.com/ophub/fnnas/issues/271) request. the `OES-Plus-V2.1(s922x)` box has received support. The used dtb is `meson-g12b-s922x-oes-plus-v2.dtb`, u-boot used `u-boot-s905x2-s922.bin`. The 1xGigabit wired network works fine. | | [cnMeeko](https://github.com/cnMeeko) | 201. [2026-02-01] According to his sharing in the [Pull](https://github.com/ophub/u-boot/pull/30) request. the `NanoPC-T4(rk3399)` box has received support. The used dtb is `rk3399-nanopc-t4.dtb`, u-boot used `trust.bin`, `uboot.img` and `idbloader.bin`. The 1xGigabit wired network works fine. | | [a1303045940](https://github.com/a1303045940) | 202. [2026-02-01] According to his sharing in the [Pull](https://github.com/ophub/u-boot/pull/29) request. the `BDKJ-One(rk3568)` box has received support. The used dtb is `rk3568-bd-one.dtb`, u-boot used `idbloader.img`, `u-boot.itb`. The 5xGigabit wired network works fine. | | [Javier-Huang](https://github.com/Javier-Huang) | 203. [2026-02-02] According to his sharing in the [Pull](https://github.com/ophub/fnnas/pull/350) request. the `Station-P2(rk3568)` box has received support. The used dtb is `rk3568-roc-pc.dtb`, u-boot used `u-boot-rockchip.bin`. The 2xGigabit wired network works fine. | | [lentll](https://github.com/lentll) | 204. [2026-02-02] According to his sharing in the [Issues](https://github.com/ophub/fnnas/issues/355) request. the `Rock-5-ITX(rk3588)` box has received support. The used dtb is `rk3588-rock-5-itx.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 2x2.5Gigabit wired network works fine. | | [maxwell-hub](https://github.com/maxwell-hub) | 205. [2026-02-03] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3354) request. the `Firefly-Core-3399-JD4(rk3399)` box has received support. The used dtb is `rk3399-firefly-core-3399-jd4.dtb`, u-boot used `trust.bin`, `uboot.img` and `idbloader.bin`. The 1Gigabit wired network works fine. | | [shanshuise](https://github.com/shanshuise) | 206. [2026-02-05] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3339) request. the `AIO-3399C(rk3399)` box has received support. The used dtb is `rk3399-aio-3399c.dtb`, u-boot used `trust.bin`, `uboot.img` and `idbloader.bin`. The 1Gigabit wired network works fine. | | [jun9100](https://github.com/jun9100) | 207. [2026-02-09] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3339) request. the `AIO-3399C(AI)(rk3399)` box has received support. The used dtb is `rk3399-aio-3399c-ai.dtb`, u-boot used `trust.bin`, `uboot.img` and `idbloader.bin`. The 1Gigabit wired network works fine. | | [MaxCrazy1101](https://github.com/MaxCrazy1101) | 208. [2026-02-12] According to his sharing in the [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3387) request. the `LZ-D3568(rk3568)` box has received support. The used dtb is `rk3568-lz-d3568-v3.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 1Gigabit wired network works fine. | | [Crazh3](https://github.com/Crazh3) | 209. [2026-03-05] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3328) request. the `LZ-D3588(rk3588)` box has received support. The used dtb is `rk3588-lz-d3588.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 2x1Gigabit wired network works fine. | | [xf110](https://github.com/xf110) | 210. [2026-03-10] According to his sharing in the [Issues](https://github.com/ophub/fnnas/issues/464) request. the `HK1-Rbox-K8S(rk3528)` box has received support. The used dtb is `rk3528-hk1-rbox-k8s.dtb`, u-boot used `bootloader.bin`. The 100Mbps wired network works fine. | | [xf110](https://github.com/xf110) | 211. [2026-03-10] According to his sharing in the [Issues](https://github.com/ophub/fnnas/issues/464) request. the `HT2(rk3528)` box has received support. The used dtb is `rk3528-ht2.dtb`, u-boot used `bootloader.bin`. The 1Gigabit wired network works fine. | | [MikuChat](https://github.com/MikuChat) | 212. [2026-03-15] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3372) request. the `Sv-33a6x(VPU)(rk3399)` box has received support. The used dtb is `rk3399-sv-33a6x-vpu.dtb`, u-boot used `u-boot-rockchip.bin`. The 1Gigabit wired network works fine. | | [LSP0123](https://github.com/LSP0123) | 213. [2026-03-16] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3302) request. the `Inspur-CD1000-Cloud-PC(rk3528)` box has received support. The used dtb is `rk3528-cd1000.dtb`, u-boot used `bootloader.bin`. The 100Mbps wired network works fine. | | [itdoginfo](https://github.com/itdoginfo) | 214. [2026-03-16] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3432) request. the `UNT400G(s905l3)` box has received support. The used dtb is `meson-gxl-s905l3b-m302a.dtb`, u-boot used `u-boot-s905x-s912.bin`. The 100Mbps wired network works fine. | | [nblky](https://github.com/nblky) | 215. [2026-03-19] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3437) request. the `Boca-tcn100(rk3588s)` box has received support. The used dtb is `rk3588s-boca-tcn100.dtb`, u-boot used `u-boot.itb` and `idbloader.img`. The 1Gigabit wired network works fine. | | [infirms](https://github.com/infirms) | 216. [2026-03-20] According to his sharing in the [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3441) request. the `TOX1(s905x3)` box has received support. The used dtb is `meson-sm1-tox1.dtb`, u-boot used `u-boot-x96maxplus.bin`. The 1Gigabit wired network and the RTL8822BS wireless are working fine. | ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ================================================ FILE: README.cn.md ================================================
Armbian
# Armbian / 岸边 [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) Armbian(中文名:岸边)是基于 Debian/Ubuntu 构建的专为 ARM 芯片设计的轻量级 Linux 发行版。Armbian 系统精简、清洁,100% 兼容并继承了 Debian/Ubuntu 的功能与丰富的软件生态,可以安全稳定地运行在 TF/SD/USB 及设备的 eMMC 存储中。本项目保留了 Armbian 官方系统的完整性,并进一步拓展了对电视盒子等非官方支持设备的适配,同时增加了一系列便捷操作指令。现在你可以将电视盒子的安卓 TV 系统替换为 Armbian,使其成为一台功能强大的服务器。 本项目依托众多[贡献者](CONTRIBUTORS.md)的力量,为 `Amlogic`、`Rockchip` 和 `Allwinner` 平台的设备构建 Armbian 系统,支持写入 eMMC 使用、更新内核等功能。详细使用方法请参见 [Armbian 使用文档](./documents/README.cn.md)。最新的 Armbian 系统可在 [Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases) 中下载。欢迎 `Fork` 并进行个性化定制。如果对你有帮助,请点击仓库右上角的 `Star` 表示支持。 ## Armbian 系统默认信息 | 系统名称 | 默认账号 | 默认密码 | SSH 端口 | IP 地址 | | -------------- | ------- | ------- | ------- | ------- | | 🐧 [Armbian.OS](https://github.com/ophub/amlogic-s9xxx-armbian/releases) | root | 1234 | 22 | 从路由器获取 | | 🐋 [Armbian.Docker](https://hub.docker.com/u/ophub) | root | 1234 | 22 | 静态 MacVLAN IP | ## 支持的设备列表 ⬆️ 各平台(晶晨/瑞芯微/全志)型号均按 SoC 性能由高至低排列。 | SoC | [设备](https://github.com/ophub/amlogic-s9xxx-armbian/releases) | [内核](https://github.com/ophub/kernel) | | ---- | ---- | ---- | | a311d | [Khadas-VIM3](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/99), [WXY-OES](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2666) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s922x | [Beelink-GT-King](https://github.com/ophub/amlogic-s9xxx-armbian/issues/370), [Beelink-GT-King-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/707), [Ugoos-AM6-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/464), [ODROID-N2](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/201), [X88-King](https://github.com/ophub/amlogic-s9xxx-armbian/issues/988), [Ali-CT2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1150), [WXY-OES-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3029) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x3 | [X96-Max+](https://github.com/ophub/amlogic-s9xxx-armbian/issues/351), [HK1-Box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/414), [Vontar-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1006), [H96-Max-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1250), [Ugoos-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/782), [TX3(QZ)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/644), [TX3(BZ)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1077), [X96-Air](https://github.com/ophub/amlogic-s9xxx-armbian/issues/366), [X96-Max+_A100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/779), [A95X-F3-Air](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2282), [Tencent-Aurora-3Pro(s905x3-b)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/506), [X96-Max+Q1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/788), [X96-Max+100W](https://github.com/ophub/amlogic-s9xxx-armbian/issues/909), [X96-Max+_2101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1086), [Infinity-B32](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1181), [Whale](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1166), [X88-Pro-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [X99-Max-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [Transpeed-X3-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [TOX1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3441) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x2 | [X96Max-4G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/453), [X96Max-2G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/95), [MECOOL-KM3-4G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/79), [Tanix-Tx5-Max](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/351), [A95X-F2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/851), [HG680-FJ](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3089) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3a | [E900V22C/D](https://github.com/Calmact/e900v22c), [CM311-1a-YST](https://github.com/ophub/amlogic-s9xxx-armbian/issues/517), [M401A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/732), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/517), [UNT403A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/970), [UNT413A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/970), [ZTE-B863AV3.2-M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/741), [CM311-1a-CH](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1508), [IP112H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1520), [B863AV3.1-M2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2292) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3b | [CM201-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2209), [CM211-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1180), [CM311-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1268), [E900V21D](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2447), [E900V22D](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1256), [E900V21E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1514), [E900V22E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/939), [M302A/M304A](https://github.com/ophub/amlogic-s9xxx-armbian/pull/615), [Hisense-IP103H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1154), [TY1608](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1332), [TY1608](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1568), [MGV2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1613), [B860AV-2.1M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1598), [UNT403A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1712), [RG020ET-CA](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1860), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3272) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3 | [CM211-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1318), [CM311-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/763), [HG680-LC](https://github.com/ophub/amlogic-s9xxx-armbian/issues/978), [M401A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/921#issuecomment-1453143251), [UNT400G1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1277), [UNT400G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2625), [UNT402A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1481), [ZXV10-BV310](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1512), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1817), [ZXV10-B860AV3.2-M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2012), [ZXV10-B860AV2.1-U](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2273), [E900V22D-2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2058), [CM201-1-6-YS](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2539), [IP108H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2539), [M301A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3055) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s912 | [Tanix-TX8-Max](https://github.com/ophub/amlogic-s9xxx-armbian/issues/500), [Tanix-TX9-Pro(3G)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/315), [Tanix-TX9-Pro(2G)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/740), [Tanix-TX92](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72#issuecomment-1012790770), [Tanix-TX9S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3282), [Nexbox-A1](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/260), [Nexbox-A95X-A2](https://www.cafago.com/en/p-v2979eu-2g.html), [A95X](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/260), [H96-Pro-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72#issuecomment-1013071513), [VORKE-Z6-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72), [Mecool-M8S-PRO-L](https://github.com/ophub/amlogic-s9xxx-armbian/issues/158), [Vontar-X92](https://github.com/ophub/amlogic-s9xxx-armbian/issues/525), [T95Z-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/668), [Octopus-Planet](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1020), [Phicomm-T1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/522), [TX3-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1882), [OneCloudPro-V1.1_V1.2](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2241) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905d | [MECOOL-KI-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/59), [Phicomm-N1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/925), [SML-5442TW](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/451) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x | [HG680P](https://github.com/ophub/amlogic-s9xxx-armbian/issues/262), [B860H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/60), [TBee-Box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/98), [T95](https://github.com/ophub/amlogic-s9xxx-armbian/issues/285), [TX9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/645), [XiaoMI-3S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1405), [X96](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1480), [Nexbox-a95x](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1714), [BTV9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3256) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905mb | [S65](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1644) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l | [UNT402A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1481), [M201-S](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/444), [MiBox-4](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2101), [MiBox-4C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1826), [MG101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1912), [E900V21C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2341), [IP108H-53u1m](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2357), [Tencent-Aurora-1s](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2465), [B860AV2.1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2491), [B860AV2.1U](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2499), [HM201](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2585) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l2 | [MGV2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/648), [MGV2000-K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1839), [MGV3000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/921), [Wojia-TV-IPBS9505](https://github.com/ophub/amlogic-s9xxx-armbian/issues/648), [M301A](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/405), [E900v21E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1278), [e900v21d](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2127), [CM201-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2188), [IP108H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2598), [MGV2000-CW](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2616) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905lb | [Q96-mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/734), [BesTV-R3300L](https://github.com/ophub/amlogic-s9xxx-armbian/pull/993), [SumaVision-Q7](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1190), [MG101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1570), [s65](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2128), [IPBS9505](https://github.com/ophub/amlogic-s9xxx-armbian/pull/993#issuecomment-2276804591) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905w | [X96-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/621), [TX3-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1062), [W95](https://github.com/ophub/amlogic-s9xxx-armbian/issues/570), [X96W/FunTV](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1044), [MXQ-Pro-4K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1140), [MeCool-m8s-pro-W](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3245) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905 | [Beelink-Mini-MX-2G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/127), [Sunvell-T95M](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/337), [MXQ-Pro+4K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/715), [SumaVision-Q5](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1175) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3588(s) | [Radxa-Rock5B](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1240), [Radxa-Rock5C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2324), [Orange-Pi-5-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2400), [Beelink-IPC-R](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/415), [HLink-H88K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H88K-V3](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [NanoPC-T6](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2453), [Smart-Am60](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2817), [DC-A588](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2988), [Orangepi-5B](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3052), [CM3588-NAS](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3306), [Rock-5-ITX](https://github.com/ophub/fnnas/issues/355), [LZ-D3588](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3328), [Boca-tcn100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3437) | [rk3588](https://github.com/ophub/kernel/releases/tag/kernel_rk3588) | | rk3576 | [NanoPi-m5](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3207) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3399 | [EAIDK-610](https://github.com/ophub/amlogic-s9xxx-armbian/pull/991), [King3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1080), [TN3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1094), [Kylin3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1132), [ZCube1-Max](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1247), [CRRC](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1280), [SMART-AM40](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1317), [SW799](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1326), [ZYSJ](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1380), [DG-3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1492), [DLFR100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1522), [Emb3531](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1549), [Leez-p710](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1609), [tvi3315a](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1687), [xiaobao](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1698), [Fine3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1790), [Firefly-RK3399](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/491), [LX-R3S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2026), [Hugsun-x99](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2050), [Tb-ls3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2146), [Hisense-hs530r](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/572), [Tpm312](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2403), [ZK-rk39a](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2446), [YSKJ](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2673), [Fmx1-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2691), [Fmx1-Pro-B](https://github.com/ophub/fnnas/issues/250), [Sv-33a6x](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/748), [Sv-33a6x(VPU)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3372), [AIO-3399B](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3185), [AIO-3399C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3339), [AIO-3399C(AI)](https://github.com/ophub/fnnas/issues/108), [TaraM](https://github.com/ophub/u-boot/pull/28), [NanoPC-T4](https://github.com/ophub/u-boot/pull/30), [Firefly-Core-3399-JD4](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3354), [GEA-6319](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3383) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3568 | [FastRhino-R66S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1061), [FastRhino-R68S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/774), [Radxa-E25](https://wiki.radxa.com/Rock3/CM/CM3I/E25), [NanoPi-R5S](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1217), [NanoPi-R5C](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1217), [HLink-H66K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H68K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H69K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [Seewo-sv21](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2017), [Mrkaio-m68s](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2155), [Swan1-w28](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2407), [Ruisen-box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2508), [DG-TN3568](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2661), [Alark35-3500](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2911), [MMBox-Anas3035](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2995), [Wocyber-A3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2978), [Photonicat](https://github.com/ophub/amlogic-s9xxx-openwrt/pull/827), [NSY-G16-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/845), [NSY-G68-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/845), [BDY-G18-Pro](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/847), [Gzpeite-P01](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3221), [LZ-D3568](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3387), [LZ-K3568](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3304), [BDKJ-One](https://github.com/ophub/u-boot/pull/29), [Station-P2](https://github.com/ophub/fnnas/pull/350), [Lyt-t68m](https://github.com/ophub/fnnas/issues/435) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3566 | [Panther-X2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1319), [JP-TvBox](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1867), [LCKFB-Taishan-Pi](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2538), [WXY-OEC-turbo-4g](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2736), [Station-M2](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/744), [Orange-Pi-3B](https://github.com/ophub/fnnas/issues/261) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3528 | [HLink-H28K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1726), [Radxa-E20C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2324), [H96-Max-M2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2404), [HK1-Rbox-K8S](https://github.com/ophub/fnnas/issues/464), [HT2](https://github.com/ophub/fnnas/issues/464), [CD1000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3302) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx) | | rk3328 | [BeikeYun](https://github.com/ophub/amlogic-s9xxx-armbian/issues/852), [Chainedbox-L1-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1680), [Station-M1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1313), [Bqeel-MVR9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1313), [Renegade/Firefly](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1861) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3318 | [RX3318-Box](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2129) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | h6 | [Vplus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1100), [Tanix-TX6](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1120), [TQC-A01](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1638) | [h6](https://github.com/ophub/kernel/releases/tag/kernel_h6)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | h618 | [OrangePi-Zero3](https://github.com/ophub/fnnas/issues/158), [H618-DevBoard](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3434) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | > [!TIP] > 目前 [s905 的盒子](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1173)仅支持在 `TF/SD/USB` 中使用,其他型号的盒子均支持写入 `EMMC`。更多信息请查阅 [✅支持的设备列表说明](build-armbian/armbian-files/common-files/etc/model_database.conf)。添加新设备支持可参考说明文档 12.15 章节的方法:[添加新的支持设备](documents/README.cn.md#1215-如何添加新的支持设备)。使用前请先阅读 [Armbian 使用文档](./documents/README.cn.md),常见问题均已提供解决方案。 ## 安装及升级 Armbian 的相关说明 请选择与你的设备型号对应的 Armbian 系统,不同设备的使用方法请参考对应的说明文档。 - ### 安装 Armbian 到 EMMC 1. `Rockchip` 平台的安装方法请查看说明文档中的 [第 8 章节](documents/README.cn.md#8-安装-armbian-到-emmc)。 2. `Amlogic` 和 `Allwinner` 平台,使用 [Rufus](https://rufus.ie/) 或者 [balenaEtcher](https://www.balena.io/etcher/) 等工具将系统写入 USB 里,然后把写好系统的 USB 插入盒子。登录 Armbian 系统 (默认用户: root, 默认密码: 1234) → 输入命令: ```shell armbian-install ``` | 可选参数 | 默认值 | 选项 | 说明 | | ------- | ------- | ------ | ----------------- | | -m | no | yes/no | 使用主线 u-boot | | -a | yes | yes/no | 使用 [ampart](https://github.com/7Ji/ampart) 分区表调整工具 | | -l | no | yes/no | 显示全部设备列表 | 示例:`armbian-install -m yes -a no` - ### 更新 Armbian 内核 登录 Armbian 系统 → 输入命令: ```shell # 使用 root 用户运行 (sudo -i) # 如果不指定参数,将更新为最新版本。 armbian-update ``` | 可选参数 | 默认值 | 选项 | 说明 | | -------- | ------------ | ------------- | -------------------------------- | | -r | ophub/kernel | `/` | 设置从 github.com 下载内核的仓库 | | -u | 自动识别 | stable/flippy/beta/rk3588/rk35xx/h6 | 设置使用的内核的 [tags 后缀](https://github.com/ophub/kernel/releases) | | -k | 最新版 | 内核版本 | 设置[内核版本](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | -b | yes | yes/no | 更新内核时自动备份当前使用的内核 | | -d | deb | tar/deb | 设置首选的内核包格式。若指定格式不存在,脚本将自动尝试另一种格式。如需编译自定义驱动,推荐使用 `deb` 格式。 | | -m | no | yes/no | 使用主线 u-boot | | -s | 无 | 无/磁盘名称 | [SOS] 恢复 eMMC/NVMe/sdX 等磁盘中的系统内核 | | -h | 无 | 无 | 查看帮助信息 | 示例:`armbian-update -k 5.15 -u stable -d deb` 通过 `-k` 参数指定内核版本时,可以精确指定具体版本号,例如:`armbian-update -k 5.15.50`;也可以模糊指定内核系列,例如:`armbian-update -k 5.15`。模糊指定时将自动使用该系列的最新版本。 更新内核时会自动备份当前使用的内核,备份存储在 `/ddbr/backup` 目录中,保留最近 3 个版本。若新安装的内核不稳定,可随时恢复到备份版本。若更新内核后系统无法启动,可通过 `armbian-update -s` 恢复系统内核。更多详情请参见[帮助文档](documents/README.cn.md#10-更新-armbian-内核)。 - ### 更换 Armbian 源 登录 Armbian 系统 → 输入命令: ```shell armbian-apt ``` 根据你所在的国家或地区选择合适的软件源,可以显著提升软件下载速度。更多说明详见[帮助文档](documents/README.cn.md#11-安装常用软件)。 - ### 安装常用软件 登录 Armbian 系统 → 输入命令: ```shell armbian-software ``` 使用 `armbian-software -u` 命令可更新本地软件中心列表。根据用户在 [Issue](https://github.com/ophub/amlogic-s9xxx-armbian/issues) 中的反馈需求,已逐步整合常用[软件](build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf),实现一键安装/更新/卸载等快捷操作。包括 `Docker 镜像`、`桌面软件`、`应用服务`等。详见[更多说明](documents/armbian_software.md)。 - ### 修改 Armbian 配置 登录 Armbian 系统 → 输入命令: ```shell armbian-config ``` - ### 为 Armbian 创建 swap 如果你在使用 `Docker` 等内存占用较大的应用时,感觉当前设备内存不足,可以创建 `swap` 虚拟内存分区,将磁盘空间的一定容量虚拟为内存使用。以下命令的参数单位为 `GB`,默认值为 `1`。 登录 Armbian 系统 → 输入命令: ```shell armbian-swap 1 ``` - ### 控制 LED 显示 登录 Armbian 系统 → 输入命令: ```shell armbian-openvfd ``` 根据 [LED 屏显示控制说明](documents/led_screen_display_control.md) 进行调试。 - ### 备份/还原 EMMC 原系统 支持在 `TF/SD/USB` 中对设备 `EMMC` 分区进行备份和恢复。建议在全新设备上安装 Armbian 系统之前,先对原始的安卓 TV 系统进行备份,以便日后需要恢复时使用。 请从 `TF/SD/USB` 启动 Armbian 系统 → 输入命令: ```shell armbian-ddbr ``` 根据提示输入 `b` 进行系统备份,输入 `r` 进行系统恢复。 > [!IMPORTANT] > 除此之外,也可以通过线刷方式将安卓系统写入 eMMC。安卓系统的下载镜像可在 [Tools](https://github.com/ophub/kernel/releases/tag/tools) 中查找。 - ### 在 Armbian 中编译内核 在 Armbian 中编译内核的用法详见[编译内核](compile-kernel/README.cn.md)说明文档。登录 Armbian 系统后,输入以下命令: ```shell armbian-kernel -u armbian-kernel -k 6.6.12 ``` - ### 更多使用说明 将本地系统中的全部服务脚本更新至最新版本,可登录 Armbian 系统后输入以下命令: ```shell armbian-sync ``` 在 Armbian 的使用过程中,常见问题的解决方法详见 [documents](documents/README.cn.md)。 ## 本地化打包 1. 克隆仓库到本地 `git clone --depth 1 https://github.com/ophub/amlogic-s9xxx-armbian.git` 2. 安装必要的软件包(以 Ubuntu 24.04 为例) 进入 `~/amlogic-s9xxx-armbian` 根目录,然后执行安装命令: ```shell sudo apt-get update -y sudo apt-get full-upgrade -y # For Ubuntu-24.04 sudo apt-get install -y $(cat compile-kernel/tools/script/ubuntu2404-build-armbian-depends) ``` 3. 进入 `~/amlogic-s9xxx-armbian` 根目录,在该目录下创建 `build/output/images` 文件夹,并将 Armbian 镜像文件(如 `Armbian_21.11.0-trunk_Odroidn2_current_5.15.50.img`)上传至 `~/amlogic-s9xxx-armbian/build/output/images` 目录。请保留原版 Armbian 镜像文件名中的发行版本号(如 `21.11.0`)和内核版本号(如 `5.15.50`),它们将在重构后用作 Armbian 系统的命名依据。 4. 进入 `~/amlogic-s9xxx-armbian` 根目录,执行 `sudo ./rebuild -b s905x3 -k 6.6.12` 命令即可生成指定 board 的 Armbian 镜像文件。生成的文件保存在 `build/output/images` 目录中。 - ### 本地化打包参数说明 | 参数 | 含义 | 说明 | | ---- | ---------- | ---------- | | -b | Board | 指定需要编译的设备代号。例如 `-b s905x3` 表示编译代号为 s905x3 的设备,多个设备可用下划线连接,如 `-b s905x3_s905d`。特殊值:`all` 表示编译全部设备,`first50` 表示设备库中的前 50 个,`range50_100` 表示第 51 至第 100 个,`range100_150` 表示第 101 至第 150 个,`last20` 表示最后 20 个。设备代号列表详见 [model_database.conf](build-armbian/armbian-files/common-files/etc/model_database.conf) 中的 `BOARD` 配置项。默认值:`all` | | -r | KernelRepo | 指定 github.com 内核仓库的 `/`。默认值:`ophub/kernel` | | -u | kernelUsage | 设置使用的内核的 `tags 后缀`,如 [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable), [flippy](https://github.com/ophub/kernel/releases/tag/kernel_flippy), [beta](https://github.com/ophub/kernel/releases/tag/kernel_beta)。默认值:`stable` | | -k | Kernel | 指定 [kernel](https://github.com/ophub/kernel/releases/tag/kernel_stable) 名称,如 `-k 6.6.12` 。多个内核使用 `_` 进行连接,如 `-k 6.6.12_5.15.50` 。通过 `-k` 参数自由指定的内核版本只对使用 `stable/flippy/beta` 的内核有效。其他内核系列例如 [rk3588](https://github.com/ophub/kernel/releases/tag/kernel_rk3588) / [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx) / [h6](https://github.com/ophub/kernel/releases/tag/kernel_h6) 等只能使用特定内核。 | | -a | AutoKernel | 设置是否自动采用同系列最新版本内核。当为 `true` 时,将自动在内核库中查找 `-k` 指定内核(如 6.6.12)的同系列是否有更新版本,若存在更新版本则自动替换。设置为 `false` 时将使用指定版本编译。默认值:`true` | | -t | RootfsType | 设置系统 ROOTFS 分区的文件系统类型,可选 `ext4` 或 `btrfs`。例如:`-t btrfs`。默认值:`ext4` | | -s | Size | 设置系统镜像分区大小。仅设置 ROOTFS 分区大小时可只指定一个数值,例如:`-s 2560`;需同时设置 BOOTFS 和 ROOTFS 分区大小时,用 `/` 连接两个数值,例如:`-s 512/2560`。默认值:`512/2560` | | -n | BuilderName | 设置 Armbian 系统构建者签名。签名中请勿包含空格。默认值:无 | - `sudo ./rebuild` : 使用默认配置,对全部型号的设备进行打包。 - `sudo ./rebuild -b s905x3 -k 6.6.12` : 推荐用法。使用默认配置编译指定内核。 - `sudo ./rebuild -b s905x3 -k 6.1.y` : 使用默认配置编译,内核使用 6.1.y 系列的最新版。 - `sudo ./rebuild -b s905x3_s905d -k 6.6.12_5.15.50` : 使用默认配置,同时打包多个内核。多个内核用 `_` 连接。 - `sudo ./rebuild -b s905x3 -k 6.6.12 -s 2560` : 使用默认配置,指定单个内核和单个型号进行打包,ROOTFS 分区大小设为 2560 MiB。 - `sudo ./rebuild -b s905x3_s905d` 使用默认配置,对多个型号进行全部内核打包,多个型号用 `_` 连接。 - `sudo ./rebuild -k 6.6.12_5.15.50` : 使用默认配置,指定多个内核,对全部型号进行打包。多个内核用 `_` 连接。 - `sudo ./rebuild -k 6.6.12_5.15.50 -a true` : 使用默认配置,指定多个内核,对全部型号进行打包,并自动升级到同系列最新内核。 - `sudo ./rebuild -t btrfs -s 2560 -k 6.6.12` : 使用默认配置,文件系统设为 btrfs,ROOTFS 分区大小为 2560 MiB,指定内核为 6.6.12,对全部型号进行打包。 ## 使用 GitHub Actions 进行编译 1. 关于 Workflows 文件的配置详见 [.github/workflows/](.github/workflows/) 目录。 2. 全新编译:在 [Actions](https://github.com/ophub/amlogic-s9xxx-armbian/actions) 页面中选择 ***`Build Armbian server image`***,即可通过 [build-armbian-arm64-server-image.yml](.github/workflows/build-armbian-arm64-server-image.yml) 进行编译。可选择 Ubuntu 系列(如 `resolute`)或 Debian 系列(如 `trixie`)等。点击 ***`Run workflow`*** 按钮即可开始编译。 3. 二次编译:如果 [Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases) 中已有编译好的 `Armbian_.*-trunk_.*.img.gz` 文件,只需为其他 board 重新打包,可跳过源文件编译步骤,直接使用 [build-armbian-using-releases-files.yml](.github/workflows/build-armbian-using-releases-files.yml) 进行二次制作。 4. 使用其他 Armbian 系统(如 Armbian 官方下载站 [armbian.tnahosting.net](https://armbian.tnahosting.net/dl/) 提供的 [odroidn2](https://armbian.tnahosting.net/dl/odroidn2/archive/) 系统),只需在工作流配置文件 [build-armbian-using-official-image.yml](.github/workflows/build-armbian-using-official-image.yml) 中引入本仓库的脚本进行 Armbian 重构,即可适配其他设备。示例代码如下: ```yaml - name: Build Armbian uses: ophub/amlogic-s9xxx-armbian@main with: build_target: armbian armbian_path: build/output/images/*.img armbian_board: s905d_s905x3_s922x_s905x armbian_kernel: 6.12.y_6.18.y ``` - ### GitHub Actions 输入参数说明 相关参数与本地打包命令一一对应,详情请参考上述说明。 | 参数 | 默认值 | 说明 | |------------------|---------------|--------------------------------------------------| | armbian_path | 无 | 设置原版 Armbian 文件的路径。支持当前工作流中的文件路径(如 `build/output/images/*.img`),也支持网络下载地址(如 `https://dl.armbian.com/*/Armbian_*.img.xz`) | | armbian_board | all | 设置打包盒子的 `board` ,功能参考 `-b` | | kernel_repo | ophub/kernel | 指定 github.com 内核仓库的 `/`,功能参考 `-r` | | kernel_usage | stable | 设置使用的内核的 `tags 后缀`。功能参考 `-u` | | armbian_kernel | 6.12.y_6.18.y | 设置内核 [版本](https://github.com/ophub/kernel/releases/tag/kernel_stable),功能参考 `-k` | | auto_kernel | true | 设置是否自动采用同系列最新版本内核,功能参考 `-a` | | armbian_fstype | ext4 | 设置系统 ROOTFS 分区的文件系统类型,功能参考 `-t` | | armbian_size | 512/2560 | 设置系统 BOOTFS 和 ROOTFS 分区的大小,功能参考 `-s` | | armbian_files | false | 添加自定义 Armbian 文件。设置后,该目录下的所有文件将被复制到 [common-files](build-armbian/armbian-files/common-files) 中。目录结构必须与 Armbian 根目录保持一致,以确保文件正确覆盖到固件中(例如:默认配置文件应存放于 `etc/default/` 子目录下)。 | | builder_name | 无 | 设置 Armbian 系统构建者签名,功能参考 `-n` | - ### GitHub Actions 输出变量说明 上传到 `Releases` 需要为仓库设置 `Workflow 读写权限`,详见[使用说明](documents/README.cn.md#2-设置隐私变量-github_token)。 | 参数 | 默认值 | 说明 | |-------------------------------------|---------------|----------------------------| | ${{ env.PACKAGED_OUTPUTPATH }} | out | Armbian 系统文件输出路径 | | ${{ env.PACKAGED_OUTPUTDATE }} | 04.13.1058 | 打包日期(月.日.时分) | | ${{ env.PACKAGED_STATUS }} | success | 打包状态:success / failure | ## 制作 Armbian Docker 镜像 Armbian 系统 [Docker](https://hub.docker.com/u/ophub) 镜像的制作方法可参考 [armbian_docker](./compile-kernel/tools/script/docker) 制作脚本。 ## 使用 GitHub Actions 编译内核 内核的编译方法详见[编译内核](compile-kernel/README.cn.md)。 ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 6.12.y_6.18.y kernel_auto: true kernel_sign: -yourname ``` ## Armbian 贡献者 首先感谢 [150balbes](https://github.com/150balbes) 为在 Amlogic 电视盒子上运行 Armbian 所做出的杰出贡献和奠定的坑实基础。本项目编译的 [Armbian](https://github.com/armbian/build) 系统直接使用官方当前的最新源码进行实时编译。程序的开发思路来源于 [ebkso](https://www.kflyo.com/howto-compile-armbian-for-n1-box) 等作者的教程。感谢各位的奉献与分享,让我们得以在更多设备上使用 Armbian 系统。 本系统所使用的 [u-boot](https://github.com/ophub/u-boot)、[kernel](https://github.com/ophub/kernel) 等资源主要来源于 [unifreq/openwrt_packit](https://github.com/unifreq/openwrt_packit) 项目,部分文件由用户在 [amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt) / [amlogic-s9xxx-armbian](https://github.com/ophub/amlogic-s9xxx-armbian) / [luci-app-amlogic](https://github.com/ophub/luci-app-amlogic) / [kernel](https://github.com/ophub/kernel) / [u-boot](https://github.com/ophub/u-boot) 等项目的 [Pull](https://github.com/ophub/amlogic-s9xxx-armbian/pulls) 和 [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues) 中贡献分享。为感谢这些开拓者和分享者,自本仓库创建之日起(`2021-09-19`),已统一在 [CONTRIBUTORS.md](https://github.com/ophub/amlogic-s9xxx-armbian/blob/main/CONTRIBUTORS.md) 中进行记录。再次感谢大家为设备赋予新的生命与价值。 ## 其他发行版 - [amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt) 项目提供了适用于盒子的 `OpenWrt` 系统,在支持 Armbian 的相关设备上同样适用。 - [fnnas](https://github.com/ophub/fnnas) 项目提供了适用于盒子的 `FnNAS` 系统,在支持 Armbian 的相关设备上同样适用。 - [unifreq](https://github.com/unifreq/openwrt_packit) 为晶晨、瑞芯微和全志等平台的更多设备制作了 `OpenWrt` 系统,是盒子生态的标杆项目,推荐使用。 - [Scirese](https://github.com/Scirese/alarm) 在安卓电视盒子上测试了 `Arch Linux ARM` / `Manjaro` 系统的制作、安装和使用,详情请参见其仓库说明。 - [7Ji](https://7ji.github.io/) 在其博客中发表了多篇关于 Amlogic 平台逆向工程与开发的文章,涵盖以 ArchLinux 方式安装 ArchLinux ARM 系统、Amlogic 平台启动机制解析等内容。其 [ampart](https://github.com/7Ji/ampart) 项目提供了一款分区工具,可读取并编辑 Amlogic eMMC 分区表和 DTB 内分区,实现 eMMC 空间 100% 利用。[amlogic-s9xxx-archlinuxarm](https://github.com/7Ji/amlogic-s9xxx-archlinuxarm) 项目提供了 `Arch Linux ARM` 系统的制作和使用方法。[YAopenvfD](https://github.com/7Ji/YAopenvfD) 项目提供了另一个 openvfd 守护进程实现。 - [13584452567](https://github.com/13584452567) 是本仓库 `Rockchip` 系列设备的开拓者。凭借其分享,本项目拓展了对 [EAIDK-610](https://github.com/ophub/amlogic-s9xxx-armbian/pull/991)、[King3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1080)、[TN3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1094)、[Kylin3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1132)、[ZCube1-Max](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1247)、[tvi3315a](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1687)、[xiaobao](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1698) 等众多 `Rockchip` 设备的支持。他还是 [TQC-A01](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1638) 等 `Allwinner` 设备[专用内核](https://github.com/13584452567/linux-6.6.y)的维护者,并在[论坛](https://github.com/ophub/amlogic-s9xxx-armbian/discussions/1634)和[问答区](https://github.com/ophub/amlogic-s9xxx-armbian/issues)中提供了大量技术支持和解决方案,为盒子生态的发展做出了巨大贡献。 - [cooip-jm](https://github.com/cooip-jm) 在其 [wiki](https://github.com/cooip-jm/About-openwrt/wiki) 中分享了许多关于 Armbian、LXC、Docker、AdGuard 等应用的使用方法,推荐参考学习。 ## 链接 - [armbian](https://github.com/armbian/build) - [unifreq](https://github.com/unifreq) - [kernel.org](https://kernel.org) ## License The amlogic-s9xxx-armbian © OPHUB is licensed under [GPL-2.0](LICENSE) ================================================ FILE: README.ja.md ================================================
Armbian
# Armbian [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) Armbianは、Debian/Ubuntuをベースに、ARMチップ向けに特別に構築された軽量Linuxディストリビューションです。Armbianシステムはスリムでクリーンであり、Debian/Ubuntuと100%互換性があり、その機能と豊富なソフトウェアエコシステムを継承しています。TF/SD/USBストレージおよびデバイスのeMMCで安全かつ安定して動作します。本プロジェクトは、公式Armbianシステムの完全性を維持しつつ、TVボックスなどの公式にサポートされていないデバイスへのサポートを拡張し、便利な管理コマンドのセットを追加しています。TVボックスのAndroid TVシステムをArmbianに置き換え、強力なサーバーに変身させることができます。 本プロジェクトは多くの[コントリビューター](CONTRIBUTORS.md)に支えられ、`Amlogic`、`Rockchip`、`Allwinner`デバイス向けのArmbianシステムを構築しています。eMMCへの書き込み、カーネル更新などの機能をサポートしています。詳しい使い方は[Armbianユーザードキュメント](./documents/README.ja.md)をご覧ください。最新のArmbianシステムは[Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases)からダウンロードできます。`Fork`してカスタマイズすることを歓迎します。本プロジェクトがお役に立ちましたら、右上の`Star`ボタンをクリックしてサポートをお願いします。 ## Armbianシステムのデフォルト情報 | システム名 | デフォルトユーザー名 | デフォルトパスワード | SSHポート | IPアドレス | | -------------- | ---------------- | ----------------- | --------- | ----------- | | 🐧 [Armbian.OS](https://github.com/ophub/amlogic-s9xxx-armbian/releases) | root | 1234 | 22 | ルーターから取得 | | 🐋 [Armbian.Docker](https://hub.docker.com/u/ophub) | root | 1234 | 22 | 静的MacVLAN IP | ## 対応デバイス一覧 ⬆️ 各プラットフォーム(Amlogic/Rockchip/Allwinner)のモデルは、SoC性能の高い順に並べられています。 | SoC | [デバイス](https://github.com/ophub/amlogic-s9xxx-armbian/releases) | [カーネル](https://github.com/ophub/kernel) | | ---- | ---- | ---- | | a311d | [Khadas-VIM3](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/99), [WXY-OES](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2666) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s922x | [Beelink-GT-King](https://github.com/ophub/amlogic-s9xxx-armbian/issues/370), [Beelink-GT-King-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/707), [Ugoos-AM6-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/464), [ODROID-N2](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/201), [X88-King](https://github.com/ophub/amlogic-s9xxx-armbian/issues/988), [Ali-CT2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1150), [WXY-OES-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3029) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x3 | [X96-Max+](https://github.com/ophub/amlogic-s9xxx-armbian/issues/351), [HK1-Box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/414), [Vontar-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1006), [H96-Max-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1250), [Ugoos-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/782), [TX3(QZ)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/644), [TX3(BZ)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1077), [X96-Air](https://github.com/ophub/amlogic-s9xxx-armbian/issues/366), [X96-Max+_A100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/779), [A95X-F3-Air](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2282), [Tencent-Aurora-3Pro(s905x3-b)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/506), [X96-Max+Q1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/788), [X96-Max+100W](https://github.com/ophub/amlogic-s9xxx-armbian/issues/909), [X96-Max+_2101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1086), [Infinity-B32](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1181), [Whale](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1166), [X88-Pro-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [X99-Max-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [Transpeed-X3-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [TOX1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3441) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x2 | [X96Max-4G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/453), [X96Max-2G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/95), [MECOOL-KM3-4G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/79), [Tanix-Tx5-Max](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/351), [A95X-F2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/851), [HG680-FJ](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3089) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3a | [E900V22C/D](https://github.com/Calmact/e900v22c), [CM311-1a-YST](https://github.com/ophub/amlogic-s9xxx-armbian/issues/517), [M401A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/732), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/517), [UNT403A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/970), [UNT413A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/970), [ZTE-B863AV3.2-M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/741), [CM311-1a-CH](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1508), [IP112H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1520), [B863AV3.1-M2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2292) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3b | [CM201-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2209), [CM211-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1180), [CM311-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1268), [E900V21D](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2447), [E900V22D](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1256), [E900V21E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1514), [E900V22E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/939), [M302A/M304A](https://github.com/ophub/amlogic-s9xxx-armbian/pull/615), [Hisense-IP103H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1154), [TY1608](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1332), [TY1608](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1568), [MGV2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1613), [B860AV-2.1M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1598), [UNT403A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1712), [RG020ET-CA](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1860), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3272) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3 | [CM211-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1318), [CM311-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/763), [HG680-LC](https://github.com/ophub/amlogic-s9xxx-armbian/issues/978), [M401A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/921#issuecomment-1453143251), [UNT400G1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1277), [UNT400G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2625), [UNT402A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1481), [ZXV10-BV310](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1512), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1817), [ZXV10-B860AV3.2-M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2012), [ZXV10-B860AV2.1-U](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2273), [E900V22D-2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2058), [CM201-1-6-YS](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2539), [IP108H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2539), [M301A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3055) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s912 | [Tanix-TX8-Max](https://github.com/ophub/amlogic-s9xxx-armbian/issues/500), [Tanix-TX9-Pro(3G)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/315), [Tanix-TX9-Pro(2G)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/740), [Tanix-TX92](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72#issuecomment-1012790770), [Tanix-TX9S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3282), [Nexbox-A1](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/260), [Nexbox-A95X-A2](https://www.cafago.com/en/p-v2979eu-2g.html), [A95X](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/260), [H96-Pro-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72#issuecomment-1013071513), [VORKE-Z6-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72), [Mecool-M8S-PRO-L](https://github.com/ophub/amlogic-s9xxx-armbian/issues/158), [Vontar-X92](https://github.com/ophub/amlogic-s9xxx-armbian/issues/525), [T95Z-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/668), [Octopus-Planet](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1020), [Phicomm-T1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/522), [TX3-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1882), [OneCloudPro-V1.1_V1.2](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2241) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905d | [MECOOL-KI-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/59), [Phicomm-N1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/925), [SML-5442TW](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/451) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x | [HG680P](https://github.com/ophub/amlogic-s9xxx-armbian/issues/262), [B860H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/60), [TBee-Box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/98), [T95](https://github.com/ophub/amlogic-s9xxx-armbian/issues/285), [TX9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/645), [XiaoMI-3S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1405), [X96](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1480), [Nexbox-a95x](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1714), [BTV9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3256) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905mb | [S65](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1644) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l | [UNT402A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1481), [M201-S](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/444), [MiBox-4](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2101), [MiBox-4C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1826), [MG101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1912), [E900V21C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2341), [IP108H-53u1m](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2357), [Tencent-Aurora-1s](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2465), [B860AV2.1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2491), [B860AV2.1U](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2499), [HM201](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2585) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l2 | [MGV2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/648), [MGV2000-K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1839), [MGV3000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/921), [Wojia-TV-IPBS9505](https://github.com/ophub/amlogic-s9xxx-armbian/issues/648), [M301A](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/405), [E900v21E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1278), [e900v21d](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2127), [CM201-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2188), [IP108H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2598), [MGV2000-CW](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2616) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905lb | [Q96-mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/734), [BesTV-R3300L](https://github.com/ophub/amlogic-s9xxx-armbian/pull/993), [SumaVision-Q7](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1190), [MG101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1570), [s65](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2128), [IPBS9505](https://github.com/ophub/amlogic-s9xxx-armbian/pull/993#issuecomment-2276804591) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905w | [X96-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/621), [TX3-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1062), [W95](https://github.com/ophub/amlogic-s9xxx-armbian/issues/570), [X96W/FunTV](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1044), [MXQ-Pro-4K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1140), [MeCool-m8s-pro-W](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3245) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905 | [Beelink-Mini-MX-2G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/127), [Sunvell-T95M](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/337), [MXQ-Pro+4K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/715), [SumaVision-Q5](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1175) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3588(s) | [Radxa-Rock5B](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1240), [Radxa-Rock5C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2324), [Orange-Pi-5-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2400), [Beelink-IPC-R](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/415), [HLink-H88K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H88K-V3](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [NanoPC-T6](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2453), [Smart-Am60](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2817), [DC-A588](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2988), [Orangepi-5B](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3052), [CM3588-NAS](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3306), [Rock-5-ITX](https://github.com/ophub/fnnas/issues/355), [LZ-D3588](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3328), [Boca-tcn100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3437) | [rk3588](https://github.com/ophub/kernel/releases/tag/kernel_rk3588) | | rk3576 | [NanoPi-m5](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3207) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3399 | [EAIDK-610](https://github.com/ophub/amlogic-s9xxx-armbian/pull/991), [King3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1080), [TN3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1094), [Kylin3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1132), [ZCube1-Max](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1247), [CRRC](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1280), [SMART-AM40](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1317), [SW799](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1326), [ZYSJ](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1380), [DG-3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1492), [DLFR100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1522), [Emb3531](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1549), [Leez-p710](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1609), [tvi3315a](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1687), [xiaobao](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1698), [Fine3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1790), [Firefly-RK3399](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/491), [LX-R3S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2026), [Hugsun-x99](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2050), [Tb-ls3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2146), [Hisense-hs530r](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/572), [Tpm312](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2403), [ZK-rk39a](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2446), [YSKJ](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2673), [Fmx1-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2691), [Fmx1-Pro-B](https://github.com/ophub/fnnas/issues/250), [Sv-33a6x](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/748), [Sv-33a6x(VPU)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3372), [AIO-3399B](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3185), [AIO-3399C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3339), [AIO-3399C(AI)](https://github.com/ophub/fnnas/issues/108), [TaraM](https://github.com/ophub/u-boot/pull/28), [NanoPC-T4](https://github.com/ophub/u-boot/pull/30), [Firefly-Core-3399-JD4](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3354), [GEA-6319](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3383) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3568 | [FastRhino-R66S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1061), [FastRhino-R68S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/774), [Radxa-E25](https://wiki.radxa.com/Rock3/CM/CM3I/E25), [NanoPi-R5S](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1217), [NanoPi-R5C](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1217), [HLink-H66K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H68K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H69K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [Seewo-sv21](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2017), [Mrkaio-m68s](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2155), [Swan1-w28](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2407), [Ruisen-box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2508), [DG-TN3568](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2661), [Alark35-3500](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2911), [MMBox-Anas3035](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2995), [Wocyber-A3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2978), [Photonicat](https://github.com/ophub/amlogic-s9xxx-openwrt/pull/827), [NSY-G16-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/845), [NSY-G68-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/845), [BDY-G18-Pro](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/847), [Gzpeite-P01](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3221), [LZ-D3568](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3387), [LZ-K3568](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3304), [BDKJ-One](https://github.com/ophub/u-boot/pull/29), [Station-P2](https://github.com/ophub/fnnas/pull/350), [Lyt-t68m](https://github.com/ophub/fnnas/issues/435) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3566 | [Panther-X2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1319), [JP-TvBox](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1867), [LCKFB-Taishan-Pi](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2538), [WXY-OEC-turbo-4g](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2736), [Station-M2](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/744), [Orange-Pi-3B](https://github.com/ophub/fnnas/issues/261) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3528 | [HLink-H28K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1726), [Radxa-E20C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2324), [H96-Max-M2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2404), [HK1-Rbox-K8S](https://github.com/ophub/fnnas/issues/464), [HT2](https://github.com/ophub/fnnas/issues/464), [CD1000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3302) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx) | | rk3328 | [BeikeYun](https://github.com/ophub/amlogic-s9xxx-armbian/issues/852), [Chainedbox-L1-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1680), [Station-M1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1313), [Bqeel-MVR9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1313), [Renegade/Firefly](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1861) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3318 | [RX3318-Box](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2129) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | h6 | [Vplus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1100), [Tanix-TX6](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1120), [TQC-A01](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1638) | [h6](https://github.com/ophub/kernel/releases/tag/kernel_h6)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | h618 | [OrangePi-Zero3](https://github.com/ophub/fnnas/issues/158), [H618-DevBoard](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3434) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | > [!TIP] > 現在、[s905ボックス](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1173)は`TF/SD/USB`でのみ使用できます。その他のボックスモデルは`EMMC`への書き込みに対応しています。詳細は[✅ 対応デバイス一覧](build-armbian/armbian-files/common-files/etc/model_database.conf)をご参照ください。新しいデバイスサポートの追加については、ドキュメントのセクション12.15:[新しい対応デバイスの追加方法](documents/README.ja.md#1215-新しいサポートデバイスの追加方法)をご覧ください。ご使用前に[Armbianユーザードキュメント](./documents/README.ja.md)をお読みください。よくある問題の解決方法が記載されています。 ## Armbianのインストールとアップグレード手順 お使いのデバイスモデルに合ったArmbianシステムを選択してください。デバイス固有の使用方法については、対応するドキュメントをご参照ください。 - ### ArmbianをEMMCにインストール 1. `Rockchip`プラットフォームのデバイスについては、ドキュメントの[第8章](documents/README.ja.md#8-armbian-を-emmc-にインストールする)をご参照ください。 2. `Amlogic`および`Allwinner`プラットフォームのデバイスについては、[Rufus](https://rufus.ie/)や[balenaEtcher](https://www.balena.io/etcher/)などのツールを使用してシステムをUSBメモリに書き込み、デバイスに挿入します。Armbianシステムにログイン(デフォルトユーザー:root、デフォルトパスワード:1234)し、以下のコマンドを入力します: ```shell armbian-install ``` | オプション | デフォルト | 選択肢 | 説明 | | -------- | ------- | ------- | ----------------- | | -m | no | yes/no | メインラインu-bootを使用 | | -a | yes | yes/no | [ampart](https://github.com/7Ji/ampart)パーティション調整ツールを使用 | | -l | no | yes/no | 完全なデバイスリストを表示 | 例:`armbian-install -m yes -a no` - ### Armbianカーネルの更新 Armbianシステムにログインし、以下のコマンドを入力します: ```shell # rootユーザーとして実行(sudo -i) # パラメータを指定しない場合、最新バージョンに更新されます。 armbian-update ``` | オプション | デフォルト | 選択肢 | 説明 | | -------- | ------------ | ------------- | -------------------------------- | | -r | ophub/kernel | `/` | github.comからカーネルをダウンロードするリポジトリを設定 | | -u | 自動判定 | stable/flippy/beta/rk3588/rk35xx/h6 | カーネルの[タグサフィックス](https://github.com/ophub/kernel/releases)を設定 | | -k | 最新バージョン | カーネルバージョン | [カーネルバージョン](https://github.com/ophub/kernel/releases/tag/kernel_stable)を設定 | | -b | yes | yes/no | 更新時に現在使用中のカーネルを自動バックアップ | | -d | deb | tar/deb | 優先するカーネルパッケージ形式を設定。利用できない場合、スクリプトが自動的に代替形式を試みます。カスタムドライバーのコンパイルには`deb`形式を推奨。 | | -m | no | yes/no | メインラインu-bootを使用 | | -s | なし | なし/ディスク名 | [SOS] eMMC/NVMe/sdXまたは他のディスク上のシステムカーネルを復元 | | -h | なし | なし | ヘルプ情報を表示 | 例:`armbian-update -k 5.15 -u stable -d deb` `-k`パラメータでカーネルバージョンを指定する際、正確なバージョン番号(例:`armbian-update -k 5.15.50`)またはカーネルシリーズのみ(例:`armbian-update -k 5.15`)を指定できます。シリーズを指定した場合、そのシリーズ内の最新バージョンが自動的に使用されます。 カーネル更新時、現在実行中のカーネルは自動的に`/ddbr/backup`ディレクトリにバックアップされ、最新の3つのバージョンが保持されます。新しくインストールしたカーネルが不安定な場合、いつでもバックアップカーネルを復元できます。カーネル更新によりシステムが起動できなくなった場合は、`armbian-update -s`でシステムカーネルを復元できます。詳細は[ヘルプドキュメント](documents/README.ja.md#10-armbian-カーネルの更新)をご覧ください。 - ### Armbianソースの変更 Armbianシステムにログインし、以下のコマンドを入力します: ```shell armbian-apt ``` お住まいの国や地域に適したソフトウェアソースを選択することで、ダウンロード速度を大幅に向上させることができます。詳細は[ヘルプドキュメント](documents/README.ja.md#11-よく使うソフトウェアのインストール)をご覧ください。 - ### よく使うソフトウェアのインストール Armbianシステムにログインし、以下のコマンドを入力します: ```shell armbian-software ``` `armbian-software -u`コマンドでローカルのソフトウェアセンターリストを更新できます。[Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues)でのユーザーフィードバックに基づき、よく使われる[ソフトウェア](build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf)がワンクリックでのインストール/更新/アンインストールに対応するよう段階的に統合されています。`Dockerイメージ`、`デスクトップソフトウェア`、`アプリケーションサービス`などが含まれます。[詳細な説明](documents/armbian_software.md)をご覧ください。 - ### Armbian設定の変更 Armbianシステムにログインし、以下のコマンドを入力します: ```shell armbian-config ``` - ### ArmbianのSwap作成 `Docker`などのメモリ集約型アプリケーションの実行時にデバイスのメモリが不足する場合、`swap`仮想メモリパーティションを作成して、ディスク容量の一部を追加メモリとして使用できます。パラメータの単位は`GB`で、デフォルト値は`1`です。 Armbianシステムにログインし、以下のコマンドを入力します: ```shell armbian-swap 1 ``` - ### LEDディスプレイの制御 Armbianシステムにログインし、以下のコマンドを入力します: ```shell armbian-openvfd ``` [LEDスクリーンディスプレイ制御手順](documents/led_screen_display_control.md)に従ってデバッグしてください。 - ### EMMC元システムのバックアップ/復元 `TF/SD/USB`経由でデバイスの`EMMC`パーティションのバックアップと復元をサポートします。新しいデバイスにArmbianをインストールする前に、必要に応じて将来復元できるよう、元のAndroid TVシステムをバックアップすることをお勧めします。 `TF/SD/USB`からArmbianシステムを起動し、以下のコマンドを入力します: ```shell armbian-ddbr ``` プロンプトで`b`を入力するとシステムをバックアップ、`r`を入力すると復元します。 > [!IMPORTANT] > または、USBケーブル経由でAndroidシステムをeMMCに直接書き込むこともできます。Androidシステムイメージは[Tools](https://github.com/ophub/kernel/releases/tag/tools)から入手できます。 - ### Armbian内でのカーネルコンパイル カーネルコンパイルの手順については、[カーネルコンパイル](compile-kernel/README.ja.md)ドキュメントをご覧ください。Armbianシステムにログインし、以下のコマンドを入力します: ```shell armbian-kernel -u armbian-kernel -k 6.6.12 ``` - ### その他の使用方法 システム内のすべてのサービススクリプトを最新バージョンに更新するには、Armbianシステムにログインし、以下のコマンドを入力します: ```shell armbian-sync ``` Armbian使用時のよくある問題とその解決方法については、[documents](documents/README.ja.md)をご覧ください。 ## ローカルパッケージング 1. リポジトリをローカルにクローン `git clone --depth 1 https://github.com/ophub/amlogic-s9xxx-armbian.git` 2. 必要なソフトウェアパッケージをインストール(Ubuntu 24.04を例として) `~/amlogic-s9xxx-armbian`ルートディレクトリに移動し、インストールコマンドを実行します: ```shell sudo apt-get update -y sudo apt-get full-upgrade -y # Ubuntu-24.04の場合 sudo apt-get install -y $(cat compile-kernel/tools/script/ubuntu2404-build-armbian-depends) ``` 3. `~/amlogic-s9xxx-armbian`ルートディレクトリに移動し、`build/output/images`フォルダを作成して、Armbianイメージファイル(例:`Armbian_21.11.0-trunk_Odroidn2_current_5.15.50.img`)を`~/amlogic-s9xxx-armbian/build/output/images`ディレクトリにアップロードします。元のファイル名のリリースバージョン番号(例:`21.11.0`)とカーネルバージョン番号(例:`5.15.50`)を保持してください。再構築されたArmbianシステムの命名に使用されます。 4. `~/amlogic-s9xxx-armbian`ルートディレクトリに移動し、`sudo ./rebuild -b s905x3 -k 6.6.12`を実行して、指定したボード用のArmbianイメージを生成します。出力ファイルは`build/output/images`ディレクトリに保存されます。 - ### ローカルパッケージングパラメータの説明 | パラメータ | 意味 | 説明 | | ---- | ---------- | ---------- | | -b | ボード | ビルドするデバイスコードを指定します。例:`-b s905x3`はs905x3デバイスをビルドします。複数のデバイスはアンダースコアで結合できます(例:`-b s905x3_s905d`)。特殊値:`all`はすべてのデバイスをビルド、`first50`は最初の50台、`range50_100`は51〜100台目、`range100_150`は101〜150台目、`last20`は最後の20台をビルドします。完全なリストは[model_database.conf](build-armbian/armbian-files/common-files/etc/model_database.conf)の`BOARD`エントリをご参照ください。デフォルト:`all` | | -r | カーネルリポジトリ | github.comのカーネルリポジトリの`/`を指定。デフォルト値:`ophub/kernel` | | -u | カーネル用途 | 使用するカーネルの`タグサフィックス`を設定([stable](https://github.com/ophub/kernel/releases/tag/kernel_stable)、[flippy](https://github.com/ophub/kernel/releases/tag/kernel_flippy)、[beta](https://github.com/ophub/kernel/releases/tag/kernel_beta)など)。デフォルト値:`stable` | | -k | カーネル | [カーネル](https://github.com/ophub/kernel/releases/tag/kernel_stable)名を指定(例:`-k 6.6.12`)。複数のカーネルは`_`で結合(例:`-k 6.6.12_5.15.50`)。`-k`パラメータで自由に指定できるカーネルバージョンは、`stable/flippy/beta`を使用するカーネルにのみ有効です。[rk3588](https://github.com/ophub/kernel/releases/tag/kernel_rk3588) / [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx) / [h6](https://github.com/ophub/kernel/releases/tag/kernel_h6)などの他のカーネルシリーズは、専用のカーネルのみ使用できます。 | | -a | 自動カーネル | 同じシリーズの最新カーネルを自動的に使用するかどうかを設定。`true`の場合、`-k`で指定されたシリーズ(例:6.6.12)内の新しいバージョンがカーネルリポジトリで確認され、見つかった場合は最新バージョンが自動的に使用されます。`false`の場合、指定された正確なバージョンが使用されます。デフォルト:`true` | | -t | ルートFSタイプ | ROOTFSパーティションのファイルシステムタイプを設定。選択肢:`ext4`または`btrfs`。例:`-t btrfs`。デフォルト:`ext4` | | -s | サイズ | イメージパーティションサイズを設定。ROOTFSパーティションのみ設定する場合は単一の値を指定(例:`-s 2560`)。BOOTFSとROOTFSの両方を設定する場合は`/`で結合(例:`-s 512/2560`)。デフォルト:`512/2560` | | -n | ビルダー名 | Armbianシステムのビルダー署名を設定。スペースを含めないでください。デフォルト:なし | - `sudo ./rebuild`:デフォルト設定ですべてのデバイスモデルをパッケージング。 - `sudo ./rebuild -b s905x3 -k 6.6.12`:推奨。指定したカーネルでデフォルト設定のビルド。 - `sudo ./rebuild -b s905x3 -k 6.1.y`:デフォルト設定で6.1.yシリーズの最新カーネルを使用してビルド。 - `sudo ./rebuild -b s905x3_s905d -k 6.6.12_5.15.50`:デフォルト設定で複数のカーネルを同時にビルド。複数のカーネルは`_`で結合。 - `sudo ./rebuild -b s905x3 -k 6.6.12 -s 2560`:単一のカーネルとモデルでデフォルト設定のビルド。ROOTFSパーティションサイズを2560 MiBに設定。 - `sudo ./rebuild -b s905x3_s905d`:複数のモデルですべてのカーネルをデフォルト設定でビルド。複数のモデルは`_`で結合。 - `sudo ./rebuild -k 6.6.12_5.15.50`:すべてのモデルで複数の指定カーネルをデフォルト設定でビルド。カーネルは`_`で結合。 - `sudo ./rebuild -k 6.6.12_5.15.50 -a true`:上記と同じ。各シリーズ内の最新カーネルに自動アップグレード。 - `sudo ./rebuild -t btrfs -s 2560 -k 6.6.12`:btrfsファイルシステム、2560 MiBのROOTFS、カーネル6.6.12ですべてのモデルをビルド。 ## GitHub Actionsを使用したコンパイル 1. ワークフロー設定ファイルは[.github/workflows/](.github/workflows/)ディレクトリにあります。 2. 新規ビルド:[Actions](https://github.com/ophub/amlogic-s9xxx-armbian/actions)ページで***`Build Armbian server image`***を選択し、[build-armbian-arm64-server-image.yml](.github/workflows/build-armbian-arm64-server-image.yml)ワークフローを使用します。Ubuntuシリーズ(例:`resolute`)またはDebianシリーズ(例:`trixie`)から選択できます。***`Run workflow`***をクリックしてビルドを開始します。 3. 再ビルド:[Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases)にコンパイル済みの`Armbian_.*-trunk_.*.img.gz`ファイルがすでにあり、他のボード用に再パッケージするだけの場合は、ソースコンパイル手順をスキップし、[build-armbian-using-releases-files.yml](.github/workflows/build-armbian-using-releases-files.yml)を使用して二次ビルドを行います。 4. 他のArmbianシステム(例:公式[armbian.tnahosting.net](https://armbian.tnahosting.net/dl/)ダウンロードサイトの[odroidn2](https://armbian.tnahosting.net/dl/odroidn2/archive/)イメージ)を使用する場合は、ワークフローファイル[build-armbian-using-official-image.yml](.github/workflows/build-armbian-using-official-image.yml)で本リポジトリのスクリプトを参照するだけで、他のデバイスをサポートするためのArmbian再構築が可能です。例: ```yaml - name: Build Armbian uses: ophub/amlogic-s9xxx-armbian@main with: build_target: armbian armbian_path: build/output/images/*.img armbian_board: s905d_s905x3_s922x_s905x armbian_kernel: 6.12.y_6.18.y ``` - ### GitHub Actions入力パラメータの説明 これらのパラメータは、上記のローカルパッケージングコマンドオプションに対応しています。 | パラメータ | デフォルト | 説明 | |-----------------|---------------|---------------------------------------------------------| | armbian_path | なし | 元のArmbianファイルのパスを設定。ワークフローファイルパス(例:`build/output/images/*.img`)およびネットワークダウンロードURL(例:`https://dl.armbian.com/*/Armbian_*.img.xz`)をサポート。 | | armbian_board | all | パッケージボックスの`board`を設定。`-b`を参照 | | kernel_repo | ophub/kernel | github.comのカーネルリポジトリの`/`を指定。`-r`を参照 | | kernel_usage | stable | 使用するカーネルの`タグサフィックス`を設定。`-u`を参照 | | armbian_kernel | 6.12.y_6.18.y | カーネルの[バージョン](https://github.com/ophub/kernel/releases/tag/kernel_stable)を設定。`-k`を参照 | | auto_kernel | true | 同じシリーズの最新バージョンのカーネルを自動的に採用するかどうかを設定。`-a`を参照 | | armbian_fstype | ext4 | システムのROOTFSパーティションのファイルシステムタイプを設定。`-t`を参照 | | armbian_size | 512/2560 | システムのBOOTFSおよびROOTFSパーティションのサイズを設定。`-s`を参照 | | armbian_files | false | カスタムArmbianファイルを追加。設定した場合、このディレクトリ内のすべてのファイルが[common-files](build-armbian/armbian-files/common-files)にコピーされます。ファイルが正しくオーバーレイされるよう、ディレクトリ構造はArmbianのルートディレクトリを反映する必要があります(例:デフォルト設定ファイルは`etc/default/`配下に配置)。 | | builder_name | なし | Armbianシステムのビルダー署名を設定。`-n`を参照 | - ### GitHub Actions出力変数の説明 `Releases`へのアップロードには、リポジトリの`ワークフロー読み取りおよび書き込み権限`が必要です。詳細は[使用方法の説明](documents/README.ja.md#2-プライバシー変数-github_token-等の設定)をご覧ください。 | パラメータ | デフォルト | 説明 | |----------------------------------|---------------|---------------------------------------| | ${{ env.PACKAGED_OUTPUTPATH }} | out | Armbianシステムファイルの出力パス | | ${{ env.PACKAGED_OUTPUTDATE }} | 04.13.1058 | パッケージング日時(月.日.時分) | | ${{ env.PACKAGED_STATUS }} | success | パッケージングステータス:success / failure | ## Armbian Dockerイメージのビルド Armbianシステムの[Docker](https://hub.docker.com/u/ophub)イメージの作成については、[armbian_docker](./compile-kernel/tools/script/docker)ビルドスクリプトをご参照ください。 ## GitHub Actionsを使用したカーネルコンパイル カーネルコンパイルの手順については、[compile-kernel](compile-kernel/README.ja.md)をご覧ください。 ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 6.12.y_6.18.y kernel_auto: true kernel_sign: -yourname ``` ## Armbianコントリビューター まず、[150balbes](https://github.com/150balbes)氏の素晴らしい貢献と、Amlogic TVボックスでArmbianを実行するために築かれた確かな基盤に感謝します。ここでコンパイルされる[Armbian](https://github.com/armbian/build)システムは、最新の公式ソースコードを使用してリアルタイムでビルドされています。開発アプローチは、[ebkso](https://www.kflyo.com/howto-compile-armbian-for-n1-box)などの著者のチュートリアルからインスピレーションを受けています。皆様の献身と共有に感謝し、Armbianがますます多くのデバイスで動作できるようになっています。 このシステムで使用される[u-boot](https://github.com/ophub/u-boot)、[kernel](https://github.com/ophub/kernel)、その他のリソースは、主に[unifreq/openwrt_packit](https://github.com/unifreq/openwrt_packit)プロジェクトから提供されています。一部のファイルは、[amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt)、[amlogic-s9xxx-armbian](https://github.com/ophub/amlogic-s9xxx-armbian)、[luci-app-amlogic](https://github.com/ophub/luci-app-amlogic)、[u-boot](https://github.com/ophub/u-boot)、[kernel](https://github.com/ophub/kernel)などのプロジェクトで、ユーザーが[Pull Requests](https://github.com/ophub/amlogic-s9xxx-armbian/pulls)や[Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues)を通じて貢献したものです。これらの先駆者やコントリビューターを称えるため、リポジトリ作成以降(`2021-09-19`)のすべての貢献が[CONTRIBUTORS.md](https://github.com/ophub/amlogic-s9xxx-armbian/blob/main/CONTRIBUTORS.md)に記録されています。皆様のおかげで、これらのデバイスに新しい命と目的が与えられたことに改めて感謝いたします。 ## その他のディストリビューション - [amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt)プロジェクトは、TVボックス向けの`OpenWrt`システムを提供しており、Armbianがサポートするデバイスにも適用可能です。 - [fnnas](https://github.com/ophub/fnnas)プロジェクトは、TVボックス向けの`FnNAS`システムを提供しており、Armbianがサポートするデバイスにも適用可能です。 - [unifreq](https://github.com/unifreq/openwrt_packit)は、幅広いAmlogic、Rockchip、Allwinnerデバイス向けの`OpenWrt`システムを作成しており、コミュニティのベンチマークプロジェクトです。強くお勧めします。 - [Scirese](https://github.com/Scirese/alarm)は、Android TVボックスでの`Arch Linux ARM` / `Manjaro`システムのビルド、インストール、使用をテストしています。詳細はリポジトリをご覧ください。 - [7Ji](https://7ji.github.io/)は、Amlogicプラットフォームのリバースエンジニアリングと開発に関する記事を公開しており、ArchLinux ARMのインストールやAmlogicブートメカニズムの分析などのトピックを扱っています。[ampart](https://github.com/7Ji/ampart)プロジェクトは、Amlogic eMMCパーティションテーブルとDTBパーティションの読み取り・編集用パーティションツールを提供し、eMMCスペースの100%活用を実現しています。[amlogic-s9xxx-archlinuxarm](https://github.com/7Ji/amlogic-s9xxx-archlinuxarm)プロジェクトは、`Arch Linux ARM`のビルドおよび使用手順を提供しています。[YAopenvfD](https://github.com/7Ji/YAopenvfD)プロジェクトは、代替のopenvfdデーモン実装を提供しています。 - [13584452567](https://github.com/13584452567)は、本リポジトリにおける`Rockchip`デバイスサポートの先駆者です。彼の貢献により、[EAIDK-610](https://github.com/ophub/amlogic-s9xxx-armbian/pull/991)、[King3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1080)、[TN3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1094)、[Kylin3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1132)、[ZCube1-Max](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1247)、[tvi3315a](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1687)、[xiaobao](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1698)など、多数の`Rockchip`デバイスのサポートが拡大されました。また、[TQC-A01](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1638)などの`Allwinner`デバイス用の専用[カーネル](https://github.com/13584452567/linux-6.6.y)をメンテナンスし、[Discussions](https://github.com/ophub/amlogic-s9xxx-armbian/discussions/1634)や[Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues)で広範な技術サポートとソリューションを提供し、コミュニティに多大な貢献をしています。 - [cooip-jm](https://github.com/cooip-jm)は、Armbian、LXC、Docker、AdGuard、その他のアプリケーションに関する多くのガイドを[wiki](https://github.com/cooip-jm/About-openwrt/wiki)で共有しています。ぜひご覧ください。 ## リンク - [armbian](https://github.com/armbian/build) - [unifreq](https://github.com/unifreq) - [kernel.org](https://kernel.org) ## ライセンス amlogic-s9xxx-armbian © OPHUBは[GPL-2.0](LICENSE)の下でライセンスされています。 ================================================ FILE: README.md ================================================
Armbian
# Armbian [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) Armbian is a lightweight Linux distribution built specifically for ARM chips, based on Debian/Ubuntu. The Armbian system is lean, clean, and 100% compatible with Debian/Ubuntu, inheriting its functionality and rich software ecosystem. It runs securely and stably on TF/SD/USB storage and the device's eMMC. This project preserves the integrity of the official Armbian system while extending support for unofficially supported devices such as TV boxes, and adds a set of convenient management commands. You can now replace the Android TV system on your TV box with Armbian, transforming it into a powerful server. This project relies on many [contributors](CONTRIBUTORS.md) to build the Armbian system for `Amlogic`, `Rockchip`, and `Allwinner` devices. It supports writing to eMMC, kernel updates, and other features. For detailed usage, see the [Armbian User Documentation](./documents). The latest Armbian system can be downloaded from [Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases). Welcome to `Fork` and customize. If this project is helpful, please click the `Star` button in the upper right corner to show your support. ## Default Information for Armbian System | System Name | Default Username | Default Password | SSH Port | IP Address | | -------------- | ---------------- | ----------------- | --------- | ----------- | | 🐧 [Armbian.OS](https://github.com/ophub/amlogic-s9xxx-armbian/releases) | root | 1234 | 22 | Obtain from router | | 🐋 [Armbian.Docker](https://hub.docker.com/u/ophub) | root | 1234 | 22 | Static MacVLAN IP | ## Supported Devices ⬆️ Models from each platform (Amlogic/Rockchip/Allwinner) are ranked by SoC performance from high to low. | SoC | [Device](https://github.com/ophub/amlogic-s9xxx-armbian/releases) | [Kernel](https://github.com/ophub/kernel) | | ---- | ---- | ---- | | a311d | [Khadas-VIM3](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/99), [WXY-OES](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2666) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s922x | [Beelink-GT-King](https://github.com/ophub/amlogic-s9xxx-armbian/issues/370), [Beelink-GT-King-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/707), [Ugoos-AM6-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/464), [ODROID-N2](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/201), [X88-King](https://github.com/ophub/amlogic-s9xxx-armbian/issues/988), [Ali-CT2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1150), [WXY-OES-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3029) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x3 | [X96-Max+](https://github.com/ophub/amlogic-s9xxx-armbian/issues/351), [HK1-Box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/414), [Vontar-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1006), [H96-Max-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1250), [Ugoos-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/782), [TX3(QZ)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/644), [TX3(BZ)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1077), [X96-Air](https://github.com/ophub/amlogic-s9xxx-armbian/issues/366), [X96-Max+_A100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/779), [A95X-F3-Air](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2282), [Tencent-Aurora-3Pro(s905x3-b)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/506), [X96-Max+Q1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/788), [X96-Max+100W](https://github.com/ophub/amlogic-s9xxx-armbian/issues/909), [X96-Max+_2101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1086), [Infinity-B32](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1181), [Whale](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1166), [X88-Pro-X3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [X99-Max-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [Transpeed-X3-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1621), [TOX1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3441) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x2 | [X96Max-4G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/453), [X96Max-2G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/95), [MECOOL-KM3-4G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/79), [Tanix-Tx5-Max](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/351), [A95X-F2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/851), [HG680-FJ](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3089) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3a | [E900V22C/D](https://github.com/Calmact/e900v22c), [CM311-1a-YST](https://github.com/ophub/amlogic-s9xxx-armbian/issues/517), [M401A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/732), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/517), [UNT403A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/970), [UNT413A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/970), [ZTE-B863AV3.2-M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/741), [CM311-1a-CH](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1508), [IP112H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1520), [B863AV3.1-M2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2292) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3b | [CM201-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2209), [CM211-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1180), [CM311-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1268), [E900V21D](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2447), [E900V22D](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1256), [E900V21E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1514), [E900V22E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/939), [M302A/M304A](https://github.com/ophub/amlogic-s9xxx-armbian/pull/615), [Hisense-IP103H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1154), [TY1608](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1332), [TY1608](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1568), [MGV2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1613), [B860AV-2.1M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1598), [UNT403A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1712), [RG020ET-CA](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1860), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3272) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l3 | [CM211-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1318), [CM311-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/763), [HG680-LC](https://github.com/ophub/amlogic-s9xxx-armbian/issues/978), [M401A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/921#issuecomment-1453143251), [UNT400G1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1277), [UNT400G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2625), [UNT402A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1481), [ZXV10-BV310](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1512), [M411A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1817), [ZXV10-B860AV3.2-M](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2012), [ZXV10-B860AV2.1-U](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2273), [E900V22D-2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2058), [CM201-1-6-YS](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2539), [IP108H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2539), [M301A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3055) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s912 | [Tanix-TX8-Max](https://github.com/ophub/amlogic-s9xxx-armbian/issues/500), [Tanix-TX9-Pro(3G)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/315), [Tanix-TX9-Pro(2G)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/740), [Tanix-TX92](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72#issuecomment-1012790770), [Tanix-TX9S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3282), [Nexbox-A1](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/260), [Nexbox-A95X-A2](https://www.cafago.com/en/p-v2979eu-2g.html), [A95X](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/260), [H96-Pro-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72#issuecomment-1013071513), [VORKE-Z6-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/72), [Mecool-M8S-PRO-L](https://github.com/ophub/amlogic-s9xxx-armbian/issues/158), [Vontar-X92](https://github.com/ophub/amlogic-s9xxx-armbian/issues/525), [T95Z-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/668), [Octopus-Planet](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1020), [Phicomm-T1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/522), [TX3-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1882), [OneCloudPro-V1.1_V1.2](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2241) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905d | [MECOOL-KI-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/59), [Phicomm-N1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/925), [SML-5442TW](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/451) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905x | [HG680P](https://github.com/ophub/amlogic-s9xxx-armbian/issues/262), [B860H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/60), [TBee-Box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/98), [T95](https://github.com/ophub/amlogic-s9xxx-armbian/issues/285), [TX9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/645), [XiaoMI-3S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1405), [X96](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1480), [Nexbox-a95x](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1714), [BTV9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3256) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905mb | [S65](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1644) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l | [UNT402A](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1481), [M201-S](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/444), [MiBox-4](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2101), [MiBox-4C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1826), [MG101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1912), [E900V21C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2341), [IP108H-53u1m](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2357), [Tencent-Aurora-1s](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2465), [B860AV2.1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2491), [B860AV2.1U](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2499), [HM201](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2585) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905l2 | [MGV2000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/648), [MGV2000-K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1839), [MGV3000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/921), [Wojia-TV-IPBS9505](https://github.com/ophub/amlogic-s9xxx-armbian/issues/648), [M301A](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/405), [E900v21E](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1278), [e900v21d](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2127), [CM201-1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2188), [IP108H](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2598), [MGV2000-CW](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2616) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905lb | [Q96-mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/734), [BesTV-R3300L](https://github.com/ophub/amlogic-s9xxx-armbian/pull/993), [SumaVision-Q7](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1190), [MG101](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1570), [s65](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2128), [IPBS9505](https://github.com/ophub/amlogic-s9xxx-armbian/pull/993#issuecomment-2276804591) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905w | [X96-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/621), [TX3-Mini](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1062), [W95](https://github.com/ophub/amlogic-s9xxx-armbian/issues/570), [X96W/FunTV](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1044), [MXQ-Pro-4K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1140), [MeCool-m8s-pro-W](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3245) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | s905 | [Beelink-Mini-MX-2G](https://github.com/ophub/amlogic-s9xxx-armbian/issues/127), [Sunvell-T95M](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/337), [MXQ-Pro+4K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/715), [SumaVision-Q5](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1175) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3588(s) | [Radxa-Rock5B](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1240), [Radxa-Rock5C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2324), [Orange-Pi-5-Plus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2400), [Beelink-IPC-R](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/415), [HLink-H88K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H88K-V3](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [NanoPC-T6](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2453), [Smart-Am60](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2817), [DC-A588](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2988), [Orangepi-5B](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3052), [CM3588-NAS](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3306), [Rock-5-ITX](https://github.com/ophub/fnnas/issues/355), [LZ-D3588](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3328), [Boca-tcn100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3437) | [rk3588](https://github.com/ophub/kernel/releases/tag/kernel_rk3588) | | rk3576 | [NanoPi-m5](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3207) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3399 | [EAIDK-610](https://github.com/ophub/amlogic-s9xxx-armbian/pull/991), [King3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1080), [TN3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1094), [Kylin3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1132), [ZCube1-Max](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1247), [CRRC](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1280), [SMART-AM40](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1317), [SW799](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1326), [ZYSJ](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1380), [DG-3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1492), [DLFR100](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1522), [Emb3531](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1549), [Leez-p710](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1609), [tvi3315a](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1687), [xiaobao](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1698), [Fine3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1790), [Firefly-RK3399](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/491), [LX-R3S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2026), [Hugsun-x99](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2050), [Tb-ls3399](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2146), [Hisense-hs530r](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/572), [Tpm312](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2403), [ZK-rk39a](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2446), [YSKJ](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2673), [Fmx1-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2691), [Fmx1-Pro-B](https://github.com/ophub/fnnas/issues/250), [Sv-33a6x](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/748), [Sv-33a6x(VPU)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3372), [AIO-3399B](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3185), [AIO-3399C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3339), [AIO-3399C(AI)](https://github.com/ophub/fnnas/issues/108), [TaraM](https://github.com/ophub/u-boot/pull/28), [NanoPC-T4](https://github.com/ophub/u-boot/pull/30), [Firefly-Core-3399-JD4](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3354), [GEA-6319](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3383) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3568 | [FastRhino-R66S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1061), [FastRhino-R68S](https://github.com/ophub/amlogic-s9xxx-armbian/issues/774), [Radxa-E25](https://wiki.radxa.com/Rock3/CM/CM3I/E25), [NanoPi-R5S](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1217), [NanoPi-R5C](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1217), [HLink-H66K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H68K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [HLink-H69K](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1726), [Seewo-sv21](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2017), [Mrkaio-m68s](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2155), [Swan1-w28](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2407), [Ruisen-box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2508), [DG-TN3568](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2661), [Alark35-3500](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2911), [MMBox-Anas3035](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2995), [Wocyber-A3](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2978), [Photonicat](https://github.com/ophub/amlogic-s9xxx-openwrt/pull/827), [NSY-G16-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/845), [NSY-G68-Plus](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/845), [BDY-G18-Pro](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/847), [Gzpeite-P01](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3221), [LZ-D3568](https://github.com/ophub/amlogic-s9xxx-armbian/pull/3387), [LZ-K3568](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3304), [BDKJ-One](https://github.com/ophub/u-boot/pull/29), [Station-P2](https://github.com/ophub/fnnas/pull/350), [Lyt-t68m](https://github.com/ophub/fnnas/issues/435) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3566 | [Panther-X2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1319), [JP-TvBox](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1867), [LCKFB-Taishan-Pi](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2538), [WXY-OEC-turbo-4g](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2736), [Station-M2](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/744), [Orange-Pi-3B](https://github.com/ophub/fnnas/issues/261) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3528 | [HLink-H28K](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1726), [Radxa-E20C](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2324), [H96-Max-M2](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2404), [HK1-Rbox-K8S](https://github.com/ophub/fnnas/issues/464), [HT2](https://github.com/ophub/fnnas/issues/464), [CD1000](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3302) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx) | | rk3328 | [BeikeYun](https://github.com/ophub/amlogic-s9xxx-armbian/issues/852), [Chainedbox-L1-Pro](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1680), [Station-M1](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1313), [Bqeel-MVR9](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1313), [Renegade/Firefly](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1861) | [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | rk3318 | [RX3318-Box](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2129) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | h6 | [Vplus](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1100), [Tanix-TX6](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1120), [TQC-A01](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1638) | [h6](https://github.com/ophub/kernel/releases/tag/kernel_h6)
[stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | h618 | [OrangePi-Zero3](https://github.com/ophub/fnnas/issues/158), [H618-DevBoard](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3434) | [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable) | > [!TIP] > At present, the [s905 box](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1173) can only be used with `TF/SD/USB`; other box models support writing to `EMMC`. For more information, refer to the [✅ Supported Device List](build-armbian/armbian-files/common-files/etc/model_database.conf). To add new device support, see Section 12.15 of the documentation: [Adding New Supported Devices](documents/README.md#1215-how-to-add-new-supported-devices). Please read the [Armbian User Documentation](./documents) before use, as it provides solutions to common issues. ## Installation and Upgrade Instructions for Armbian Choose the Armbian system that matches your device model. Refer to the corresponding documentation for device-specific usage instructions. - ### Install Armbian to EMMC 1. For `Rockchip` platform devices, refer to [Chapter 8](documents#8-installing-armbian-to-emmc) of the documentation. 2. For `Amlogic` and `Allwinner` platform devices, use tools such as [Rufus](https://rufus.ie/) or [balenaEtcher](https://www.balena.io/etcher/) to write the system to a USB stick, then insert the USB stick into the device. Log in to the Armbian system (default user: root, default password: 1234) and enter the command: ```shell armbian-install ``` | Optional | Default | Options | Description | | -------- | ------- | ------- | ----------------- | | -m | no | yes/no | Use mainline u-boot | | -a | yes | yes/no | Use [ampart](https://github.com/7Ji/ampart) partition adjustment tool | | -l | no | yes/no | Show full device list | Example: `armbian-install -m yes -a no` - ### Update Armbian Kernel Log in to the Armbian system and enter the command: ```shell # Run as root user (sudo -i) # If no parameter is specified, it will be updated to the latest version. armbian-update ``` | Optional | Default | Options | Description | | -------- | ------------ | ------------- | -------------------------------- | | -r | ophub/kernel | `/` | Set the repository for downloading kernels from github.com | | -u | Automation | stable/flippy/beta/rk3588/rk35xx/h6 | Set the kernel [tags suffix](https://github.com/ophub/kernel/releases) | | -k | Latest version | Kernel version | Set the [kernel version](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | -b | yes | yes/no | Automatically back up the currently used kernel when updating | | -d | deb | tar/deb | Set the preferred kernel package format. If unavailable, the script will automatically try the alternative format. The `deb` format is recommended for compiling custom drivers. | | -m | no | yes/no | Use mainline u-boot | | -s | None | None/DiskName | [SOS] Restore the system kernel on eMMC/NVMe/sdX or other disks | | -h | None | None | View help information | Example: `armbian-update -k 5.15 -u stable -d deb` When specifying the kernel version via the `-k` parameter, you can provide an exact version number (e.g., `armbian-update -k 5.15.50`) or specify only the kernel series (e.g., `armbian-update -k 5.15`). When a series is specified, the latest version within that series will be used automatically. During kernel updates, the currently running kernel is automatically backed up to the `/ddbr/backup` directory, retaining the 3 most recent versions. If the newly installed kernel proves unstable, you can restore a backup kernel at any time. If a kernel update renders the system unbootable, use `armbian-update -s` to restore the system kernel. For more details, see the [Help Document](documents#10-updating-armbian-kernel). - ### Replace Armbian Sources Log in to the Armbian system and enter the command: ```shell armbian-apt ``` Choosing the appropriate software source for your country or region can significantly improve download speeds. For more details, see the [Help Document](documents#11-installing-common-software). - ### Install Common Software Log in to the Armbian system and enter the command: ```shell armbian-software ``` The command `armbian-software -u` updates the local software center list. Based on user feedback in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues), commonly used [software](build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf) has been gradually integrated with one-click install/update/uninstall support. This includes `Docker images`, `desktop software`, `application services`, and more. See the [detailed instructions](documents/armbian_software.md). - ### Modify Armbian Configuration Log in to the Armbian system and enter the command: ```shell armbian-config ``` - ### Create Swap for Armbian If you find the device's memory insufficient when running memory-intensive applications such as `Docker`, you can create a `swap` virtual memory partition to use a portion of disk space as additional memory. The parameter unit is `GB`, with a default value of `1`. Log in to the Armbian system and enter the command: ```shell armbian-swap 1 ``` - ### Control LED Display Log in to the Armbian system and enter the command: ```shell armbian-openvfd ``` Debug according to the [LED Screen Display Control Instructions](documents/led_screen_display_control.md). - ### Backup/Restore EMMC Original System Supports backing up and restoring the device's `EMMC` partition via `TF/SD/USB`. Before installing Armbian on a new device, it is recommended to back up the original Android TV system for future restoration if needed. Boot the Armbian system from `TF/SD/USB` and enter the command: ```shell armbian-ddbr ``` Enter `b` at the prompt to back up the system, or `r` to restore. > [!IMPORTANT] > Alternatively, the Android system can be flashed directly into eMMC via USB cable. Android system images are available in [Tools](https://github.com/ophub/kernel/releases/tag/tools). - ### Compile the Kernel in Armbian For kernel compilation instructions, see the [Compile Kernel](compile-kernel) documentation. Log in to the Armbian system and enter the command: ```shell armbian-kernel -u armbian-kernel -k 6.6.12 ``` - ### More Usage Instructions To update all service scripts in the system to the latest version, log in to the Armbian system and enter the command: ```shell armbian-sync ``` For common issues and their solutions when using Armbian, see [documents](documents). ## Local Packaging 1. Clone the repository to local `git clone --depth 1 https://github.com/ophub/amlogic-s9xxx-armbian.git` 2. Install the necessary software packages (using Ubuntu 24.04 as an example) Enter the `~/amlogic-s9xxx-armbian` root directory, then run the installation command: ```shell sudo apt-get update -y sudo apt-get full-upgrade -y # For Ubuntu-24.04 sudo apt-get install -y $(cat compile-kernel/tools/script/ubuntu2404-build-armbian-depends) ``` 3. Enter the `~/amlogic-s9xxx-armbian` root directory, create the `build/output/images` folder, and upload the Armbian image file (e.g., `Armbian_21.11.0-trunk_Odroidn2_current_5.15.50.img`) to the `~/amlogic-s9xxx-armbian/build/output/images` directory. Retain the release version number (e.g., `21.11.0`) and kernel version number (e.g., `5.15.50`) in the original filename, as they will be used for naming the rebuilt Armbian system. 4. Enter the `~/amlogic-s9xxx-armbian` root directory and run `sudo ./rebuild -b s905x3 -k 6.6.12` to generate the Armbian image for the specified board. Output files are saved in the `build/output/images` directory. - ### Local Packaging Parameter Description | Parameter | Meaning | Description | | ---- | ---------- | ---------- | | -b | Board | Specifies the device code(s) to build. For example, `-b s905x3` builds the s905x3 device. Multiple devices can be joined with underscores, e.g., `-b s905x3_s905d`. Special values: `all` builds all devices; `first50` builds the first 50; `range50_100` builds devices 51–100; `range100_150` builds devices 101–150; `last20` builds the last 20. See the `BOARD` entries in [model_database.conf](build-armbian/armbian-files/common-files/etc/model_database.conf) for the full list. Default: `all` | | -r | KernelRepo | Specify the `/` of the github.com kernel repository. Default value: `ophub/kernel` | | -u | kernelUsage | Set the `tags suffix` of the kernel used, such as [stable](https://github.com/ophub/kernel/releases/tag/kernel_stable), [flippy](https://github.com/ophub/kernel/releases/tag/kernel_flippy), [beta](https://github.com/ophub/kernel/releases/tag/kernel_beta). Default value: `stable` | | -k | Kernel | Specify [kernel](https://github.com/ophub/kernel/releases/tag/kernel_stable) name, such as `-k 6.6.12`. Connect multiple kernels with `_`, such as `-k 6.6.12_5.15.50`. The kernel version freely specified by the `-k` parameter is only valid for kernels using `stable/flippy/beta`. Other kernel series such as [rk3588](https://github.com/ophub/kernel/releases/tag/kernel_rk3588) / [rk35xx](https://github.com/ophub/kernel/releases/tag/kernel_rk35xx) / [h6](https://github.com/ophub/kernel/releases/tag/kernel_h6) can only use specific kernels. | | -a | AutoKernel | Set whether to automatically use the latest kernel within the same series. When `true`, the kernel repository is checked for newer versions within the series specified by `-k` (e.g., 6.6.12), and if found, the latest version is used automatically. When `false`, the exact specified version is used. Default: `true` | | -t | RootfsType | Set the file system type of the ROOTFS partition. Options: `ext4` or `btrfs`. Example: `-t btrfs`. Default: `ext4` | | -s | Size | Set the image partition sizes. To set only the ROOTFS partition, specify a single value (e.g., `-s 2560`). To set both BOOTFS and ROOTFS, join them with `/` (e.g., `-s 512/2560`). Default: `512/2560` | | -n | BuilderName | Set the Armbian system builder signature. Do not include spaces. Default: None | - `sudo ./rebuild`: Use default configuration to package all device models. - `sudo ./rebuild -b s905x3 -k 6.6.12`: Recommended. Build with default configuration for the specified kernel. - `sudo ./rebuild -b s905x3 -k 6.1.y`: Build with default configuration, using the latest kernel in the 6.1.y series. - `sudo ./rebuild -b s905x3_s905d -k 6.6.12_5.15.50`: Build with default configuration for multiple kernels simultaneously. Use `_` to join multiple kernels. - `sudo ./rebuild -b s905x3 -k 6.6.12 -s 2560`: Build a single kernel and model with default configuration; ROOTFS partition size set to 2560 MiB. - `sudo ./rebuild -b s905x3_s905d`: Build all kernels for multiple models with default configuration. Use `_` to join multiple models. - `sudo ./rebuild -k 6.6.12_5.15.50`: Build all models with default configuration and multiple specified kernels. Use `_` to join kernels. - `sudo ./rebuild -k 6.6.12_5.15.50 -a true`: Same as above, with automatic upgrade to the latest kernel within each series. - `sudo ./rebuild -t btrfs -s 2560 -k 6.6.12`: Build all models with btrfs filesystem, 2560 MiB ROOTFS, and kernel 6.6.12. ## Use GitHub Actions for Compilation 1. Workflow configuration files are located in the [.github/workflows/](.github/workflows/) directory. 2. Fresh Build: On the [Actions](https://github.com/ophub/amlogic-s9xxx-armbian/actions) page, select ***`Build Armbian server image`*** to use the [build-armbian-arm64-server-image.yml](.github/workflows/build-armbian-arm64-server-image.yml) workflow. You can choose from Ubuntu series (e.g., `resolute`) or Debian series (e.g., `trixie`). Click ***`Run workflow`*** to start the build. 3. Rebuild: If [Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases) already contains compiled `Armbian_.*-trunk_.*.img.gz` files and you only need to repackage for other boards, skip the source compilation step and use [build-armbian-using-releases-files.yml](.github/workflows/build-armbian-using-releases-files.yml) for secondary builds. 4. To use other Armbian systems (e.g., the [odroidn2](https://armbian.tnahosting.net/dl/odroidn2/archive/) image from the official [armbian.tnahosting.net](https://armbian.tnahosting.net/dl/) download site), simply reference this repository's script in the workflow file [build-armbian-using-official-image.yml](.github/workflows/build-armbian-using-official-image.yml) for Armbian restructuring to support other devices. Example: ```yaml - name: Build Armbian uses: ophub/amlogic-s9xxx-armbian@main with: build_target: armbian armbian_path: build/output/images/*.img armbian_board: s905d_s905x3_s922x_s905x armbian_kernel: 6.12.y_6.18.y ``` - ### GitHub Actions Input Parameter Description These parameters correspond to the local packaging command options described above. | Parameter | Default | Description | |-----------------|---------------|---------------------------------------------------------| | armbian_path | None | Set the path of the original Armbian file. Supports workflow file paths (e.g., `build/output/images/*.img`) and network download URLs (e.g., `https://dl.armbian.com/*/Armbian_*.img.xz`). | | armbian_board | all | Set the `board` of the package box, refer to `-b` | | kernel_repo | ophub/kernel | Specify `/` of the github.com kernel repository, refer to `-r` | | kernel_usage | stable | Set the `tags suffix` of the used kernel. Refer to `-u` | | armbian_kernel | 6.12.y_6.18.y | Set the [version](https://github.com/ophub/kernel/releases/tag/kernel_stable) of the kernel, refer to `-k` | | auto_kernel | true | Set whether to automatically adopt the latest version of the same series kernel, refer to `-a` | | armbian_fstype | ext4 | Set the file system type of the system's ROOTFS partition, refer to `-t` | | armbian_size | 512/2560 | Set the size of the system BOOTFS and ROOTFS partitions, function reference `-s` | | armbian_files | false | Add custom Armbian files. When set, all files in this directory will be copied to [common-files](build-armbian/armbian-files/common-files). The directory structure must mirror the Armbian root directory to ensure files are correctly overlaid (e.g., default configuration files should be placed under `etc/default/`). | | builder_name | None | Set the Armbian system builder signature, refer to `-n` | - ### GitHub Actions Output Variable Description Uploading to `Releases` requires `Workflow read and write permissions` for the repository. See the [usage instructions](documents/README.md#2-set-up-private-variable-github_token) for details. | Parameter | Default | Description | |----------------------------------|---------------|---------------------------------------| | ${{ env.PACKAGED_OUTPUTPATH }} | out | Armbian system files output path | | ${{ env.PACKAGED_OUTPUTDATE }} | 04.13.1058 | Packaging date (month.day.hourminute) | | ${{ env.PACKAGED_STATUS }} | success | Packaging status: success / failure | ## Build Armbian Docker Image For creating [Docker](https://hub.docker.com/u/ophub) images of the Armbian system, refer to the [armbian_docker](./compile-kernel/tools/script/docker) build script. ## Compiling Kernel Using GitHub Actions For kernel compilation instructions, see [compile-kernel](compile-kernel). ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 6.12.y_6.18.y kernel_auto: true kernel_sign: -yourname ``` ## Armbian Contributors First and foremost, thanks to [150balbes](https://github.com/150balbes) for the outstanding contributions and the solid foundation laid for running Armbian on Amlogic TV boxes. The [Armbian](https://github.com/armbian/build) system compiled here uses the latest official source code for real-time builds. The development approach is inspired by tutorials from authors such as [ebkso](https://www.kflyo.com/howto-compile-armbian-for-n1-box). Thanks to everyone's dedication and sharing, enabling Armbian to run on an ever-growing range of devices. The [u-boot](https://github.com/ophub/u-boot), [kernel](https://github.com/ophub/kernel), and other resources used in this system are primarily sourced from the [unifreq/openwrt_packit](https://github.com/unifreq/openwrt_packit) project. Some files have been contributed by users through [Pull Requests](https://github.com/ophub/amlogic-s9xxx-armbian/pulls) and [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues) in projects such as [amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt), [amlogic-s9xxx-armbian](https://github.com/ophub/amlogic-s9xxx-armbian), [luci-app-amlogic](https://github.com/ophub/luci-app-amlogic), [u-boot](https://github.com/ophub/u-boot), and [kernel](https://github.com/ophub/kernel). To acknowledge these pioneers and contributors, all contributions since the repository's creation (`2021-09-19`) are recorded in [CONTRIBUTORS.md](https://github.com/ophub/amlogic-s9xxx-armbian/blob/main/CONTRIBUTORS.md). Thanks again to everyone for breathing new life and purpose into these devices. ## Other Distributions - The [amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt) project provides the `OpenWrt` system for TV boxes, also applicable to Armbian-supported devices. - The [fnnas](https://github.com/ophub/fnnas) project provides the `FnNAS` system for TV boxes, also applicable to Armbian-supported devices. - [unifreq](https://github.com/unifreq/openwrt_packit) has created `OpenWrt` systems for a wide range of Amlogic, Rockchip, and Allwinner devices, serving as a benchmark project in the community. Highly recommended. - [Scirese](https://github.com/Scirese/alarm) has tested the build, installation, and usage of `Arch Linux ARM` / `Manjaro` systems on Android TV boxes. See his repository for details. - [7Ji](https://7ji.github.io/) has published articles on reverse engineering and development for the Amlogic platform, covering topics such as installing ArchLinux ARM and analyzing the Amlogic boot mechanism. His [ampart](https://github.com/7Ji/ampart) project provides a partition tool for reading and editing Amlogic eMMC partition tables and DTB partitions, enabling 100% utilization of eMMC space. The [amlogic-s9xxx-archlinuxarm](https://github.com/7Ji/amlogic-s9xxx-archlinuxarm) project provides build and usage instructions for `Arch Linux ARM`. The [YAopenvfD](https://github.com/7Ji/YAopenvfD) project offers an alternative openvfd daemon implementation. - [13584452567](https://github.com/13584452567) is the pioneer for `Rockchip` device support in this repository. Through his contributions, support was expanded for numerous `Rockchip` devices including [EAIDK-610](https://github.com/ophub/amlogic-s9xxx-armbian/pull/991), [King3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1080), [TN3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1094), [Kylin3399](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1132), [ZCube1-Max](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1247), [tvi3315a](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1687), [xiaobao](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1698), and more. He also maintains specialized [kernels](https://github.com/13584452567/linux-6.6.y) for `Allwinner` devices such as [TQC-A01](https://github.com/ophub/amlogic-s9xxx-armbian/pull/1638), and has provided extensive technical support and solutions in [Discussions](https://github.com/ophub/amlogic-s9xxx-armbian/discussions/1634) and [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues), making significant contributions to the community. - [cooip-jm](https://github.com/cooip-jm) shares many guides on Armbian, LXC, Docker, AdGuard, and other applications in his [wiki](https://github.com/cooip-jm/About-openwrt/wiki). Recommended reading. ## Links - [armbian](https://github.com/armbian/build) - [unifreq](https://github.com/unifreq) - [kernel.org](https://kernel.org) ## License The amlogic-s9xxx-armbian © OPHUB is licensed under [GPL-2.0](LICENSE) ================================================ FILE: action.yml ================================================ name: "Rebuild Armbian and Kernel" author: "https://github.com/ophub/amlogic-s9xxx-armbian" description: "Support Amlogic, Rockchip and Allwinner boxes." inputs: # Select build target build_target: description: "Select build target: armbian / kernel" required: false default: "armbian" # For build armbian ----- armbian_path: description: "Set Armbian file path." required: false default: "build/output/images/*.img" armbian_board: description: "Set device Board." required: false default: "all" kernel_repo: description: "Set kernel repository." required: false default: "ophub/kernel" kernel_usage: description: "Set the tags of the stable kernel." required: false default: "stable" armbian_kernel: description: "Set kernel version." required: false default: "6.1.y_6.12.y" auto_kernel: description: "Auto use the latest kernel." required: false default: "true" armbian_fstype: description: "Set armbian rootfs type: ext4 / btrfs" required: false default: "ext4" armbian_size: description: "Set armbian rootfs size(Unit: MiB)." required: false default: "" armbian_files: description: "Add custom Armbian files." required: false default: "" builder_name: description: "Set Armbian builder signature." required: false default: "" # For compile kernel ----- kernel_source: description: "Select the kernel source code" required: false default: "unifreq" kernel_version: description: "Select kernel version" required: false default: "6.1.y_6.12.y" kernel_auto: description: "Auto use the latest kernel" required: false default: "true" kernel_package: description: "Select compile package list" required: false default: "all" kernel_sign: description: "Set the kernel custom signature" required: false default: "-ophub" kernel_toolchain: description: "Select the compilation toolchain" required: false default: "clang" config_flavor: description: "Set the kernel config flavor" required: false default: "" kernel_config: description: "Set the path of kernel .config" required: false default: "false" kernel_patch: description: "Set the directory for kernel patches" required: false default: "false" auto_patch: description: "Set whether to use kernel patches" required: false default: "false" compress_format: description: "Set the initrd compression format" required: false default: "xz" delete_source: description: "Set whether to delete the kernel source" required: false default: "false" silent_log: description: "Set whether to use silent log output" required: false default: "false" enable_log: description: "Set whether to output logs to a file" required: false default: "false" ccache_clear: description: "Set whether to clear the cache" required: false default: "false" docker_hostpath: description: "Set Docker working directory" required: false default: "" docker_image: description: "Select Armbian docker image" required: false default: "" runs: using: "composite" steps: - shell: bash run: | cd ${{ github.action_path }} echo -e "Current running path: [ ${PWD} ]" build_target="${{ inputs.build_target }}" [[ -z "${build_target}" ]] && build_target="armbian" if [[ "${build_target}" == "armbian" ]]; then cd ${{ github.action_path }} echo -e "Starting Armbian rebuild..." armbian_file="${{ inputs.armbian_path }}" armbian_filename="${armbian_file##*/}" armbian_filepath="build/output/images" echo -e "Armbian file input parameters: [ ${armbian_file} ]" [[ -z "${armbian_file}" ]] && echo -e "The [ armbian_path ] variable must be specified." && exit 1 [[ -d "${armbian_filepath}" ]] || mkdir -p ${armbian_filepath} if [[ "${armbian_file}" =~ ^http ]]; then echo -e "Downloading file: [ ${armbian_file} ]" curl -fsSL "${armbian_file}" -o "${armbian_filepath}/${armbian_filename}" else if [[ -z "$(ls ${armbian_filepath}/${armbian_filename} 2>/dev/null)" ]]; then echo -e "Copying files: [ ${armbian_file} ]" if [[ "${armbian_file}" =~ ^/ ]]; then cp -vf ${armbian_file} -t ${armbian_filepath}/ || true else cp -vf ${{ github.workspace }}/${armbian_file} -t ${armbian_filepath}/ || true fi else echo -e "File [ ${armbian_filepath}/${armbian_filename} ] already exists, skipping." fi fi sync echo -e "Contents of [ ${armbian_filepath} ] directory: \n$(ls -lh ${armbian_filepath} 2>/dev/null)" cd ${armbian_filepath} echo -e "Checking the Armbian file format..." down_file="$(ls -l *.img* 2>/dev/null | grep "^-" | awk '{print $9}' | sort -u | head -n 1)" if [[ -n "${down_file}" ]]; then echo -e "Selected Armbian file: [ ${down_file} ]" else echo -e "The Armbian file is invalid!" exit 1 fi [[ "${down_file:0-7}" == ".img.gz" ]] && gzip -df ${down_file} 2>/dev/null && sync [[ "${down_file:0-7}" == ".img.xz" ]] && xz -d ${down_file} 2>/dev/null && sync [[ "${down_file:0-4}" == ".zip" ]] && unzip -o ${down_file} 2>/dev/null && sync echo -e "Armbian file: \n$(ls -lh *.img 2>/dev/null)" echo -e "Checking the Armbian filename (-trunk_)..." image_file="$(ls *.img 2>/dev/null | head -n 1)" if [[ "${image_file}" =~ "-trunk_" ]]; then echo -e "The Armbian filename is correct." else echo -e "Modifying Armbian filename..." # Get image version, such as 25.11.0 image_version="$(echo ${image_file} | grep -oE '[0-9]{2}\.[0-9]{1,2}\.[0-9]{1,2}' | head -n 1)" # Get image kernel version, such as 6.12.56 image_kernel="$(echo ${image_file} | grep -oE '[0-9]+\.[0-9]{1,2}\.[0-9]{1,3}' | grep -v "${image_version}" | head -n 1)" # Get image codename, such as trixie image_codename="$(echo ${image_file} | grep -oE "(trixie|bookworm|bullseye|resolute|noble|jammy)" || echo '')" # Rename armbian image file image_save_name="Armbian_${image_version}-trunk_${image_codename}_arm64_${image_kernel}.img" rm -f ${image_save_name} mv -f ${image_file} ${image_save_name} echo -e "Renamed Armbian file: [ ${image_save_name} ]" fi # Custom Armbian rebuild files if [[ -n "${{ inputs.armbian_files }}" && "${{ inputs.armbian_files }}" != "false" ]]; then echo -e "Adding custom Armbian rebuild files..." copy_from_path="${{ inputs.armbian_files }}" copy_from_path="${copy_from_path%/}" [[ "${copy_from_path}" != /* ]] && copy_from_path="${{ github.workspace }}/${copy_from_path}" copy_to_path="build-armbian/armbian-files/common-files" cp -avf --no-preserve=ownership "${copy_from_path}/." -t "${copy_to_path}/" || true else echo -e "Using the default Armbian rebuild files." fi cd ${{ github.action_path }} echo -e "Starting to rebuild Armbian..." make_command="" [[ -n "${{ inputs.armbian_board }}" ]] && make_command="${make_command} -b ${{ inputs.armbian_board }}" [[ -n "${{ inputs.kernel_repo }}" ]] && make_command="${make_command} -r ${{ inputs.kernel_repo }}" [[ -n "${{ inputs.kernel_usage }}" ]] && make_command="${make_command} -u ${{ inputs.kernel_usage }}" [[ -n "${{ inputs.armbian_kernel }}" ]] && make_command="${make_command} -k ${{ inputs.armbian_kernel }}" [[ -n "${{ inputs.auto_kernel }}" ]] && make_command="${make_command} -a ${{ inputs.auto_kernel }}" [[ -n "${{ inputs.armbian_fstype }}" ]] && make_command="${make_command} -t ${{ inputs.armbian_fstype }}" [[ -n "${{ inputs.armbian_size }}" ]] && make_command="${make_command} -s ${{ inputs.armbian_size }}" [[ -n "${{ inputs.builder_name }}" ]] && make_command="${make_command} -n ${{ inputs.builder_name }}" read -r -a make_args <<< "${make_command}" sudo ./rebuild "${make_args[@]}" cd ${{ github.action_path }}/${armbian_filepath} # Compress Armbian image file pigz -qf *.img || gzip -qf *.img sync && sleep 3 cd ${{ github.action_path }} echo -e "Output environment variables." echo "PACKAGED_OUTPUTPATH=${PWD}/${armbian_filepath}" >> ${GITHUB_ENV} echo "PACKAGED_OUTPUTDATE=$(date +"%m.%d.%H%M")" >> ${GITHUB_ENV} echo "PACKAGED_STATUS=success" >> ${GITHUB_ENV} echo -e "PACKAGED_OUTPUTPATH: ${PWD}/${armbian_filepath}" echo -e "PACKAGED_OUTPUTDATE: $(date +"%m.%d.%H%M")" echo -e "PACKAGED_STATUS: success" echo -e "PACKAGED_OUTPUTPATH files list: \n$(ls -lh ${PWD}/${armbian_filepath}/ 2>/dev/null)" elif [[ "${build_target}" == "kernel" ]]; then cd ${{ github.action_path }} echo -e "Starting kernel compilation..." # Custom kernel config files config_filepath="compile-kernel/tools/config" [[ -d "${config_filepath}" ]] || mkdir -p ${config_filepath} if [[ -n "${{ inputs.kernel_config }}" && "${{ inputs.kernel_config }}" != "false" ]]; then if [[ "$(ls ${{ github.workspace }}/${{ inputs.kernel_config }}/config-* -l 2>/dev/null | grep "^-" | wc -l)" -ne "0" ]]; then echo -e "Using a custom kernel compilation template..." rm -f ${config_filepath}/* 2>/dev/null && sync cp -vrf "${{ github.workspace }}/${{ inputs.kernel_config }}/." -t "${config_filepath}/" || true echo -e "List of Kernel Custom Compilation Configuration Templates: \n$(ls -lh ${config_filepath} 2>/dev/null)" else echo -e "The custom kernel compilation template path is invalid. Using the default template." fi else echo -e "Using the default kernel compilation template." fi # Custom kernel patch files custom_kernel_patch="compile-kernel/tools/patch" [[ -d "${custom_kernel_patch}" ]] || mkdir -p ${custom_kernel_patch} if [[ -n "${{ inputs.kernel_patch }}" && "${{ inputs.kernel_patch }}" != "false" ]]; then if [[ -d "${{ github.workspace }}/${{ inputs.kernel_patch }}" ]]; then echo -e "Using custom kernel patches..." rm -rf ${custom_kernel_patch}/* 2>/dev/null && sync cp -vrf "${{ github.workspace }}/${{ inputs.kernel_patch }}/." -t "${custom_kernel_patch}/" || true echo -e "Directory of custom kernel patches: \n$(ls -lh ${custom_kernel_patch} 2>/dev/null)" else echo -e "Invalid custom kernel patch directory. Skipping." fi else echo -e "No custom kernel patches provided." fi echo -e "Building kernel compilation command." make_command="" [[ -n "${{ inputs.kernel_source }}" ]] && make_command="${make_command} -r ${{ inputs.kernel_source }}" [[ -n "${{ inputs.kernel_version }}" ]] && make_command="${make_command} -k ${{ inputs.kernel_version }}" [[ -n "${{ inputs.kernel_auto }}" ]] && make_command="${make_command} -a ${{ inputs.kernel_auto }}" [[ -n "${{ inputs.kernel_package }}" ]] && make_command="${make_command} -m ${{ inputs.kernel_package }}" [[ -n "${{ inputs.auto_patch }}" ]] && make_command="${make_command} -p ${{ inputs.auto_patch }}" [[ -n "${{ inputs.kernel_sign }}" ]] && make_command="${make_command} -n ${{ inputs.kernel_sign }}" [[ -n "${{ inputs.kernel_toolchain }}" ]] && make_command="${make_command} -t ${{ inputs.kernel_toolchain }}" [[ -n "${{ inputs.compress_format }}" ]] && make_command="${make_command} -z ${{ inputs.compress_format }}" [[ -n "${{ inputs.delete_source }}" ]] && make_command="${make_command} -d ${{ inputs.delete_source }}" [[ -n "${{ inputs.silent_log }}" ]] && make_command="${make_command} -s ${{ inputs.silent_log }}" [[ -n "${{ inputs.ccache_clear }}" ]] && make_command="${make_command} -c ${{ inputs.ccache_clear }}" [[ -n "${{ inputs.config_flavor }}" ]] && make_command="${make_command} -f ${{ inputs.config_flavor }}" [[ -n "${{ inputs.enable_log }}" ]] && make_command="${make_command} -l ${{ inputs.enable_log }}" [[ -n "${{ inputs.docker_hostpath }}" ]] && make_command="${make_command} -h ${{ inputs.docker_hostpath }}" [[ -n "${{ inputs.docker_image }}" ]] && make_command="${make_command} -i ${{ inputs.docker_image }}" read -r -a make_args <<< "${make_command}" sudo ./recompile "${make_args[@]}" cd ${{ inputs.docker_hostpath }} kernel_outpath="compile-kernel/output" output_tags="$(ls -l ${kernel_outpath}/*.tar.gz 2>/dev/null | awk '{print $9}' | grep -oP '\d+\.\d+\.\d+' | sort -u | xargs | tr "[ ]" "_")" echo -e "Setting output environment variables." echo "PACKAGED_OUTPUTTAGS=${output_tags}" >> ${GITHUB_ENV} echo "PACKAGED_OUTPUTPATH=${PWD}/${kernel_outpath}" >> ${GITHUB_ENV} echo "PACKAGED_OUTPUTDATE=$(date +"%m.%d.%H%M")" >> ${GITHUB_ENV} echo "PACKAGED_STATUS=success" >> ${GITHUB_ENV} echo -e "PACKAGED_OUTPUTTAGS: ${output_tags}" echo -e "PACKAGED_OUTPUTPATH: ${PWD}/${kernel_outpath}" echo -e "PACKAGED_OUTPUTDATE: $(date +"%m.%d.%H%M")" echo -e "PACKAGED_STATUS: success" echo -e "PACKAGED_OUTPUTPATH files list: \n$(ls -lh ${PWD}/${kernel_outpath}/ 2>/dev/null)" else echo -e "Please select a build target: armbian / kernel" exit 1 fi branding: icon: "terminal" color: "gray-dark" ================================================ FILE: build-armbian/README.cn.md ================================================ # 构建文件说明 [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) 编译 Armbian 系统所需的文件按功能分类存放在各个子目录中。 ## armbian-files 此目录存放 Armbian 构建过程中所需的全部文件。其中,`common-files` 目录存放与平台无关的通用文件,`platform-files` 目录存放各平台专用文件,`different-files` 目录存放针对不同设备的差异化配置文件。更多说明详见 [documents](../documents/README.cn.md) 中的 `12.15` 章节。 所需固件将从 [ophub/firmware](https://github.com/ophub/firmware) 仓库自动下载至 `common-files/usr/lib/firmware` 目录。 ## kernel 在 `kernel` 目录下创建与版本号对应的文件夹,如 `stable/5.10.125`。若需编译多个内核,依次创建各版本目录并放入对应的内核文件即可。内核文件可从 [kernel](https://github.com/ophub/kernel) 仓库下载,也可[自行编译](../compile-kernel)。若本地未预先存放内核文件,构建脚本将自动从 kernel 仓库下载。 ## u-boot 系统引导文件。根据所用内核版本的不同,相应的 u-boot 文件将由安装或更新脚本自动获取和配置。所需的 u-boot 将从 [ophub/u-boot](https://github.com/ophub/u-boot) 仓库自动下载至 `u-boot` 目录。 ================================================ FILE: build-armbian/README.ja.md ================================================ # ビルドファイルの説明 [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) Armbian システムのコンパイルに必要なファイルは、機能別に各サブディレクトリに分類して格納されています。 ## armbian-files このディレクトリには、Armbian のビルドプロセスで必要なすべてのファイルが格納されています。`common-files` ディレクトリにはプラットフォームに依存しない共通ファイル、`platform-files` ディレクトリには各プラットフォーム専用ファイル、`different-files` ディレクトリには異なるデバイス向けの差分設定ファイルが格納されています。詳細は [documents](../documents/README.ja.md) の `12.15` セクションを参照してください。 必要なファームウェアは [ophub/firmware](https://github.com/ophub/firmware) リポジトリから `common-files/usr/lib/firmware` ディレクトリに自動的にダウンロードされます。 ## kernel `kernel` ディレクトリ内にバージョン番号に対応するフォルダを作成します(例:`stable/5.10.125`)。複数のカーネルをコンパイルする必要がある場合は、各バージョンのディレクトリを順次作成し、対応するカーネルファイルを配置してください。カーネルファイルは [kernel](https://github.com/ophub/kernel) リポジトリからダウンロードするか、[自分でコンパイル](../compile-kernel)することもできます。ローカルにカーネルファイルが事前に配置されていない場合、ビルドスクリプトが kernel リポジトリから自動的にダウンロードします。 ## u-boot システムブートファイルです。使用するカーネルバージョンに応じて、対応する u-boot ファイルはインストールまたは更新スクリプトによって自動的に取得・設定されます。必要な u-boot は [ophub/u-boot](https://github.com/ophub/u-boot) リポジトリから `u-boot` ディレクトリに自動的にダウンロードされます。 ================================================ FILE: build-armbian/README.md ================================================ # Build Files Reference [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) The files required for compiling the Armbian system are organized in their respective directories. ## armbian-files This directory contains all the files used during the Armbian build process. The `common-files` subdirectory holds platform-independent shared files, the `platform-files` subdirectory holds platform-specific files, and the `different-files` subdirectory holds device-specific configuration files. For further details, refer to Section `12.15` of the [documentation](../documents/). Required firmware files are automatically downloaded from the [ophub/firmware](https://github.com/ophub/firmware) repository into the `common-files/usr/lib/firmware` directory. ## kernel Create a version-specific folder under the `kernel` directory, e.g., `stable/5.10.125`. For multiple kernels, create separate directories sequentially and place the corresponding kernel files in each. Kernel files can be downloaded from the [kernel](https://github.com/ophub/kernel) repository, or you can [compile them yourself](../compile-kernel). If no kernel files are present locally, the build script will automatically download them from the kernel repository. ## u-boot System bootloader files. Depending on the kernel version, the appropriate u-boot files are automatically managed by the installation and update scripts as needed. Required u-boot files are automatically downloaded from the [ophub/u-boot](https://github.com/ophub/u-boot) repository into the `u-boot` directory. ================================================ FILE: build-armbian/armbian-files/common-files/etc/balance_irq ================================================ eth0 4 xhci-hcd:usb1 3 xhci-hcd:usb2 3 xhci-hcd:usb3 3 xhci-hcd:usb4 3 xhci-hcd:usb5 3 xhci-hcd:usb6 3 xhci-hcd:usb7 3 xhci-hcd:usb8 3 xhci-hcd:usb9 3 ================================================ FILE: build-armbian/armbian-files/common-files/etc/custom_service/start_service.sh ================================================ #!/bin/bash #======================================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Customize the startup script. Add content as needed. # Dependent script: /etc/rc.local (which runs with 'set -e') # File path: /etc/custom_service/start_service.sh # # Version: v1.3 # #======================================================================================== # Custom Service Log - all script output will be logged here custom_log="/tmp/ophub_start_service.log" # A helper function for logging with a timestamp log_message() { echo "[$(date +"%Y.%m.%d.%H:%M:%S")] $1" >>"${custom_log}" } # Start of the script log_message "Starting custom services..." # Disabled verbose kernel messages on console dmesg -n 1 >/dev/null 2>&1 || true log_message "Kernel console logging level set to 1 (Panic only)." # System Identification # Set the release check file to identify the device type ophub_release_file="/etc/ophub-release" [[ -f "${ophub_release_file}" ]] && source "${ophub_release_file}" 2>/dev/null || true FDTFILE="${FDTFILE:-no_found.dtb}" log_message "Detected FDT file: ${FDTFILE}" # Device-Specific Services # Add rknpu module to the system module load list ophub_load_conf="/etc/modules-load.d/ophub-load-list.conf" [[ -f "${ophub_load_conf}" ]] || touch "${ophub_load_conf}" if modinfo rknpu >/dev/null 2>&1; then grep -q -x "rknpu" "${ophub_load_conf}" 2>/dev/null || echo "rknpu" >>"${ophub_load_conf}" else grep -q -x "rknpu" "${ophub_load_conf}" 2>/dev/null && sed -i '/^rknpu$/d' "${ophub_load_conf}" fi log_message "Adjusted the rknpu module in the system module load list." # For Tencent Aurora 3Pro (s905x3-b) box: Load Bluetooth module if [[ "${FDTFILE}" == "meson-sm1-skyworth-lb2004-a4091.dtb" ]]; then grep -q -x "btmtksdio" "${ophub_load_conf}" 2>/dev/null || echo "btmtksdio" >>"${ophub_load_conf}" log_message "Attempted to load btmtksdio module for Tencent-Aurora-3Pro." fi # For swan1-w28(rk3568) board: USB power and switch control if [[ "${FDTFILE}" == "rk3568-swan1-w28.dtb" ]]; then ( # GPIO operations are critical, but we also add error suppression. gpioset 0 21=1 >/dev/null 2>&1 gpioset 3 20=1 >/dev/null 2>&1 gpioset 4 21=1 >/dev/null 2>&1 gpioset 4 22=1 >/dev/null 2>&1 ) & log_message "USB power control GPIOs set for Swan1-w28." fi # For smart-am60(rk3588)/orangepi-5b(rk3588s) board: Bluetooth control if [[ "${FDTFILE}" =~ ^(rk3588-smart-am60\.dtb|rk3588s-orangepi-5b\.dtb)$ ]]; then # This is a sequence of commands, with the last one running in the background. # The background command (&) won't affect the script's exit code. ( rfkill block all chmod a+x /lib/firmware/ap6276p/brcm_patchram_plus1 >/dev/null 2>&1 sleep 2 rfkill unblock all /lib/firmware/ap6276p/brcm_patchram_plus1 --enable_hci --no2bytes --use_baudrate_for_download --tosleep 200000 --baudrate 1500000 --patchram /lib/firmware/ap6275p/BCM4362A2.hcd /dev/ttyS9 & ) & log_message "Bluetooth firmware download process started for Smart-am60/orangepi-5b." fi # For nsy-g16-plus/nsy-g68-plus/bdy-g18-pro board if [[ "${FDTFILE}" =~ ^(rk3568-nsy-g16-plus\.dtb|rk3568-nsy-g68-plus\.dtb|rk3568-bdy-g18-pro\.dtb)$ ]]; then ( # Wait for network to be up sleep 10 # Set MTU to 1500 for eth0 and br0 set_mtu() { [[ -d "/sys/class/net/${1}" ]] && ip link set "${1}" mtu 1500 >/dev/null 2>&1 } set_mtu eth0 set_mtu br0 # Close offloading features to improve stability if [[ -d "/sys/class/net/eth0" ]] && command -v ethtool >/dev/null 2>&1; then ethtool -K eth0 tso off gso off gro off tx off rx off >/dev/null 2>&1 fi ) & log_message "Network optimizations for ${FDTFILE} applied." fi # General System Services # Restart ssh service mkdir -p -m0755 /var/run/sshd >/dev/null 2>&1 || true if [[ -f "/etc/init.d/ssh" ]]; then (sleep 5 && /etc/init.d/ssh restart >/dev/null 2>&1) & log_message "SSH service restart attempted." fi # Add network performance optimization if [[ -x "/usr/sbin/balethirq.pl" ]]; then (perl /usr/sbin/balethirq.pl >/dev/null 2>&1) & log_message "Network optimization service (balethirq.pl) execution attempted." fi # Led display control, Only for Amlogic devices (meson-*) with valid boxid. openvfd_enable="no" # yes or no, set to "yes" to enable OpenVFD service. openvfd_boxid="15" # Set the boxid according to your device. Refer to the documentation for details. openvfd_restart="no" # yes or no, set to "yes" to restart the OpenVFD service. if [[ "${openvfd_boxid}" != "0" && "${FDTFILE}" =~ ^meson- ]]; then ( # Start OpenVFD service [[ "${openvfd_enable}" == "yes" ]] && armbian-openvfd "${openvfd_boxid}" >/dev/null 2>&1 # Some devices require a restart to clear 'BOOT' and related messages [[ "${openvfd_restart}" == "yes" ]] && { armbian-openvfd "0" >/dev/null 2>&1 sleep 3 armbian-openvfd "${openvfd_boxid}" >/dev/null 2>&1 } log_message "OpenVFD service execution attempted." ) & fi # For vplus(Allwinner h6) led color lights if [[ -x "/usr/bin/rgb-vplus" ]]; then rgb-vplus --RedName=RED --GreenName=GREEN --BlueName=BLUE >/dev/null 2>&1 & log_message "Vplus RGB LED service started in background." fi # For fan control service if [[ -x "/usr/bin/pwm-fan.pl" ]]; then perl /usr/bin/pwm-fan.pl >/dev/null 2>&1 & log_message "Fan control service (pwm-fan.pl) started in background." fi # For oes(A311d) SATA LED status monitoring if [[ -x "/usr/bin/oes_sata_leds.sh" ]]; then /usr/bin/oes_sata_leds.sh >/var/log/oes-sata-leds.log 2>&1 & log_message "SATA status check service (oes_sata_leds.sh) started in background." fi # For pveproxy startup service if [[ -n "$(dpkg -l | awk '{print $2}' | grep -w "^pve-manager$" || true)" ]]; then # Restarting systemd services can sometimes fail during early boot. (systemctl restart pveproxy >/dev/null 2>&1) & log_message "PVE proxy service restart attempted." fi # Maximize root partition size todo_rootfs_resize="/root/.no_rootfs_resize" [[ -f "${todo_rootfs_resize}" && "$(cat ${todo_rootfs_resize} 2>/dev/null | xargs)" == "yes" ]] && { armbian-tf >/dev/null 2>&1 & log_message "Root partition resize completed." } # Finalization log_message "All custom services have been processed successfully." ================================================ FILE: build-armbian/armbian-files/common-files/etc/default/cpufrequtils ================================================ # The file path: /etc/default/cpufrequtils # Call file: /etc/init.d/cpufrequtils # # View setup results: # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq # cat /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq # Set ENABLE to "true" to let the script run at boot time ENABLE="true" # View CPU core MIN_CORE_CPU="$(ls -l /sys/devices/system/cpu | grep -oE "cpu[0-9]{1,2}" | sort | head -n 1)" MAX_CORE_CPU="$(ls -l /sys/devices/system/cpu | grep -oE "cpu[0-9]{1,2}" | sort -rV | head -n 1)" # MIN_SPEED and MAX_SPEED listed in: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies MIN_SPEED="$(cat /sys/devices/system/cpu/${MIN_CORE_CPU}/cpufreq/scaling_available_frequencies 2>/dev/null | awk '{print $(NF/2)}')" MAX_SPEED="$(cat /sys/devices/system/cpu/${MAX_CORE_CPU}/cpufreq/scaling_available_frequencies 2>/dev/null | awk '{print $NF}')" # GOVERNOR listed in: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors # GOVERNOR Options: conservative userspace powersave ondemand performance schedutil GOVERNOR="schedutil" ================================================ FILE: build-armbian/armbian-files/common-files/etc/fstab ================================================ LABEL=ROOTFS / ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1 LABEL=BOOT /boot vfat defaults 0 2 tmpfs /tmp tmpfs defaults,nosuid 0 0 ================================================ FILE: build-armbian/armbian-files/common-files/etc/model_database.conf ================================================ #========================================================================================================================================================================= # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the build Armbian, OpenWrt and FnNAS # https://github.com/ophub/amlogic-s9xxx-armbian # https://github.com/ophub/amlogic-s9xxx-openwrt # https://github.com/ophub/fnnas # # Function: Define the list of supported devices # # Column definitions: # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION # 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD # # [ 5.UBOOT_OVERLOAD ] : Referred to as for Amlogic, for Rockchip, not used for Allwinner. # [ 9.KERNEL_TAGS ] : The tag name suffix used in https://github.com/ophub/kernel/releases # [ Kernel tags ] start with [ kernel_ ], e.g., kernel_stable, kernel_rk3588, etc. # [ Common kernels ] include [ kernel_stable, kernel_flippy, and kernel_beta ], which can be used interchangeably. # [ Specific kernels ] use specific kernel versions, downloaded from [ kernel_stable ] tags by default, can be replaced with [ common kernels ]. # You can specify multiple kernel version matching formats, e.g., 6.1.43, 5.15.y, 6.x.y, 5.15.y_6.1.y, etc. # Where [ 5.x.y ] includes 5.10.y, 5.15.y, and [ 6.x.y ] includes 6.1.y, 6.6.y, 6.12.y, and 6.18.y. # [ stable/all ] = [ kernel_stable/* ] : Available for all devices. # [ stable/6.x.y ] = [ kernel_stable/6.x.y ] : Available for all devices; Rockchip rk3399/rk3568 series devices use specified kernels. # [ stable/5.x.y ] = [ kernel_stable/5.x.y ] : Available for all Amlogic devices. # [ flippy/all ] = [ kernel_flippy/* ] : Available for all devices. # [ beta/all ] = [ kernel_beta/* ] : Available for all devices. # [ rk3588/6.1.y ] = [ kernel_rk3588/6.1.y ] : Dedicated to Rockchip rk3588 series devices. # [ rk35xx/6.1.y ] = [ kernel_rk35xx/6.1.y ] : Dedicated to Rockchip rk3528/rk3566/rk3568 series devices. # [ h6/6.6.y ] = [ kernel_h6/6.6.y ] : Dedicated to Allwinner h6 (TQC-A01) device. # [ 13.CONTRIBUTORS ] : GitHub username of the contributor (https://github.com) # # When [ -b all ], selects [ all rows ] where [ BUILD is yes ]. # When [ -b first ], selects [ first N rows ] where [ BUILD is yes ]. # When [ -b from ], selects [ rows from N+1 to end ] where [ BUILD is yes ]. # When [ -b last ], selects [ last N rows ] where [ BUILD is yes ]. # When [ -b board ], selects [ first row ] with [ matching BOARD ], ignoring [ BUILD ]. # # Tip: [IDL]: ID Locked. Do not modify. # For [ 2.MODEL ] entries marked with [IDL], a fixed [ ID ] is required (e.g., [ 213, 304, 409 ]). Do not change these in the [ install/update script ]. # #========================================================================================================================================================================= # Amlogic GXL Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 101 :Phicomm-N1 :s905d :meson-gxl-s905d-phicomm-n1.dtb :u-boot-n1.bin :NA :u-boot-2015-phicomm-n1.bin :2GB-Mem,1Gb-Nic,brcm43455-wifi :stable/all :amlogic :meson-gxl :uEnv.txt :unifreq :s905d :yes 102 :Phicomm-N1(DMA-thresh) :s905d :meson-gxl-s905d-phicomm-n1-thresh.dtb :u-boot-n1.bin :NA :u-boot-2015-phicomm-n1.bin :When-ethmac-flow-control-is-off :stable/all :amlogic :meson-gxl :uEnv.txt :unifreq :s905d-n1-thresh :no 103 :MECOOL-KI-Pro :s905d :meson-gxl-s905d-mecool-ki-pro.dtb :u-boot-p201.bin :NA :NA :2G/16G,1Gb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :martinlanger90 :s905d-ki-pro :no 104 :SML-5442TW :s905d :meson-gxl-s905d-sml5442tw.dtb :u-boot-s905x-s912.bin :NA :NA :2G/8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :WallcroftUK :s905d-sml5442tw :no 105 :HG680P :s905x :meson-gxl-s905x-p212.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :rapdodge :s905x :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 106 :B860H :s905x :meson-gxl-s905x-b860h.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :sibondt :s905x-b860h :yes 107 :Nexbox-a95x :s905x :meson-gxl-s905x-nexbox-a95x.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :khancyr :s905x-nexbox-a95x :no 108 :TX9 :s905x :meson-gxl-s905x-tx9.dtb :u-boot-s905x-s912.bin :NA :NA :100Mb-Nic,rtl8723cs-WLAN :stable/all :amlogic :meson-gxl :uEnv.txt :thumsl :s905x-tx9 :no 109 :T95,XiaoMI-3S,X96,BTV9 :s905x :meson-gxl-s905x-p212.dtb :u-boot-s905x-s912.bin :NA :NA :2G/16G,1Gb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :chris4git,shuye1728,Drafteed,rickmschulz :s905x-t95 :yes 110 :TBee :s905x :meson-gxl-s905x-tbee.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :DiogoSilva48 :s905x-tbee :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 111 :TX3-Mini,MeCool-m8s-pro-W :s905w :meson-gxl-s905w-tx3-mini.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :piotrekcrash,fgpx78 :s905w :yes 112 :W95 :s905w :meson-gxl-s905w-p281.dtb :u-boot-s905x-s912.bin :NA :NA :2GB-RAM,16GB-ROM,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :skysurf :s905w-w95 :no 113 :X96-Mini :s905w :meson-gxl-s905w-x96-mini.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :TThanhXuan :s905w-x96-mini :no 114 :X96W,FunTV,MXQ-Pro-4K :s905w :meson-gxl-s905w-x96w.dtb :u-boot-s905x-s912.bin :NA :NA :2GB-RAM,16GB-ROM,100Mb-Nic,AP6255-wifi/BT :stable/all :amlogic :meson-gxl :uEnv.txt :daniyo27,Choomai :s905w-x96w :no 115 :UNT402A,M201-S,MiBox-4C,IP108H,B860AV2.1 :s905l :meson-gxl-s905l3b-m302a.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :janko888,hzlyu123,foobarjimmy,shijifeizhai,qfnuzlr :s905l :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 116 :MG101,Mibox-4,E900V21C :s905l :meson-gxl-s905l-venz-v10.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :dz515704201,yicheng42,Jstzo2u :s905l-mg101 :yes 117 :Tencent-Aurora-1s :s905l :meson-gxl-s905x-p212.dtb :u-boot-s905x-s912.bin :NA :NA :2G/16G,1Gb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :DavidTsou :s905l-aurora-1s :no 118 :ZXV10-B860AV2.1U,HM201 :s905l :meson-gxl-s905x-tx9.dtb :u-boot-s905x-s912.bin :NA :NA :100Mb-Nic,rtl8723cs-WLAN :stable/all :amlogic :meson-gxl :uEnv.txt :DavidTsou,ASFLY61 :s905l-b860av21u :no 119 :MGV2000,MGV3000,M301A,CM201-1,IP108H :s905l2 :meson-gxl-s905l2-x7-5g.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :skysurf,texaszc,champion0117,haochn,w2xg2022 :s905l2 :yes 120 :E900v21E,MGV2000-K,e900v21d :s905l2 :meson-gxl-s905l2-x7-5g.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :lovl88,sleepwalkera,shijifeizhai :s905l2-e900v21e :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 121 :Wojia-TV-IPBS9505 :s905l2 :meson-gxl-s905l2-ipbs9505.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :marchmin :s905l2-wojia :no 122 :CM311-1,HG680-LC,M401A,UNT402A,CM201-1-6-YS :s905l3 :meson-gxl-s905l2-x7-5g.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :ours1505,1904688138,yhxxm,orientzane,tinytinycn :s905l3 :yes 123 :CM211-1,M411A,B860AV3.2M,B860AV2.1U,M301A :s905l3 :meson-gxl-s905l3b-m302a.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :Ivanriver,foobarjimmy,chiqianjiqi,shuzhizhi,JiaHeWG :s905l3-cm211 :yes 124 :UNT400G1,E900V22D-2,UNT400G,IP108H :s905l3 :meson-gxl-s905l2-x7-5g.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :signigelchan,Cp0204,bambizlu,bambizlu :s905l3-unt400g1 :no 125 :UNT402A,UNT400G :s905l3 :meson-gxl-s905l3b-m302a.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :shirakawa-poi,itdoginfo :s905l3-unt402a :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 126 :E900V21E,E900V22E,MGV2000/CW,M411A :s905l3b :meson-gxl-s905l3b-e900v22e.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :jietech17,tuzhis,locAtt,w2xg2022,siliconbanana :s905l3b-e900v22e :yes 127 :M302A,M304A,CM201-1,CM211-1,CM311-1 :s905l3b :meson-gxl-s905l3b-m302a.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :janko888,wgbingo,God-JohnDiamond,peagsus :s905l3b :yes 128 :UNT403A :s905l3b :meson-gxl-s905l3b-m302a.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :yycvip :s905l3b-unt403a :no 129 :RG020ET-CA :s905l3b :meson-gxl-s905l3b-e900v22e.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :shijifeizhai :s905l3b-rg020et-ca :no 130 :IP103H,TY1608,BV310,B860AV-2.1M :s905l3b :meson-gxl-s905l3b-m302a.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :gbsadmin,Jeagarm,w2xg2022,aolin2000 :s905l3b-ip103h :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 131 :E900V22D,TY1608 :s905l3b :meson-gxl-s905l2-x7-5g.dtb :u-boot-s905x-s912.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :piaoliuchong,aaftio :s905l3b-e900v22d :no 132 :E900V21D :s905l3b :meson-gxl-s905l2-x7-5g.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :Leona233 :s905l3b-e900v21d :no 133 :S65 :s905mb :meson-gxl-s905x-p212.dtb :u-boot-r3300l.bin :r3300l-u-boot.bin.sd.bin :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :shijifeizhai :s905mb :no 134 :BesTV-R3300L,SumaVision-Q7,MG101 :s905lb :meson-gxl-s905x-p212.dtb :u-boot-r3300l.bin :r3300l-u-boot.bin.sd.bin :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :7Ji,taotao108,aaftio :s905lb-r3300l :yes 135 :Q96-mini :s905lb :meson-gxl-s905x-p212.dtb :u-boot-s905x-s912.bin :NA :NA :1G/8G,100Mb-Nic :stable/all :amlogic :meson-gxl :uEnv.txt :CarlKuhligk :s905lb-q96-mini :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 136 :IPBS9505 :s905lb :meson-gxl-s905l2-x7-5g.dtb :u-boot-p212.bin :NA :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-gxl :extlinux.conf :Hx0531 :s905lb-ipbs9505 :no # Amlogic GXM Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 201 :Octopus-Planet,OneCloudPro-V1.1,Tanix-TX9S :s912 :meson-gxm-octopus-planet.dtb :u-boot-zyxq.bin :NA :NA :2GB-Mem,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :unifreq,longjuanfeng05,Eksol :s912 :yes 202 :Octopus-Planet(FAKE) :s912 :meson-gxm-octopus-planet.dtb :u-boot-zyxq.bin :NA :bl-fake-octopus-planet.bin :2GB-Mem,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :unifreq,lanyucomputer :s912-zyxq-fake :no 203 :H96-Pro-Plus,TX92,Z6-Plus :s912 :meson-gxm-octopus-planet.dtb :u-boot-zyxq.bin :NA :NA :2G/32G,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :unifreq,ErikPelli :s912-h96pro-plus :no 204 :Vontar-X92 :s912 :meson-gxm-x92.dtb :u-boot-p212.bin :NA :NA :3GB-RAM,16GB/32GB-eMMC,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :d5stick :s912-x92 :yes 205 :Phicomm-T1 :s912 :meson-gxm-phicomm-t1.dtb :u-boot-s905x-s912.bin :NA :NA :2G-RAM,16G-ROM,100Mb-Nic,Wifi,Bluetooth :stable/all :amlogic :meson-gxm :uEnv.txt :birdxs :s912-phicomm-t1 :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 206 :MECOOL-M8S-Pro-L,TX3-Mini :s912 :meson-gxm-q201.dtb :u-boot-s905x-s912.bin :NA :NA :2G/3G-RAM,16G/32G-ROM,100Mb-Nic :stable/all :amlogic :meson-gxm :extlinux.conf :parkjw0117,phuonganh2601 :s912-m8s-pro :yes 207 :T95Z-Plus :s912 :meson-gxm-t95z-plus.dtb :u-boot-s905x-s912.bin :NA :NA :3G+32G,1Gb-Nic :stable/all :amlogic :meson-gxm :extlinux.conf :NewbieOrange :s912-t95z-plus :yes 208 :TX9-Pro(3G_32G_1Gb) :s912 :meson-gxm-tx9-pro.dtb :u-boot-zyxq.bin :NA :NA :3G-RAM,32G-ROM,1Gb-Nic,brcm43455-wifi :stable/all :amlogic :meson-gxm :uEnv.txt :unifreq,Smim0 :s912-tx9-pro-3g :no 209 :TX9-Pro(2G_16G_100Mb) :s912 :meson-gxm-q201.dtb :u-boot-p212.bin :NA :NA :3G-RAM,32G-ROM,100Mb-Nic,RTL8189ETV-wifi :stable/all :amlogic :meson-gxm :uEnv.txt :rainups :s912-tx9-pro-2g :no 210 :Nexbox-A1,A95X :s912 :meson-gxm-nexbox-a1.dtb :u-boot-p212.bin :NA :NA :2G-DDR3-RAM,16G-eMMC,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :kodokskoprol :s912-nexbox-a1 :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 211 :Nexbox-A95X-A2 :s912 :meson-gxm-nexbox-a2.dtb :u-boot-p212.bin :NA :NA :2GB-RAM,16GB-ROM,2.4G/5.0G-WiFi,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :sibondt :s912-nexbox-a2 :no 212 :Tanix-TX8-MAX :s912 :meson-gxm-tx8-max.dtb :u-boot-p212.bin :NA :NA :3GB-RAM,16GB/32GB-eMMC,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :Fengke6 :s912-tx8-max :no 213 :[IDL],OneCloudPro-V1.2 :s912 :meson-gxm-octopus-planet.dtb :u-boot-zyxq.bin :NA :NA :2GB-Mem,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :unifreq,longjuanfeng05 :s912-onecloudpro :no 214 :[IDL],OneCloudPro-V1.2-Flash-NewOS :s912 :meson-gxm-octopus-planet.dtb :u-boot-zyxq.bin :NA :NA :2GB-Mem,1Gb-Nic :stable/all :amlogic :meson-gxm :uEnv.txt :unifreq,longjuanfeng05,lanlanpy,Asxcvbn :s912-onecloudpro-2 :no # Amlogic G12A Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 301 :X96-Max-4GB,Tx5-Max :s905x2 :meson-g12a-x96-max.dtb :u-boot-x96max.bin :x96max-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic :stable/all :amlogic :meson-g12a :uEnv.txt :mreser99 :s905x2 :yes 302 :X96-Max-2GB,A95X-F2 :s905x2 :meson-g12a-x96-max-rmii.dtb :u-boot-x96max.bin :x96max-u-boot.bin.sd.bin :NA :2GB-Mem,100Mb-Nic :stable/all :amlogic :meson-g12a :uEnv.txt :RomanKozyrev :s905x2-x96max-2g :no 303 :MECOOL-KM3-4G :s905x2 :meson-g12a-sei510.dtb :u-boot-x96max.bin :x96max-u-boot.bin.sd.bin :NA :4+64G/128G,100Mb-Nic :stable/all :amlogic :meson-g12a :uEnv.txt :flymike :s905x2-km3 :no 304 :[IDL],E900V22C-D,CM311-1a-CH,IP112H,B863AV3.1 :s905l3a :meson-g12a-s905l3a-e900v22c.dtb :u-boot-e900v22c.bin :NA :NA :4+64G/128G,100Mb-Nic :stable/all :amlogic :meson-g12a :uEnv.txt :Calmact,KryptonLee,yu6zhou,orientzane,AboutCXJ :s905l3a :yes 305 :[IDL],CM311-1a-YST :s905l3a :meson-g12a-s905l3a-cm311.dtb :u-boot-e900v22c.bin :NA :NA :2+16G,BT-rtl8761b,100Mb-Nic :stable/all :amlogic :meson-g12a :uEnv.txt :xcray :s905l3a-cm311 :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 306 :M401A,UNT403A,B863AV3.2-M :s905l3a :meson-g12a-s905l3a-m401a.dtb :u-boot-e900v22c.bin :NA :NA :2+16G,100Mb-Nic :stable/all :amlogic :meson-g12a :uEnv.txt :janko888,yangzhuang2333,OPMonday :s905l3a-m401a :no 307 :HG680-FJ :s905x2 :meson-g12a-hg680-fj.dtb :u-boot-x96max.bin :x96max-u-boot.bin.sd.bin :NA :2+8G,100Mb-Nic :stable/all :amlogic :meson-g12a :uEnv.txt :sibondt :s905x2-hg680fj :yes # Amlogic G12B Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 401 :Khadas-VIM3 :a311d :meson-g12b-a311d-khadas-vim3.dtb :u-boot-gtkingpro.bin :khadas-vim3-u-boot.sd.bin :NA :1Gb-Nic,brcm4398-wifi :stable/all :amlogic :meson-g12b :uEnv.txt :darkliang :a311d :yes 402 :GT-King :s922x :meson-g12b-gtking.dtb :u-boot-gtking.bin :gtking-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm4356-wifi :stable/all :amlogic :meson-g12b :uEnv.txt :unifreq :s922x-gtking :no 403 :GT-King-Pro,X88-King :s922x :meson-g12b-gtking-pro.dtb :u-boot-gtkingpro.bin :gtkingpro-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm4356-wifi :stable/all :amlogic :meson-g12b :uEnv.txt :unifreq,JordanPlayz158 :s922x :yes 404 :GT-King-Pro-H :s922x :meson-g12b-gtking-pro-h.dtb :u-boot-gtkingpro.bin :gtkingpro-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm4356-wifi :stable/all :amlogic :meson-g12b :uEnv.txt :unifreq :s922x-gtkingpro-h :no 405 :GT-King-Pro-Rev_A :s922x :meson-g12b-gtking-pro-rev_a.dtb :u-boot-gtkingpro-rev-a.bin :NA :NA :4GB-Mem,1Gb-Nic,brcm4356-wifi :stable/all :amlogic :meson-g12b :uEnv.txt :unifreq,JFLim1 :s922x-reva :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 406 :UGOOS-AM6-Plus :s922x :meson-g12b-ugoos-am6.dtb :u-boot-gtkingpro.bin :gtkingpro-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm4398-wifi :stable/all :amlogic :meson-g12b :uEnv.txt :unifreq :s922x-ugoos-am6 :no 407 :Hardkernel-ODroid-N2 :s922x :meson-g12b-odroid-n2.dtb :u-boot-gtkingpro.bin :odroid-n2-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic :stable/all :amlogic :meson-g12b :uEnv.txt :unifreq :s922x-odroid-n2 :no 408 :Ali-CT2000 :s922x :meson-g12b-ali-ct2000.dtb :u-boot-s905x2-s922.bin :NA :NA :4GB-Mem,16GB-eMMC,1Gb-Nic,Bluetooth,wifi :stable/all :amlogic :meson-g12b :uEnv.txt :unifreq :s922x-ct2000 :yes 409 :[IDL],WXY-OES :a311d :meson-g12b-a311d-oes-a.dtb :u-boot-s905x2-s922.bin :NA :NA :4GB-Mem,8GB-eMMC,3xSATA,1Gb-Nic :stable/all :amlogic :meson-g12b :uEnv.txt :retro98boy,beixiang,Arthur97172,Bluehei,ZZH-wl :a311d-oes :yes 410 :[IDL],WXY-OES-Plus :s922x :meson-g12b-s922x-oes-plus-b.dtb :u-boot-s905x2-s922.bin :NA :NA :4GB-Mem,8GB-eMMC,3xSATA,1Gb-Nic,300MB-Nic :stable/all :amlogic :meson-g12b :uEnv.txt :retro98boy,zjycb,caojiezi2003,yesterday666,yaodmin :s922x-oes-plus :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # Amlogic SM1 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 501 :X96-Max+_100Mb :s905x3 :meson-sm1-x96-max-plus-100m.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,1Gb-Nic,rtl8822cs-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3 :yes 502 :X96-Max+_1GB :s905x3 :meson-sm1-x96-max-plus.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,1Gb-Nic,rtl8822cs-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-x96max :no 503 :X96-Max+(OverClock) :s905x3 :meson-sm1-x96-max-plus-oc.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,1Gb-Nic,rtl8822cs-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-x96max-oc :no 504 :X96-Max+(IP1001M) :s905x3 :meson-sm1-x96-max-plus-ip1001m.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,1Gb-Nic(IP1001M),brcm4354-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq,psergeevich :s905x3-ip1001m :no 505 :X96-Max+_A100 :s905x3 :meson-sm1-x96-max-plus-a100.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,32G-Rom,Wifi-AM7256,100Mb-Nic :stable/all :amlogic :meson-sm1 :uEnv.txt :dicsonpan,taras-filatov :s905x3-a100 :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 506 :X96-Max+_2101 :s905x3 :meson-sm1-x96-max-plus-2101.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,32G-Rom,Wifi/BT,1Gb-Nic(JL2xx1) :stable/all :amlogic :meson-sm1 :uEnv.txt :salsabilng :s905x3-2101 :no 507 :X96-Max+Q1 :s905x3 :meson-sm1-x96-max-plus-q1.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,32G-Rom,Wifi-work,100Mb-Nic :stable/all :amlogic :meson-sm1 :uEnv.txt :tv4you2016 :s905x3-q1 :no 508 :X96-Max+Q2,X96-Air-Q1000 :s905x3 :meson-sm1-x96-max-plus-q2.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,1Gb-Nic,qca9377-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :danboid :s905x3-q2 :no 509 :X96-Air-1Gb :s905x3 :meson-sm1-x96-air-gbit.dtb :u-boot-x96maxplus.bin :NA :NA :2GB-Mem,1Gb-Nic,Wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-x96air-gb :no 510 :X96-Air,X96-Max+100W,100Mb :s905x3 :meson-sm1-x96-air.dtb :u-boot-x96maxplus.bin :NA :NA :2GB-Mem,100Mb-Nic,Wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :trvqhuy :s905x3-x96air :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 511 :Tencent-Aurora-3Pro :s905x3 :meson-sm1-skyworth-lb2004-a4091.dtb :u-boot-skyworth-lb2004.bin :skyworth-lb2004-u-boot.bin.sd.bin :skyworth-lb2004-bootloader.img :4GB-Mem,32G-Rom,1Gb-Nic(JL2xx1) :stable/all :amlogic :meson-sm1 :uEnv.txt :livelier :s905x3-b :no 512 :HK1-Box,Vontar-X3 :s905x3 :meson-sm1-hk1box-vontar-x3.dtb :u-boot-x96maxplus.bin :hk1box-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm4339-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :d5stick :s905x3-hk1 :no 513 :HK1-Box(OverClock) :s905x3 :meson-sm1-hk1box-vontar-x3-oc.dtb :u-boot-x96maxplus.bin :hk1box-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm4339-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-hk1-oc :no 514 :H96-Max-X3,Infinity-B32 :s905x3 :meson-sm1-h96-max-x3.dtb :u-boot-x96maxplus.bin :h96maxx3-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm4339-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :ketaksaan :s905x3-h96max :no 515 :H96-Max-X3(OverClock),B32 :s905x3 :meson-sm1-h96-max-x3-oc.dtb :u-boot-x96maxplus.bin :h96maxx3-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm4339-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-h96max-oc :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 516 :Ugoos-X3 :s905x3 :meson-sm1-ugoos-x3.dtb :u-boot-ugoos-x3.bin :ugoos-x3-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm43455/43456-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq,livelier :s905x3-ugoosx3 :no 517 :Ugoos-X3(OverClock) :s905x3 :meson-sm1-ugoos-x3-oc.dtb :u-boot-ugoos-x3.bin :ugoos-x3-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,brcm43455/43456-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq,livelier :s905x3-ugoosx3-oc :no 518 :TX3-1Gb :s905x3 :meson-sm1-tx3-qz.dtb :u-boot-tx3-qz.bin :x96maxplus-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,bcm4330-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-tx3 :no 519 :TX3-1Gb(OverClock) :s905x3 :meson-sm1-tx3-qz-oc.dtb :u-boot-tx3-qz.bin :x96maxplus-u-boot.bin.sd.bin :NA :4GB-Mem,1Gb-Nic,bcm4330-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-tx3-oc :no 520 :TX3-100Mb :s905x3 :meson-sm1-tx3-bz.dtb :u-boot-tx3-bz.bin :x96maxplus-u-boot.bin.sd.bin :NA :4GB-Mem,100Mb-Nic,bcm4330-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq,irfanjunaid :s905x3-tx3-bz :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 521 :TX3-100Mb(OverClock) :s905x3 :meson-sm1-tx3-bz-oc.dtb :u-boot-tx3-bz.bin :x96maxplus-u-boot.bin.sd.bin :NA :4GB-Mem,100Mb-Nic,bcm4330-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-tx3-bz-oc :no 522 :A95XF3-Air-1Gb :s905x3 :meson-sm1-a95xf3-air-gbit.dtb :u-boot-x96maxplus.bin :NA :NA :2GB-Mem,1Gb-Nic,Wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq :s905x3-a95xf3-gb :no 523 :A95XF3-Air-100Mb :s905x3 :meson-sm1-a95xf3-air.dtb :u-boot-x96maxplus.bin :NA :NA :2GB-Mem,100Mb-Nic,Wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :unifreq,Pat-78 :s905x3-a95xf3 :no 524 :X88-Pro-X3,X99-Max+,Transpeed-X3+ :s905x3 :meson-sm1-x88-pro-x3.dtb :u-boot-x96maxplus.bin :x88prox3-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,1Gb-Nic,qca9377-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :araczkowski :s905x3-x88-pro-x3 :yes 525 :[IDL],Whale :s905x3 :meson-sm1-x96-max-plus.dtb :u-boot-x96maxplus.bin :x96maxplus-u-boot.bin.sd.bin :hk1box-bootloader.img :4GB-Mem,64G-Rom,1Gb-Nic,rtl8822cs-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :9runner :s905x3-whale :no #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- 526 :TOX1 :s905x3 :meson-sm1-tox1.dtb :u-boot-x96maxplus.bin :hk1box-u-boot.bin.sd.bin :NA :4GB-Mem,32GB-eMMC,1Gb-Nic,RTL8822BS-wifi :stable/all :amlogic :meson-sm1 :uEnv.txt :infirms,devmfc :s905x3-tox1 :no # Amlogic GXBB Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- a01 :Sunvell-T95M,SumaVision-Q5 :s905 :meson-gxbb-p201.dtb :u-boot-s905.bin :NA :NA :2GB-RAM,16GB-ROM,1Gb-Nic :stable/all :amlogic :meson-gxbb :extlinux.conf :puccio823,qianbinbin :s905 :yes a02 :MXQ-Pro+ :s905 :meson-gxbb-mxq-pro-plus.dtb :u-boot-p201.bin :NA :NA :2GB-DDR3,8G-eMMC,100Mb-Nic :stable/all :amlogic :meson-gxbb :uEnv.txt :unifreq :s905-mxqpro-plus :no a03 :Beelink-Mini-MX-2G :s905 :meson-gxbb-beelink-mini-mx.dtb :u-boot-s905.bin :NA :NA :2GB-RAM,16GB-ROM,1Gb-Nic :stable/all :amlogic :meson-gxbb :uEnv.txt :flymike,atsdai :s905-beelink-mini :no # Rockchip RK3588/RK3588S Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r101 :Rock5B :rk3588 :rk3588-rock-5b.dtb :NA :u-boot.itb :idbloader.img :Oct-core,4/8/16GB-RAM,2.5Gb-Nic :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :unifreq :rock5b :yes r102 :IPC-R :rk3588 :rk3588-beelink-ipc-r.dtb :NA :u-boot.itb :idbloader.img :8GB-LPDDR4,4x1Gb-Nic,2x2.5Gb-Nic,BT,wifi :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :gwx11111111 :ipc-r :no r103 :HLink-H88K :rk3588 :rk3588-hlink-h88k.dtb :NA :NA :rk3588-h88k-bootloader.bin :8GB-LPDDR4,32GB-eMMC,1Gb/2.5Gb-Nic :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :unifreq :h88k :yes r104 :HLink-H88K-V3 :rk3588 :rk3588-hlink-h88k-v31.dtb :NA :u-boot.itb :idbloader.img :8GB-LPDDR4,32GB-eMMC,1Gb/2.5Gb-Nic :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :unifreq :h88k-v3 :yes r105 :Rock5C :rk3588s :rk3588s-rock-5c.dtb :NA :u-boot.itb :idbloader.img :4/8/16/32GB-LPDDR4x-RAM,NVMe,2.5Gb-Nic :rk3588/6.1.y :rockchip :rk3588s :armbianEnv.txt :unifreq :rock5c :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r106 :Orange-Pi-5-Plus :rk3588 :rk3588-orangepi-5-plus.dtb :NA :u-boot.itb :idbloader.img :Oct-core,4/8/16GB-RAM,2.5Gb-Nic :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :yonggedebaqi :orangepi-5-plus :yes r107 :NanoPC-T6 :rk3588 :rk3588-nanopc-t6.dtb :NA :u-boot.itb :idbloader.img :4/8/16GB-RAM,32/64/256Gb-ROM,2x2.5Gb-Nic :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :hunter24099 :nanopc-t6 :yes r108 :Smart-Am60 :rk3588 :rk3588-smart-am60.dtb :NA :u-boot.itb :idbloader.img :8/16GB-RAM,64/256Gb-ROM,1Gb-Nic :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :dy008 :smart-am60 :yes r109 :DC-A588 :rk3588 :rk3588-dc-a588.dtb :NA :u-boot.itb :idbloader.img :4/8/16GB-RAM,16~128Gb-eMMC,TF,2x1Gb-Nic :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :AndroidOL,Lemon1151 :dc-a588 :yes r110 :Orange-Pi-5B :rk3588s :rk3588s-orangepi-5b.dtb :NA :u-boot.itb :idbloader.img :4/8/16GB-RAM,16~256Gb-eMMC,TF,1Gb-Nic :rk3588/6.1.y :rockchip :rk3588s :armbianEnv.txt :lighthx :orangepi-5b :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r111 :FriendlyElec-CM3588-NAS :rk3588 :rk3588-friendlyelec-cm3588-nas.dtb :NA :NA :u-boot-rockchip.bin :4/8/16GB-RAM,64Gb-eMMC,4xNVMe,1x2.5Gb-Nic :rk3588/6.1.y :rockchip :rk3588 :armbianEnv.txt :dengweiwen :cm3588-nas :yes r112 :Rock-5-ITX :rk3588 :rk3588-rock-5-itx.dtb :NA :u-boot.itb :idbloader.img :8~32GB-RAM,8Gb-eMMC,4xSATA,2x2.5Gb-Nic :stable/6.12.y :rockchip :rk3588 :armbianEnv.txt :lentll :rock-5-itx :yes r113 :LZ-D3588 :rk3588 :rk3588-lz-d3588.dtb :NA :u-boot.itb :idbloader.img :8GB-RAM,64Gb-eMMC,TF,2x1Gb-Nic :stable/6.12.y :rockchip :rk3588 :armbianEnv.txt :Crazh3 :lz-d3588 :yes r114 :Boca-tcn100 :rk3588s :rk3588s-boca-tcn100.dtb :NA :u-boot.itb :idbloader.img :8/16GB-RAM,32Gb-eMMC,NVMe,1Gb-Nic :rk3588/6.1.y :rockchip :rk3588s :armbianEnv.txt :nblky :boca-tcn100 :yes # Rockchip RK3568 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r201 :R66S :rk3568 :rk3568-fastrhino-r66s.dtb :NA :u-boot.itb :idbloader.img :2/4GB-LPDDR4,TF,2x2.5Gb-Nic :rk35xx/6.1.y :rockchip :rk3568 :armbianEnv.txt :unifreq :r66s :yes r202 :R68S :rk3568 :rk3568-fastrhino-r68s.dtb :NA :NA :bootloader.bin :1/2GB-LPDDR4,16G-eMMC,2x1Gb/2x2.5Gb-Nic :rk35xx/6.1.y :rockchip :rk3568 :armbianEnv.txt :unifreq :r68s :yes r203 :E25 :rk3568 :rk3568-radxa-e25.dtb :NA :u-boot.itb :idbloader.img :1/4/8GB-LPDDR4,SD/M.2-SSD,2x2.5Gb-Nic :rk35xx/6.1.y :rockchip :rk3568 :armbianEnv.txt :unifreq :e25 :yes r204 :NanoPi-R5S :rk3568 :rk3568-nanopi-r5s.dtb :NA :u-boot.itb :idbloader.img :2/4GB-RAM,8/16G-eMMC,2x2.5Gb/1Gb-Nic :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :buglloc :nanopi-r5s :yes r205 :NanoPi-R5C :rk3568 :rk3568-nanopi-r5c.dtb :NA :u-boot.itb :idbloader.img :2/4GB-RAM,8/16G-eMMC,2x2.5Gb/1Gb-Nic :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :kongjun0,inindev :nanopi-r5c :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r206 :HLink-H66K :rk3568 :rk3568-hlink-h66k.dtb :NA :NA :bootloader.bin :2/4GB-LPDDR4,32G-eMMC,2x2.5Gb-Nic :rk35xx/6.1.y :rockchip :rk3568 :armbianEnv.txt :unifreq :h66k :yes r207 :HLink-H68K :rk3568 :rk3568-hlink-h68k.dtb :NA :NA :bootloader.bin :2/4GB-LPDDR4,32G-eMMC,2x1Gb/2x2.5Gb-Nic :rk35xx/6.1.y :rockchip :rk3568 :armbianEnv.txt :unifreq :h68k :yes r208 :HLink-H69K :rk3568 :rk3568-hlink-h69k.dtb :NA :NA :bootloader.bin :2/4GB-LPDDR4,32G-eMMC,2x1Gb/2x2.5Gb-Nic :rk35xx/6.1.y :rockchip :rk3568 :armbianEnv.txt :unifreq :h69k :yes r209 :Seewo-sv21 :rk3568 :rk3568-seewo-sv21.dtb :NA :u-boot.itb :idbloader.img :2GB-DDR4,32G-eMMC,2x1Gb :stable/6.12.y :rockchip :rk3568 :extlinux.conf :sehczaa :seewo-sv21 :yes r210 :Mrkaio-m68s :rk3568 :rk3568-mrkaio-m68s.dtb :NA :u-boot.itb :idbloader.img :2GB-DDR4,8G-eMMC,2x1Gb :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :bnaand :mrkaio-m68s :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r211 :Swan1-w28 :rk3568 :rk3568-swan1-w28.dtb :NA :u-boot.itb :idbloader.img :2GB-DDR4,16G-eMMC,1x1Gb,BT,wifi :rk35xx/6.1.y :rockchip :rk3568 :armbianEnv.txt :dy008 :swan1-w28 :yes r212 :Ruisen-box :rk3568 :rk3568-ruisen-box.dtb :NA :NA :bootloader.bin :4GB-LPDDR4,32G-eMMC,2x1Gb,SATA3.0 :rk35xx/6.1.y :rockchip :rk3568 :armbianEnv.txt :Xianleewu,ysuolmai :ruisen-box :yes r213 :DG-TN3568 :rk3568 :rk3568-dg-tn3568.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,32G-eMMC,1x1Gb,SATA3.0 :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :stevenliuit :dg-tn3568 :yes r214 :Alark35-3500 :rk3568 :rk3568-alark35-3500.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,32G-eMMC,100Mb-Nic :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :stevenliuit :alark35-3500 :yes r215 :MMBox-Anas3035 :rk3568 :rk3568-mmbox-anas3035.dtb :NA :NA :u-boot-rockchip.bin :4GB-LPDDR4,32G-eMMC,3xSATA,2x2.5Gb-Nic :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :ritech :anas3035 :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r216 :Wocyber-A3 :rk3568 :rk3568-wocyber-a3.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,128G-eMMC,1xSATA,1Gb-Nic :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :Arthur97172 :wocyber-a3 :yes r217 :photonicat :rk3568 :rk3568-photonicat.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,256G-eMMC,wifi,1Gb-Nic :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :sib0ndt :photonicat :yes r218 :NSY-G16-Plus :rk3568 :rk3568-nsy-g16-plus.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,256G-eMMC,NVMe,wifi,5x1Gb-Nic :stable/6.12.y :rockchip :rk3568 :extlinux.conf :liubei1998,xiaomeng9597,linai081795 :nsy-g16-plus :yes r219 :NSY-G68-Plus :rk3568 :rk3568-nsy-g68-plus.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,256G-eMMC,NVMe,wifi,5x1Gb-Nic :stable/6.12.y :rockchip :rk3568 :extlinux.conf :liubei1998,xiaomeng9597,maojun1998,nanosunny,faq110 :nsy-g68-plus :yes r220 :BDY-G18-Pro :rk3568 :rk3568-bdy-g18-pro.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,256G-eMMC,NVMe,wifi,5x1Gb-Nic :stable/6.12.y :rockchip :rk3568 :extlinux.conf :liubei1998,xiaomeng9597,linai081795 :bdy-g18-pro :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r221 :Gzpeite-P01 :rk3568 :rk3568-gzpeite.dtb :NA :u-boot.itb :idbloader.img :2~8GB-LPDDR4,16~64G-eMMC,NVMe,2x1Gb-Nic :rk35xx/6.1.y :rockchip :rk3568 :extlinux.conf :lakalin :gzpeite-p01 :yes r222 :LZ-K3568 :rk3568 :rk3568-lz-k3568.dtb :NA :u-boot.itb :idbloader.img :8GB-LPDDR4,128G-eMMC,TF,2x1Gb-Nic :stable/6.12.y :rockchip :rk3568 :extlinux.conf :zzhccv1234 :lz-k3568 :yes r223 :BDKJ-One :rk3568 :rk3568-bd-one.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,8G-eMMC,2xSATA,NVMe,6x1Gb-Nic :stable/6.12.y :rockchip :rk3568 :extlinux.conf :a1303045940 :bdkj-bd-one :yes r224 :Station-P2 :rk3568 :rk3568-roc-pc.dtb :NA :NA :u-boot-rockchip.bin :2~8GB-LPDDR4,eMMC,SATA,NVMe,TF,2x1Gb-Nic :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :Javier :station-p2 :yes r225 :LZ-D3568 :rk3568 :rk3568-lz-d3568-v3.dtb :NA :u-boot.itb :idbloader.img :8GB-LPDDR4,128G-eMMC,TF,2x1Gb-Nic :stable/6.12.y :rockchip :rk3568 :extlinux.conf :MaxCrazy1101 :lz-d3568 :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r226 :Lyt-t68m :rk3568 :rk3568-lyt-t68m.dtb :NA :u-boot.itb :idbloader.img :2GB-RAM,32G-eMMC,TF,2x1Gb-Nic,2x2.5Gb-Nic :stable/6.12.y :rockchip :rk3568 :armbianEnv.txt :OlivInk :lyt-t68m :yes # Rockchip RK3566 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG/ENV 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r301 :Panther-X2 :rk3566 :rk3566-panther-x2.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,32G-eMMC,64G-TF,2x1Gb-Nic :stable/6.12.y :rockchip :rk3566 :armbianEnv.txt :tdleiyao :panther-x2 :yes r302 :JP-TvBox :rk3566 :rk3566-jp-tvbox.dtb :NA :u-boot.itb :idbloader.img :8GB-LPDDR4,32G-eMMC,SATA,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3566 :armbianEnv.txt :unifreq :jp-tvbox :yes r303 :LCKFB-Taishan-Pi :rk3566 :rk3566-taishanpi-v10.dtb :NA :u-boot.itb :idbloader.img :2GB-LPDDR4,16G-eMMC,SATA,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3566 :armbianEnv.txt :ccu6 :lckfb-tspi :yes r304 :[IDL],WXY-OEC-turbo-4g(Replaced-Chip-eMMC) :rk3566 :rk3566-wxy-oec-turbo-4g.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,Replaced-eMMC,1xSATA,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3566 :extlinux.conf :andyfanybo,dd-ray :wxy-oect-mod :no r305 :Station-M2 :rk3566 :rk3566-roc-pc.dtb :NA :NA :u-boot-rockchip.bin :2GB-LPDDR4,32G-eMMC,NVMe,TF,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3566 :armbianEnv.txt :Kwonelee :station-m2 :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r306 :[IDL],WXY-OEC-turbo-4g(Original-Edition) :rk3566 :rk3566-wxy-oec-turbo-4g.dtb :NA :NA :bootloader.bin :4GB-LPDDR4,8G-eMMC,1xSATA,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3566 :extlinux.conf :dd-ray,hoiw :wxy-oect :yes r307 :Orange-Pi-3B :rk3566 :rk3566-orangepi-3b.dtb :NA :NA :u-boot-rockchip.bin :2/4/8GB-LPDDR4,16~256G-eMMC,TF,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3566 :extlinux.conf :GinRyan :orangepi-3b :yes # Rockchip RK3399 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r401 :EAIDK-610 :rk3399 :rk3399-eaidk-610.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR3,16G-eMMC,128GB-SD,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3399 :armbianEnv.txt :13584452567 :eaidk-610 :yes r402 :King3399 :rk3399 :rk3399-king3399.dtb :trust.bin :uboot.img :idbloader.bin :2GB/4GB-DDR3,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :13584452567 :king3399 :yes r403 :TN3399 :rk3399 :rk3399-tn3399-v3.dtb :trust.bin :uboot.img :idbloader.bin :4GB-DDR3,16G-eMMC,1Gb-Nic,WIFI/BT(AP6255) :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :13584452567 :tn3399 :yes r404 :Kylin3399 :rk3399 :rk3399-kylin3399.dtb :trust.bin :uboot.img :idbloader.bin :4GB-DDR3,32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :13584452567 :kylin3399 :yes r405 :ZCube1-Max :rk3399 :rk3399-zcube1-max.dtb :trust.bin :uboot.img :idbloader.bin :2GB-DDR3,16G-eMMC,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3399 :armbianEnv.txt :13584452567 :zcube1-max :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r406 :tvi3315a :rk3399 :rk3399-tvi3315a.dtb :trust.bin :uboot.img :idbloader.bin :4GB-LPDDR3,16G-eMMC,1Gb-Nic,mini PCIe :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :13584452567 :tvi3315a :yes r407 :xiaobao :rk3399 :rk3399-xiaobao.dtb :trust.bin :uboot.img :idbloader.bin :4GB-DDR3,16G-eMMC,1Gb-Nic,SATA,TF :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :13584452567,Lemon1151 :xiaobao :yes r408 :SMART-AM40 :rk3399 :rk3399-smart-am40.dtb :trust.bin :uboot.img :idbloader.bin :4GB-DDR3,32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :GD2021 :smart-am40 :yes r409 :CRRC :rk3399 :rk3399-crrc.dtb :trust.bin :uboot.img :idbloader.bin :2GB-DDR3,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :GD2021 :crrc :yes r410 :ZYSJ :rk3399 :rk3399-zysj.dtb :trust.bin :uboot.img :idbloader.bin :2GB/4GB-LPDDR3,8G/128G-eMMC,TF,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :cm9vdA,GD2021,Lemon1151 :zysj :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r411 :Dilusense-DLFR100 :rk3399 :rk3399-dlfr100.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR3,32G-eMMC,2x1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :cm9vdA,chamoyo :dlfr100 :yes r412 :EMB3531 :rk3399 :rk3399-emb3531.dtb :trust.bin :uboot.img :idbloader.bin :2GB-DDR3,32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :rongchuan17 :emb3531 :yes r413 :Leez-P710 :rk3399 :rk3399-leez-p710.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :cm9vdA,inoeud :leez :yes r414 :Firefly-RK3399 :rk3399 :rk3399-firefly.dtb :trust.bin :uboot.img :idbloader.bin :2GB/4GB-DDR3,16G/32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :extlinux.conf :150balbes,liaoya :firefly-rk3399 :yes r415 :DG-3399 :rk3399 :rk3399-dg3399.dtb :trust.bin :uboot.img :idbloader.bin :2GB/4GB-DDR3,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :lauren12133 :dg3399 :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r416 :Fine3399 :rk3399 :rk3399-fine3399.dtb :trust.bin :uboot.img :idbloader.bin :4GB-RAM,8G/16G/64G/128G-eMMC,TF,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :cm9vdA,r1172464137,Lemon1151,QXY716 :fine3399 :yes r417 :SW799 :rk3399 :rk3399-bozz-sw799.dtb :trust.bin :uboot.img :idbloader.bin :4GB-DDR3,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :inoeud :sw799 :yes r418 :LX-R3S :rk3399 :rk3399-lx-r3s.dtb :trust.bin :uboot.img :idbloader.bin :2GB/4GB-DDR3,6G/16G/32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :cm9vdA,kuuer :lx-r3s :yes r419 :Hugsun-X99 :rk3399 :rk3399-hugsun-x99.dtb :trust.bin :uboot.img :idbloader.bin :4GB-DDR3,32/64G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :yao-weijie :hugsun-x99 :yes r420 :Tb-ls3399 :rk3399 :rk3399-tb-ls3399.dtb :trust.bin :uboot.img :idbloader.bin :2GB-DDR3,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :chute8427 :tb-ls3399 :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r421 :Hisense-hs530r :rk3399 :rk3399-hs530r.dtb :NA :u-boot.itb :idbloader.img :4GB-RAM,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :hunter24099 :hs530r :yes r422 :Tpm312 :rk3399 :rk3399-tpm312.dtb :trust.bin :uboot.img :idbloader.bin :4GB-RAM,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :Lemon1151,wanglixiang90,robinZhao :tpm312 :yes r423 :ZK-rk39a :rk3399 :rk3399-zk-r39a.dtb :trust.bin :uboot.img :idbloader.bin :4GB-RAM,32/64G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :hunter24099 :zk-r39a :yes r424 :YSKJ :rk3399 :rk3399-yskj.dtb :trust.bin :uboot.img :idbloader.bin :4GB-RAM,32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :zakuwaki :yskj :yes r425 :Fmx1-Pro :rk3399 :rk3399-fmx1-pro.dtb :NA :u-boot.itb :idbloader.img :4GB-RAM,32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :extlinux.conf :doyoman :fmx1-pro :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r426 :GEA-6319 :rk3399 :rk3399-gea6319.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR3,8/16/32G-eMMC,SD,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :Lemon1151,zaichou,hunter24099 :gea-6319 :yes r427 :AIO-3399b :rk3399 :rk3399-aio-3399b.dtb :NA :u-boot.itb :idbloader.img :2GB/4GB-RAM,8G/16G/32G/64G-eMMC,TF,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :TheRepublicOfChina :aio-3399b :yes r428 :TaraM :rk3399 :rk3399-taram.dtb :trust.bin :uboot.img :idbloader.bin :4GB-RAM,32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :chongshengB :taram :yes r429 :Fmx1-Pro-B :rk3399 :rk3399-fmx1-pro-b.dtb :trust.bin :uboot.img :idbloader.bin :4GB-RAM,32G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :chengdataon-source,179156054 :fmx1-pro-b :yes r430 :NanoPC-T4 :rk3399 :rk3399-nanopc-t4.dtb :trust.bin :uboot.img :idbloader.bin :4GB-RAM,64G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :cnMeeko :nanopc-t4 :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r431 :Firefly-Core-3399-JD4 :rk3399 :rk3399-firefly-core-3399-jd4.dtb :trust.bin :uboot.img :idbloader.bin :2/4GB-RAM,8~128G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :armbianEnv.txt :maxwell-hub :firefly-jd4 :yes r432 :AIO-3399C :rk3399 :rk3399-aio-3399c.dtb :trust.bin :uboot.img :idbloader.bin :2GB/4GB-LPDDR4,8G/128G-eMMC,SD,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :extlinux.conf :shanshuise :aio-3399c :yes r433 :AIO-3399C(AI) :rk3399 :rk3399-aio-3399c-ai.dtb :trust.bin :uboot.img :idbloader.bin :2GB/4GB-LPDDR4,8G/128G-eMMC,SD,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :extlinux.conf :kaixinos,jun9100,shanshuise :aio-3399c-ai :yes r434 :Sv-33a6x :rk3399 :rk3399-sv-33a6x.dtb :NA :u-boot.itb :idbloader.img :2GB-RAM,16G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3399 :extlinux.conf :loadnl :sv-33a6x :yes r435 :Sv-33a6x(VPU) :rk3399 :rk3399-sv-33a6x-vpu.dtb :NA :NA :u-boot-rockchip.bin :2GB-RAM,16G-eMMC,1Gb-Nic,Add-VPU-driver :stable/6.12.y :rockchip :rk3399 :extlinux.conf :MikuChat :sv-33a6x-vpu :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # Rockchip RK3328 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r501 :BeikeYun :rk3328 :rk3328-beikeyun-1296mhz.dtb :trust.bin :uboot.img :idbloader.bin :1GB-Mem,8G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3328 :armbianEnv.txt :unifreq,doyoman :beikeyun :yes r502 :Chainedbox-L1-Pro :rk3328 :rk3328-l1pro-1296mhz.dtb :trust.bin :uboot.img :idbloader.bin :1GB-Mem,8G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3328 :armbianEnv.txt :unifreq,Ride_Wind,aaa7260 :chainedbox :yes r503 :Station-M1,Bqeel-MVR9 :rk3328 :rk3328-box-trn9.dtb :trust.bin :uboot.img :idbloader.bin :2GB/4GB-DDR3,8-128G-eMMC,TF,1Gb-Nic :stable/6.12.y :rockchip :rk3328 :armbianEnv.txt :giovEra :station-m1 :yes r504 :Renegade-RK3328,Firefly-RK3328 :rk3328 :rk3328-roc-cc.dtb :trust.bin :uboot.img :idbloader.bin :1GB/2GB/4GB-DDR4,8-128G-eMMC,TF,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3328 :armbianEnv.txt :sehczaa :renegade-rk3328 :yes # Rockchip RK3318 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r601 :rk3318-box :rk3318 :rk3318-box.dtb :NA :u-boot.itb :idbloader.img :1GB-Mem,8G-eMMC,1Gb-Nic :stable/6.12.y :rockchip :rk3318 :armbianEnv.txt :13584452567 :rk3318-box :yes # Rockchip RK3528 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r701 :HLink-H28K :rk3528 :rk3528-hlink-h28k.dtb :NA :NA :bootloader.bin :1GB/2GB/4GB-LPDDR4,8G-eMMC,TF,2x1Gb-Nic :rk35xx/6.1.y :rockchip :rk3528 :armbianEnv.txt :unifreq :h28k :yes r702 :Radxa-E20C :rk3528 :rk3528-radxa-e20c.dtb :NA :u-boot.itb :idbloader.img :2GB-LPDDR4,TF,2x1Gb-Nic :rk35xx/6.1.y :rockchip :rk3528 :armbianEnv.txt :unifreq :e20c :yes r703 :H96-Max-M2 :rk3528 :rk3528-mangopi-m28k.dtb :NA :u-boot.itb :idbloader.img :4GB-LPDDR4,64G-eMMC,USB,1Gb-Nic :rk35xx/6.1.y :rockchip :rk3528 :armbianEnv.txt :d5stick :h96-max-m2 :yes r704 :HK1-Rbox-K8S :rk3528 :rk3528-hk1-rbox-k8s.dtb :NA :NA :bootloader.bin :2GB/4GB-LPDDR4,16/32/64G-eMMC,100Mb-Nic :stable/6.12.y :rockchip :rk3528 :armbianEnv.txt :xf110,xf110119,ruichi1978 :hk1-rbox-k8s :yes r705 :HT2 :rk3528 :rk3528-ht2.dtb :NA :NA :bootloader.bin :2GB/4GB-LPDDR4,32/64G-eMMC,TF,1Gb-Nic :stable/6.12.y :rockchip :rk3528 :armbianEnv.txt :xf110,xf110119,ruichi1978 :ht2 :yes #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r706 :Inspur-CD1000-Cloud-PC :rk3528 :rk3528-cd1000.dtb :NA :NA :bootloader.bin :2GB-LPDDR4,32-eMMC,TF,100Mb-Nic :rk35xx/6.1.y :rockchip :rk3528 :armbianEnv.txt :LSP0123,YukMingLaw :cd1000 :yes # Rockchip RK3576 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.TRUST_IMG 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- r801 :NanoPi-m5 :rk3576 :rk3576-nanopi-m5.dtb :NA :u-boot.itb :idbloader.img :4/8/16GB-Mem,8/16G-eMMC,2x1Gb-Nic :stable/6.12.y :rockchip :rk3576 :armbianEnv.txt :RokkakuM :nanopi-m5 :yes # Allwinner h6 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UNUSED 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- w101 :Vplus-Cloud :h6 :sun50i-h6-vplus-cloud.dtb :NA :NA :u-boot-sunxi-with-spl.bin :1GB-DDR3,8G-eMMC,1Gb-Nic :stable/6.12.y :allwinner :sun50i-h6 :armbianEnv.txt :unifreq,yu13740000 :vplus :yes w102 :Tanix-TX6 :h6 :sun50i-h6-tanix-tx6.dtb :NA :NA :u-boot-sunxi-with-spl.bin :2GB/4GB-DDR3,16G/32G-eMMC,100Mb-Nic :stable/6.12.y :allwinner :sun50i-h6 :extlinux.conf :angel :tanix-tx6 :yes w103 :TQC-A01 :h6 :sun50i-h6-tqc-a01.dtb :NA :NA :u-boot-sunxi-with-spl.bin :1GiB-LPDDR3,8G-eMMC,100Mb-Nic,BT,WIFI :h6/6.6.y :allwinner :sun50i-h6 :extlinux.conf :13584452567 :tqc-a01 :yes # Allwinner h618 Family #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UNUSED 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD #-------+----------------------------------------------+---------+-----------------------------------------+-----------------------------+------------------------------------+--------------------------------+-------------------------------------------+----------------------+------------+-------------+----------------+-----------------------------------------------------+--------------------+---------- w201 :OrangePi-Zero3 :h618 :sun50i-h618-orangepi-zero3.dtb :NA :NA :u-boot-sunxi-with-spl.bin :1/1.5/2/4GiB-LPDDR4,TF,1Gb-Nic :stable/6.12.y :allwinner :sun50i-h616 :armbianEnv.txt :xzq849 :orangepi-zero3 :yes w202 :H618-DevBoard :h618 :sun50i-h618-devboard.dtb :NA :NA :u-boot-sunxi-with-spl.bin :4GiB-LPDDR4,128G-eMMC,1Gb-Nic :stable/6.12.y :allwinner :sun50i-h616 :armbianEnv.txt :MrZhou :h618-devboard :yes ================================================ FILE: build-armbian/armbian-files/common-files/etc/modprobe.d/brcmfmac.conf ================================================ options brcmfmac feature_disable=0x282000 ================================================ FILE: build-armbian/armbian-files/common-files/etc/modules-load.d/ophub-load-list.conf ================================================ # This is a custom file to automatically load driver modules at boot. # Add modules here that you would normally load manually via 'modprobe'. # # Format: Write only the module name (one per line). # Example: Instead of running 'sudo modprobe tcp_bbr', just add 'tcp_bbr' below. tcp_bbr rknpu ================================================ FILE: build-armbian/armbian-files/common-files/etc/sysctl.conf ================================================ # # /etc/sysctl.conf - Configuration file for setting system variables # See /etc/sysctl.d/ for additional system variables. # See sysctl.conf (5) for information. # #kernel.domainname = example.com # Uncomment the following to stop low-level messages on console kernel.printk = 7 4 1 7 ##############################################################3 # Functions previously found in netbase # # Uncomment the next two lines to enable Spoof protection (reverse-path filter) # Turn on Source Address Verification in all interfaces to # prevent some spoofing attacks #net.ipv4.conf.default.rp_filter=1 #net.ipv4.conf.all.rp_filter=1 # Uncomment the next line to enable TCP/IP SYN cookies # See http://lwn.net/Articles/277146/ # Note: This may impact IPv6 TCP sessions too #net.ipv4.tcp_syncookies=1 # Uncomment the next line to enable packet forwarding for IPv4 #net.ipv4.ip_forward=1 # Uncomment the next line to enable packet forwarding for IPv6 # Enabling this option disables Stateless Address Autoconfiguration # based on Router Advertisements for this host #net.ipv6.conf.all.forwarding=1 ################################################################### # Additional settings - these settings can improve the network # security of the host and prevent against some network attacks # including spoofing attacks and man in the middle attacks through # redirection. Some network environments, however, require that these # settings are disabled so review and enable them as needed. # # Do not accept ICMP redirects (prevent MITM attacks) #net.ipv4.conf.all.accept_redirects = 0 #net.ipv6.conf.all.accept_redirects = 0 # _or_ # Accept ICMP redirects only for gateways listed in our default # gateway list (enabled by default) # net.ipv4.conf.all.secure_redirects = 1 # # Do not send ICMP redirects (we are not a router) #net.ipv4.conf.all.send_redirects = 0 # # Do not accept IP source route packets (we are not a router) #net.ipv4.conf.all.accept_source_route = 0 #net.ipv6.conf.all.accept_source_route = 0 # # Log Martian Packets #net.ipv4.conf.all.log_martians = 1 # ################################################################### # Magic system request Key # 0=disable, 1=enable all, >1 bitmask of sysrq functions # See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html # for what other values do #kernel.sysrq=438 vm.swappiness = 100 vm.max_map_count = 262144 # Generated file - do not edit. # Disable the hung task timer by default. (bnc#552820) kernel.hung_task_timeout_secs = 0 # Increase defaults for IPC (bnc#146656) kernel.msgmax = 65536 kernel.msgmnb = 65536 # TCP Congestion Control Optimization Guide # # Command to check device support status: [ sysctl net.ipv4.tcp_available_congestion_control ] # net.ipv4.tcp_available_congestion_control = reno cubic bbr # # Recommended for 100Mbps/Low Performance Devices: fq_codel + cubic # Recommended for Gigabit/High Performance Devices: fq + bbr net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.ip_forward = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.igmp_max_memberships = 100 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 120 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_sack = 1 net.ipv4.tcp_dsack = 1 net.ipv6.conf.default.forwarding = 1 net.ipv6.conf.all.forwarding = 1 net.core.rmem_max = 4194304 net.core.wmem_max = 1048576 net.netfilter.nf_conntrack_acct = 1 net.netfilter.nf_conntrack_checksum = 0 net.netfilter.nf_conntrack_max = 65535 net.netfilter.nf_conntrack_tcp_timeout_established = 7440 net.netfilter.nf_conntrack_udp_timeout = 60 net.netfilter.nf_conntrack_udp_timeout_stream = 180 net.netfilter.nf_conntrack_helper = 1 # Disable IPv6 by default net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 ================================================ FILE: build-armbian/armbian-files/common-files/usr/sbin/armbian-apt ================================================ #!/bin/bash #=========================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Change the APT mirror source of the system # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: armbian-apt # #============================= Functions list #============================= # # error_msg : Output error message # check_release : Check the system release # backup_source_list : Backup the source list # change_source_list : Change the APT mirror source # select_mirror_site : Select the mirror site # #========================= Set default parameters ========================== # # Get custom firmware information ophub_release_file="/etc/ophub-release" # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" OPTIONS="[\033[93m OPTIONS \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #=========================================================================== # Encountered a serious error, abort the script execution error_msg() { echo -e "${ERROR} ${1}" exit 1 } # Check the system release information check_release() { if [[ -f "${ophub_release_file}" ]]; then source "${ophub_release_file}" VERSION_CODEID="${VERSION_CODEID}" VERSION_CODENAME="${VERSION_CODENAME}" [[ -z "${VERSION_CODEID}" ]] && error_msg "System VERSION_CODEID not detected!" [[ -z "${VERSION_CODENAME}" ]] && error_msg "System VERSION_CODENAME not detected!" # Set the source files armbian_source_file="/etc/apt/sources.list.d/${VERSION_CODEID}.sources" armbian_source_backup_file="/etc/apt/sources.list.d/${VERSION_CODEID}.sources.bak" else error_msg "System release file not found!" fi } # Backup the source list backup_source_list() { [[ -f "${armbian_source_file}" && ! -f "${armbian_source_backup_file}" ]] && { cp -f "${armbian_source_file}" "${armbian_source_backup_file}" } } # Change the APT mirror source # Reference source: https://github.com/armbian/build/blob/main/lib/functions/rootfs/distro-specific.sh change_source_list() { echo -e "${STEPS} Changing APT mirror source to: [ ${MIRROR_URL} ]" echo -e "${INFO} System release: [ ${VERSION_CODENAME} ]" case "${VERSION_CODENAME}" in buster | bullseye | bookworm | trixie | forky) declare -a suites=("${VERSION_CODENAME}" "${VERSION_CODENAME}-updates") declare -a components=(main contrib non-free) if [[ "${VERSION_CODENAME}" != "buster" && "${VERSION_CODENAME}" != "bullseye" ]]; then # EOS releases doesn't get security updates declare -a security_suites=("${VERSION_CODENAME}-security") suites+=("${VERSION_CODENAME}-backports") components+=("non-free-firmware") fi cat >${armbian_source_file} <>${armbian_source_file} <${armbian_source_file} <${armbian_source_file} </dev/null; then error_msg "You are running in eMMC mode, please boot system with TF/SD/USB!" fi # Find the EMMC drive emmc="$(lsblk -l -o NAME | grep -oE "mmcblk[0-9]boot0" | sort -u | sed "s/boot0//g")" # Find emmc disk, find emmc that does not contain the boot0 partition [[ -z "${emmc}" ]] && emmc="$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?)' | grep -vE ^${root_devname} | sort -u)" # Check if eMMC exists [[ -z "${emmc}" ]] && error_msg "No eMMC storage found on this device!" # Show the eMMC device name echo -e "${INFO} The device eMMC name: [ /dev/${emmc} ]" # Check emmc partition size dev_intsize="$(fdisk -s /dev/${emmc})" [[ -z "$(echo "${dev_intsize}" | sed -n "/^[0-9]\+$/p")" ]] && error_msg "Unable to determine eMMC size." echo -e "${INFO} The device eMMC size: [ $(($dev_intsize / 1024 / 1024))GB ]" # check directory [[ -d "${out_path}" ]] || mkdir -p ${out_path} echo -e "${INFO} The ddbr file path: [ ${out_path}/${ddbr_image} ]\n" } # Check the remaining space do_checkspace() { # Check the remaining space capacity remaining_space="$(df -Tk ${out_path} | tail -n1 | awk '{print $5}' | echo $(($(xargs) / 1024 / 1024)))" if [[ -z "$(echo "${remaining_space}" | sed -n "/^[0-9]\+$/p")" ]]; then error_msg "Unable to determine available space on the target path." fi # Check if there is enough free space if [[ "${remaining_space}" -lt "${need_space}" ]]; then error_msg "Insufficient disk space. Please use [ armbian-tf ] to expand the partition first." fi } # Backup the eMMC system do_backup() { echo -e "${STEPS} Starting eMMC system backup..." do_checkspace echo -e "${INFO} Compressing [ /dev/${emmc} ] to [ ${out_path}/${ddbr_image} ], please wait..." rm -f ${out_path}/${ddbr_image} 2>/dev/null && sync dd if=/dev/${emmc} | pv -s ${dev_intsize}"K" | gzip >${out_path}/${ddbr_image} [[ "$?" -eq "0" ]] && sync && echo -e "${SUCCESS} eMMC backup completed successfully." sync && sleep 3 exit 0 } # Restore the eMMC system do_restore() { echo -e "${STEPS} Starting eMMC system restore..." [[ ! -f "${out_path}/${ddbr_image}" ]] && error_msg "Backup file [ ${out_path}/${ddbr_image} ] not found." echo -e "${INFO} Restoring [ ${out_path}/${ddbr_image} ] to [ /dev/${emmc} ], please wait..." gunzip -c ${out_path}/${ddbr_image} | pv -s ${dev_intsize}"K" | dd of=/dev/${emmc} [[ "$?" -eq "0" ]] && sync && echo -e "${SUCCESS} eMMC restore completed successfully." sync && sleep 3 exit 0 } echo -e "${STEPS} Welcome to the eMMC system backup/restore tool." # Check script permission [[ "$(id -u)" == "0" ]] || error_msg "Please run this script as root: [ sudo $0 ]" # Check emmc do_checkemmc # Prompt the user to select backup or restore cat < /dev/null echo "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] ${DOCKER_SOURCE}/${VERSION_CODEID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null echo -e "${STEPS} Installing Docker packages..." sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin echo -e "${STEPS} Configuring Docker registry mirrors..." [[ -d "/etc/docker" ]] || mkdir -p /etc/docker if [[ "${source_id}" -ne "1" ]]; then # Docker registry mirrors for China sudo cat >/etc/docker/daemon.json </etc/docker/daemon.json </dev/null sync && sleep 3 echo -e "${SUCCESS} Docker installed successfully." } # Update Docker packages docker_update() { echo -e "${STEPS} Updating Docker packages..." # Update the docker package sudo apt-get update sudo apt-get upgrade -y sudo apt-get dist-upgrade -y sudo apt-get --purge autoremove -y sudo apt-get autoclean -y echo -e "${SUCCESS} Docker updated successfully." exit 0 } # Remove Docker and clean up docker_remove() { echo -e "${STEPS} Removing Docker..." # Remove the docker package sudo apt-get update sudo apt-get remove --purge -y docker-ce docker-ce-cli containerd.io docker-compose* docker-ce-* sudo apt-get --purge autoremove -y sudo apt-get autoclean -y # sudo rm -rf /etc/docker 2>/dev/null sudo rm -rf /var/lib/docker 2>/dev/null sudo rm -rf /var/run/docker.sock 2>/dev/null echo -e "${SUCCESS} Docker removed successfully." exit 0 } echo -e "${INFO} Welcome to the Docker Management Tool." # Check script permission [[ "$(id -u)" == "0" ]] || error_msg "Please run this script as root: [ sudo $0 ]" # Execute script assist functions case "${1}" in update) docker_update ;; remove) docker_remove ;; *) docker_install ;; esac ================================================ FILE: build-armbian/armbian-files/common-files/usr/sbin/armbian-fix ================================================ #!/bin/bash #======================================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Dependent script: /usr/lib/armbian/armbian-firstrun # Function: Fix permissions and system settings (executed during initial system setup) # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: armbian-fix # #================================ Set default parameters ================================ # export DEBIAN_FRONTEND=noninteractive # Set the armbian release check file armbian_release_file="/etc/armbian-release" armbian_image_file="/etc/armbian-image-release" armbian_os_status="/etc/armbian-distribution-status" os_release_file="/etc/os-release" # Set the ophub release check file ophub_release_file="/etc/ophub-release" # Custom armbian-fix Log fix_log="/tmp/armbian-fix.log" # #====================================================================================== # Add log tolog() { echo -e "${1}" echo -e "[$(date +"%Y.%m.%d.%H:%M:%S")] ${1}" >>"${fix_log}" 2>/dev/null || true } # Show start message echo "" >${fix_log} && tolog "Starting system fixes..." # Get the system release version, such as: resolute, noble, trixie, bookworm, etc. [[ -f "/etc/lsb-release" ]] && DISTRIBUTION_CODENAME="$(grep CODENAME /etc/lsb-release | cut -d'=' -f2 || true)" [[ -z "${DISTRIBUTION_CODENAME}" && -f "${os_release_file}" ]] && DISTRIBUTION_CODENAME="$(grep VERSION_CODENAME "${os_release_file}" | cut -d'=' -f2 || true)" [[ -z "${DISTRIBUTION_CODENAME}" && -x "/usr/bin/lsb_release" ]] && DISTRIBUTION_CODENAME="$(/usr/bin/lsb_release -c | cut -d':' -f2 | tr -d '\t' || true)" # ===== A. Fix system permissions ===== # Fix common release permissions [[ -d "/var/tmp" ]] && chmod 777 /var/tmp 2>/dev/null && tolog "01. Fix tmp permissions" [[ -d "/etc/update-motd.d" ]] && chmod -x /etc/update-motd.d/* 2>/dev/null && chmod +x /etc/update-motd.d/{10-*,20-*,30-*} 2>/dev/null && tolog "02. Fix update-motd.d permissions" [[ -d "/var/cache/man" ]] && chown man:root /var/cache/man -R 2>/dev/null && tolog "03. Fix man permissions" [[ -d "/var/cache/man" ]] && chmod g+s /var/cache/man -R 2>/dev/null && tolog "04. Fix man permissions" [[ -f "/etc/sudoers" ]] && chown root:root /etc/sudoers 2>/dev/null && tolog "05. Fix sudoers ownership" [[ -f "/etc/sudoers" ]] && chmod 440 /etc/sudoers 2>/dev/null && tolog "06. Fix sudoers permissions" [[ -f "/usr/bin/sudo" ]] && chown root:root /usr/bin/sudo 2>/dev/null && tolog "07. Fix sudo permissions" [[ -f "/usr/bin/sudo" ]] && chmod 4755 /usr/bin/sudo 2>/dev/null && tolog "08. Fix sudo permissions" # Fix focal permissions [[ -f "/usr/lib/sudo/sudoers.so" ]] && chown 0 /usr/lib/sudo/sudoers.so 2>/dev/null && tolog "09. Fix sudoers.so permissions" [[ -f "/usr/lib/sudo/sudoers.so" ]] && chmod 644 /usr/lib/sudo/sudoers.so 2>/dev/null && tolog "10. Fix sudoers.so permissions" [[ -f "/usr/lib/policykit-1/polkit-agent-helper-1" ]] && chmod 4755 /usr/lib/policykit-1/polkit-agent-helper-1 2>/dev/null && tolog "11. Fix polkit-agent-helper-1 permissions" # Fix jammy permissions [[ -f "/usr/libexec/sudo/sudoers.so" ]] && chown 0 /usr/libexec/sudo/sudoers.so 2>/dev/null && tolog "12. Fix sudoers.so permissions" [[ -f "/usr/libexec/sudo/sudoers.so" ]] && chmod 644 /usr/libexec/sudo/sudoers.so 2>/dev/null && tolog "13. Fix sudoers.so permissions" [[ -f "/usr/libexec/polkit-agent-helper-1" ]] && chmod 4755 /usr/libexec/polkit-agent-helper-1 2>/dev/null && tolog "14. Fix polkit-agent-helper-1 permissions" # ===== B. Remove unnecessary packages and scripts ===== # Clean APT cache apt-get clean -y 2>/dev/null && rm -rf /var/cache/apt/* 2>/dev/null && rm -rf /var/lib/apt/* 2>/dev/null && tolog "20. Clean APT cache" # Get kernel signature [[ -f "${ophub_release_file}" ]] && { kernel_signature="$(cat ${ophub_release_file} | grep -E "^KERNEL_SIGNATURE=" | cut -d"'" -f2 || true)" } # 21. Remove linux-image-* pkg_linux_image="$(dpkg -l | awk '{print $2}' | grep "^linux-image-" || true)" for pkg in ${pkg_linux_image}; do if [[ -n "${pkg}" ]] && [[ -z "${kernel_signature}" || ! "${pkg}" =~ ${kernel_signature} ]]; then image_list_path="/var/lib/dpkg/info/${pkg}.list" apt-mark unhold ${pkg} 2>/dev/null truncate -s 0 "${image_list_path}" 2>/dev/null || : >"${image_list_path}" 2>/dev/null apt-get remove -qq --purge -y --allow-change-held-packages ${pkg} 2>/dev/null && tolog "21. Remove ${pkg}" elif [[ "${pkg}" =~ ${kernel_signature} ]]; then tolog "21. Keep ${pkg}" fi done # 22. Remove linux-dtb-* pkg_linux_dtb="$(dpkg -l | awk '{print $2}' | grep "^linux-dtb-" || true)" for pkg in ${pkg_linux_dtb}; do if [[ -n "${pkg}" ]] && [[ -z "${kernel_signature}" || ! "${pkg}" =~ ${kernel_signature} ]]; then dtb_list_path="/var/lib/dpkg/info/${pkg}.list" apt-mark unhold ${pkg} 2>/dev/null truncate -s 0 "${dtb_list_path}" 2>/dev/null || : >"${dtb_list_path}" 2>/dev/null apt-get remove -qq --purge -y --allow-change-held-packages ${pkg} 2>/dev/null && tolog "22. Remove ${pkg}" elif [[ "${pkg}" =~ ${kernel_signature} ]]; then tolog "22. Keep ${pkg}" fi done # 23. Remove linux-u-boot-* pkg_linux_uboot="$(dpkg -l | awk '{print $2}' | grep "^linux-u-boot-" || true)" for pkg in ${pkg_linux_uboot}; do if [[ -n "${pkg}" ]]; then linux_uboot_list_path="/var/lib/dpkg/info/${pkg}.list" apt-mark unhold ${pkg} 2>/dev/null truncate -s 0 "${linux_uboot_list_path}" 2>/dev/null || : >"${linux_uboot_list_path}" 2>/dev/null apt-get remove -qq --purge -y --allow-change-held-packages ${pkg} 2>/dev/null && tolog "23. Remove ${pkg}" fi done # 24. Remove armbian-firmware pkg_armbian_firmware="$(dpkg -l | awk '{print $2}' | grep "^armbian-firmware" || true)" for pkg in ${pkg_armbian_firmware}; do if [[ -n "${pkg}" ]]; then firmware_list_path="/var/lib/dpkg/info/${pkg}.list" apt-mark unhold ${pkg} 2>/dev/null truncate -s 0 "${firmware_list_path}" 2>/dev/null || : >"${firmware_list_path}" 2>/dev/null apt-get remove -qq --purge -y --allow-change-held-packages ${pkg} 2>/dev/null && tolog "24. Remove ${pkg}" fi done # 25. Remove armbian-bsp-cli-* pkg_armbian_bsp_cli="$(dpkg -l | awk '{print $2}' | grep "^armbian-bsp-cli-" || true)" for pkg in ${pkg_armbian_bsp_cli}; do if [[ -n "${pkg}" ]]; then armbian_bsp_cli_list_path="/var/lib/dpkg/info/${pkg}.list" apt-mark unhold ${pkg} 2>/dev/null truncate -s 0 "${armbian_bsp_cli_list_path}" 2>/dev/null || : >"${armbian_bsp_cli_list_path}" 2>/dev/null apt-get remove -qq --purge -y --allow-change-held-packages ${pkg} 2>/dev/null && tolog "25. Remove ${pkg}" fi done # 26. hold packages and disable update_initramfs [[ -n "$(dpkg -l | awk '{print $2}' | grep initramfs-tools || true)" ]] && apt-mark hold initramfs-tools* 2>/dev/null && tolog "26. Hold initramfs-tools*" initramfs_conf="/etc/initramfs-tools/update-initramfs.conf" [[ -f "${initramfs_conf}" ]] && sed -i "s|^update_initramfs=.*|update_initramfs=no|g" "${initramfs_conf}" && tolog "27. Disable update-initramfs.conf" # ===== C. Disable unnecessary system services ===== # Regenerate machine-id for unique identification rm -f /etc/machine-id /var/lib/dbus/machine-id 2>/dev/null && tolog "50. Delete machine-id" dbus-uuidgen --ensure=/etc/machine-id 2>/dev/null && tolog "51. Generate /etc/machine-id" dbus-uuidgen --ensure 2>/dev/null && tolog "52. Generate /var/lib/dbus/machine-id" # Disable automatic hibernation to prevent storage device issues systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null && tolog "53. Disable automatic sleep/hibernation" # Disable tips of the day for [ /etc/update-motd.d/35-armbian-tips ] motd_tips="/etc/default/armbian-motd" [[ -f "${motd_tips}" ]] && { sed -i 's|^MOTD_DISABLE=""|MOTD_DISABLE="tips"|g' "${motd_tips}" tolog "54. Disable tips of the day" } || true quotes_cron="/etc/cron.daily/armbian-quotes" [[ -f "${quotes_cron}" ]] && { sed -i "s|^curl |#curl |g" "${quotes_cron}" tolog "55. Disable quotes cron plan" } || true # Remove motd-news services motd_timer="/usr/lib/systemd/system/motd-news.timer" [[ -f "${motd_timer}" ]] && { systemctl stop motd-news.timer 2>/dev/null systemctl disable motd-news.timer 2>/dev/null rm -f "${motd_timer}" tolog "56. Disable motd-news.timer" } || true motd_service="/usr/lib/systemd/system/motd-news.service" [[ -f "${motd_service}" ]] && { systemctl stop motd-news.service 2>/dev/null systemctl disable motd-news.service 2>/dev/null rm -f "${motd_service}" tolog "57. Disable motd-news.service" } || true rm -f /var/lib/systemd/deb-systemd-helper-enabled/timers.target.wants/motd-news.timer 2>/dev/null rm -f /var/lib/systemd/deb-systemd-helper-enabled/motd-news.timer.dsh-also 2>/dev/null rm -f /etc/systemd/system/timers.target.wants/motd-news.timer 2>/dev/null # Disable the partition auto-resize service systemctl stop armbian-resize-filesystem.service 2>/dev/null systemctl disable armbian-resize-filesystem.service 2>/dev/null tolog "58. Disable armbian-resize-filesystem.service" # Disable the ssh.socket: https://github.com/ophub/amlogic-s9xxx-armbian/discussions/1476 systemctl disable --now ssh.socket 2>/dev/null systemctl enable --now ssh.service 2>/dev/null tolog "59. Disable the ssh.socket and enable ssh.service" # ===== D. Apply custom settings ===== # Fix legacy configuration file names (after 2022.12.03) [[ -f "/etc/amlogic_model_database.conf" ]] && { mv -f /etc/amlogic_model_database.conf /etc/model_database.conf 2>/dev/null tolog "70. Rename amlogic_model_database.conf to model_database.conf" } || true [[ -f "/etc/rockchip_model_database.conf" ]] && { mv -f /etc/rockchip_model_database.conf /etc/model_database.conf 2>/dev/null tolog "71. Rename rockchip_model_database.conf to model_database.conf" } || true # Confirm and adjust device information [[ -f "${ophub_release_file}" ]] && { # Get welcome banner value family_name="$(cat ${ophub_release_file} | grep -E "^FAMILY=" | cut -d"'" -f2 || true)" platform_name="$(cat ${ophub_release_file} | grep -E "^PLATFORM=" | cut -d"'" -f2 || true)" soc_name="$(cat ${ophub_release_file} | grep -E "^SOC=" | cut -d"'" -f2 | sed -e "s|\b[a-z]|\U&|g" || true)" board_name="$(cat ${ophub_release_file} | grep -E "^BOARD=" | cut -d"'" -f2 | sed -e "s|\b[a-z]|\U&|g" || true)" # Migrate legacy ANDROID_UBOOT parameter name [[ -n "$(cat ${ophub_release_file} | grep -E "^ANDROID_UBOOT=")" ]] && { sed -i "s|^ANDROID_UBOOT=|BOOTLOADER_IMG=|g" ${ophub_release_file} tolog "80. Rename ANDROID_UBOOT to BOOTLOADER_IMG" } # Migrate legacy UBOOT_STATUS parameter name [[ -n "$(cat ${ophub_release_file} | grep -E "^UBOOT_STATUS=")" ]] && { sed -i "s|^UBOOT_STATUS=|MLUBOOT_STATUS=|g" ${ophub_release_file} tolog "81. Rename UBOOT_STATUS to MLUBOOT_STATUS" } # Add default kernel tags if missing sed -i "s|^KERNEL_BRANCH=|KERNEL_TAGS=|g" ${ophub_release_file} sed -i "s|^KERNEL_TAGS='6.x.y'|KERNEL_TAGS='6.1.y'|g" ${ophub_release_file} [[ -n "$(cat ${ophub_release_file} | grep -E "^KERNEL_TAGS=")" ]] || { [[ "${soc_name,,}" == "rk3588" ]] && KERNEL_TAGS="rk3588" || KERNEL_TAGS="stable" echo "KERNEL_TAGS='${KERNEL_TAGS}'" >>${ophub_release_file} tolog "82. Add the KERNEL_TAGS name" } # Add default KERNEL_REPO if missing [[ -n "$(cat ${ophub_release_file} | grep -E "^KERNEL_REPO=")" ]] || { echo "KERNEL_REPO='ophub/kernel'" >>${ophub_release_file} tolog "83. Add the custom KERNEL_REPO URL" } # Add default KERNEL_BACKUP if missing [[ -n "$(cat ${ophub_release_file} | grep -E "^KERNEL_BACKUP=")" ]] || { echo "KERNEL_BACKUP='yes'" >>${ophub_release_file} tolog "84. Add the custom KERNEL_BACKUP" } # Get the board display name by platform [[ "${platform_name}" == "amlogic" ]] && bd_name="Aml.${soc_name}" [[ "${platform_name}" == "rockchip" ]] && bd_name="RK.${board_name}" [[ "${platform_name}" == "allwinner" ]] && bd_name="AW.${board_name}" # Update armbian-release configuration [[ -f "${armbian_release_file}" ]] && { [[ -n "${bd_name}" ]] && { sed -i "s|^BOARD=.*|BOARD=\"${board_name}\"|g" ${armbian_release_file} sed -i "s|^BOARD_NAME=.*|BOARD_NAME=\"${bd_name}\"|g" ${armbian_release_file} } short_version="$(cat ${armbian_release_file} | grep -E '^VERSION=' | grep -oE '[2-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}' | head -n 1 || true)" [[ -n "${short_version}" ]] && { sed -i "s|^VERSION=.*|VERSION=\"${short_version}\"|g" ${armbian_release_file} sed -i "s|^REVISION=.*|REVISION=\"${short_version}\"|g" ${armbian_release_file} } sed -i "s|^BOOT_SOC=.*|BOOT_SOC=\"${soc_name}\"|g" ${armbian_release_file} sed -i "s|^BOARDFAMILY=.*|BOARDFAMILY=\"${family_name}\"|g" ${armbian_release_file} sed -i "s|^LINUXFAMILY=.*|LINUXFAMILY=\"${platform_name}\"|g" ${armbian_release_file} sed -i "s|^VENDOR=.*|VENDOR=\"Armbian OS\"|g" ${armbian_release_file} sed -i "s|^IMAGE_TYPE=.*|IMAGE_TYPE=rebuild|g" ${armbian_release_file} sed -i "s|^BOARD_TYPE=.*|BOARD_TYPE=diy|g" ${armbian_release_file} sed -i "s|^FORCE_BOOTSCRIPT_UPDATE=.*|FORCE_BOOTSCRIPT_UPDATE=\"no\"|g" ${armbian_release_file} sed -i "s|^BOOTSCRIPT_FORCE_UPDATE=.*|BOOTSCRIPT_FORCE_UPDATE=\"no\"|g" ${armbian_release_file} sed -i "s|^FORCE_UBOOT_UPDATE=.*|FORCE_UBOOT_UPDATE=\"no\"|g" ${armbian_release_file} tolog "85. Update custom board info: ${armbian_release_file}" } # Update armbian-image-release configuration [[ -f "${armbian_image_file}" ]] && { [[ -n "${bd_name}" ]] && { sed -i "s|^BOARD=.*|BOARD=\"${board_name}\"|g" ${armbian_image_file} sed -i "s|^BOARD_NAME=.*|BOARD_NAME=\"${bd_name}\"|g" ${armbian_image_file} } short_version="$(cat ${armbian_image_file} | grep -E '^VERSION=' | grep -oE '[2-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}' | head -n 1 || true)" [[ -n "${short_version}" ]] && { sed -i "s|^VERSION=.*|VERSION=\"${short_version}\"|g" ${armbian_image_file} sed -i "s|^REVISION=.*|REVISION=\"${short_version}\"|g" ${armbian_image_file} } sed -i "s|^BOARDFAMILY=.*|BOARDFAMILY=\"${family_name}\"|g" ${armbian_image_file} sed -i "s|^LINUXFAMILY=.*|LINUXFAMILY=\"${platform_name}\"|g" ${armbian_image_file} sed -i "s|^VENDOR=.*|VENDOR=\"Armbian OS\"|g" ${armbian_image_file} sed -i "s|^IMAGE_TYPE=.*|IMAGE_TYPE=rebuild|g" ${armbian_image_file} sed -i "s|^BOARD_TYPE=.*|BOARD_TYPE=diy|g" ${armbian_image_file} sed -i "s|^FORCE_BOOTSCRIPT_UPDATE=.*|FORCE_BOOTSCRIPT_UPDATE=\"no\"|g" ${armbian_image_file} sed -i "s|^BOOTSCRIPT_FORCE_UPDATE=.*|BOOTSCRIPT_FORCE_UPDATE=\"no\"|g" ${armbian_image_file} tolog "86. Update custom board info: ${armbian_image_file}" } # Update os-release information [[ -f "${os_release_file}" ]] && { short_version="$(cat ${os_release_file} | grep -E '^PRETTY_NAME=' | grep -oE '[2-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}' | head -n 1 || true)" sed -i "s|^PRETTY_NAME=.*|PRETTY_NAME=\"Armbian OS ${short_version} ${DISTRIBUTION_CODENAME}\"|g" ${os_release_file} sed -i "s|^ARMBIAN_PRETTY_NAME=.*|ARMBIAN_PRETTY_NAME=\"Armbian OS ${short_version} ${DISTRIBUTION_CODENAME}\"|g" ${os_release_file} tolog "87. Update custom board info: ${os_release_file}" } # Disable unused serial console on non-Amlogic platforms [[ "${platform_name}" != "amlogic" ]] && { systemctl disable serial-getty@ttyFIQ0 2>/dev/null systemctl disable serial-getty@ttyAML0 2>/dev/null tolog "88. Disable ttyFIQ0 & ttyAML0 (ttyS2)" } } || true # Set system distribution status to supported [[ -n "${DISTRIBUTION_CODENAME}" && -f "${armbian_os_status}" ]] && { sed -i "s|^${DISTRIBUTION_CODENAME}=.*|${DISTRIBUTION_CODENAME}=supported|g" ${armbian_os_status} tolog "90. Set ${DISTRIBUTION_CODENAME} distribution status to supported" } || true # Expand root partition if flagged todo_rootfs_resize="/root/.no_rootfs_resize" [[ -f "${todo_rootfs_resize}" && "$(cat ${todo_rootfs_resize} 2>/dev/null | xargs)" == "yes" ]] && { armbian-tf 2>/dev/null && tolog "91. Root partition expanded successfully" } || true # Hide WAN & IPv6 addresses from MOTD ip_info_file="/etc/update-motd.d/20-ip-info" [[ -f "${ip_info_file}" ]] && { sed -i '/^get_wan.*_address/s/{.*/{ true; }/' ${ip_info_file} sed -i '/if.*ipv6s.*||.*wan6/,/fi/s/^/#/' ${ip_info_file} tolog "92. Hide WAN & IPv6 addresses from MOTD" } || true # Show end message tolog "All system fixes applied successfully." ================================================ FILE: build-armbian/armbian-files/common-files/usr/sbin/armbian-kernel ================================================ #!/bin/bash #============================================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Run on Armbian to compile the kernel # Copyright (C) 2021- https://github.com/unifreq # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: armbian-kernel # Command optional parameters please refer to the source code repository # #======================================= Functions list ======================================= # # error_msg : Output error message # update_script : Update compilation scripts # clean_tmp : Clear temporary files # help_info : Display help information # #=============================== Set make environment variables =============================== # # Related file storage path make_path="/opt/kernel" compile_path="${make_path}/compile-kernel" kernel_path="${compile_path}/kernel" out_kernel="${compile_path}/output" config_path="${compile_path}/tools/config" script_path="${compile_path}/tools/script" compile_script="${make_path}/recompile" script_name="${script_path}/armbian_compile_kernel.sh" arch_info="$(arch)" # The kernel compilation scripts download repository script_repo="https://github.com/ophub/amlogic-s9xxx-armbian.git" script_dir="compile-kernel" # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" HINT="[\033[93m HINT \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #============================================================================================== error_msg() { echo -e "${ERROR} ${1}" exit 1 } update_script() { echo -e "${STEPS} Updating kernel compilation scripts..." # Install git echo -e "${INFO} Installing update dependencies..." sudo apt-get -qq update [[ -z "$(dpkg -l | awk '{print $2}' | grep -w "^git$")" ]] && sudo apt-get install -y git # Download the latest scripts from the repository echo -e "${INFO} Fetching latest scripts from repository..." git_tmp_path="$(mktemp -d)" cd ${git_tmp_path} git init --quiet git remote add origin ${script_repo} git config core.sparseCheckout true echo "${script_dir}/*" >>.git/info/sparse-checkout git pull --quiet --depth=1 origin main [[ "${?}" -ne "0" ]] && error_msg "Failed to download scripts from [ ${script_repo} ]." # Update the compilation scripts cd ${make_path} mkdir -p ${compile_path} cp -af --no-preserve=ownership ${git_tmp_path}/${script_dir}/* ${compile_path} [[ "${?}" -ne "0" ]] && error_msg "Failed to sync scripts from [ ${script_repo} ]." cp -f --no-preserve=ownership ${script_name} ${compile_script} chmod +x ${compile_script} # Clean up temporary files rm -rf ${git_tmp_path} 2>/dev/null # Install compilation dependencies echo -e "${INFO} Installing compilation dependencies..." sudo apt-get install -y $(cat ${script_path}/armbian-compile-kernel-depends) [[ "${?}" -ne "0" ]] && error_msg "Failed to install dependencies." sync && sleep 3 echo -e "${SUCCESS} Compilation scripts updated successfully." exit 0 } clean_tmp() { cd ${make_path} echo -e "${STEPS} Cleaning up kernel source and output files..." rm -rf ${kernel_path} ${out_kernel} 2>/dev/null && sync echo -e "${SUCCESS} Cleanup completed successfully." exit 0 } help_info() { clear cat </dev/null VERSION_CODEID="${VERSION_CODEID}" VERSION_CODENAME="${VERSION_CODENAME}" else error_msg "Missing release file: [ ${ophub_release_file} ]" fi [[ -n "${VERSION_CODEID}" && -n "${VERSION_CODENAME}" ]] || error_msg "Incomplete release info in [ ${ophub_release_file} ]" } # Check and install required dependencies check_depends() { # List of required dependencies dpkg_packages=( "apt-transport-https" "ca-certificates" "coreutils" "cpu-checker" "curl" "dmidecode" "dnsmasq-base" "git" "net-tools" "systemd" "tar" ) # Add additional dependencies for non-trixie versions if [[ "${VERSION_CODENAME}" != "trixie" ]]; then dpkg_packages+=("software-properties-common") fi # Cyclic check all dependencies is_dpkg="0" i="1" for package in ${dpkg_packages[*]}; do [[ -n "$(dpkg -l | awk '{print $2}' | grep -w "^${package}$")" ]] || is_dpkg="1" #echo -e "${INFO} ${package}: ${is_dpkg}" ((i++)) done # Install missing packages if [[ "${is_dpkg}" -eq "1" ]]; then echo -e "${STEPS} Installing required dependencies..." sudo apt-get update sudo apt-get install -y ${dpkg_packages[*]} [[ "${?}" -eq "0" ]] || error_msg "Failed to install dependencies." fi } # Initialize and check software installation status check_software_status() { # Check if the software configuration file exists [[ -s "${software_conf}" ]] || error_msg "Missing configuration file: [ ${software_conf} ]" [[ -n "$(cat ${software_conf} | grep -E "^[0-9]{1,9}.*:")" ]] || error_msg "Configuration file is empty: [ ${software_conf} ]" # Check software installation status tmp_conf="$(mktemp)" [[ -f "${tmp_conf}" ]] && rm -f ${tmp_conf} 2>/dev/null cat ${software_conf} 2>/dev/null | grep -E "^[0-9]{1,9}.*:" | sed -e 's/NA//g' -e 's/NULL//g' -e 's/[ ][ ]*//g' | while read line; do # Set initial value local state="not-installed" local manage="install" local support="supported" # Check software installation status local auth_method="$(echo ${line} | awk -F ':' '{print $3}' | awk -F '@' '{print $1}')" local package="$(echo ${line} | awk -F ':' '{print $3}' | awk -F '@' '{print $2}')" # Check the software installation status by category check_status="0" case "${auth_method}" in dpkg) [[ -n "$(dpkg -l | awk '{print $2}' | grep -w "^${package}$" 2>/dev/null)" ]] && check_status="1" ;; docker) [[ -n "$(docker ps -q -f name=${package} 2>/dev/null)" ]] && check_status="1" ;; which) [[ -n "$(which "${package}" 2>/dev/null)" ]] && check_status="1" ;; find) [[ -s "${package}" ]] && check_status="1" ;; *) check_status="0" ;; esac # Adjust software installation status [[ "${check_status}" -eq "1" ]] && { local state="installed" local manage="update/remove" } # Check whether the software supports running on the current system local release="$(echo ${line} | awk -F ':' '{print $5}')" [[ "${release}" != "all" && "${release}" != *"${VERSION_CODENAME}"* ]] && { local support="unsupported" local manage="-" } # Query results are written to a temporary file [[ "${support}" == "supported" ]] && echo "${line}:${support}:${state}:${manage}" >>${tmp_conf} && sync done software_database="$(cat ${tmp_conf} 2>/dev/null)" [[ -n "${software_database}" ]] || error_msg "No compatible software found for [ ${VERSION_CODEID}:${VERSION_CODENAME} ]." } # Search for software model by ID search_software_model() { local sid="${1}" local ret_count="$(echo "${software_database}" | grep -E "^${sid}:" | wc -l)" if [[ "${ret_count}" -eq "1" ]]; then echo "${software_database}" | grep -E "^${sid}:" fi } # Display the software list and handle user selection # Columns: 1.ID 2.NAME 3.STATE 4.MANAGE # Example: 11 :frps :not-installed :install show_software_list() { echo -e "${STEPS} Displaying software list [ System: \033[92m${VERSION_CODEID}/${VERSION_CODENAME}\033[0m ]..." # Check software status check_software_status # Define split line style split_line="───────────────────────────────────────────────────────────────────" # Show software list echo "${software_database}" | awk -F ':' '{print $1,$2,$7,$8}' | while read line; do # Add a header for each software list category [[ "$(echo ${line} | awk '{print $1}')" == *"01" ]] && { printf "%-s\n" "${split_line}" printf "%-5s %-30s %-15s %-15s\n" ID NAME STATE MANAGE printf "%-s\n" "${split_line}" } # Print software information printf "%-5s %-30s %-15s %-15s\n" $(echo "${line}") done # Add end split line printf "%-s\n" "${split_line}" # Display software options echo -ne "${OPTIONS} Please Input Software ID: " read software_id # Check the validity of the selection ret="$(search_software_model "${software_id}")" [[ -z "${ret}" ]] && error_msg "Software ID [ ${software_id} ] not found!" #echo -e "${INFO} Software Model: [ ${ret} ]" # Display selected software information software_name="$(echo "${ret}" | awk -F ':' '{print $2}')" software_execute="$(echo "${ret}" | awk -F ':' '{print $4}')" software_release="$(echo "${ret}" | awk -F ':' '{print $5}')" software_support="$(echo "${ret}" | awk -F ':' '{print $6}')" software_state="$(echo "${ret}" | awk -F ':' '{print $7}')" software_manage="$(echo "${ret}" | awk -F ':' '{print $8}')" if [[ "${software_support}" == "supported" ]]; then echo -e "${INFO} Software ID: [ ${software_id} ]" echo -e "${INFO} Software Name: [ ${software_name} ]" else error_msg "This software is not compatible with the current system. Supported: [ ${software_release//@/ \| } ]." fi # Choose to update or remove installed software [[ "${software_state}" == "installed" ]] && { echo -ne "${OPTIONS} Update=(u) or Remove=(r)? (u/r): " read optid optid="${optid/U/u}" && optid="${optid/R/r}" [[ "${optid:0:1}" == "u" || "${optid:0:1}" == "r" ]] || error_msg "Invalid input!" [[ "${optid:0:1}" == "u" ]] && software_manage="update" || software_manage="remove" } echo -e "${STEPS} Processing: [ ${software_execute} ${software_manage} ${software_name} ]..." # Perform software install/update/remove operations if [[ "${software_execute}" == "command-"* ]]; then # Execute fixed scripts sudo bash ${software_path}/${software_execute} -s ${software_id} -m ${software_manage} else # Execute dedicated scripts sudo bash ${software_path}/${software_execute} ${software_manage} fi } # Update software management scripts from repository update_script() { echo -e "${STEPS} Updating software management scripts..." # Download the latest scripts from the repository git_tmp_path="$(mktemp -d)" cd ${git_tmp_path} git init --quiet git config core.sparseCheckout true echo "${script_dir}/*" >>.git/info/sparse-checkout git remote add origin ${script_repo} git pull --quiet --depth=1 origin main [[ "${?}" -ne "0" ]] && error_msg "Failed to download scripts from [ ${script_repo} ]." # Update the software management scripts mkdir -p ${software_path} cp -af --no-preserve=ownership ${git_tmp_path}/${script_dir}/* ${software_path} [[ "${?}" -ne "0" ]] && error_msg "Failed to sync scripts from [ ${script_repo} ]." find ${software_path} -type f -name '*.sh' -exec chmod +x {} \; # Clean up temporary files rm -rf ${git_tmp_path} 2>/dev/null sync && sleep 3 echo -e "${SUCCESS} Scripts updated successfully." exit 0 } # Clear software management scripts and temporary files clean_tmp() { echo -e "${STEPS} Cleaning up software management files..." rm -rf ${software_path} 2>/dev/null && sync echo -e "${SUCCESS} Cleanup completed successfully." exit 0 } # Show help information help_info() { clear cat < mmcblk0 DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/p[0-9]+$//') PARTITION_NAME="p" ;; [hsv]d[a-z][0-9]*) # Using sed to remove all trailing numbers # For example, sda1 -> sda DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/[0-9]+$//') PARTITION_NAME="" ;; nvme?n?p[0-9]*) # Using sed to remove the trailing 'p' and all numbers # For example, nvme0n1p1 -> nvme0n1 DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/p[0-9]+$//') PARTITION_NAME="p" ;; *) error_msg "Unable to recognize the disk type of ${ROOT_PTNAME}!" ;; esac # Find out if the extended partition was created using armbian-tf on TF/USB storage find_right_path="/mnt/${DISK_NAME}${PARTITION_NAME}2" if [[ -d "${find_right_path}" ]]; then PARTITION_PATH="${find_right_path}" else PARTITION_PATH="/mnt" fi # Check if there is enough free space available_space="$(df -Tk ${PARTITION_PATH} | tail -n1 | awk '{print $5}' | echo $(($(xargs) / 1024 / 1024)))" if [[ -z "$(echo "${available_space}" | sed -n "/^[0-9]\+$/p")" ]]; then error_msg "Unable to determine available space on the target path." fi if [[ "${available_space}" -lt "${swap_gb}" ]]; then error_msg "Only [ ${available_space} ] GiB available, insufficient to create [ ${swap_gb} ] GiB swap." fi # Check directory SWAP_PATH="${PARTITION_PATH}/.swap" mkdir -p ${SWAP_PATH} && sync echo -e "${INFO} Preparing to create [ ${swap_gb} ] GiB swap in [ ${SWAP_PATH} ]." } # Delete the current swap file delete_current_swap() { echo -e "${STEPS} Current swap size: [ ${1} ] bytes. Removing..." current_swap_file="$(cat /proc/swaps | sed -n '$p' | awk '{print $1}' | echo $(xargs))" swapoff ${current_swap_file} 2>/dev/null && sync rm -f ${current_swap_file} 2>/dev/null && sync echo -e "${SUCCESS} Previous swap removed successfully." } # Create a new swap file create_the_swap() { echo -e "${STEPS} Creating new swap file..." ROOTFS_TYPE="$(df -hT ${SWAP_PATH} | tail -n1 | awk '{print $2}')" echo -e "${INFO} Swap size: [ ${swap_gb} ] GiB, filesystem type: [ ${ROOTFS_TYPE} ]. Please wait..." # create swapfile [[ "${ROOTFS_TYPE}" == "btrfs" ]] && { truncate -s 0 ${SWAP_PATH}/swapfile [[ "${?}" -ne "0" ]] && error_msg "[ truncate ] operation failed." chattr +C ${SWAP_PATH}/swapfile btrfs property set ${SWAP_PATH}/swapfile compression none } dd if="/dev/zero" of="${SWAP_PATH}/swapfile" bs="1024" count="$((1048576 * ${swap_gb}))" conv="fsync" [[ "${?}" -ne "0" ]] && error_msg "Failed to write [ ${SWAP_PATH}/swapfile ] using dd." chmod 600 ${SWAP_PATH}/swapfile mkswap -L SWAP ${SWAP_PATH}/swapfile [[ "${?}" -ne "0" ]] && error_msg "[ mkswap ] operation failed." swapon ${SWAP_PATH}/swapfile [[ "${?}" -ne "0" ]] && error_msg "[ swapon ] operation failed." # Add swap to the mount point sed -i '/swap/d' /etc/fstab echo "${SWAP_PATH}/swapfile swap swap defaults 0 0" >>/etc/fstab # Disable zram swap zram_config="/etc/default/armbian-zram-config" [[ -f "${zram_config}" ]] && sed -i "s|# SWAP=false|SWAP=false|g" ${zram_config} sync && sleep 3 echo -e "${INFO} Current swap status: \n$(cat /proc/swaps)" echo -e "${SUCCESS} Swap created successfully!" } # Check swap do_checkswap() { # Set the swap size in GiB my_swap_gb="${1}" format_gb="$(echo "${my_swap_gb}" | awk -F "." '{print $1}')" if [[ -n "$(echo "${format_gb}" | sed -n "/^[0-9]\+$/p")" ]]; then swap_gb="${format_gb}" else swap_gb="1" fi # Check disk do_checkdisk # manage swap current_swap="$(free -m | sed -n '$p' | awk '{print $2}' | echo $(xargs))" if [[ "${current_swap}" -ne "0" ]]; then delete_current_swap ${current_swap} create_the_swap ${swap_gb} else create_the_swap ${swap_gb} fi exit 0 } echo -e "${STEPS} Welcome to the Swap Management Tool." # Check script permission [[ "$(id -u)" == "0" ]] || error_msg "Please run this script as root: [ sudo $0 ]" # Check swap do_checkswap "${@}" ================================================ FILE: build-armbian/armbian-files/common-files/usr/sbin/armbian-sync ================================================ #!/bin/bash #========================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Synchronize all service scripts from the repository # Copyright (C) 2022- https://github.com/unifreq/openwrt_packit # Copyright (C) 2022- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: armbian-sync # #============================= Functions list ============================= # # error_msg : Output error message # check_release : Check the config file # check_depends : Check dependencies # sync_config : Synchronize all service scripts # #========================================================================== # # Armbian firmware config info record file ophub_release_file="/etc/ophub-release" # The script files download repository script_repo="https://github.com/ophub/amlogic-s9xxx-armbian.git" script_dir="build-armbian/armbian-files" # Operation instruction and service storage path sbin_path="/usr/sbin" # Software service storage path share_path="/usr/share/ophub" # Openvfd service storage path openvfd_path="/usr/share/openvfd" # # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" OPTIONS="[\033[93m OPTIONS \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #========================================================================== # Show error message error_msg() { echo -e "${ERROR} ${1}" exit 1 } # Check the release configuration file check_release() { # Check release file [[ -f "${ophub_release_file}" ]] || error_msg "Missing release file: [ ${ophub_release_file} ]" # Get values source "${ophub_release_file}" PLATFORM="${PLATFORM}" FDTFILE="${FDTFILE}" # Auto-detect platform for early devices that lack the PLATFORM parameter [[ -z "${PLATFORM}" && -n "${FDTFILE}" ]] && { [[ ${FDTFILE:0:5} == "meson" ]] && PLATFORM="amlogic" || PLATFORM="rockchip" echo "PLATFORM='${PLATFORM}'" >>${ophub_release_file} } echo -e "${INFO} Armbian PLATFORM: [ ${PLATFORM} ]" } # Check and install required dependencies check_depends() { # Check the necessary dependencies for apt install is_dpkg="0" dpkg_packages=("git" "tar" "coreutils") i="1" for package in ${dpkg_packages[*]}; do [[ -n "$(dpkg -l | awk '{print $2}' | grep -w "^${package}$" 2>/dev/null)" ]] || is_dpkg="1" ((i++)) done # Install missing packages if [[ "${is_dpkg}" -eq "1" ]]; then echo -e "${STEPS} Installing required dependencies..." sudo apt-get update sudo apt-get install -y ${dpkg_packages[*]} [[ "${?}" -ne "0" ]] && error_msg "Failed to install dependencies." fi } # Synchronize all service scripts sync_config() { echo -e "${STEPS} Start syncing all service scripts..." # Download the latest scripts from the repository echo -e "${INFO} Fetching latest scripts from repository..." git_tmp_path="$(mktemp -d)" cd ${git_tmp_path} git init --quiet git remote add origin ${script_repo} git config core.sparseCheckout true echo "${script_dir}/*" >>.git/info/sparse-checkout git pull --quiet --depth=1 origin main [[ "${?}" -ne "0" ]] && error_msg "Failed to download scripts from [ ${script_repo} ]." # Update system command and service scripts echo -e "${STEPS} Syncing system command and service scripts..." [[ -d "${sbin_path}" ]] || mkdir -p ${sbin_path} cp -af --no-preserve=ownership ${git_tmp_path}/${script_dir}/common-files${sbin_path}/* ${sbin_path} [[ "${?}" -ne "0" ]] && error_msg "Failed to sync common [ ${sbin_path} ] scripts." chmod +x ${sbin_path}/armbian-* # Update software management scripts echo -e "${STEPS} Syncing software management scripts..." [[ -d "${share_path}" ]] || mkdir -p ${share_path} cp -af --no-preserve=ownership ${git_tmp_path}/${script_dir}/common-files${share_path}/* ${share_path} [[ "${?}" -ne "0" ]] && error_msg "Failed to sync common [ ${share_path} ] scripts." find ${share_path} -type f -name '*.sh' -exec chmod +x {} \; # Update Amlogic platform specific scripts [[ "${PLATFORM}" == "amlogic" ]] && { # Update Amlogic platform command and service scripts echo -e "${STEPS} Syncing Amlogic platform-specific scripts..." cp -af --no-preserve=ownership ${git_tmp_path}/${script_dir}/platform-files/amlogic/rootfs${sbin_path}/* ${sbin_path} [[ "${?}" -ne "0" ]] && error_msg "Failed to sync Amlogic [ ${sbin_path} ] scripts." chmod +x ${sbin_path}/armbian-* # Update OpenVFD LED display service scripts echo -e "${STEPS} Syncing Amlogic OpenVFD service scripts..." [[ -d "${openvfd_path}" ]] || mkdir -p ${openvfd_path} cp -af --no-preserve=ownership ${git_tmp_path}/${script_dir}/platform-files/amlogic/rootfs${openvfd_path}/* ${openvfd_path} [[ "${?}" -ne "0" ]] && error_msg "Failed to sync Amlogic [ ${openvfd_path} ] scripts." chmod +x ${openvfd_path}/vfdservice } # Clean up temporary files rm -rf ${git_tmp_path} 2>/dev/null sync && sleep 3 echo -e "${SUCCESS} All service scripts synchronized successfully." exit 0 } # Check the release configuration file check_release # Check and install required dependencies check_depends # Synchronize all service scripts sync_config ================================================ FILE: build-armbian/armbian-files/common-files/usr/sbin/armbian-tf ================================================ #!/bin/bash #=========================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Root Partition Expansion Tool # Copyright (C) 2021- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: armbian-tf # #========================= Set default parameters ========================== # # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" OPTIONS="[\033[93m OPTIONS \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #=========================================================================== # Encountered a serious error, abort the script execution error_msg() { echo -e "${ERROR} ${1}" exit 1 } # Check the disk where the root partition resides do_checkdisk() { # Find the partition where root is located ROOT_PTNAME="$(df / | tail -n1 | awk '{print $1}' | awk -F '/' '{print $3}')" [[ -z "${ROOT_PTNAME}" ]] && error_msg "Cannot find the root filesystem partition!" # Find the disk where the partition is located, supporting multi-digit partition numbers case "${ROOT_PTNAME}" in mmcblk?p[0-9]*) # For example, mmcblk0p1 -> mmcblk0 DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/p[0-9]+$//') ;; [hsv]d[a-z][0-9]*) # For example, sda1 -> sda DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/[0-9]+$//') ;; nvme?n?p[0-9]*) # For example, nvme0n1p1 -> nvme0n1 DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/p[0-9]+$//') ;; *) error_msg "Unrecognized disk type ${ROOT_PTNAME}!" ;; esac sync && sleep 3 } # Expand the root partition to fill available space expansion_partition() { echo -e "${INFO} Repairing disk partition table..." printf 'f\n' | parted ---pretend-input-tty /dev/${DISK_NAME} unit MiB print || repair_status="no" [[ "${repair_status}" == "no" ]] && error_msg "Failed to repair disk partition table. Expansion aborted." pt_num="$(parted -s /dev/${DISK_NAME} print | awk '$1~/[1-9]+/ {print $1}' | wc -l)" [[ "${pt_num}" -ne "2" ]] && error_msg "Expected 2 partitions but found ${pt_num}. Automatic expansion aborted." echo -e "${INFO} Expanding the root partition..." printf 'Yes\n-1\n' | parted ---pretend-input-tty /dev/${DISK_NAME} resizepart 2 100% echo -e "${INFO} Resizing the filesystem..." ROOTFS_TYPE="$(df -hT / | grep "/" | awk '{print $2}')" if [[ "${ROOTFS_TYPE}" == "btrfs" ]]; then btrfs filesystem resize max / [[ "${?}" -ne "0" ]] && error_msg "[ btrfs ] operation failed." else resize2fs /dev/${ROOT_PTNAME} [[ "${?}" -ne "0" ]] && error_msg "[ resize2fs ] operation failed." fi # Do not delete the flag file, only modify the value to prevent re-expansion by armbian-resize-filesystem echo "no" >/root/.no_rootfs_resize echo -e "${SUCCESS} Root partition expanded successfully." } # Show welcome message echo -e "${STEPS} Welcome to the Root Partition Expansion Tool." do_checkdisk expansion_partition ================================================ FILE: build-armbian/armbian-files/common-files/usr/sbin/armbian-update ================================================ #!/bin/bash #================================================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Armbian Kernel Update Tool # Copyright (C) 2021- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Kernel download server: https://github.com/ophub/kernel/tree/main/pub # # Command: armbian-update # #========================================= Functions list ========================================= # # error_msg : Output error message and abort execution # # check_depends : Check and install required dependencies # check_network : Verify network connectivity to GitHub # check_disk : Detect system disk and partition names # # init_var : Initialize all runtime variables and parse options # query_version : Query the latest kernel version from GitHub releases # search_kernel : Search for local or remote kernel packages # download_kernel : Download kernel package from GitHub releases # check_kernel : Verify kernel package integrity (.deb and .tar.gz) # backup_kernel : Backup the currently running kernel # backup_fdtfile : Backup the current device tree blob (DTB) file # restore_fdtfile : Restore DTB file from backup if missing # update_tar_kernel : Install the kernel from .tar.gz packages # update_deb_kernel : Install the kernel from .deb packages # update_uboot : Update the U-Boot bootloader # update_initrd_addr : Adjust initrd/ramdisk address for Amlogic devices # update_os_version : Update the Armbian OS version string # # sos_kernel : Rescue and restore the kernel to a target disk # # help_info : Display usage and help information # #===================================== Set default parameters ===================================== # # Set current path current_path="${PWD}" # Set kernel backup directory backup_path="/ddbr/backup" # Set kernel rescue temporary directory rescue_path="/ddbr/rescue" # Set the release check file ophub_release_file="/etc/ophub-release" armbian_release_file="/etc/armbian-release" armbian_image_file="/etc/armbian-image-release" # Set default installation mainline u-boot (-m) auto_mainline_uboot="no" # Set default kernel download type (-d), option: tar/deb download_type="deb" # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" FINISH="[\033[93m FINISH \033[0m]" PROMPT="[\033[93m PROMPT \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #================================================================================================== # Encountered a critical error, output the message and abort execution error_msg() { echo -e "${ERROR} ${1}" exit 1 } # Check and install required dependencies check_depends() { echo -e "${STEPS} Checking required dependencies..." is_missing="0" necessary_packages=("coreutils" "bsdextrautils" "tar" "curl" "btrfs-progs" "e2fsprogs") i="1" for package in "${necessary_packages[@]}"; do [[ -n "$(dpkg -l | awk '{print $2}' | grep -w "^${package}$" 2>/dev/null)" ]] || is_missing="1" ((i++)) done if [[ "${is_missing}" -eq "1" ]]; then echo -e "${INFO} Installing missing dependencies..." sudo apt-get update sudo apt-get install -y ${necessary_packages[@]} [[ "${?}" -ne "0" ]] && error_msg "Failed to install dependencies. Update aborted." else echo -e "${INFO} All dependencies are satisfied." fi sync && echo "" } # Verify network connectivity to GitHub check_network() { # Check the connection status to github.com curl --connect-timeout 10 -s "github.com" >/dev/null 2>&1 && github_net="yes" || github_net="no" if [[ "${github_net}" == "yes" ]]; then echo -e "${INFO} Network connection to [ github.com ] is available." else error_msg "Cannot access [ github.com ]. Please check your network connection." fi } # Detect system disk and partition names check_disk() { # Reload system services sudo systemctl daemon-reload # Find the partition where root is located ROOT_PTNAME="$(df / | tail -n1 | awk '{print $1}' | awk -F '/' '{print $3}')" [[ -z "${ROOT_PTNAME}" ]] && error_msg "Failed to query system partition information." # Find the disk where the partition is located, supporting multi-digit partition numbers case "${ROOT_PTNAME}" in mmcblk?p[0-9]*) # For example, mmcblk0p1 -> mmcblk0 DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/p[0-9]+$//') ;; [hsv]d[a-z][0-9]*) # For example, sda1 -> sda DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/[0-9]+$//') ;; nvme?n?p[0-9]*) # For example, nvme0n1p1 -> nvme0n1 DISK_NAME=$(echo "${ROOT_PTNAME}" | sed -E 's/p[0-9]+$//') ;; *) error_msg "Unrecognized disk type ${ROOT_PTNAME}!" ;; esac } # Initialize all runtime variables and parse command-line options init_var() { echo -e "${STEPS} Initializing parameters..." # Query the current version kernel_uname="$(uname -r)" current_kernel="$(echo "${kernel_uname}" | grep -oP '\d+\.\d+\.\d+')" [[ -z "${current_kernel}" ]] && error_msg "Failed to detect the current kernel version." # Check release file [[ -f "${ophub_release_file}" ]] || error_msg "missing [ ${ophub_release_file} ] file." # Adjust parameter name sed -i "s|^KERNEL_BRANCH=|KERNEL_TAGS=|g" ${ophub_release_file} # Attempt to detect the FDT file from common boot configuration files FDTFILE="" [[ -f "/boot/uEnv.txt" ]] && { FDTFILE="$(grep -E '^FDT=.*\.dtb$' /boot/uEnv.txt | sed -E 's#.*/##' || true)"; } [[ -z "${FDTFILE}" && -f "/boot/extlinux/extlinux.conf" ]] && { FDTFILE="$(grep -E '/dtb/.*\.dtb$' /boot/extlinux/extlinux.conf | sed -E 's#.*/##' || true)"; } [[ -z "${FDTFILE}" && -f "/boot/armbianEnv.txt" ]] && { FDTFILE="$(grep -E '^fdtfile=.*\.dtb$' /boot/armbianEnv.txt | sed -E 's#.*/##' || true)"; } # Update FDT file records information [[ -n "${FDTFILE}" ]] && sed -i "s|^FDTFILE=.*|FDTFILE='${FDTFILE}'|g" ${ophub_release_file} # Get values source "${ophub_release_file}" PLATFORM="${PLATFORM}" MODEL_ID="${MODEL_ID}" FDTFILE="${FDTFILE}" UBOOT_OVERLOAD="${UBOOT_OVERLOAD}" MAINLINE_UBOOT="${MAINLINE_UBOOT}" KERNEL_REPO="${KERNEL_REPO}" KERNEL_TAGS="${KERNEL_TAGS}" KERNEL_SIGNATURE="${KERNEL_SIGNATURE}" DOWNLOAD_TYPE="${DOWNLOAD_TYPE}" KERNEL_BACKUP="${KERNEL_BACKUP}" # Check the platform variable [[ -z "${PLATFORM}" ]] && error_msg "[ PLATFORM ] variable is missing. Update aborted." # Check the FDT file variable [[ -z "${FDTFILE}" ]] && error_msg "[ FDTFILE ] variable is missing. Update aborted." # Check kernel download type if [[ -n "${DOWNLOAD_TYPE}" ]]; then download_type="${DOWNLOAD_TYPE}" else download_type="deb" echo "DOWNLOAD_TYPE='deb'" >>${ophub_release_file} fi # Check kernel signature [[ -n "${KERNEL_SIGNATURE}" ]] || { KERNEL_SIGNATURE="${kernel_uname#*-}" echo "KERNEL_SIGNATURE='${KERNEL_SIGNATURE}'" >>${ophub_release_file} } # Set the kernel packages declare -A platform_family=(["amlogic"]="meson64" ["rockchip"]="rockchip64" ["allwinner"]="sunxi64") kernel_deb_list=("linux-image" "linux-dtb-${platform_family[${PLATFORM}]}" "linux-headers" "linux-libc-dev") kernel_tar_list=("boot" "dtb-${PLATFORM}" "modules" "header") # If it is followed by [ : ], it means that the option requires a parameter value local options="r:u:k:b:m:d:" parsed_args=$(getopt -o "${options}" -- "${@}") [[ ${?} -ne 0 ]] && error_msg "Parameter parsing failed." eval set -- "${parsed_args}" while true; do case "${1}" in -r | --kernelRepository) if [[ -n "${2}" ]]; then KERNEL_REPO="${2}" shift 2 else error_msg "Invalid -r parameter [ ${2} ]!" fi ;; -u | --kernel_Usage) if [[ -n "${2}" ]]; then kernel_usage="${2}" shift 2 else error_msg "Invalid -u parameter [ ${2} ]!" fi ;; -k | --Kernel) if [[ -n "${2}" ]]; then inputs_kernel="${2//.tar.gz/}" inputs_kernel="${inputs_kernel##deb-}" shift 2 else error_msg "Invalid -k parameter [ ${2} ]!" fi ;; -b | --kernel_Backup) if [[ -n "${2}" ]]; then KERNEL_BACKUP="${2}" shift 2 else error_msg "Invalid -b parameter [ ${2} ]!" fi ;; -m | --Mainline_u-boot) if [[ -n "${2}" ]]; then auto_mainline_uboot="${2}" shift 2 else error_msg "Invalid -m parameter [ ${2} ]!" fi ;; -d | --download_type) if [[ -n "${2}" ]]; then download_type="${2}" shift 2 else error_msg "Invalid -d parameter [ ${2} ]!" fi ;; --) shift break ;; *) [[ -n "${1}" ]] && error_msg "Invalid option [ ${1} ]!" break ;; esac done # Adjust the custom kernel repository url format [[ -z "${KERNEL_REPO}" ]] && KERNEL_REPO="ophub/kernel" [[ "${KERNEL_REPO}" =~ ^https: ]] && KERNEL_REPO="$(echo ${KERNEL_REPO} | awk -F'/' '{print $4"/"$5}')" kernel_api="https://github.com/${KERNEL_REPO}" # Set kernel download tags [[ -n "${kernel_usage}" ]] && KERNEL_TAGS="${kernel_usage}" KERNEL_TAGS="${KERNEL_TAGS//kernel_/}" [[ -z "$(echo ${KERNEL_TAGS} | grep -oE "(stable|flippy|beta|rk3588|rk35xx|h6)")" ]] && { echo -e "${PROMPT} Invalid KERNEL_TAGS value [ ${KERNEL_TAGS} ]. Resetting to default [ stable ]." KERNEL_TAGS="stable" } # Check if the mainline u-boot exists [[ "${auto_mainline_uboot}" =~ ^(yes|no)$ ]] || auto_mainline_uboot="no" [[ "${auto_mainline_uboot}" == "yes" ]] && { [[ -n "${MAINLINE_UBOOT}" && -f "${MAINLINE_UBOOT}" ]] || error_msg "[ ${MAINLINE_UBOOT} ] not found. Update aborted." sed -i "s|^MLUBOOT_STATUS=.*|MLUBOOT_STATUS='yes'|g" ${ophub_release_file} } # Check kernel download type [[ "${download_type}" =~ ^(tar|deb)$ ]] || download_type="deb" # Check kernel backup option [[ "${KERNEL_BACKUP}" =~ ^(yes|no)$ ]] || KERNEL_BACKUP="yes" # Check the current system running disk check_disk # Display settings results echo -e "${INFO} Armbian platform: [ ${PLATFORM} ]" echo -e "${INFO} Current kernel: [ ${kernel_uname} ]" echo -e "${INFO} Kernel signature: [ ${KERNEL_SIGNATURE} ]" echo -e "${INFO} Kernel download type: [ ${download_type} ]" echo -e "${INFO} Kernel download repository: [ ${KERNEL_REPO} ]" echo -e "${INFO} Kernel tags: [ ${KERNEL_TAGS} ]" echo -e "${INFO} Specify kernel: [ ${inputs_kernel} ]" echo -e "${INFO} Backup kernel: [ ${KERNEL_BACKUP} ]" echo -e "${INFO} Mainline u-boot update: [ ${auto_mainline_uboot} ]" echo -e "${INFO} Running on disk: [ /dev/${DISK_NAME} ]" sync && echo "" } # Query the latest kernel version from GitHub releases query_version() { kernel_prefix="${1}" echo -e "${INFO} Querying the latest version for [ ${kernel_prefix} ]..." # Using lookbehind (?<=...) to extract ONLY the patch number latest_kernel="$( curl -fsSL ${kernel_api}/releases/expanded_assets/kernel_${KERNEL_TAGS} | grep -oP "(?<=${kernel_prefix}\.)[0-9]+(?=\.tar\.gz)" | sort -urV | head -n 1 )" } # Search for local or remote kernel packages search_kernel() { cd ${current_path} echo -e "${STEPS} Searching for kernel packages..." # Set the kernel save path and clear old files kernel_save_path="/var/cache/apt/archives/ophub" [[ -d "${kernel_save_path}" ]] || mkdir -p "${kernel_save_path}" rm -rf "${kernel_save_path}"/* # Set the kernel path kernel_path="${kernel_save_path}" local_found="no" # Check for local .deb files first, e.g: linux-image_6.1.164-1-ophub_arm64.deb -> 6.1.164 if [[ "$(find . -maxdepth 1 -type f -name "*.deb" 2>/dev/null | wc -l)" -ge "3" ]]; then target_file="$(ls linux-image_*.deb 2>/dev/null | head -n 1)" if [[ -n "${target_file}" ]]; then inputs_kernel="$(echo "${target_file}" | grep -oP '(?<=_)\d+\.\d+\.\d+(?=-)' || echo "${target_file}" | grep -oP '\d+\.\d+\.\d+')" download_type="deb" local_found="yes" fi # Check for local .tar.gz files, e.g: boot-6.6.123-ophub.tar.gz -> 6.6.123 elif [[ "$(find . -maxdepth 1 -type f -name "*.tar.gz" 2>/dev/null | wc -l)" -ge "3" ]]; then target_file="$(ls boot-*.tar.gz 2>/dev/null | head -n 1)" if [[ -n "${target_file}" ]]; then inputs_kernel="$(echo "${target_file}" | grep -oP '(?<=boot-)\d+\.\d+\.\d+')" download_type="tar" local_found="yes" fi fi # Handle Local Files if [[ "${local_found}" == "yes" ]]; then echo -e "${INFO} Found local kernel packages. Version: [ ${inputs_kernel} ] Type: [ ${download_type} ]" [[ -f "sha256sums" ]] && mv -f sha256sums -t "${kernel_path}" mv -f *".${download_type}"* -t "${kernel_path}" [[ "${?}" -ne "0" ]] && error_msg "Failed to move local kernel files." else # Handle Online Query check_network # If the last character of the string (e.g: 6.1.) is ".", append "y" to it. [[ -n "${inputs_kernel}" && "${inputs_kernel: -1}" == "." ]] && inputs_kernel="${inputs_kernel}y" # If the string (e.g: 6.1) contains only one period, add ".y" to it. [[ -n "${inputs_kernel}" && "$(grep -o "\." <<<"${inputs_kernel}" | wc -l)" -eq "1" ]] && inputs_kernel="${inputs_kernel}.y" # Automatically retrieve the latest version of the current kernel series and the specified kernel series (e.g: 6.1.y) # However, when the specified kernel parameter contains a "-" character, the specified version will be used (e.g: 6.1.141-rk3588) [[ -z "${inputs_kernel}" ]] || [[ "${inputs_kernel}" =~ ^[0-9].*[a-z]$ && "${inputs_kernel}" != *"-"* ]] && { # kernel_verpatch, such as [ 6.1 ] kernel_verpatch="$(echo ${current_kernel} | awk -F '.' '{print $1"."$2}')" # Setting the kernel series for the query (6.1.y -> 6.1) [[ "${inputs_kernel}" =~ ^[0-9].*[a-z]$ ]] && kernel_verpatch="${inputs_kernel%.*}" # Define the search order of kernel types based on priority [[ "${download_type}" == "deb" ]] && search_types=("deb" "tar") || search_types=("tar" "deb") # Traverse kernel types to query the latest kernel version for type in "${search_types[@]}"; do # If deb: search for 'deb-6.1' to extract kernel version # If tar: search for '6.1' to extract kernel version [[ "${type}" == "deb" ]] && prefix="deb-${kernel_verpatch}" || prefix="${kernel_verpatch}" # Query the latest kernel version query_version "${prefix}" # If found, update global variables and stop searching if [[ -n "${latest_kernel}" ]]; then download_type="${type}" break fi done # If the latest kernel version is still not found, no suitable kernel exists in the repository [[ -z "${latest_kernel}" ]] && error_msg "No matching kernel version found in GitHub releases." # Construct pure version number (e.g. 6.12.89) inputs_kernel="${kernel_verpatch}.${latest_kernel}" } echo -e "${INFO} Target online kernel: [ ${inputs_kernel} ]" fi sync && echo "" } # Download kernel package from GitHub releases download_kernel() { cd ${current_path} echo -e "${STEPS} Downloading kernel package..." # Construct filename based on type if [[ "${download_type}" == "deb" ]]; then # deb-6.12.89.tar.gz down_filename="deb-${inputs_kernel}.tar.gz" else # 6.12.89.tar.gz down_filename="${inputs_kernel}.tar.gz" fi # Download the kernel package from GitHub releases kernel_down_from="https://github.com/${KERNEL_REPO}/releases/download/kernel_${KERNEL_TAGS}/${down_filename}" echo -e "${INFO} Download URL: [ ${kernel_down_from} ]" curl -fsSL "${kernel_down_from}" -o "${kernel_path}/${down_filename}" [[ "${?}" -ne "0" ]] && error_msg "Failed to download the kernel package." # Extract the downloaded kernel package tar -mxzf "${kernel_path}/${down_filename}" -C "${kernel_path}" [[ "${?}" -ne "0" ]] && error_msg "Failed to extract the kernel package." # Handle if extraction creates a subdir if [[ -d "${kernel_path}/${inputs_kernel}" ]]; then kernel_path="${kernel_path}/${inputs_kernel}" elif [[ -d "${kernel_path}/deb-${inputs_kernel}" ]]; then kernel_path="${kernel_path}/deb-${inputs_kernel}" fi # Set permissions for directories and files separately find "${kernel_path}" -type d -exec chmod 755 {} \; find "${kernel_path}" -type f -exec chmod a+r {} \; sync && echo "" } # Verify kernel package integrity (supports .deb and .tar.gz) check_kernel() { cd "${kernel_path}" echo -e "${STEPS} Verifying kernel package integrity..." if [[ "${download_type}" == "deb" ]]; then # Find .deb kernel file target_file="$(ls linux-image_*.deb 2>/dev/null | head -n 1)" [[ -z "${target_file}" ]] && error_msg "Kernel .deb file not found in [ ${kernel_path} ]." # Extract kernel name: linux-image_6.1.164-1-ophub_arm64.deb -> 6.1.164-1-ophub_arm64 kernel_name="$(echo "${target_file}" | grep -oP '(?<=linux-image_).*?(?=\.deb)')" # Extract kernel signature: 6.1.164-1-ophub_arm64 -> ophub kernel_signature="$(echo "${kernel_name}" | sed -E 's/^.*-([^-_]+)_.*/\1/')" # Extract verify name: linux-image_6.1.164-1-ophub_arm64.deb -> 6.12.69-ophub verify_name="$( echo "${target_file}" | grep -oP '(?<=linux-image_).*?(?=_arm64\.deb)' | awk -F'-' '{print $1"-"$NF}' )" # Set file list for verification check_list=(${kernel_deb_list[@]}) else # Find .tar.gz kernel file target_file="$(ls boot-*.tar.gz 2>/dev/null | head -n 1)" [[ -z "${target_file}" ]] && error_msg "Kernel .tar.gz file not found in [ ${kernel_path} ]." # Extract kernel name: boot-6.6.123-ophub.tar.gz -> 6.6.123-ophub kernel_name="$(echo "${target_file}" | grep -oP '(?<=boot-).*?(?=\.tar\.gz)')" # Extract kernel signature: 6.6.123-ophub -> ophub kernel_signature="${kernel_name#*-}" verify_name="${kernel_name}" # Set file list for verification check_list=(${kernel_tar_list[@]}) fi echo -e "${INFO} Kernel name: [ ${kernel_name} ]" # Check if the kernel is already installed if [[ "${kernel_uname}" == "${verify_name}" ]]; then echo -e "${INFO} The current kernel [ ${kernel_uname} ] is already up to date." echo -ne "${PROMPT} Do you want to force update? [y/n]: " read force_update case "${force_update,,}" in y*) echo -e "${INFO} Proceeding with force update..." ;; *) echo -e "${FINISH} Update cancelled by user." exit 0 ;; esac fi # Identify Kernel Version kernel_base="$(echo ${kernel_name} | grep -oP '\d+\.\d+\.\d+')" [[ -z "${kernel_base}" ]] && error_msg "Failed to detect a valid kernel version." # Check the sha256sums file sha256sums_file="sha256sums" if [[ -s "${sha256sums_file}" && -n "$(cat ${sha256sums_file})" ]]; then echo -e "${INFO} Performing SHA256 checksum verification..." local i="1" for prefix in "${check_list[@]}"; do # Construct filename based on prefix and kernel name if [[ "${download_type}" == "deb" ]]; then tmp_file="${prefix}_${kernel_name}.deb" else tmp_file="${prefix}-${kernel_name}.tar.gz" fi # Check if file exists if [[ ! -s "${tmp_file}" ]]; then # Handle optional header files if [[ "${prefix}" == "linux-headers" || "${prefix}" == "header" ]]; then echo -e "${PROMPT} (${i}/4) [ ${tmp_file} ] is missing, skipping verification." ((i++)) continue else error_msg "(${i}/4) Required file [ ${tmp_file} ] is missing." fi fi # Check checksum tmp_sha256sum="$(sha256sum "${tmp_file}" | awk '{print $1}')" tmp_checkcode="$(grep "${tmp_file}" "${sha256sums_file}" | awk '{print $1}')" [[ "${tmp_sha256sum}" == "${tmp_checkcode}" ]] || error_msg "(${i}/4) ${tmp_file}: SHA256 checksum mismatch." echo -e "${INFO} (${i}/4) [ ${tmp_file} ] checksum verified successfully." ((i++)) done fi sync && echo "" } # Backup the currently running kernel backup_kernel() { echo -e "${STEPS} Backing up the current kernel..." [[ -d "${backup_path}" ]] || mkdir -p ${backup_path} rm -rf ${backup_path}/${current_kernel} # Keep the latest 3 kernel backups and delete the others backup_kernel_list=($(ls ${backup_path} -lt | grep "^d" | awk '{print $9}')) [[ "${#backup_kernel_list[@]}" -ge "3" ]] && { for ((i = 2; i < ${#backup_kernel_list[@]}; i++)); do rm -rf ${backup_path}/${backup_kernel_list[$i]}; done } # Identify the current kernel files mkdir -p ${backup_path}/${current_kernel} # Create temporary file directory kernel_tmp_path="$(mktemp -d)" cd ${kernel_tmp_path} # 1. Pack the boot-*.tar.gz file rm -rf * cp -rf /boot/*-${kernel_uname} -t . [[ "${?}" -ne "0" ]] && error_msg "(1/4) Failed to copy [ /boot/*-${kernel_uname} ] files." rm -rf dtb* chmod +x * tar -czf boot-${kernel_uname}.tar.gz * mv -f *.tar.gz ${backup_path}/${current_kernel} [[ "${?}" -ne "0" ]] && error_msg "(1/4) Failed to move [ boot-${kernel_uname}.tar.gz ] files." echo -e "${INFO} (1/4) Backup of [ boot-${kernel_uname}.tar.gz ] succeeded." # 2. Pack the dtb-*.tar.gz file rm -rf * cp -rf /boot/dtb/${PLATFORM}/* -t . [[ "${?}" -ne "0" ]] && error_msg "(2/4) Failed to copy [ /boot/dtb/${PLATFORM}/* ] files." tar -czf dtb-${PLATFORM}-${kernel_uname}.tar.gz * mv -f *.tar.gz ${backup_path}/${current_kernel} [[ "${?}" -ne "0" ]] && error_msg "(2/4) Failed to move [ dtb-${PLATFORM}-${kernel_uname}.tar.gz ] files." echo -e "${INFO} (2/4) Backup of [ dtb-${PLATFORM}-${kernel_uname}.tar.gz ] succeeded." # 3. Pack the modules-*.tar.gz file rm -rf * cp -rf /usr/lib/modules/${kernel_uname} -t . [[ "${?}" -ne "0" ]] && error_msg "(3/4) Failed to copy [ /usr/lib/modules/${kernel_uname} ] files." tar -czf modules-${kernel_uname}.tar.gz * mv -f *.tar.gz ${backup_path}/${current_kernel} [[ "${?}" -ne "0" ]] && error_msg "(3/4) Failed to move [ modules-${kernel_uname}.tar.gz ] files." echo -e "${INFO} (3/4) Backup of [ modules-${kernel_uname}.tar.gz ] succeeded." # 4. Pack the header-*.tar.gz file, header file is optional if [[ -d "/usr/src/linux-headers-${kernel_uname}" ]]; then rm -rf * cp -rf /usr/src/linux-headers-${kernel_uname}/* -t . [[ "${?}" -ne "0" ]] && error_msg "(4/4) Failed to copy [ /usr/src/linux-headers-${kernel_uname}/* ] files." tar -czf header-${kernel_uname}.tar.gz * mv -f *.tar.gz ${backup_path}/${current_kernel} [[ "${?}" -ne "0" ]] && error_msg "(4/4) Failed to move [ header-${kernel_uname}.tar.gz ] files." echo -e "${INFO} (4/4) Backup of [ header-${kernel_uname}.tar.gz ] succeeded." else echo -e "${PROMPT} (4/4) [ /usr/src/linux-headers-${kernel_uname} ] folder does not exist, skip backup." fi # Add sha256sum integrity verification file cd ${backup_path}/${current_kernel} sha256sum * >sha256sums echo -e "${INFO} [ sha256sums ] file has been generated." echo -e "${INFO} Current kernel backup path: [ ${backup_path}/${current_kernel} ]." sync && echo "" } backup_fdtfile() { # Check if the dtb backup directory exists, if not, create it [[ -d "${backup_path}/dtb" ]] || mkdir -p ${backup_path}/dtb # Backup the current DTB file [[ -f "/boot/dtb/${PLATFORM}/${FDTFILE}" ]] && { cp -f /boot/dtb/${PLATFORM}/${FDTFILE} ${backup_path}/dtb/ [[ "${?}" -ne "0" ]] && error_msg "Failed to backup the DTB file." echo -e "${INFO} DTB file backed up to [ ${backup_path}/dtb/${FDTFILE} ]." } } restore_fdtfile() { # Restore the DTB file if the backup exists and the current one is missing if [[ -f "${backup_path}/dtb/${FDTFILE}" && ! -f "/boot/dtb/${PLATFORM}/${FDTFILE}" ]]; then cp -f ${backup_path}/dtb/${FDTFILE} /boot/dtb/${PLATFORM}/ [[ "${?}" -ne "0" ]] && error_msg "Failed to restore the DTB file." echo -e "${INFO} DTB file has been restored from backup." elif [[ -f "/boot/dtb/${PLATFORM}/${FDTFILE}" ]]; then echo -e "${INFO} The new kernel already includes the required DTB file, skipping restoration." fi } # Install the kernel from .deb packages update_deb_kernel() { cd ${kernel_path} echo -e "${STEPS} Installing kernel from .deb packages..." # Check if the kernel package is in deb format [[ "${download_type}" == "deb" ]] || error_msg "The kernel package is not in deb format." # Backup the current DTB files backup_fdtfile # Identify the .deb files to install local n="0" local install_files="" for prefix in "${kernel_deb_list[@]}"; do local f="$(ls ${prefix}_*.deb 2>/dev/null | head -n 1)" if [[ -n "${f}" ]]; then ((n++)) install_files="${install_files} ./${f}" else error_msg "Kernel .deb package not found: [ ${prefix}_*.deb ]." fi done # Install the .deb kernel packages if [[ -n "${install_files}" ]]; then # Install packages one by one local i="1" install_failed=0 for pkg in ${install_files}; do # Install the package and capture the output log for error analysis if installation fails pkg_log="$(apt-get install -y --reinstall --allow-downgrades "${pkg}" 2>&1)" # Check the installation result if [[ "${?}" -eq "0" ]]; then echo -e "${INFO} (${i}/${n}) Installation of [ ${pkg#./} ] succeeded." else echo -e "${PROMPT} (${i}/${n}) Installation of [ ${pkg#./} ] failed. Error details:" # Display the last 5 lines of the log to provide context on the failure without overwhelming the user echo "${pkg_log}" | tail -n 5 install_failed=1 fi ((i++)) done # If any package installation failed, attempt to fix broken dependencies if [[ "${install_failed}" -ne "0" ]]; then echo -e "${INFO} Attempting to fix broken package dependencies..." # First, try to fix broken dependencies which might be causing the installation failure apt-get install -f -y >/dev/null 2>&1 # Then, try to reinstall the kernel packages again to ensure they are properly installed apt-get install -y --reinstall --allow-downgrades ${install_files} >/dev/null 2>&1 # Finally, verify the installation status of the kernel packages if [[ "${?}" -eq "0" ]]; then echo -e "${INFO} Package dependencies fixed and verified successfully." else error_msg "Failed to fix package dependencies. Packages may be corrupted." fi fi else error_msg "No kernel .deb packages found for installation." fi # Update release file sed -i "s|^KERNEL_VERSION=.*|KERNEL_VERSION='${kernel_base}'|g" ${ophub_release_file} sed -i "s|^DOWNLOAD_TYPE=.*|DOWNLOAD_TYPE='${download_type}'|g" ${ophub_release_file} sed -i "s|^KERNEL_SIGNATURE=.*|KERNEL_SIGNATURE='${kernel_signature}'|g" ${ophub_release_file} # Restore the DTB files if necessary restore_fdtfile # Delete kernel temporary files rm -rf ${kernel_save_path}/* sync && echo "" } # Install the kernel from .tar.gz packages update_tar_kernel() { cd ${kernel_path} echo -e "${STEPS} Installing kernel from .tar.gz packages..." # Check if the kernel package is in tar.gz format [[ "${download_type}" == "tar" ]] || error_msg "The kernel package is not in tar.gz format." # Backup the current DTB files backup_fdtfile # Delete the current kernel files rm -f /boot/config-* /boot/initrd.img-* /boot/System.map-* /boot/uInitrd-* /boot/vmlinuz-* rm -rf /boot/uInitrd /boot/Image /boot/zImage /boot/dtb-* # 01. For /boot five files tar -mxzf boot-${kernel_name}.tar.gz -C /boot [[ "${PLATFORM}" == "amlogic" ]] && (cd /boot && cp -f uInitrd-${kernel_name} uInitrd && cp -f vmlinuz-${kernel_name} zImage) [[ "${PLATFORM}" == "rockchip" ]] && (cd /boot && ln -sf uInitrd-${kernel_name} uInitrd && ln -sf vmlinuz-${kernel_name} Image) [[ "${PLATFORM}" == "allwinner" ]] && (cd /boot && cp -f uInitrd-${kernel_name} uInitrd && cp -f vmlinuz-${kernel_name} Image) # wxy-oect: MODEL_ID numbers r304 and r306, require special handling of uInitrd [[ "${MODEL_ID}" =~ ^(r304|r306)$ ]] && (cd /boot && ln -sf initrd.img-${kernel_name} uInitrd) [[ "$(ls /boot/*${kernel_name}* -l 2>/dev/null | grep "^-" | wc -l)" -ge "4" ]] || error_msg "The /boot files is missing." echo -e "${INFO} (1/4) Unpacking [ boot-${kernel_name}.tar.gz ] succeeded." # 02. For /boot/dtb/${PLATFORM}/* [[ -d "/boot/dtb/${PLATFORM}" ]] || mkdir -p /boot/dtb/${PLATFORM} tar -mxzf dtb-${PLATFORM}-${kernel_name}.tar.gz -C /boot/dtb/${PLATFORM} [[ "${PLATFORM}" == "rockchip" ]] && ln -sf dtb /boot/dtb-${kernel_name} [[ "$(ls /boot/dtb/${PLATFORM} -l 2>/dev/null | grep "^-" | wc -l)" -ge "2" ]] || error_msg "/boot/dtb/${PLATFORM} files is missing." echo -e "${INFO} (2/4) Unpacking [ dtb-${PLATFORM}-${kernel_name}.tar.gz ] succeeded." # 03. For /usr/src/linux-headers-${kernel_name}, header file is optional if [[ -f "header-${kernel_name}.tar.gz" ]]; then header_path="linux-headers-${kernel_name}" rm -rf /usr/src/linux-headers-* && mkdir -p "/usr/src/${header_path}" tar -mxzf header-${kernel_name}.tar.gz -C /usr/src/${header_path} [[ -d "/usr/src/${header_path}/include" ]] || error_msg "/usr/src/${header_path}/include folder is missing." echo -e "${INFO} (3/4) Unpacking [ header-${kernel_name}.tar.gz ] succeeded." else echo -e "${PROMPT} (3/4) [ header-${kernel_name}.tar.gz ] file does not exist, skip unpacking." fi # 04. For /usr/lib/modules/${kernel_name} rm -rf /usr/lib/modules/* tar -mxzf modules-${kernel_name}.tar.gz -C /usr/lib/modules [[ -n "${header_path}" ]] && (cd /usr/lib/modules/${kernel_name}/ && rm -f build source && ln -sf /usr/src/${header_path} build) [[ -d "/usr/lib/modules/${kernel_name}" ]] || error_msg "/usr/lib/modules/${kernel_name} kernel folder is missing." echo -e "${INFO} (4/4) Unpacking [ modules-${kernel_name}.tar.gz ] succeeded." # Update release file sed -i "s|^KERNEL_VERSION=.*|KERNEL_VERSION='${kernel_base}'|g" ${ophub_release_file} sed -i "s|^DOWNLOAD_TYPE=.*|DOWNLOAD_TYPE='${download_type}'|g" ${ophub_release_file} sed -i "s|^KERNEL_SIGNATURE=.*|KERNEL_SIGNATURE='${kernel_signature}'|g" ${ophub_release_file} # Restore the DTB files if necessary restore_fdtfile # Delete kernel temporary files rm -rf ${kernel_save_path}/* sync && echo "" } # Update the U-Boot bootloader update_uboot() { echo -e "${STEPS} Updating U-Boot bootloader..." # With TEXT_OFFSET patch is [ 0108 ], without TEXT_OFFSET patch is [ 0000 ] and need to ues [ UBOOT_OVERLOAD ] file. need_overload="yes" vmlinuz_file_name="$(find /boot -maxdepth 1 -type f -name "vmlinuz-*" 2>/dev/null | head -n 1)" [[ "$(hexdump -n 15 -x "${vmlinuz_file_name}" 2>/dev/null | head -n 1 | awk '{print $7}')" == "0108" ]] && need_overload="no" # Copy u-boot.ext and u-boot.emmc if [[ "${need_overload}" == "yes" && -f "/boot/${UBOOT_OVERLOAD}" ]]; then echo -e "${INFO} Copy u-boot: [ /boot/${UBOOT_OVERLOAD} ]" run_on_emmc="$(lsblk -l -o NAME | grep -oE "^${DISK_NAME}boot0")" [[ ! -f "/boot/u-boot.ext" ]] && cp -f /boot/${UBOOT_OVERLOAD} /boot/u-boot.ext [[ ! -f "/boot/u-boot.emmc" && -n "${run_on_emmc}" ]] && cp -f /boot/u-boot.ext /boot/u-boot.emmc chmod +x /boot/u-boot.* elif [[ "${need_overload}" == "yes" && ! -f "/boot/${UBOOT_OVERLOAD}" ]]; then echo -e "${PROMPT} The [ /boot/${UBOOT_OVERLOAD} ] file is required but missing." else echo -e "${INFO} No need for overload file, skip copying." fi # Write mainline u-boot if [[ "${auto_mainline_uboot}" == "yes" ]]; then echo -e "${INFO} Write Mainline u-boot: [ ${MAINLINE_UBOOT} ]" dd if="${MAINLINE_UBOOT}" of="/dev/${DISK_NAME}" conv=fsync bs=1 count=444 2>/dev/null dd if="${MAINLINE_UBOOT}" of="/dev/${DISK_NAME}" conv=fsync bs=512 skip=1 seek=1 2>/dev/null [[ "${?}" -ne "0" ]] && error_msg "Failed to write bootloader using [ dd ]." else echo -e "${INFO} Mainline U-Boot not enabled, skipping." fi sync && echo "" } # Adjust initrd and ramdisk address for Amlogic devices update_initrd_addr() { echo -e "${STEPS} Checking initrd and ramdisk addresses..." # Check if the file exists for emmc_autoscript.cmd and emmc_autoscript initrd_addr_file="/boot/emmc_autoscript.cmd" initrd_addr_mkimage_file="/boot/emmc_autoscript" if [[ -f "${initrd_addr_file}" ]]; then # Get the initrd_addr value initrd_addr_value="$(grep 'setenv initrd_addr' ${initrd_addr_file} | awk '{print $3}')" [[ -z "${initrd_addr_value}" ]] && error_msg "Failed to query [ initrd_addr ] value from [ ${initrd_addr_file} ]." # Check if the initrd_addr value is 0x15000000 [[ "${initrd_addr_value}" != "0x15000000" ]] && { echo -e "${INFO} The [ initrd_addr ] value is [ ${initrd_addr_value} ], need to adjust." # Adjust the initrd_addr value to 0x15000000 sed -i "s|^setenv initrd_addr.*|setenv initrd_addr 0x15000000|g" ${initrd_addr_file} [[ "${?}" -ne "0" ]] && error_msg "Failed to adjust [ initrd_addr ] value in [ ${initrd_addr_file} ]." echo -e "${INFO} Adjust [ initrd_addr ] value to [ 0x15000000 ] succeeded." # Create [ emmc_autoscript ] file sudo rm -f ${initrd_addr_mkimage_file} sudo mkimage -C none -A arm -T script -d ${initrd_addr_file} ${initrd_addr_mkimage_file} >/dev/null [[ "${?}" -ne "0" ]] && error_msg "Failed to create [ ${initrd_addr_mkimage_file} ] file." echo -e "${INFO} Create [ ${initrd_addr_mkimage_file} ] file succeeded." } else error_msg "The [ ${initrd_addr_file} ] file is missing, stop updating." fi # Check if the file exists for s905_autoscript.cmd and s905_autoscript ramdisk_addr_file="/boot/s905_autoscript.cmd" ramdisk_addr_mkimage_file="/boot/s905_autoscript" if [[ -f "${ramdisk_addr_file}" ]]; then # Get the ramdisk_addr_r value ramdisk_addr_value="$(grep 'setenv ramdisk_addr_r' ${ramdisk_addr_file} | awk '{print $3}')" [[ -z "${ramdisk_addr_value}" ]] && error_msg "Failed to query [ initrd_addr ] value from [ ${ramdisk_addr_file} ]." # Check if the ramdisk_addr_r value is 0x15000000 [[ "${ramdisk_addr_value}" != "0x15000000" ]] && { echo -e "${INFO} The [ ramdisk_addr_r ] value is [ ${ramdisk_addr_value} ], need to adjust." # Adjust the ramdisk_addr_r value to 0x15000000 sed -i "s|^setenv ramdisk_addr_r.*|setenv ramdisk_addr_r 0x15000000|g" ${ramdisk_addr_file} [[ "${?}" -ne "0" ]] && error_msg "Failed to adjust [ ramdisk_addr_r ] value in [ ${ramdisk_addr_file} ]." echo -e "${INFO} Adjust [ ramdisk_addr_r ] value to [ 0x15000000 ] succeeded." # Create [ s905_autoscript ] file sudo rm -f ${ramdisk_addr_mkimage_file} sudo mkimage -C none -A arm -T script -d ${ramdisk_addr_file} ${ramdisk_addr_mkimage_file} >/dev/null [[ "${?}" -ne "0" ]] && error_msg "Failed to create [ ${ramdisk_addr_mkimage_file} ] file." echo -e "${INFO} Create [ ${ramdisk_addr_mkimage_file} ] file succeeded." } fi # Check if the file exists for boot.ini boot_ini_file="/boot/boot.ini" if [[ -f "${boot_ini_file}" ]]; then # Get the initrd_addr value boot_ini_addr_value="$(grep 'setenv initrd_addr' ${boot_ini_file} | awk '{print $3}')" [[ -z "${boot_ini_addr_value}" ]] && error_msg "Failed to query [ initrd_addr ] value from [ ${boot_ini_file} ]." # Check if the initrd_addr value is 0x15000000 [[ "${boot_ini_addr_value}" != "0x15000000" ]] && { echo -e "${INFO} The [ initrd_addr ] value is [ ${boot_ini_addr_value} ], need to adjust." sed -i "s|^setenv initrd_addr.*|setenv initrd_addr 0x15000000|g" ${boot_ini_file} [[ "${?}" -ne "0" ]] && error_msg "Failed to adjust [ initrd_addr ] value in [ ${boot_ini_file} ]." echo -e "${INFO} Adjust [ initrd_addr ] value to [ 0x15000000 ] succeeded." } else error_msg "The [ ${boot_ini_file} ] file is missing, stop updating." fi # Check if the file exists for boot-emmc.ini boot_emmc_ini_file="/boot/boot-emmc.ini" if [[ -f "${boot_emmc_ini_file}" ]]; then # Get the initrd_addr value boot_emmc_ini_addr_value="$(grep 'setenv initrd_addr' ${boot_emmc_ini_file} | awk '{print $3}')" [[ -z "${boot_emmc_ini_addr_value}" ]] && error_msg "Failed to query [ initrd_addr ] value from [ ${boot_emmc_ini_file} ]." # Check if the initrd_addr value is 0x15000000 [[ "${boot_emmc_ini_addr_value}" != "0x15000000" ]] && { echo -e "${INFO} The [ initrd_addr ] value is [ ${boot_emmc_ini_addr_value} ], need to adjust." sed -i "s|^setenv initrd_addr.*|setenv initrd_addr 0x15000000|g" ${boot_emmc_ini_file} [[ "${?}" -ne "0" ]] && error_msg "Failed to adjust [ initrd_addr ] value in [ ${boot_emmc_ini_file} ]." echo -e "${INFO} Adjust [ initrd_addr ] value to [ 0x15000000 ] succeeded." } fi echo -e "${INFO} All address checks completed." sync && echo "" } # Update the Armbian OS version string update_os_version() { echo -e "${STEPS} Updating Armbian OS version..." # Get the latest Armbian OS version os_version="$( curl -fsSL -m 15 \ https://github.com/armbian/build/tags | grep -oE 'Link\">v.*' | grep -oE '[2-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}' | sort -urV | head -n 1 )" # Update the Armbian OS version if [[ ${?} -eq 0 && -n "${os_version}" ]]; then echo -e "${INFO} The latest Armbian OS version: [ ${os_version} ]" sed -i "s|^VERSION=.*|VERSION=\"${os_version}\"|g" ${armbian_image_file} ${armbian_release_file} sed -i "s|^REVISION=.*|REVISION=\"${os_version}\"|g" ${armbian_image_file} ${armbian_release_file} else echo -e "${PROMPT} Failed to query the latest Armbian OS version. Skipping update." fi sync && echo "" } # Rescue and restore the kernel to a target disk sos_kernel() { echo -e "${STEPS} Starting kernel rescue..." # Check the current system running disk check_disk # Supports specifying disks, such as: [ armbian-update -s mmcblk1 ] box_disk="${2}" if [[ -n "${box_disk}" ]]; then # Format the disk names box_disk="${box_disk//\/dev\//}" # Check if the disk exists [[ -b "/dev/${box_disk}" ]] || error_msg "The specified disk [ ${box_disk} ] does not exist." # Check if the specified disk is the same as the current system disk [[ "${box_disk}" == "${DISK_NAME}" ]] && error_msg "The specified disk [ ${box_disk} ] is the same as the current system disk [ ${DISK_NAME} ]." echo -e "${INFO} The device name of the specified disk: [ ${box_disk} ]" else # Find emmc disk, first find emmc containing boot0 partition box_disk="$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?|nvme[0-9]?n[0-9]?|[hsv]d[a-z])' | grep -vE ^${DISK_NAME} | sort -u | head -n 1)" # Check if disk exists [[ -z "${box_disk}" ]] && error_msg "Unable to locate the target disk for rescue." echo -e "${INFO} The device name of the target rescue disk: [ ${box_disk} ]" fi rescue_disk="/dev/${box_disk}" echo -e "${INFO} Armbian is running on [ /dev/${DISK_NAME} ]. Target rescue disk: [ ${rescue_disk} ]." # Create a temporary mount directory umount -f ${rescue_path}/bootfs 2>/dev/null umount -f ${rescue_path}/rootfs 2>/dev/null rm -rf ${rescue_path} 2>/dev/null mkdir -p ${rescue_path}/{bootfs/,rootfs/} && sync [[ "${?}" -ne "0" ]] && error_msg "Failed to create temporary mount directory [ ${rescue_path} ]." # Mount eMMC to USB [[ "${box_disk}" =~ ^([hsv]d[a-z]) ]] && PARTITION_NAME="" || PARTITION_NAME="p" mount ${rescue_disk}${PARTITION_NAME}1 ${rescue_path}/bootfs [[ "${?}" -ne "0" ]] && error_msg "mount ${rescue_disk}${PARTITION_NAME}1 failed!" mount ${rescue_disk}${PARTITION_NAME}2 ${rescue_path}/rootfs [[ "${?}" -ne "0" ]] && error_msg "mount ${rescue_disk}${PARTITION_NAME}2 failed!" # Identify the current system kernel files system_kernel="$(uname -r)" # 01. For /boot files if [[ -d "${rescue_path}/bootfs" ]]; then cd ${rescue_path}/bootfs rm -rf config-* initrd.img-* System.map-* vmlinuz-* uInitrd* *Image dtb* u-boot.ext u-boot.emmc [[ -f "/boot/u-boot.ext" ]] && { cp -f /boot/u-boot.ext -t . cp -f /boot/u-boot.ext u-boot.emmc chmod +x u-boot.ext u-boot.emmc } cp -rf /boot/{*-${system_kernel},uInitrd,*Image,dtb} -t . [[ "${?}" -ne "0" ]] && error_msg "(1/3) [ boot ] kernel files rescue failed." echo -e "${INFO} (1/3) [ boot ] kernel files rescue succeeded." # Adjust the initrd_addr value to 0x15000000 initrd_addr_file="emmc_autoscript.cmd" initrd_addr_mkimage_file="emmc_autoscript" [[ -f "${initrd_addr_file}" ]] && { sed -i "s|^setenv initrd_addr.*|setenv initrd_addr 0x15000000|g" ${initrd_addr_file} sudo rm -f ${initrd_addr_mkimage_file} sudo mkimage -C none -A arm -T script -d ${initrd_addr_file} ${initrd_addr_mkimage_file} >/dev/null } # Adjust the ramdisk_addr_r value to 0x15000000 ramdisk_addr_file="s905_autoscript.cmd" ramdisk_addr_mkimage_file="s905_autoscript" [[ -f "${ramdisk_addr_file}" ]] && { sed -i "s|^setenv ramdisk_addr_r.*|setenv ramdisk_addr_r 0x15000000|g" ${ramdisk_addr_file} sudo rm -f ${ramdisk_addr_mkimage_file} sudo mkimage -C none -A arm -T script -d ${ramdisk_addr_file} ${ramdisk_addr_mkimage_file} >/dev/null } # Adjust the initrd_addr value to 0x15000000 [[ -f "boot.ini" ]] && sed -i "s|^setenv initrd_addr.*|setenv initrd_addr 0x15000000|g" boot.ini [[ -f "boot-emmc.ini" ]] && sed -i "s|^setenv initrd_addr.*|setenv initrd_addr 0x15000000|g" boot-emmc.ini else error_msg "(1/3) The [ ${rescue_path}/bootfs ] folder does not exist, stop rescuing." fi # 02. For /usr/lib/modules/${system_kernel} if [[ -d "${rescue_path}/rootfs/usr/lib/modules" ]]; then cd ${rescue_path}/rootfs/usr/lib/modules rm -rf * cp -rf /usr/lib/modules/${system_kernel} -t . [[ "${?}" -ne "0" ]] && error_msg "(2/3) [ modules ] kernel files rescue failed." echo -e "${INFO} (2/3) [ modules ] kernel files rescue succeeded." else error_msg "(2/3) The [ ${rescue_path}/rootfs/usr/lib/modules ] folder does not exist, stop rescuing." fi # 03. For /usr/src/linux-headers-${system_kernel} if [[ -d "/usr/src/linux-headers-${system_kernel}" ]]; then cd ${rescue_path}/rootfs/usr/src rm -rf linux-headers-* cp -rf /usr/src/linux-headers-${system_kernel} -t . [[ "${?}" -ne "0" ]] && error_msg "(3/3) [ headers ] kernel files rescue failed." echo -e "${INFO} (3/3) [ headers ] kernel files rescue succeeded." else echo -e "${PROMPT} (3/3) [ /usr/src/linux-headers-${system_kernel} ] folder does not exist, skip rescue." fi # Unmount the emmc partition cd ${rescue_path} umount -f ${rescue_path}/bootfs 2>/dev/null umount -f ${rescue_path}/rootfs 2>/dev/null sync && echo "" } # Display help information # prettytable (single_border_style): https://github.com/jazzband/prettytable/blob/main/src/prettytable/prettytable.py#L1358 help_info() { clear cat </ │ Set the repository for downloading kernels from github.com │ │ -u │ automate │ stable/flippy/beta/rk3588/rk35xx/h6 │ Set the tags suffix of the kernel used │ │ -k │ latest │ kernel-version │ Set the kernel version │ │ -c │ None │ domain-name │ Set the cdn domain name for accelerated access to github.com │ │ -b │ yes │ yes/no │ Automatically backup the current system kernel │ │ -d │ tar │ tar/deb │ Set the download type for the kernel │ │ -m │ no │ yes/no │ Use Mainline u-boot │ │ -s │ None │ None/mmcblkX/nvmeXnX/sdX │ [SOS] Restore the system kernel of eMMC/NVMe/sdX disk │ └───────────┴──────────────┴─────────────────────────────────────┴───────────────────────────────────────────────────────────────┘ EOF exit 0 } # Check script permission [[ "$(id -u)" == "0" ]] || error_msg "Please run this script as root: [ sudo $0 ]" echo -e "${STEPS} Welcome to the Armbian Kernel Update Tool." # Execute relevant functions based on the options if [[ "${@}" =~ ^-s(\s)* ]]; then # Start rescuing the kernel sos_kernel "${@}" # Kernel restore successful sync && sleep 3 echo -e "${SUCCESS} Kernel rescue completed successfully. Please remove the disk and restart the Armbian system." elif [[ "${@}" == "-b yes" ]]; then # Backup current kernel init_var "${@}" backup_kernel # Kernel backup successful sync && sleep 3 echo -e "${SUCCESS} Kernel backup completed successfully." elif [[ "${@}" == "-h" ]]; then # Display help information help_info else # Start updating the kernel check_depends init_var "${@}" search_kernel [[ "${local_found}" == "no" ]] && download_kernel check_kernel [[ "${KERNEL_BACKUP}" != "no" ]] && backup_kernel [[ "${download_type}" == "deb" ]] && update_deb_kernel || update_tar_kernel [[ "${PLATFORM}" == "amlogic" ]] && { update_uboot update_initrd_addr } update_os_version # Kernel update successful sync && sleep 3 echo -e "${SUCCESS} Kernel update completed successfully. Rebooting the system..." reboot fi ================================================ FILE: build-armbian/armbian-files/common-files/usr/sbin/balethirq.pl ================================================ #!/usr/bin/perl # Copyright (C) 2021- https://github.com/unifreq use strict; our %irq_map; our %cpu_map; our %min_cpu_map; our %uniq_eth_cpu_map; our $all_cpu_mask = 0; # RPS CPU 掩码是否排除 eth0 占用的核心 (0: 否, 1: 是) our $rpscpu_exclude_eth0_core=1; # RPS CPU 掩码是否排除 eth1 占用的核心 (0: 否, 1: 是) our $rpscpu_exclude_eth1_core=1; our $usb_as_eth1 = 0; &read_config(); &read_irq_data(); &update_smp_affinity(); &enable_eth_rps_rfs(); &board_special_config(); exit(0); ############################## sub functions ######################### # 读取 /etc/balance_irq 或 /etc/config/balance_irq 中的配置文件 sub read_config { my $cpu_count = &get_cpu_count(); my $fh; my $config_file; if(-f "/etc/balance_irq") { $config_file = "/etc/balance_irq"; } elsif(-f "/etc/config/balance_irq") { $config_file = "/etc/config/balance_irq"; } else { exit(0); } open $fh, "<", $config_file or die $!; while(<$fh>) { chomp; # 跳过注释行 next if(/^#/); # 跳过空行 next if(/^\s*$/); my($name, $value) = split; my @cpus = split(',', $value); # ARMv8 架构当前最多支持 8 核 CPU my $min_cpu = 9; foreach my $cpu (@cpus) { if($cpu > $cpu_count) { $cpu = $cpu_count; } elsif($cpu < 1) { $cpu = 1; } if($min_cpu > $cpu) { $min_cpu = $cpu; } } # foreach $cpu_map{$name} = \@cpus; $min_cpu_map{$name} = $min_cpu; } # while close $fh; } # 计算 CPU 核心数 sub get_cpu_count { my $fh; open $fh, "<", "/proc/cpuinfo" or die $!; my $count=0; while(<$fh>) { chomp; my @ary = split; if($ary[0] eq "processor") { $count++; $all_cpu_mask += 1<<($count-1); } } close $fh; return $count; } sub read_irq_data { my $fh; open $fh, "<", "/proc/interrupts" or die $!; my %local_map; while(<$fh>) { chomp; my @raw = split; my $irq = $raw[0]; $irq =~ s/://; my $name = $raw[-1]; if(exists $local_map{$name}) { # R68S 有 2 条 eth0 和 2 条 eth1,仅保留第 1 条 next; } else { $local_map{$name} = 1; } if(exists $cpu_map{$name}) { $irq_map{$name} = $irq; if($name =~ m/\Axhci-hcd:usb[1-9]\Z/) { if (not (exists $cpu_map{eth1} || exists $cpu_map{'eth1-0'}) ) { # 对于单网口设备,USB 外接网卡视为 eth1 $usb_as_eth1 = 1; $uniq_eth_cpu_map{eth1} = 1 << ($min_cpu_map{$name} - 1); } else { $uniq_eth_cpu_map{$name} = 1 << ($min_cpu_map{$name} - 1); } } else { $uniq_eth_cpu_map{$name} = 1 << ($min_cpu_map{$name} - 1); } } } close $fh; } sub update_smp_affinity { for my $key (sort keys %irq_map) { my $fh; my $irq = $irq_map{$key}; my $cpus_ref = $cpu_map{$key}; my $mask = 0; foreach my $cpu (@$cpus_ref) { $mask += 1 << ($cpu-1); } my $smp_affinity = sprintf("%0x", $mask); open $fh, ">", "/proc/irq/$irq/smp_affinity" or die $!; print "IRQ name: $key, IRQ: $irq, affinity: $smp_affinity\n"; print $fh "$smp_affinity\n"; close $fh; } } sub tunning_eth_ring { my ($eth, $target_rx_ring, $target_tx_ring) = @_; my $buf = `/usr/sbin/ethtool -g ${eth} 2>/dev/null`; if($buf) { $buf =~ s/\r|\n/\t/g; if( $buf =~ m/.+?Pre-set maximums:\s+RX:\s+(\d+|n\/a).+?TX:\s+(\d+|n\/a).+?Current hardware settings:\s+RX:\s+(\d+|n\/a).+?TX:\s+(\d+|n\/a)/) { my $max_rx_ring = $1; my $max_tx_ring = $2; my $cur_rx_ring = $3; my $cur_tx_ring = $4; $max_rx_ring = 0 if ($max_rx_ring eq 'n/a'); $max_tx_ring = 0 if ($max_tx_ring eq 'n/a'); $cur_rx_ring = 0 if ($cur_rx_ring eq 'n/a'); $cur_tx_ring = 0 if ($cur_tx_ring eq 'n/a'); if( ($max_rx_ring > 0) && ($target_rx_ring>0) && ($max_rx_ring > $target_rx_ring) && ($cur_rx_ring != $target_rx_ring) ) { system "/usr/sbin/ethtool -G ${eth} rx ${target_rx_ring} >/dev/null 2>&1"; print "Set the RX ring of ${eth} to ${target_rx_ring}\n"; } if( ($max_tx_ring > 0) && ($target_tx_ring>0) && ($max_tx_ring > $target_tx_ring) && ($cur_tx_ring != $target_tx_ring) ) { system "/usr/sbin/ethtool -G ${eth} tx ${target_tx_ring} >/dev/null 2>&1"; print "Set the TX ring of ${eth} to ${target_tx_ring}\n"; } } } } sub enable_eth_rps_rfs { my $rps_sock_flow_entries = 0; for my $eth ("eth0","eth1","eth2","eth3","eth4","eth5","eth6") { # RPS 优化仅针对单队列网卡, # 如果存在 rx-1,则表示该网卡支持 RSS 多队列,无需优化 if((-d "/sys/class/net/${eth}/queues/rx-0") && (! -d "/sys/class/net/${eth}/queues/rx-1")) { my $value = 32768; $rps_sock_flow_entries += $value; my $eth_cpu_mask_hex; my $cpu_mask = $all_cpu_mask; if($rpscpu_exclude_eth0_core == 1) { $cpu_mask -= $uniq_eth_cpu_map{eth0}; } if($rpscpu_exclude_eth1_core == 1) { $cpu_mask -= $uniq_eth_cpu_map{eth1}; } $eth_cpu_mask_hex = sprintf("%0x", $cpu_mask); print "Set the RPS CPU mask of $eth to 0x$eth_cpu_mask_hex\n"; open my $fh, ">", "/sys/class/net/${eth}/queues/rx-0/rps_cpus" or die; print $fh $eth_cpu_mask_hex; close $fh; open $fh, ">", "/sys/class/net/${eth}/queues/rx-0/rps_flow_cnt" or die; print $fh $value; close $fh; open my $fh, ">", "/sys/class/net/${eth}/queues/tx-0/xps_cpus" or die; print $fh $eth_cpu_mask_hex; close $fh; if( ($eth eq "eth1") && ($usb_as_eth1 == 1) ) { # USB 外接网卡 eth1 (RTL8153),经实测最佳 rx_ring 范围为 100-500,默认值 100,超过 500 后多核 CPU 负载会失衡 &tunning_eth_ring($eth, 192, 0); } } } open my $fh, ">", "/proc/sys/net/core/rps_sock_flow_entries" or die; print $fh $rps_sock_flow_entries; close $fh; } sub get_boardinfo() { my $ret="unknown"; if(-f "/proc/device-tree/model") { open my $fh, "<", "/proc/device-tree/model" or warn $!; read $fh, $ret, 100; close $fh; $ret =~ s/\0//; } return $ret; } sub board_special_config() { my $board = &get_boardinfo(); if($board eq "FastRhino R66S") { &optimize_eth_parameters("eth0","eth1"); } elsif($board eq "FastRhino R68S") { &optimize_eth_parameters("eth0","eth1","eth2","eth3"); } elsif($board eq "Radxa E25") { &optimize_eth_parameters("eth0","eth1"); } elsif($board eq "FriendlyElec NanoPi R5") { &optimize_eth_parameters("eth0","eth1","eth2"); } elsif($board eq "Radxa ROCK 5B") { &optimize_eth_parameters("eth0","eth1"); } elsif($board eq "Beelink IPC-R Board") { &optimize_eth_parameters("eth0","eth1","eth2","eth3","eth4","eth5"); } elsif($board eq "Hlink H28K") { &optimize_eth_parameters("eth0", "eth1"); } elsif($board eq "Hlink H66K") { &optimize_eth_parameters("eth0","eth1","eth2"); } elsif($board eq "Hlink H68K") { &optimize_eth_parameters("eth0","eth1","eth2","eth3"); } elsif($board eq "Hlink H69K") { &optimize_eth_parameters("eth0","eth1","eth2","eth3"); } elsif($board eq "Hlink H88K") { &optimize_eth_parameters("eth0","eth1"); } elsif($board eq "Hlink H88K-V3") { &optimize_eth_parameters("eth0","eth1"); } } sub optimize_eth_parameters { while (my $eth = shift) { print "Optimizing $eth ... "; system "ethtool -K $eth scatter-gather on >/dev/null 2>&1"; system "ethtool -K $eth tcp-segmentation-offload on >/dev/null 2>&1"; system "ethtool -K $eth rx-udp-gro-forwarding on >/dev/null 2>&1"; print "done\n"; } } ================================================ FILE: build-armbian/armbian-files/common-files/usr/share/alsa/cards/axg-sound-card.conf ================================================ # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2020-present Team LibreELEC (https://libreelec.tv) # # Configuration for Amlogic AXG audio # axg-sound-card.pcm.default { @args [ CARD ] @args.CARD { type string } type softvol slave.pcm { type plug slave { pcm { type hw card $CARD device 0 } } } control { name "PCM Playback Volume" card $CARD } } axg-sound-card.pcm.hdmi.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 0 } hooks.0 { type ctl_elems hook_args [ { name "IEC958 Playback Default" interface PCM lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } } axg-sound-card.pcm.iec958.0 { @args [ CARD AES0 AES1 AES2 AES3 ] @args.CARD { type string } @args.AES0 { type integer } @args.AES1 { type integer } @args.AES2 { type integer } @args.AES3 { type integer } type hooks slave.pcm { type hw card $CARD device 1 } hooks.0 { type ctl_elems hook_args [ { name "IEC958 Playback Default" interface PCM lock true preserve true optional true value [ $AES0 $AES1 $AES2 $AES3 ] } ] } hint.device 1 } ================================================ FILE: build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/201-desktop-chinese-fonts.sh ================================================ #!/bin/bash #============================================================================ # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Install Chinese language support for desktop systems # Copyright (C) 2021- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: sudo ./201-desktop-chinese-fonts.sh # #============================== Functions list ============================== # # error_msg : Output error message and exit # check_release : Check and load system release information # set_chinese_env : Configure Chinese locale environment # install_chinese_fonts : Install Chinese language packages and fonts # #========================== Set default parameters ========================== # # Get custom firmware information ophub_release_file="/etc/ophub-release" # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" OPTIONS="[\033[93m OPTIONS \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #============================================================================ # Show error message error_msg() { echo -e "${ERROR} ${1}" exit 1 } # Check release file check_release() { if [[ -f "${ophub_release_file}" ]]; then source "${ophub_release_file}" 2>/dev/null VERSION_CODEID="${VERSION_CODEID}" VERSION_CODENAME="${VERSION_CODENAME}" else error_msg "${ophub_release_file} file is missing!" fi [[ -n "${VERSION_CODEID}" && -n "${VERSION_CODENAME}" ]] || error_msg "${ophub_release_file} value is missing!" } # Set Chinese environment set_chinese_env() { # Add Chinese language setting echo -e "${STEPS} Adding Chinese environment variable settings..." local etc_env="/etc/environment" sed -i '/^LANG=/d' ${etc_env} sed -i '/^LANGUAGE=/d' ${etc_env} sed -i '/^export LANG/d' ${etc_env} echo 'LANG="zh_CN.UTF-8"' >>${etc_env} echo 'LANGUAGE="zh_CN:zh:en_US:en"' >>${etc_env} echo 'export LANG' >>${etc_env} echo 'export LANGUAGE' >>${etc_env} echo -e "${INFO} Contents of [ ${etc_env} ]: \n$(cat ${etc_env})" local locale_conf="/etc/default/locale" [[ -f "${locale_conf}" ]] || touch ${locale_conf} 2>/dev/null sed -i '/^LANG=/d' ${locale_conf} sed -i '/^LANGUAGE=/d' ${locale_conf} sed -i '/^LC_MESSAGES=/d' ${locale_conf} sed -i '/^LC_ALL=/d' ${locale_conf} sed -i '/^export LANG/d' ${locale_conf} echo 'LANG=zh_CN.UTF-8' >>${locale_conf} echo 'LANGUAGE=zh_CN:zh:en_US:en' >>${locale_conf} echo 'LC_MESSAGES=zh_CN.UTF-8' >>${locale_conf} echo 'LC_ALL=zh_CN.UTF-8' >>${locale_conf} echo -e "${INFO} Contents of [ ${locale_conf} ]: \n$(cat ${locale_conf})" # Add locale support settings echo -e "${STEPS} Adding Chinese locale settings..." local local_set="/var/lib/locales/supported.d/local" [[ -f "${local_set}" ]] || { mkdir -p "/var/lib/locales/supported.d" touch ${local_set} } echo 'en_US.UTF-8 UTF-8' >${local_set} echo 'zh_CN.UTF-8 UTF-8' >>${local_set} echo 'zh_CN.GBK GBK' >>${local_set} echo 'zh_CN GB2312' >>${local_set} echo -e "${INFO} Contents of [ ${local_set} ]: \n$(cat ${local_set})" # Load settings echo -e "${STEPS} Generating Chinese locale..." sudo locale-gen } # Install Chinese language packages install_chinese_fonts() { # Get related variables check_release # Generic packages for Ubuntu system local ubuntu_packages=( "language-pack-zh-hans" "language-pack-gnome-zh-hans" "thunderbird-locale-zh-hans" "thunderbird-locale-zh-cn" "fonts-noto-cjk" "fonts-noto-cjk-extra" "fonts-droid-fallback" "fonts-wqy-zenhei" "fonts-wqy-microhei" "fonts-arphic-ukai" "fonts-arphic-uming" "ibus-table-wubi" "ibus-libpinyin" ) # Packages of resolute/noble system local resolute_packages=( "kde-config-fcitx5" ) # Packages of focal system local focal_packages=( "kde-config-fcitx" ) # Packages of bookworm/bullseye/trixie system local debian_packages=( "fonts-noto-cjk" "fonts-noto-cjk-extra" "fonts-droid-fallback" "fonts-wqy-zenhei" "fonts-wqy-microhei" "fonts-arphic-ukai" "fonts-arphic-uming" "fonts-arphic-bsmi00lp" "fonts-arphic-gbsn00lp" "fonts-arphic-gkai00mp" "fcitx" "fcitx-table*" "fcitx-frontend-gtk2" "fcitx-frontend-gtk3" "fcitx-frontend-qt*" "fcitx-table-wbpy" "fcitx-sunpinyin" "fcitx-googlepinyin" "fcitx-pinyin" "kde-config-fcitx" "ibus-table-wubi" "ibus-libpinyin" ) # Install the Chinese language packages for the desktop system sudo apt-get update case "${VERSION_CODENAME}" in resolute | jammy | noble | oracular) echo -e "${STEPS} Installing Chinese language pack for [ ${VERSION_CODENAME} ]..." sudo apt-get install -y ${ubuntu_packages[*]} sudo apt-get install -y ${resolute_packages[*]} set_chinese_env ;; focal) echo -e "${STEPS} Installing Chinese language pack for [ ${VERSION_CODENAME} ]..." sudo apt-get install -y ${ubuntu_packages[*]} sudo apt-get install -y ${focal_packages[*]} set_chinese_env ;; bullseye | bookworm | trixie) echo -e "${STEPS} Installing Chinese language pack for [ ${VERSION_CODENAME} ]..." sudo apt-get install -y ${debian_packages[*]} set_chinese_env ;; *) error_msg "Unsupported system: [ ${VERSION_CODENAME} ]" ;; esac echo -e "${SUCCESS} Chinese desktop support has been installed successfully." } # Check script permission [[ "$(id -u)" == "0" ]] || error_msg "Please run this script as root: [ sudo ${0} ]" # Prompt for installation echo -ne "${OPTIONS} Install Chinese desktop support? (y/n): " read optid optid="${optid/Y/y}" && optid="${optid/N/n}" [[ "${optid:0:1}" == "y" ]] && install_chinese_fonts || echo -e "${INFO} Skipped Chinese desktop settings." ================================================ FILE: build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/301-frps.sh ================================================ #!/bin/bash #============================================================================ # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Manage frps (FRP server) software installation, update, and removal # Copyright (C) 2021- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: ${0} # Example: ${0} install # ${0} update # ${0} remove # #============================== Functions list ============================== # # error_msg : Output error message and exit # software_download : Download the latest frps release # software_install : Install and configure frps # software_update : Update frps to the latest version # software_remove : Remove frps and clean up files # #========================== Set default parameters ========================== # # Define the software software_name="frps" software_core="/usr/bin/frps" software_conf="/etc/frp/frps.ini" software_service="/etc/systemd/system/frps.service" # # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" PROMPT="[\033[93m PROMPT \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #============================================================================ # Show error message error_msg() { echo -e "${ERROR} ${1}" exit 1 } software_download() { echo -e "${STEPS} Downloading [ ${software_name} ] software..." # Software version query api software_api="https://api.github.com/repos/fatedier/frp/releases" # Check the latest version, E.g: v0.43.0 software_latest_version="$(curl -s "${software_api}" | grep "tag_name" | awk -F '"' '{print $4}' | tr " " "\n" | sort -rV | head -n 1)" # Query download address, E.g: https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_arm64.tar.gz software_url="$(curl -s "${software_api}" | grep -oE "https:.*${software_latest_version}.*linux_arm64.*.tar.gz")" [[ -n "${software_url}" ]] || error_msg "Failed to obtain the download address!" echo -e "${INFO} Downloading from: [ ${software_url} ]" # Download software, E.g: /tmp/tmp.xxx/frp_0.43.0_linux_arm64.tar.gz tmp_download="$(mktemp -d)" software_filename="${software_url##*/}" curl -fsSL "${software_url}" -o "${tmp_download}/${software_filename}" [[ "${?}" -eq "0" && -s "${tmp_download}/${software_filename}" ]] || error_msg "Failed to download the software!" echo -e "${INFO} Download completed: $(ls ${tmp_download} -l)" # Unzip the downloaded file tar -xf ${tmp_download}/${software_filename} -C ${tmp_download} && sync # Software directory, E.g: /tmp/tmp.xxx/frp_0.43.0_linux_arm64 software_dir="${tmp_download}/${software_filename/.tar.gz/}" echo -e "${INFO} Software directory: [ ${software_dir} ]" } software_install() { echo -e "${STEPS} Installing [ ${software_name} ] software..." software_download # Generate random token random_token="$(cat /proc/sys/kernel/random/uuid)" # Generate random account random_account="$(cat /proc/sys/kernel/random/uuid)" random_user="${random_account:0:18}" random_pwd="${random_account:19}" # Add frps.ini echo -e "${INFO} Add frps.ini to: [ ${software_conf} ]" [[ -d "/etc/frp" ]] || sudo mkdir -p "/etc/frp" # Copy the complete setup example sudo cp -f ${software_dir}/frps_full.ini /etc/frp # Generate common custom settings file sudo cat >${software_conf} <${software_service} </dev/null sudo systemctl daemon-reload echo -e "${SUCCESS} Software removed successfully." exit 0 } software_help() { echo -e "${STEPS} Script usage instructions:" cat < # Example: ${0} install # ${0} update # ${0} remove # #============================== Functions list ============================== # # error_msg : Output error message and exit # software_download : Download the latest frpc release # software_install : Install and configure frpc # software_update : Update frpc to the latest version # software_remove : Remove frpc and clean up files # #========================== Set default parameters ========================== # # Define the software software_name="frps" software_core="/usr/bin/frpc" software_conf="/etc/frp/frpc.ini" software_service="/etc/systemd/system/frpc.service" # # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" PROMPT="[\033[93m PROMPT \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #============================================================================ # Show error message error_msg() { echo -e "${ERROR} ${1}" exit 1 } software_download() { echo -e "${STEPS} Downloading [ ${software_name} ] software..." # Software version query api software_api="https://api.github.com/repos/fatedier/frp/releases" # Check the latest version, E.g: v0.43.0 software_latest_version="$(curl -s "${software_api}" | grep "tag_name" | awk -F '"' '{print $4}' | tr " " "\n" | sort -rV | head -n 1)" # Query download address, E.g: https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_arm64.tar.gz software_url="$(curl -s "${software_api}" | grep -oE "https:.*${software_latest_version}.*linux_arm64.*.tar.gz")" [[ -n "${software_url}" ]] || error_msg "Failed to obtain the download address!" echo -e "${INFO} Downloading from: [ ${software_url} ]" # Download software, E.g: /tmp/tmp.xxx/frp_0.43.0_linux_arm64.tar.gz tmp_download="$(mktemp -d)" software_filename="${software_url##*/}" curl -fsSL "${software_url}" -o "${tmp_download}/${software_filename}" [[ "${?}" -eq "0" && -s "${tmp_download}/${software_filename}" ]] || error_msg "Failed to download the software!" echo -e "${INFO} Download completed: $(ls ${tmp_download} -l)" # Unzip the downloaded file tar -xf ${tmp_download}/${software_filename} -C ${tmp_download} && sync # Software directory, E.g: /tmp/tmp.xxx/frp_0.43.0_linux_arm64 software_dir="${tmp_download}/${software_filename/.tar.gz/}" echo -e "${INFO} Software directory: [ ${software_dir} ]" } software_install() { echo -e "${STEPS} Installing [ ${software_name} ] software..." software_download # Add frpc.ini echo -e "${INFO} Add frpc.ini to: [ ${software_conf} ]" [[ -d "/etc/frp" ]] || sudo mkdir -p "/etc/frp" # Copy the complete setup example sudo cp -f ${software_dir}/frpc_full.ini /etc/frp # Generate common custom settings file sudo cat >${software_conf} <${software_service} </dev/null sudo systemctl daemon-reload echo -e "${SUCCESS} Software removed successfully." exit 0 } software_help() { echo -e "${STEPS} Script usage instructions:" cat < -m # Example: command-desktop.sh -s 201 -m install # command-desktop.sh -s 201 -m update # command-desktop.sh -s 201 -m remove # #============================== Software list =============================== # # software_201 : For desktop # software_202 : For firefox # software_203 : For vlc # software_204 : For mpv # software_205 : For gimp # software_206 : For krita # software_207 : For libreoffice # software_208 : For shotcut # software_209 : For kdenlive # software_210 : For thunderbird # software_211 : For evolution # software_212 : For gwenview # software_213 : For eog # software_214 : For visual.studio.code # software_215 : For gedit # software_216 : For flameshot # #============================================================================ # Execute generic functions software_path="/usr/share/ophub/armbian-software" software_command="${software_path}/software-command.sh" source "${software_command}" # For desktop software_201() { case "${software_manage}" in install) # Add login desktop system user echo -ne "${OPTIONS} Please input the desktop login user (non-root): " read get_desktop_user if [[ -n "${get_desktop_user}" ]]; then sudo adduser ${get_desktop_user} sudo usermod -aG sudo ${get_desktop_user} echo -e "${INFO} Desktop user: [ ${get_desktop_user} ]" else echo -e "${NOTE} Skipped adding a desktop login user." fi # Remote desktop option echo -ne "${OPTIONS} Enable remote desktop? (y/n): " read get_rd if [[ -n "${get_rd}" ]]; then get_rd="${get_rd,,,}" [[ "${get_rd:0:1}" == "y" ]] && get_rd="yes" || get_rd="no" else get_rd="no" fi echo -e "${INFO} Remote desktop enabled: [ ${get_rd} ]" # Define display manager local display_manager="lightdm" # Define input drivers and display managers local input_drivers="xserver-xorg-input-libinput xserver-xorg-input-evdev" if [[ "${VERSION_CODEID}" == "ubuntu" ]]; then # Install ubuntu-desktop on Ubuntu (resolute/noble) software_install "ubuntu-desktop ${display_manager} ${input_drivers}" elif [[ "${VERSION_CODEID}" == "debian" ]]; then # Install gnome on Debian (bookworm/trixie) software_install "gnome ${display_manager} ${input_drivers}" else error_msg "VERSION_CODEID not supported: [ ${VERSION_CODEID} ]" fi # Install xrdp and configure [[ "${get_rd}" == "yes" ]] && { # Install xrdp software_install "xrdp xorgxrdp" # Configure xrdp sudo cat <>/etc/xrdp/xrdp.ini [xrdp2] name=Custom_Remote_Desktop lib=libvnc.so username=${get_desktop_user} password=ask ip=${my_address} port=-1 code=20 EOF # Restart xrdp sudo mkdir -p /var/run/xrdp sudo chmod 775 /var/run/xrdp sudo systemctl enable xrdp sudo systemctl restart xrdp } # Install Chinese desktop support sudo bash ${software_path}/201-desktop-chinese-fonts.sh sync && sleep 3 echo -e "${SUCCESS} Desktop installed successfully. Restarting..." reboot ;; update) software_update ;; remove) if [[ "${VERSION_CODEID}" == "ubuntu" ]]; then # Remove ubuntu-desktop(gdm3) on Ubuntu (resolute/noble) software_remove "ubuntu-desktop gdm3" elif [[ "${VERSION_CODEID}" == "debian" ]]; then # Remove gnome(gdm3) on Debian (bookworm/trixie) software_remove "gnome gdm3" else error_msg "VERSION_CODEID not supported: [ ${VERSION_CODEID} ]" fi sync && sleep 3 echo -e "${SUCCESS} Desktop removed successfully. Restarting..." reboot ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For firefox software_202() { case "${software_manage}" in install) case "${VERSION_CODENAME}" in resolute | noble | jammy) sudo add-apt-repository ppa:mozillateam/ppa -y sudo apt-get update software_install "firefox-esr" ;; focal) software_install "firefox" ;; bullseye | bookworm | trixie) software_install "firefox-esr" ;; *) error_msg "Unsupported system: [ ${VERSION_CODENAME} ]" ;; esac ;; update) software_update ;; remove) case "${VERSION_CODENAME}" in resolute | noble | jammy) software_remove "firefox-esr" sudo add-apt-repository --remove ppa:mozillateam/ppa -y ;; focal) software_remove "firefox" ;; bullseye | bookworm | trixie) software_remove "firefox-esr" ;; *) error_msg "Unsupported system: [ ${VERSION_CODENAME} ]" ;; esac ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For vlc software_203() { case "${software_manage}" in install) software_install "vlc" ;; update) software_update ;; remove) software_remove "vlc" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For mpv software_204() { case "${software_manage}" in install) software_install "mpv" ;; update) software_update ;; remove) software_remove "mpv" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For gimp software_205() { case "${software_manage}" in install) software_install "gimp" ;; update) software_update ;; remove) software_remove "gimp" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For krita software_206() { case "${software_manage}" in install) software_install "krita" ;; update) software_update ;; remove) software_remove "krita" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For libreoffice software_207() { case "${software_manage}" in install) software_install "libreoffice libreoffice-l10n-zh-cn libreoffice-help-zh-cn" ;; update) software_update ;; remove) software_remove "libreoffice libreoffice-l10n-zh-cn libreoffice-help-zh-cn" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For shotcut software_208() { case "${software_manage}" in install) software_install "shotcut" ;; update) software_update ;; remove) software_remove "shotcut" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For kdenlive software_209() { case "${software_manage}" in install) software_install "kdenlive" ;; update) software_update ;; remove) software_remove "kdenlive" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For thunderbird software_210() { case "${software_manage}" in install) software_install "thunderbird" ;; update) software_update ;; remove) software_remove "thunderbird" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For evolution software_211() { case "${software_manage}" in install) software_install "evolution" ;; update) software_update ;; remove) software_remove "evolution" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For gwenview software_212() { case "${software_manage}" in install) software_install "gwenview" ;; update) software_update ;; remove) software_remove "gwenview" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For eog software_213() { case "${software_manage}" in install) software_install "eog" ;; update) software_update ;; remove) software_remove "eog" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For visual.studio.code software_214() { case "${software_manage}" in install) tmp_download="$(mktemp -d)/code_arm64.deb" curl -L https://aka.ms/linux-arm64-deb >${tmp_download} [[ "${?}" -eq "0" && -s "${tmp_download}" ]] || error_msg "Failed to download the software!" sudo dpkg -i ${tmp_download} ;; update) software_update ;; remove) software_remove "code" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For gedit software_215() { case "${software_manage}" in install) software_install "gedit" ;; update) software_update ;; remove) software_remove "gedit" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For flameshot software_216() { case "${software_manage}" in install) software_install "flameshot" ;; update) software_update ;; remove) software_remove "flameshot" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # Initialize variables init_var "${@}" software_${software_id} ${software_manage} ================================================ FILE: build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/command-docker.sh ================================================ #!/bin/bash #============================================================================ # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Manage Docker container software installation, update, and removal # Copyright (C) 2021- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: command-docker.sh -s -m # Example: command-docker.sh -s 101 -m install # command-docker.sh -s 101 -m update # command-docker.sh -s 101 -m remove # #============================== Software list =============================== # # software_101 : For docker # software_102 : For portainer:8000/9443 # software_103 : For yacht:8001 # software_104 : For transmission:9091/51413 # software_105 : For qbittorrent:8080/6881 # software_106 : For nextcloud:8088 # software_107 : For jellyfin:8096/8920/7359/1900 # software_108 : For homeassistant:8123 # software_109 : For kodbox:8081 # software_110 : For couchpotato:5050 # software_111 : For sonarr:8989 # software_112 : For radarr:7878 # software_113 : For syncthing:8384 # software_114 : For filebrowser:8002 # software_115 : For heimdall:8003/8004 # software_116 : For node-red:1880 # software_117 : For mosquitto:1883/9001 # software_118 : For openwrt:80 # software_119 : For netdata:19999 # software_120 : For xunlei:2345 # software_121 : For docker-headless:10081/10089 # software_122 : For navidrome:4533 # software_123 : For openlist:5244 # software_124 : For qinglong:5700 # software_125 : For chatgpt-next-web:3000 # software_126 : For n8n:5678 # #============================================================================ # Execute generic functions software_path="/usr/share/ophub/armbian-software" software_command="${software_path}/software-command.sh" source "${software_command}" # For docker software_101() { case "${software_manage}" in install) armbian-docker install ;; update) armbian-docker update ;; remove) armbian-docker remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For portainer software_102() { # Set basic information container_name="portainer" image_name="portainer/portainer-ce:latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Prompt users whether to use their own SSL certificate echo -ne "${OPTIONS} Using your own SSL certificate? (y/N): " read use_ssl [[ "${use_ssl,,}" =~ ^[y] ]] && use_ssl="yes" || use_ssl="no" echo -e "${INFO} Your own SSL Certificate Selection: [ ${use_ssl} ]" # Instructions(English): https://hub.docker.com/r/portainer/portainer-ce docker volume create ${container_name}_data if [[ "${use_ssl}" == "yes" ]]; then # https://docs.portainer.io/advanced/ssl docker run -d --name ${container_name} \ --restart always \ -p 8000:8000 \ -p 9443:9443 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ${install_path}/portainer_data:/data \ -v ${install_path}/certs:/certs \ ${image_name} \ --sslcert /certs/portainer.crt \ --sslkey /certs/portainer.key else docker run -d --name ${container_name} \ --restart always \ -p 8000:8000 \ -p 9443:9443 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ${install_path}/portainer_data:/data \ ${image_name} fi sync && sleep 3 [[ "${use_ssl}" == "yes" ]] && { echo -e "${NOTE} Please place your SSL certificate in: [ ${install_path}/certs/portainer.crt & portainer.key ]" } echo -e "${NOTE} The ${container_name} address: [ https://${my_address}:9443 ]" echo -e "${SUCCESS} The ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For yacht software_103() { # Set basic information container_name="yacht" image_name="selfhostedpro/yacht:latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/selfhostedpro/yacht docker volume create ${container_name} docker run -d --name ${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8001:8000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ${install_path}/config:/config \ --restart unless-stopped \ ${image_name} sudo ufw allow 8001/tcp 2>/dev/null sync && sleep 3 echo -e "${NOTE} The ${container_name} address: [ http://${my_address}:8001 ]" echo -e "${NOTE} The ${container_name} account: [ username:admin@yacht.local / password:pass ]" echo -e "${NOTE} The ${container_name} website: [ https://yacht.sh ]" echo -e "${NOTE} The ${container_name} template: [ https://raw.githubusercontent.com/SelfhostedPro/selfhosted_templates/yacht/Template/template.json ]" echo -e "${SUCCESS} The ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For transmission software_104() { # Set basic information container_name="transmission" image_name="linuxserver/transmission:arm64v8-latest" install_path="${docker_path}/${container_name}" # Generate random account random_account="$(cat /proc/sys/kernel/random/uuid)" tr_default_user="admin" tr_default_pass="${random_account:0:18}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." echo -ne "${OPTIONS} Set login username, the default is [ ${tr_default_user} ]: " read tr_user [[ -z "${tr_user}" ]] && tr_user="${tr_default_user}" echo -e "${INFO} Login username: [ ${tr_user} ]" echo -ne "${OPTIONS} Set login password, the default is [ ${tr_default_pass} ]: " read tr_pass [[ -z "${tr_pass}" ]] && tr_pass="${tr_default_pass}" echo -e "${INFO} Login password: [ ${tr_pass} ]" # Instructions: https://github.com/linuxserver/docker-transmission docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -e USER=${tr_user} \ -e PASS=${tr_pass} \ -p 9091:9091 \ -p 51413:51413 \ -p 51413:51413/udp \ -v ${install_path}/config:/config \ -v ${install_path}/watch/folder:/watch \ -v ${download_path}:/downloads \ --restart unless-stopped \ ${image_name} # Set the transmission-web-control #echo -e "${STEPS} Installing the transmission-web-control interface..." #tr_cn_url="https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control-cn.sh" #bash <(curl -fsSL ${tr_cn_url}) ${install_path} sync && sleep 3 echo -e "${NOTE} The ${container_name} address: [ http://${my_address}:9091 ]" echo -e "${NOTE} The ${container_name} account: [ username:${tr_user} / password:${tr_pass} ]" echo -e "${SUCCESS} The ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For qbittorrent software_105() { # Set basic information container_name="qbittorrent" image_name="linuxserver/qbittorrent:arm64v8-latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/linuxserver/qbittorrent docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -e WEBUI_PORT=8080 \ -p 8080:8080 \ -p 6881:6881 \ -p 6881:6881/udp \ -v ${install_path}/appdata/config:/config \ -v ${download_path}:/downloads \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address: [ http://${my_address}:8080 ]" echo -e "${NOTE} View ${container_name} username and password: [ docker logs -f qbittorrent ]" echo -e "${SUCCESS} The ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For nextcloud software_106() { # Set basic information container_name="nextcloud" image_name="arm64v8/nextcloud:latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/arm64v8/nextcloud docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8088:80 \ -v ${install_path}/nextcloud:/var/www/html \ -v ${install_path}/apps:/var/www/html/custom_apps \ -v ${install_path}/config:/var/www/html/config \ -v ${install_path}/data:/var/www/html/data \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:8088 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For jellyfin software_107() { # Set basic information container_name="jellyfin" image_name="linuxserver/jellyfin:arm64v8-latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/linuxserver/jellyfin docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8096:8096 \ -p 8920:8920 \ -p 7359:7359/udp \ -p 1900:1900/udp \ -v ${install_path}/library:/config \ -v ${install_path}/tvseries:/data/tvshows \ -v ${install_path}/movies:/data/movies \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:8096 / https://${my_address}:8920 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For homeassistant software_108() { # Set basic information container_name="homeassistant" image_name="homeassistant/home-assistant:latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/homeassistant/home-assistant docker run -d --name=${container_name} \ --privileged \ --network=host \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8123:8123 \ -v ${install_path}/config:/config \ -v ${install_path}/media:/media \ -v /run/dbus:/run/dbus:ro \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} app [ Home Assistant ]" echo -e "${NOTE} The ${container_name} address [ http://${my_address}:8123 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For kodbox software_109() { # Set basic information container_name="kodbox" image_name="kodcloud/kodbox:latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/kodcloud/kodbox docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8081:80 \ -v ${install_path}/data:/var/www/html \ -v ${install_path}/ssl:/etc/nginx/ssl \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:8081 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For couchpotato software_110() { # Set basic information container_name="couchpotato" image_name="linuxserver/couchpotato:arm64v8-latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/linuxserver/couchpotato docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 5050:5050 \ -v ${install_path}/appdata/config:/config \ -v ${download_path}:/downloads \ -v ${movie_path}:/movies \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:5050 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For sonarr software_111() { # Set basic information container_name="sonarr" image_name="linuxserver/sonarr:arm64v8-latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/linuxserver/sonarr docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8989:8989 \ -v ${install_path}/data:/config \ -v ${tv_path}:/tv \ -v ${download_path}:/downloads \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:8989 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For radarr software_112() { # Set basic information container_name="radarr" image_name="linuxserver/radarr:arm64v8-latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/linuxserver/radarr docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 7878:7878 \ -v ${install_path}/data:/config \ -v ${movie_path}:/movies \ -v ${download_path}:/downloads \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:7878 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For syncthing software_113() { # Set basic information container_name="syncthing" image_name="linuxserver/syncthing:arm64v8-latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/linuxserver/syncthing docker run -d --name=${container_name} \ --hostname=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8384:8384 \ -p 22000:22000/tcp \ -p 22000:22000/udp \ -p 21027:21027/udp \ -v ${install_path}/appdata/config:/config \ -v ${install_path}/data1:/data1 \ -v ${install_path}/data2:/data2 \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:8384 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For filebrowser software_114() { # Set basic information container_name="filebrowser" image_name="filebrowser/filebrowser:latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/filebrowser/filebrowser docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8002:80 \ -v ${install_path}/root:/srv \ -v ${install_path}/filebrowser.db:/database/filebrowser.db \ -v ${install_path}/settings.json:/config/settings.json \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:8002 ]" echo -e "${NOTE} The ${container_name} account: [ username:admin / password:admin ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For heimdall software_115() { # Set basic information container_name="heimdall" image_name="linuxserver/heimdall:arm64v8-latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://hub.docker.com/r/linuxserver/heimdall docker run -d --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 8003:80 \ -p 8004:443 \ -v ${install_path}/config:/config \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:8003 / https://${my_address}:8004 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For node-red software_116() { # Set basic information container_name="node-red" image_name="nodered/node-red:latest" install_path="${docker_path}/${container_name}" case "${software_manage}" in install) echo -e "${STEPS} Installing Docker container: [ ${container_name} ]..." # Instructions: https://nodered.org/docs/getting-started/docker docker run -itd --name=${container_name} \ -e PUID=${docker_puid} \ -e PGID=${docker_pgid} \ -e TZ=${docker_tz} \ -p 1880:1880 \ -v node_red_data:/data \ --restart unless-stopped \ ${image_name} sync && sleep 3 echo -e "${NOTE} The ${container_name} address [ http://${my_address}:1880 ]" echo -e "${SUCCESS} ${container_name} installed successfully." exit 0 ;; update) docker_update ;; remove) docker_remove ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For mosquitto software_117() { # Set basic information container_name="mosquitto" image_name="arm64v8/eclipse-mosquitto:latest" install_path="${docker_path}/${container_name}" # Create a local persistent directory mkdir -p ${install_path}/{config/,data/,log/} # Initialize the configuration file mosquitto_conf="${install_path}/config/mosquitto.conf" sudo cat >${mosquitto_conf} < -m # Example: command-service.sh -s 303 -m install # command-service.sh -s 303 -m update # command-service.sh -s 303 -m remove # #============================== Software list =============================== # # software_303 : For nps # software_304 : For npc # software_305 : For plex # software_306 : For emby-server # software_307 : For kvm # software_308 : For pve # software_309 : For casaos # software_310 : For arozos # #============================================================================ # Execute generic functions software_path="/usr/share/ophub/armbian-software" software_command="${software_path}/software-command.sh" source "${software_command}" # For nps software_303() { case "${software_manage}" in install) # Software version query api software_api="https://api.github.com/repos/ehang-io/nps/releases" # Check the latest version, E.g: v0.26.10 software_latest_version="$(curl -s "${software_api}" | grep "tag_name" | awk -F '"' '{print $4}' | tr " " "\n" | sort -rV | head -n 1)" # Query download address, E.g: https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_arm64_server.tar.gz software_url="$(curl -s "${software_api}" | grep -oE "https:.*/${software_latest_version}/linux_arm64_server.tar.gz")" [[ -n "${software_url}" ]] || error_msg "Failed to obtain the download address!" echo -e "${INFO} Downloading from: [ ${software_url} ]" # Download software, E.g: /tmp/tmp.xxx/linux_arm64_server.tar.gz tmp_download="$(mktemp -d)" software_filename="${software_url##*/}" echo -e "${STEPS} Downloading NPS..." curl -fsSL "${software_url}" -o "${tmp_download}/${software_filename}" [[ "${?}" -eq "0" && -s "${tmp_download}/${software_filename}" ]] || error_msg "Failed to download the software!" echo -e "${INFO} Download completed: $(ls ${tmp_download} -l)" # Installing and start NPS echo -e "${STEPS} Installing and starting NPS..." cd ${tmp_download} && tar -xf ${software_filename} sudo ./nps install sudo nps start sync && sleep 3 echo -e "${NOTE} The NPS address: [ http://${my_address}:8080 ]" echo -e "${NOTE} The NPS account: [ username:admin / password:123 ]" echo -e "${NOTE} The NPS Instructions for Use: [ https://ehang-io.github.io/nps ]" echo -e "${SUCCESS} NPS installed successfully." ;; update) sudo nps stop && sudo nps-update update && sudo nps restart echo -e "${SUCCESS} NPS updated and restarted successfully." ;; remove) sudo nps stop && sudo nps uninstall sudo rm -rf /etc/nps /root/conf/nps.conf /usr/local/bin/nps /usr/local/bin/nps-update /usr/bin/nps /usr/bin/nps-update 2>/dev/null echo -e "${SUCCESS} NPS removed successfully." ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For npc software_304() { case "${software_manage}" in install) # Software version query api software_api="https://api.github.com/repos/ehang-io/nps/releases" # Check the latest version, E.g: v0.26.10 software_latest_version="$(curl -s "${software_api}" | grep "tag_name" | awk -F '"' '{print $4}' | tr " " "\n" | sort -rV | head -n 1)" # Query download address, E.g: https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_arm64_client.tar.gz software_url="$(curl -s "${software_api}" | grep -oE "https:.*/${software_latest_version}/linux_arm64_client.tar.gz")" [[ -n "${software_url}" ]] || error_msg "Failed to obtain the download address!" echo -e "${INFO} Downloading from: [ ${software_url} ]" # Download software, E.g: /tmp/tmp.xxx/linux_arm64_client.tar.gz tmp_download="$(mktemp -d)" software_filename="${software_url##*/}" echo -e "${STEPS} Downloading NPC..." curl -fsSL "${software_url}" -o "${tmp_download}/${software_filename}" [[ "${?}" -eq "0" && -s "${tmp_download}/${software_filename}" ]] || error_msg "Failed to download the software!" echo -e "${INFO} Download completed: $(ls ${tmp_download} -l)" # Installing and start NPC echo -e "${STEPS} Installing and starting NPC..." cd ${tmp_download} && tar -xf ${software_filename} sudo mkdir -p /etc/npc && sudo cp -rf conf /etc/npc sudo ./npc install sudo npc start sync && sleep 3 echo -e "${NOTE} The NPS config file path: [ /etc/npc/conf/npc.conf ]" echo -e "${NOTE} The NPS enable config command: [ sudo npc -config=/etc/npc/conf/npc.conf ]" echo -e "${NOTE} The NPC Instructions for Use: [ https://ehang-io.github.io/nps ]" echo -e "${SUCCESS} NPC installed successfully." ;; update) sudo npc stop && sudo npc-update update && sudo npc restart echo -e "${SUCCESS} NPC updated and restarted successfully." ;; remove) sudo npc stop && sudo npc uninstall sudo rm -rf /etc/npc /root/conf/npc.conf /usr/local/bin/npc /usr/local/bin/npc-update /usr/bin/npc /usr/bin/npc-update 2>/dev/null echo -e "${SUCCESS} NPC removed successfully." ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For plex software_305() { case "${software_manage}" in install) # Install basic dependencies echo -e "${STEPS} Installing basic dependencies..." software_install "curl gpg gnupg2 software-properties-common apt-transport-https lsb-release ca-certificates" # Add Plex Media Server APT repository echo -e "${STEPS} Adding the Plex Media Server APT repository..." echo "deb https://downloads.plex.tv/repo/deb public main" | sudo tee /etc/apt/sources.list.d/plexmediaserver.list # Import GPG key echo -e "${STEPS} Importing GPG keys..." curl -fsSOL https://downloads.plex.tv/plex-keys/PlexSign.key cat PlexSign.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/PlexSigkey.gpg rm -f PlexSign.key # Installing Plex Media server echo -e "${STEPS} Installing Plex Media Server..." software_install "plexmediaserver" # Ensure to open the port 32400 through the firewall echo -e "${STEPS} Configuring firewall to open port 32400..." sudo ufw allow 32400 2>/dev/null # Enable Plex server to start automatically on system boot echo -e "${STEPS} Enabling Plex Media Server to start automatically at boot..." sudo systemctl daemon-reload sudo systemctl enable --now plexmediaserver.service sudo systemctl restart plexmediaserver.service # Confirm the service is enabled echo -e "${STEPS} Confirming the service is enabled..." systemctl is-enabled plexmediaserver.service # Configure Plex Media Server sync && sleep 3 echo -e "${NOTE} The Plex Media Server address: [ http://${my_address}:32400/web ]" echo -e "${SUCCESS} Plex Media Server installed successfully." ;; update) software_update ;; remove) software_remove "plexmediaserver" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For emby-server software_306() { case "${software_manage}" in install) # Software version query api software_api="https://api.github.com/repos/MediaBrowser/Emby.Releases/releases" # Check the latest version, E.g: 4.7.5.0 software_latest_version="$(curl -s "${software_api}" | grep "tag_name" | awk -F '"' '{print $4}' | grep -E [.]0$ | tr " " "\n" | sort -rV | head -n 1)" # Query download address, E.g: https://github.com/MediaBrowser/Emby.Releases/releases/download/4.7.5.0/emby-server-deb_4.7.5.0_arm64.deb software_url="$(curl -s "${software_api}" | grep -oE "https:.*${software_latest_version}.*_arm64.deb")" [[ -n "${software_url}" ]] || error_msg "Failed to obtain the download address!" echo -e "${INFO} Downloading from: [ ${software_url} ]" # Download software, E.g: /tmp/tmp.xxx/emby-server-deb_4.7.5.0_arm64.deb tmp_download="$(mktemp -d)" software_filename="${software_url##*/}" echo -e "${STEPS} Downloading Emby Server..." curl -fsSL "${software_url}" -o "${tmp_download}/${software_filename}" [[ "${?}" -eq "0" && -s "${tmp_download}/${software_filename}" ]] || error_msg "Failed to download the software!" echo -e "${INFO} Download completed: $(ls ${tmp_download} -l)" # Installing Emby Server echo -e "${STEPS} Installing Emby Server..." sudo dpkg -i ${tmp_download}/${software_filename} # Enable Emby Server to start automatically on system boot echo -e "${STEPS} Enabling Emby Server to start automatically at boot..." sudo systemctl daemon-reload sudo systemctl enable --now emby-server.service sudo systemctl restart emby-server.service # Confirm the service is enabled echo -e "${STEPS} Confirming the service is enabled..." systemctl is-enabled emby-server.service # Configure Emby Server sync && sleep 3 echo -e "${NOTE} The Emby Server address: [ http://${my_address}:8096 ]" echo -e "${SUCCESS} Emby Server installed successfully." ;; update) software_update ;; remove) software_remove "emby-server" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For kvm software_307() { # kvm general settings my_network_br0="/etc/network/interfaces.d/br0" kvm_package_list="\ gconf2 qemu-system-arm qemu-utils qemu-efi ipxe-qemu libvirt-daemon-system libvirt-clients bridge-utils \ virtinst virt-manager seabios vgabios gir1.2-spiceclientgtk-3.0 xauth fonts-noto* \ " case "${software_manage}" in install) echo -e "${STEPS} Installing KVM and related virtualization packages..." software_install "${kvm_package_list}" # Get desktop system login user echo -ne "${OPTIONS} Please input the desktop login user (non-root): " read get_desktop_user [[ -n "${get_desktop_user}" ]] && my_user="${get_desktop_user}" || my_user="${USER}" # If the user exists, add it to the group if ! id -u ${my_user} >/dev/null 2>&1; then echo -e "${NOTE} User (${my_user}) does not exist. Creating..." sudo adduser ${my_user} sudo usermod -aG sudo ${my_user} fi # Add the login desktop system user to the kvm​ and libvirt user groups echo -e "${STEPS} Adding user (${my_user}) to the kvm and libvirt groups..." sudo usermod -aG kvm ${my_user} sudo usermod -aG libvirt ${my_user} # Enable X11Forwarding to run Linux GUI programs remotely sed -i '/X11Forwarding/d' /etc/ssh/sshd_config 2>/dev/null echo "X11Forwarding yes" >>/etc/ssh/sshd_config 2>/dev/null # Enable and start the libvirtd.service daemon echo -e "${STEPS} Enabling and starting the libvirtd.service daemon..." sudo systemctl daemon-reload sudo systemctl enable --now libvirtd.service sudo systemctl restart libvirtd.service #sudo systemctl status libvirtd.service # Add network bridge settings template echo -e "${STEPS} Adding bridged network settings template..." [[ -z "${my_network_card}" || -z "${my_address}" || -z "${my_broadcast}" || -z "${my_netmask}" || -z "${my_gateway}" ]] && { echo -ne "${OPTIONS} Please input IP address, the default is [ ${my_address} ]: " read get_address [[ -n "${get_address}" ]] && my_address="${get_address}" echo -ne "${OPTIONS} Please input broadcast, the default is [ ${my_broadcast} ]: " read get_broadcast [[ -n "${get_broadcast}" ]] && my_broadcast="${get_broadcast}" echo -ne "${OPTIONS} Please input netmask, the default is [ ${my_netmask} ]: " read get_netmask [[ -n "${get_netmask}" ]] && my_netmask="${get_netmask}" echo -ne "${OPTIONS} Please input gateway, the default is [ ${my_gateway} ]: " read get_gateway [[ -n "${get_gateway}" ]] && my_gateway="${get_gateway}" } sudo rm -f ${my_network_br0} 2>/dev/null sudo cat >${my_network_br0} <>/etc/sysctl.conf </dev/null sed -i '/^ON_SHUTDOWN=.*/d' ${vm_autostart} 2>/dev/null echo "ON_BOOT=start" >>${vm_autostart} 2>/dev/null echo "ON_SHUTDOWN=shutdown" >>${vm_autostart} 2>/dev/null } sync && sleep 3 echo -e "${NOTE} The bridge network settings: [ ${my_network_br0} ]" echo -e "${NOTE} KVM can install OpenWrt, Debian, Ubuntu, OpenSUSE, ArchLinux, Centos, Gentoo, KyLin, UOS, etc." echo -e "${NOTE} Making and using OpenWrt: [ https://github.com/unifreq/openwrt_packit ]" echo -e "${SUCCESS} KVM installed successfully." ;; update) software_update ;; remove) software_remove "${kvm_package_list}" sudo rm -f ${my_network_br0} 2>/dev/null ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For pve, Tutorials for using [ Cooip-JM: https://github.com/cooip-jm/About-openwrt/wiki ] software_308() { # pve general settings my_interfaces="/etc/network/interfaces" pve_package_list="pve-manager proxmox-ve" networking_package_list="ifupdown2 resolvconf bridge-utils lm-sensors" case "${software_manage}" in install) echo -e "${STEPS} Installing PVE..." # Add PVE software source echo -e "${STEPS} Adding [ ${VERSION_CODENAME} ] software source..." [[ -d "/etc/apt/sources.list.d" ]] || sudo mkdir -p /etc/apt/sources.list.d if [[ "${VERSION_CODENAME}" =~ ^(bookworm|trixie)$ ]]; then # Reference documentation: Cooip JM # Update: accordding to https://docs.pxvirt.lierfang.com/zh/installfromdebian.html echo "deb https://mirrors.lierfang.com/pxcloud/pxvirt ${VERSION_CODENAME} main" >/etc/apt/sources.list.d/pxvirt-${VERSION_CODENAME}-sources.list curl -fsSL https://mirrors.lierfang.com/pxcloud/lierfang.gpg -o /etc/apt/trusted.gpg.d/${VERSION_CODENAME}-lierfang.gpg elif [[ "${VERSION_CODENAME}" == "bullseye" ]]; then # Reference documentation: https://www.zhou.pp.ua/2023/08/08/n1/ echo "deb https://raw.githubusercontent.com/pimox/pimox7/master/ dev/" >/etc/apt/sources.list.d/pimox-${VERSION_CODENAME}-sources.list curl -fsSL https://raw.githubusercontent.com/pimox/pimox7/master/KEY.gpg -o /etc/apt/trusted.gpg.d/${VERSION_CODENAME}-pimox7.gpg else error_msg "This version is not supported: [ ${VERSION_CODENAME} ]" fi # Declare PATH export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin echo -e "${STEPS} Installing networking packages..." software_install "${networking_package_list}" # Add network settings echo -e "${STEPS} Adding network settings..." [[ -z "${my_network_card}" || -z "${my_mac}" || -z "${my_address}" || -z "${my_broadcast}" || -z "${my_netmask}" || -z "${my_gateway}" ]] && { echo -ne "${OPTIONS} Please input IP address, the default is [ ${my_address} ]: " read get_address [[ -n "${get_address}" ]] && my_address="${get_address}" echo -ne "${OPTIONS} Please input netmask, the default is [ ${my_netmask} ]: " read get_netmask [[ -n "${get_netmask}" ]] && my_netmask="${get_netmask}" echo -ne "${OPTIONS} Please input gateway, the default is [ ${my_gateway} ]: " read get_gateway [[ -n "${get_gateway}" ]] && my_gateway="${get_gateway}" } sudo mv -f ${my_interfaces} ${my_interfaces}.bak 2>/dev/null sudo cat >${my_interfaces} </etc/hosts </var/log/syslog [[ -f "/var/log/daemon.log" ]] && echo "" >/var/log/daemon.log sudo service syslog restart } # Disable zram echo -e "${INFO} Disable zram service." sudo systemctl disable armbian-zram-config.service sudo systemctl disable armbian-ramlog.service # Remove ceph-dkms package error echo -e "${INFO} Remove ceph-dkms package error." sudo rm -rf /usr/src/ceph-dkms-0.0.2 sudo dpkg --configure -a # Install optional packages software_install "ifupdown2" sudo ifup vmbr0 ${my_network_card} software_update # Adjust the PVE web interface (Fix the PVE web interface certificate access) echo -e "${INFO} Adjust certificate." sudo rm -f /etc/pve/pve-root-ca.pem /etc/pve/priv/pve-root-ca.* /etc/pve/local/pve-ssl.* sudo pvecm updatecerts -f # Add startup service echo -e "${INFO} Add pveproxy as a startup service." sudo systemctl daemon-reload sudo systemctl enable --now pveproxy sudo systemctl restart pveproxy # Adjust sshd_config (Fix the SSH certificate access modified by PVE) [[ -L ~/.ssh/authorized_keys ]] && { cp -f $(ls -l ~/.ssh/authorized_keys | awk '{print $NF}') ~/.ssh/authorized_keys_2 chmod 600 ~/.ssh/authorized_keys_2 sudo sed -i '/AuthorizedKeysFile/d' /etc/ssh/sshd_config sudo echo "AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys_2" >>/etc/ssh/sshd_config sudo /etc/init.d/ssh restart } # Fix log issue [[ -f "/var/log/pveproxy/access.log" ]] || { echo -e "${INFO} Fix the missing log issue." sudo mkdir -p /var/log/pveproxy sudo touch /var/log/pveproxy/access.log sudo chown -R www-data:www-data /var/log/pveproxy/ sudo chmod -R 755 /var/log/pveproxy/ sudo systemctl restart pveproxy } sync && sleep 3 echo -e "${NOTE} The network address: [ https://${my_address}:8006 ]" echo -e "${NOTE} Username and Password: [ Your system account ]" echo -e "${SUCCESS} PVE installation is successful, please [ reboot ] Armbian." ;; update) software_update ;; remove) software_remove "${pve_package_list}" ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For casaos software_309() { case "${software_manage}" in install) echo -e "${STEPS} Installing CasaOS..." curl -fsSL https://get.casaos.io | sudo bash sync && sleep 3 # Get the CasaOS service port CASA_CONF_PATH="/etc/casaos/gateway.ini" CASA_PORT="$(grep "port" ${CASA_CONF_PATH} | awk -F "=" '{print $2}')" [[ "${CASA_PORT}" -eq "80" ]] && my_casa_port="" || my_casa_port=":${CASA_PORT}" echo -e "${NOTE} The CasaOS access address: [ http://${my_address}${my_casa_port} ]" echo -e "${SUCCESS} CasaOS installation successful." ;; update) software_update ;; remove) sudo casaos-uninstall echo -e "${SUCCESS} CasaOS uninstallation successful." ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # For arozos software_310() { case "${software_manage}" in install) echo -e "${STEPS} Installing ArozOS..." wget -O install.sh https://raw.githubusercontent.com/tobychui/arozos/master/installer/install.sh && bash install.sh sync && sleep 3 echo -e "${SUCCESS} ArozOS installation successful." ;; update) software_update ;; remove) # Stop and disable the ArozOS service sudo systemctl stop arozos.service 2>/dev/null sudo systemctl disable arozos.service 2>/dev/null sudo rm -f /etc/systemd/system/arozos.service 2>/dev/null sudo systemctl daemon-reload # Uninstall ArozOS sudo rm -rf ~/arozos sync && sleep 3 echo -e "${SUCCESS} ArozOS uninstallation successful." ;; *) error_msg "Invalid input parameter: [ ${@} ]" ;; esac } # Initialize variables init_var "${@}" software_${software_id} ${software_manage} ================================================ FILE: build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-command.sh ================================================ #!/bin/bash #============================================================================ # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Shared utility functions for software management scripts # Copyright (C) 2021- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # #============================== Functions list ============================== # # error_msg : Output error message and exit # check_release : Check and load system release information # software_install : Install specified packages # software_update : Update all system packages # software_remove : Remove specified packages # docker_container_remove : Stop and remove a Docker container # docker_image_remove : Remove a Docker image # docker_update : Update a Docker container to the latest image # docker_remove : Fully remove a Docker container, image, and data # init_var : Initialize and parse command-line parameters # #========================== Set default parameters ========================== # # Get custom firmware information software_path="/usr/share/ophub/armbian-software" command_docker="${software_path}/command-docker.sh" ophub_release_file="/etc/ophub-release" # # Docker-related default settings docker_path="/opt/docker" download_path="/opt/downloads" movie_path="/opt/movies" music_path="/opt/music" tv_path="/opt/tv" docker_puid="1000" docker_pgid="1000" docker_tz="Asia/Shanghai" # # Get current network status my_network_card="$(cat /proc/net/dev 2>/dev/null | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g' | grep -E 'e' | head -n 1)" my_ifconfig="$(ifconfig -a 2>/dev/null | grep inet | grep -v 'inet6.*' | grep -v 'inet 172.*' | grep -v 'inet 127.*' | head -n1)" my_address="$(echo ${my_ifconfig} | awk '{print $2}')" my_netmask="$(echo ${my_ifconfig} | awk '{print $4}')" my_broadcast="$(echo ${my_ifconfig} | awk '{print $6}')" my_gateway="$(route -n 2>/dev/null | awk '($2~/^1/){print $2}' | head -n1)" my_macvlan="$(docker network ls 2>/dev/null | grep macvlan | awk '($2 == "macnet" && $3 == "macvlan"){print $2,$3}' | head -n1)" my_mac="$(ip a | grep ether | cut -d ' ' -f 6 | head -n 1)" my_hostname="$(hostname)" # # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" OPTIONS="[\033[93m OPTIONS \033[0m]" NOTE="[\033[93m NOTE \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #============================================================================ # Show error message error_msg() { echo -e "${ERROR} ${1}" exit 1 } check_release() { if [[ -f "${ophub_release_file}" ]]; then source "${ophub_release_file}" 2>/dev/null VERSION_CODEID="${VERSION_CODEID}" VERSION_CODENAME="${VERSION_CODENAME}" else error_msg "${ophub_release_file} file is missing!" fi [[ -n "${VERSION_CODEID}" && -n "${VERSION_CODENAME}" ]] || error_msg "${ophub_release_file} value is missing!" } software_install() { install_list="${1}" echo -e "${STEPS} Installing packages: [ ${install_list} ]..." # Install the package sudo apt-get update [[ -n "${install_list}" ]] && sudo apt-get install -y ${install_list} echo -e "${SUCCESS} [ ${install_list} ] packages installed successfully." } software_update() { echo -e "${STEPS} Updating packages..." # Update the package sudo apt-get update sudo apt-get upgrade -y sudo apt-get dist-upgrade -y sudo apt-get --purge autoremove -y sudo apt-get autoclean -y echo -e "${SUCCESS} Packages updated successfully." } software_remove() { remove_list="${1}" echo -e "${STEPS} Removing packages: [ ${remove_list} ]..." # Update the package sudo apt-get update [[ -n "${remove_list}" ]] && sudo apt-get remove --purge -y ${remove_list} sudo apt-get --purge autoremove -y sudo apt-get autoclean -y echo -e "${SUCCESS} [ ${remove_list} ] packages removed successfully." } # Stop and remove the Docker container docker_container_remove() { local container_name="${1}" [[ -n "${container_name}" ]] || error_msg "Docker container name is empty!" # Query the container ID based on the image name and remove it echo -e "${STEPS} Removing container: [ ${container_name} ]..." docker stop $(docker ps -aq --filter name=${container_name}) docker rm -f $(docker ps -aq --filter name=${container_name}) echo -e "${SUCCESS} Container [ ${container_name} ] removed successfully." } # Remove the Docker image docker_image_remove() { local image_name="${1}" [[ -n "${image_name}" ]] || error_msg "Docker image name is empty!" # Query the image ID based on the image name and remove it echo -e "${STEPS} Removing image: [ ${image_name} ]..." docker image rm -f $(docker images -q --filter reference=${image_name}) # Automatically remove unused Docker images docker image prune -f >/dev/null echo -e "${SUCCESS} Image [ ${image_name} ] removed successfully." } # Update a Docker container docker_update() { [[ -n "${image_name}" && -n "${container_name}" ]] || error_msg "Docker image or container name is empty!" echo -e "${STEPS} Updating Docker container: [ ${container_name} ]..." # Update docker image docker pull "${image_name}" # Delete old container docker_container_remove "${container_name}" # Start a new one sudo bash ${command_docker} -s ${software_id} -m install # Automatically remove unused Docker images docker image prune -f >/dev/null } # Remove a Docker container completely docker_remove() { [[ -n "${image_name}" && -n "${container_name}" && -n "${install_path}" ]] || error_msg "Docker image, container, or path is empty!" echo -e "${STEPS} Removing Docker container: [ ${container_name} ]..." # Delete old container docker_container_remove "${container_name}" # Delete old image docker_image_remove "${image_name}" # Delete the installation directory echo -ne "${OPTIONS} Delete the [ ${install_path} ] directory? (y/n): " read del_dir [[ "${del_dir,,}" == "y" ]] && [[ -d "${install_path}" ]] && rm -rf ${install_path} 2>/dev/null exit 0 } # Initialize variables init_var() { # If it is followed by [ : ], it means that the option requires a parameter value local options="s:m:" parsed_args=$(getopt -o "${options}" -- "${@}") [[ ${?} -ne 0 ]] && error_msg "Parameter parsing failed." eval set -- "${parsed_args}" while true; do case "${1}" in -s | --SoftwareID) if [[ -n "${2}" ]]; then software_id="${2}" shift 2 else error_msg "Invalid -s parameter [ ${2} ]!" fi ;; -m | --Manage) if [[ -n "${2}" ]]; then if [[ "${2}" == "install" || "${2}" == "update" || "${2}" == "remove" ]]; then software_manage="${2}" else error_msg "Invalid -m parameter [ ${2} ]!" fi shift 2 else error_msg "Invalid -m parameter [ ${2} ]!" fi ;; --) shift break ;; *) [[ -n "${1}" ]] && error_msg "Invalid option [ ${1} ]!" break ;; esac done # Get related variables check_release # Execute the corresponding operation command echo -e "${INFO} Software Manage: [ ${software_id} / ${software_manage} ]" } ================================================ FILE: build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf ================================================ #===================================================================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Configure software list # Copyright (C) 2021- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # #===================================================================================================================== # 1xx for docker #--------+------------------------------+---------------------------+---------------------+--------------------------- # 1.ID 2.Software Name 3.AuthMethod@Package 4.Execute Selection 5.Supported Release #--------+------------------------------+---------------------------+---------------------+--------------------------- 101 :Docker :dpkg@docker-ce :command-docker.sh :all 102 :Portainer :docker@portainer :command-docker.sh :all 103 :Yacht :docker@yacht :command-docker.sh :all 104 :Transmission :docker@transmission :command-docker.sh :all 105 :qBittorrent :docker@qbittorrent :command-docker.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 106 :NextCloud :docker@nextcloud :command-docker.sh :all 107 :Jellyfin :docker@jellyfin :command-docker.sh :all 108 :HomeAssistant :docker@homeassistant :command-docker.sh :all 109 :Kodbox :docker@kodbox :command-docker.sh :all 110 :CouchPotato :docker@couchpotato :command-docker.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 111 :Sonarr :docker@sonarr :command-docker.sh :all 112 :Radarr :docker@radarr :command-docker.sh :all 113 :Syncthing :docker@syncthing :command-docker.sh :all 114 :FileBrowser :docker@filebrowser :command-docker.sh :all 115 :Heimdall :docker@heimdall :command-docker.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 116 :Node-RED :docker@node-red :command-docker.sh :all 117 :Mosquitto :docker@mosquitto :command-docker.sh :all 118 :OpenWrt :docker@openwrt :command-docker.sh :all 119 :Netdata :docker@netdata :command-docker.sh :all 120 :XunLei :docker@xunlei :command-docker.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 121 :Docker-Headless :docker@docker-headless :command-docker.sh :all 122 :Navidrome :docker@navidrome :command-docker.sh :all 123 :Alist :docker@alist :command-docker.sh :all 124 :QingLong :docker@qinglong :command-docker.sh :all 125 :ChatGPT-Next-Web :docker@chatgpt-next-web :command-docker.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 126 :N8N :docker@n8n :command-docker.sh :all # 2xx for desktop #--------+------------------------------+---------------------------+---------------------+--------------------------- # 1.ID 2.Software Name 3.AuthMethod@Package 4.Execute Selection 5.Supported Release #--------+------------------------------+---------------------------+---------------------+--------------------------- 201 :Desktop :dpkg@gdm3 :command-desktop.sh :all 202 :Firefox :dpkg@firefox-esr :command-desktop.sh :all 203 :VLC :dpkg@vlc :command-desktop.sh :all 204 :MPV :dpkg@mpv :command-desktop.sh :all 205 :GIMP :dpkg@gimp :command-desktop.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 206 :Krita :dpkg@krita :command-desktop.sh :all 207 :LibreOffice :dpkg@libreoffice :command-desktop.sh :all 208 :Shotcut :dpkg@shotcut :command-desktop.sh :all 209 :Kdenlive :dpkg@kdenlive :command-desktop.sh :all 210 :Thunderbird :dpkg@thunderbird :command-desktop.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 211 :Evolution :dpkg@evolution :command-desktop.sh :all 212 :Gwenview :dpkg@gwenview :command-desktop.sh :all 213 :Eog :dpkg@eog :command-desktop.sh :all 214 :VisualStudioCode :which@code :command-desktop.sh :all 215 :Gedit :dpkg@gedit :command-desktop.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 216 :Flameshot :dpkg@flameshot :command-desktop.sh :all # 3xx for service #--------+------------------------------+---------------------------+---------------------+--------------------------- # 1.ID 2.Software Name 3.AuthMethod@Package 4.Execute Selection 5.Supported Release #--------+------------------------------+---------------------------+---------------------+--------------------------- 301 :Frps :which@frps :301-frps.sh :all 302 :Frpc :which@frpc :302-frpc.sh :all 303 :NPS :which@nps :command-service.sh :all 304 :NPC :which@npc :command-service.sh :all 305 :Plex :dpkg@plexmediaserver :command-service.sh :all #--------+------------------------------+---------------------------+---------------------+--------------------------- 306 :Emby-Server :dpkg@emby-server :command-service.sh :all 307 :KVM :dpkg@virt-manager :command-service.sh :all 308 :PVE :dpkg@pve-manager :command-service.sh :bullseye@bookworm@trixie 309 :CasaOS :which@casaos :command-service.sh :all 310 :ArozOS :find@/root/arozos :command-service.sh :all ================================================ FILE: build-armbian/armbian-files/different-files/a311d-oes/bootfs/extlinux/extlinux.conf.bak ================================================ label Armbian kernel /zImage initrd /uInitrd fdt /dtb/amlogic/meson-g12b-a311d-oes.dtb append root=LABEL=ROOTFS console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 coherent_pool=2M libata.force=noncq ubootpart= fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 loglevel=1 voutmode=hdmi disablehpd=false overscan=100 sdrmode=auto loglevel=1 splash=verbose usb-storage.quirks=0x2537:0x1066:u,0x2537:0x1068:u ================================================ FILE: build-armbian/armbian-files/different-files/a311d-oes/bootfs/uEnv.txt ================================================ LINUX=/zImage INITRD=/uInitrd FDT=/dtb/amlogic/meson-g12b-a311d-oes.dtb APPEND=root=LABEL=ROOTFS console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 coherent_pool=2M libata.force=noncq ubootpart= fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 loglevel=1 splash=verbose usb-storage.quirks=0x2537:0x1066:u,0x2537:0x1068:u ================================================ FILE: build-armbian/armbian-files/different-files/a311d-oes/rootfs/etc/armbian-board-release.conf ================================================ #=========================================================================== # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # WXY-OES, 4GB-Mem,8GB-eMMC,3xSATA,1Gb-Nic # # Configuration: /etc/model_database.conf # MODEL_ID="409" # MODEL_BOARD="a311d-oes" # SOC="a311d" # # ampart /dev/mmcblk2 # IO seek EPT: Seeking to 37748736 # EPT report: 20 partitions in the table: # =================================================================================== # ID| name | offset|( human)| size|( human)| masks # ----------------------------------------------------------------------------------- # 0: bootloader 0 ( 0.00B) 400000 ( 4.00M) 0 # (GAP) 2000000 ( 32.00M) # 1: reserved 2400000 ( 36.00M) 4000000 ( 64.00M) 0 # (GAP) 800000 ( 8.00M) # 2: cache 6c00000 ( 108.00M) 20000000 ( 512.00M) 2 # (GAP) 800000 ( 8.00M) # 3: env 27400000 ( 628.00M) 800000 ( 8.00M) 0 # (GAP) 800000 ( 8.00M) # 4: logo 28400000 ( 644.00M) 800000 ( 8.00M) 1 # (GAP) 800000 ( 8.00M) # 5: recovery 29400000 ( 660.00M) 1800000 ( 24.00M) 1 # (GAP) 800000 ( 8.00M) # 6: misc 2b400000 ( 692.00M) 2000000 ( 32.00M) 1 # (GAP) 800000 ( 8.00M) # 7: dto 2dc00000 ( 732.00M) 800000 ( 8.00M) 1 # (GAP) 800000 ( 8.00M) # 8: cri_data 2ec00000 ( 748.00M) 800000 ( 8.00M) 2 # (GAP) 800000 ( 8.00M) # 9: param 2fc00000 ( 764.00M) 1000000 ( 16.00M) 2 # (GAP) 800000 ( 8.00M) # 10: boot 31400000 ( 788.00M) 2000000 ( 32.00M) 1 # (GAP) 800000 ( 8.00M) # 11: rsv 33c00000 ( 828.00M) 1000000 ( 16.00M) 1 # (GAP) 800000 ( 8.00M) # 12: tee 35400000 ( 852.00M) 2000000 ( 32.00M) 1 # (GAP) 800000 ( 8.00M) # 13: vendor 37c00000 ( 892.00M) 10000000 ( 256.00M) 1 # (GAP) 800000 ( 8.00M) # 14: odm 48400000 ( 1.13G) 10000000 ( 256.00M) 1 # (GAP) 800000 ( 8.00M) # 15: system 58c00000 ( 1.39G) 40000000 (1024.00M) 1 # (GAP) 800000 ( 8.00M) # 16: kernel 99400000 ( 2.39G) 2000000 ( 32.00M) 2 # (GAP) 800000 ( 8.00M) # 17: backup 9bc00000 ( 2.43G) 40000000 (1024.00M) 2 # (GAP) 800000 ( 8.00M) # 18: instaboot dc400000 ( 3.44G) 20000000 ( 512.00M) 2 # (GAP) 800000 ( 8.00M) # 19: data fcc00000 ( 3.95G) d5400000 ( 3.33G) 4 # =================================================================================== # EPT report: Minumum block in table: 0x400000, 4194304, 4.000000M # CLI dispatcher: invalid mode # #=========================================================================== # Set the partition value of a special board (fixed parameter) skip_mb="700" # Set the bootloader write command for a special board (fixed parameters) write_board_file="yes" write_board_bootloader() { dd if="${bootloader_path}/${board}/bootloader.bin" of="${loop_new}" conv=fsync,notrunc bs=512 skip=1 seek=1 count=8191 2>/dev/null dd if="${bootloader_path}/${board}/reserved.bin" of="${loop_new}" conv=fsync,notrunc bs=1M seek=36 count=8 2>/dev/null dd if="${bootloader_path}/${board}/env.bin" of="${loop_new}" conv=fsync,notrunc bs=1M seek=628 count=1 2>/dev/null # echo -e "${INFO} For [ ${board} ] write special bootloader: ${bootloader_path}/${board}/bootloader.bin" } ================================================ FILE: build-armbian/armbian-files/different-files/a311d-oes/rootfs/etc/fw_env.config ================================================ /dev/mmcblk2 0x27400000 0x10000 0x10000 ================================================ FILE: build-armbian/armbian-files/different-files/a311d-oes/rootfs/usr/bin/oes_sata_leds.sh ================================================ #!/bin/bash # ================================================================================== # # 脚本用途: 监控 WXY-OES(A311d) 设备 SATA 端口的硬盘活动,并根据硬盘的存在与否控制对应的LED灯。 # 通用版本: 可自动适应 Armbian 和 OpenWrt 系统 # # 作者: https://github.com/Onlyoooooo # 版本: 1.1 (Beta) # # ================================================================================== # 定义3个SATA端口到LED设备文件的映射 declare -A PORT_LED_MAP=( ["ata1"]="/sys/class/leds/green:disk/brightness" ["ata2"]="/sys/class/leds/green:disk_1/brightness" ["ata3"]="/sys/class/leds/green:disk_2/brightness" ) # 获取当前所有活动的SATA端口ID (例如 ata1, ata2, ata3) get_active_ata_ids() { find /sys/class/block/sd* -exec readlink -f {} + 2>/dev/null | grep -o 'ata[0-9]\+' | sort -u || true } echo "WXY-OES(A311d) 设备SATA硬盘监测脚本启动,正在初始化LED状态..." # 用于存储每个端口的当前状态 (1=亮, 0=灭) declare -A PORT_STATE # 获取系统启动时已经连接的硬盘对应的端口列表 ACTIVE_PORTS_AT_BOOT=$(get_active_ata_ids) echo "开机时检测到的活动端口: ${ACTIVE_PORTS_AT_BOOT}" # 遍历关联数组 PORT_LED_MAP 的所有键 (即 "ata1", "ata2", "ata3") for port in "${!PORT_LED_MAP[@]}"; do # 默认状态为0 (灯灭) initial_state=0 # 检查当前遍历的端口是否存在于"活动端口列表"中 # 使用静默模式,通过退出码(0为成功, 非0为失败)来判断 if echo "${ACTIVE_PORTS_AT_BOOT}" | grep -q -x "${port}"; then # 如果找到,说明有硬盘,状态设为1 (灯亮) initial_state=1 echo " - 端口 ${port} 检测到活动设备,将点亮LED。" else echo " - 端口 ${port} 未检测到活动设备,将熄灭LED。" fi # 将该端口的初始状态存入 PORT_STATE 关联数组中 PORT_STATE["${port}"]=${initial_state} # 从 PORT_LED_MAP 关联数组中获取该端口对应的LED文件路径 led_file="${PORT_LED_MAP[${port}]}" # 检查文件是否存在并且当前用户有写入权限 if [[ -w "${led_file}" ]]; then # 将初始状态 (0或1) 写入文件来控制LED状态 echo "${initial_state}" >"${led_file}" else echo " - 警告: LED文件 '${led_file}' 不存在或不可写。" fi done echo "初始化完成,开始监控内核日志..." # 初始化一个空变量,用于存储最终要执行的命令。 MONITOR_CMD="" # 使用 'command -v' 检查 logread 命令是否存在,判断是否为 OpenWrt 系统。 if command -v logread >/dev/null 2>&1; then # 如果 logread 命令存在,我们判定为 OpenWrt 系统。 echo "系统环境检测为: OpenWrt,使用 'logread' 进行监控。" MONITOR_CMD="logread -f" else # 否则,我们判定为 Armbian 或其他标准 Linux 系统。 echo "系统环境检测为: Armbian,使用 'tail' 进行监控。" # [[ -r "file" ]]: 检查文件是否存在且可读。 if [[ -r "/var/log/kern.log" ]]; then # -F 选项比 -f 更强大,它可以正确处理日志文件的轮替(log rotation)。 MONITOR_CMD="tail -F /var/log/kern.log" else echo "错误: /var/log/kern.log 不存在或不可读!无法进行监控。" exit 1 fi fi echo "持续监听SATA硬盘状态..." # 使用 tail -F 或 logread -f 持续监控内核日志的变化 ${MONITOR_CMD} 2>/dev/null | while read -r line; do port="" new_value="" if [[ "${line}" =~ (ata[0-9]+):[[:space:]]SATA[[:space:]]link[[:space:]](up|down) ]]; then port="${BASH_REMATCH[1]}" [[ "${BASH_REMATCH[2]}" == "up" ]] && new_value=1 || new_value=0 elif [[ "${line}" =~ (ata[0-9]+)\.00:[[:space:]]configured ]]; then port="${BASH_REMATCH[1]}" new_value=1 elif [[ "${line}" =~ (ata[0-9]+):[[:space:]]device_remove ]]; then port="${BASH_REMATCH[1]}" new_value=0 elif [[ "${line}" =~ (ata[0-9]+):[[:space:]]EH[[:space:]]complete ]]; then port="${BASH_REMATCH[1]}" # 错误处理完成后,重新检查sysfs中的设备状态 [[ -d "/sys/class/ata_port/${port}/device" ]] && new_value=1 || new_value=0 fi if [[ -n "${port}" && -v "PORT_LED_MAP[${port}]" ]]; then # 仅当新状态与我们记录的旧状态不同时才进行操作 if [[ "${PORT_STATE[${port}]}" != "${new_value}" ]]; then echo "" echo "[$(date)] 检测到状态变化: 端口 ${port} -> ${new_value} (旧状态: ${PORT_STATE[${port}]})" led_file="${PORT_LED_MAP[${port}]}" if [[ -w "${led_file}" ]]; then echo "${new_value}" >"${led_file}" echo " - LED状态已更新。" else echo " - 警告: LED文件 '${led_file}' 不可写。" fi # 更新我们内存中的状态记录。 PORT_STATE["${port}"]="${new_value}" echo "正在等待新的内核事件..." fi fi done ================================================ FILE: build-armbian/armbian-files/different-files/alark35-3500/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-alark35-3500.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,115200 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/alark35-3500/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/anas3035/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false console=both extraargs=cma=256M rw rootwait overlay_prefix=rk35xx fdtfile=rockchip/rk3568-mmbox-anas3035.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 ================================================ FILE: build-armbian/armbian-files/different-files/anas3035/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/bdkj-bd-one/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-bd-one.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3568 overlays= extraargs= extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on ================================================ FILE: build-armbian/armbian-files/different-files/bdkj-bd-one/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi kaslrseed booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/bdkj-bd-one/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3568-nsy-g68-plus.dtb APPEND root=LABEL=ROOTFS console=ttyS2,1500000 console=tty1 no_console_suspend consoleblank=0 loglevel=8 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian ================================================ FILE: build-armbian/armbian-files/different-files/bdkj-bd-one/rootfs/etc/modules-load.d/bridge.conf ================================================ br_netfilter ================================================ FILE: build-armbian/armbian-files/different-files/bdkj-bd-one/rootfs/etc/sysctl.d/99-custom.conf ================================================ # Enable IP forwarding net.ipv4.ip_forward = 1 # Configure bridged traffic to bypass the firewall net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-arptables = 0 ================================================ FILE: build-armbian/armbian-files/different-files/bdy-g18-pro/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-bdy-g18-pro.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3568 overlays= extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u ================================================ FILE: build-armbian/armbian-files/different-files/bdy-g18-pro/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 coherent_pool=2M loglevel=${verbosity} ubootpart=${partuuid} libata.force=noncq usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" elif load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/bdy-g18-pro/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3568-bdy-g18-pro.dtb APPEND root=LABEL=ROOTFS console=ttyS2,1500000 console=tty1 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian ================================================ FILE: build-armbian/armbian-files/different-files/bdy-g18-pro/rootfs/etc/modules-load.d/bridge.conf ================================================ br_netfilter ================================================ FILE: build-armbian/armbian-files/different-files/bdy-g18-pro/rootfs/etc/sysctl.d/99-custom.conf ================================================ # Enable IP forwarding net.ipv4.ip_forward = 1 # Configure bridged traffic to bypass the firewall net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-arptables = 0 ================================================ FILE: build-armbian/armbian-files/different-files/beikeyun/bootfs/armbianEnv.txt ================================================ verbosity=1 overlay_prefix=rockchip rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro extraargs=usbcore.autosuspend=-1 rw rootwait extraboardargs= fdtfile=/dtb/rockchip/rk3328-beikeyun-1296mhz.dtb kernel_addr_r=0x02000000 ramdisk_addr_r=0x06000000 ================================================ FILE: build-armbian/armbian-files/different-files/beikeyun/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} panic=10 consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/boca-tcn100/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false overlay_prefix=rk3588 fdtfile=rockchip/rk3588s-boca-tcn100.dtb rootdev=/dev/mmcblk0p2 extraargs=rw rootwait net.ifnames=0 rootfstype=ext4 rootflags=rw,errors=remount-ro ================================================ FILE: build-armbian/armbian-files/different-files/boca-tcn100/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" echo "Testing for existence ${devtype} ${devnum} ${prefix}armbianEnv.txt ..." if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then echo "Found ${devtype} ${devnum} ${prefix}armbianEnv.txt - loading ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt ..." load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt echo "Loaded environment from ${devtype} ${devnum} ${prefix}armbianEnv.txt into ${load_addr} filesize ${filesize}..." echo "Importing into environment ..." env import -t ${load_addr} ${filesize} echo "armbianEnv.txt imported into environment" fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" elif load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/boca-tcn100/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 6 ================================================ FILE: build-armbian/armbian-files/different-files/cd1000/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3528-cd1000.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS0,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xff9f0000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3528 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/cd1000/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/cd1000/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 eth0 4 eth1 3 ================================================ FILE: build-armbian/armbian-files/different-files/chainedbox/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=false overlay_prefix=rockchip fdtfile=/dtb/rockchip/rk3328-l1pro-1296mhz.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro extraargs=usbcore.autosuspend=-1 rw rootwait extraboardargs= usbstoragequirks=0x05e3:0x0612:u,0x1d6b:0x0003:u,0x05e3:0x0610:u console=serial kernel_addr_r=0x02000000 ramdisk_addr_r=0x06000000 ================================================ FILE: build-armbian/armbian-files/different-files/chainedbox/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/chainedbox/rootfs/usr/bin/pwm-fan.pl ================================================ #!/usr/bin/perl use strict; use Sys::Hostname; use File::Glob qw(bsd_glob); ################################################################################ #个人见解:ophub我家云用的f大的调速脚本,我的理解是根据温度的匀速调速脚本,但是我家云 #的情况不太一样,我家云主板上的散热器是一块厚铝合金,实际目的是为了增加cpu的热容,使温 #度不易跳变,由于平时cpu使用频率也很低,温度更多是来自环境温度和硬盘温度,所以我之前的 #使用爱好是cpu温度低风扇不开启可保证寿命,温度高于65低于75度,风扇低速、低噪音运行,缓 #慢抽走我家云内热风就行,没有必要强制降低cpu温度,当cpu突破75度,风扇全速运行,强制散热. #由于cpu重负载情况不多,所以风扇很少全速开启. #这套逻辑使用下来非常满意; #20240903 再次修复硬盘未待机低温切换未生效bug; #20240708 修复硬盘未待机低温切换未生效bug; # 调整未待机时的风扇启动停温度; # 修改部分无需变动的变量为未常量; #20240624 增加没有内置机械硬盘的情况,可供设置,详细请看my @disks 相关几行; #20240618 由于无法在不影响硬盘进入待机状态前提下读取硬盘温度,所以只能简单判断硬盘工作状态,调整风扇启停温度; # 增加硬盘待机状态检测,如果硬盘待机,风扇可在cpu温度较高时停转(50度),较高温度起转(65度);如果硬盘未待机,风扇可在cpu温度较低时停转(38度),较低温度起转(55度); # 如果你有多块硬盘,并且知道内置硬盘设备名,请修改 #@disks 行代码; #20240618 降低风扇启动温度到57度,为了降低未待机硬盘的温度,感觉硬盘温度还高的朋友可自己降低风扇启动温度; #20240604 增加风扇降噪系数(系数可以是小数),倍数降低风扇温度最高限(最高限默认75度)以下,最低限以上的风扇转速,强调不超温就尽量不让风扇吵闹的原则; # 修改风扇停转温度,根据硬盘最佳寿命40度为修改参考; #20240428 增加风扇关闭功能,在冬天气温比较低时,如果风扇还旋转,因为热胀冷缩轴承非常容易磨损,天气冷的时候是风扇损坏率较高的时候 # 参数我已经修改完善,没有特殊情况勿改 -根据F大脚本修改 by Ran # cat /sys/devices/virtual/thermal/thermal_zone0/temp #用此行命令可在ssh命令矿中查看cpu实时温度 # 参数调整区 风扇按照固定占空比启动后10s,根据cpu温度调整转速,低于$temp_low风扇停转,高于$temp_fanOn风扇启动 # 获取所有硬盘设备名称 my @disks = bsd_glob("/dev/sd[a-z]");#如果你使用的硬盘比较多,由于我无法判断那块硬盘是内置硬盘,所以视所有硬盘为内置硬盘;两块以上硬盘无法判断内置硬盘带来问题是,风扇无法在cpu较高温度停转; #@disks = ("/dev/sdb"); #如果你能确定内置硬盘设备名,请去掉本行代码前面的井号,并修改为硬盘设备名 /dev/sda 或 /dev/sdb 或 /dev/sdc ... #@disks = ("0"); #如果你没有内置机械硬盘请去掉前面的#号,风扇会比较安静; # 速度最小值(满速是99),如果太小可能进入死区,风扇不转,需配合下面提示调整 my $speed_min = 8; # 速度最大值(满速是99) my $speed_max = 99; #当硬盘待机时下面赋值生效 #$temp_low = temp_low_high; #$temp_fanOn = temp_fanOn_high; #当硬盘没有待机时下面赋值生效 #$temp_low = temp_low_low; #$temp_fanOn = temp_fanOn_low; # 温度低限(摄氏度): 小于等于此温度风扇停转 my $temp_low = 38; # 温度低限(摄氏度):根据硬盘待机与否设置停转温度 use constant temp_low_high => 50;#硬盘待机时cpu温度小于50度,风扇停转 use constant temp_low_low => 38;#硬盘非待机时cpu温度小于38度,风扇停转 # 风扇启动温度低限(摄氏度): 大于于等于此值按启动风扇散热 my $temp_fanOn = 50; # 风扇启动温度低限(摄氏度):根据硬盘待机与否设置停转温度 use constant temp_fanOn_high => 65;#硬盘待机时cpu温度大于65度,风扇启动 use constant temp_fanOn_low => 50;#硬盘非待机时cpu温度大于55度,风扇启动 # 风扇启动占空比参数(%): 风扇启动时使用固定占空比:风扇启动占空比参数,设置要点:保证能启动同时风扇噪音不要过大 my $duty_cycle_on = 5; # 降噪系数: 降低风扇启动到cpu温度最高限区间的风扇噪音,降低幅度计算1/$fan_n,最终风扇转速=计算转速*(1/$fan_n)+$speed_min my $fan_n = 2; # 温度最高限(摄氏度): 大于此值按最高速率转动 my $temp_high = 75; # 调速间隔(秒) my $interval = 10; ################################################################################ #用到的变量,下面参数勿动 # 风扇状态位:0为关闭,1为开启 my $fanclose_temp = 0; # 风扇首次启动标志位:0为风扇运转中,1风扇从关闭到开启是第一次运行 my $fan_up = 0; # 风扇切换温度转换值 my $coeff_temp = 0; ################################################################################ my $fixed_speed = $ARGV[0]; my $period = 25000; &init; if( ($fixed_speed ne "") && ($fixed_speed =~ m/^[0-9]{1,3}$/) ) { # 如果命令行参数为 0-100 的整数,则按指定的固定速率调速 &set_fixed_speed($fixed_speed); } else { # 否则自动调速 while(1) { #print "ok 1.\n"; &auto_speed; sleep($interval); } } exit 0; ############################################################################### sub get_soc_temp { my @fnames=( '/sys/devices/virtual/thermal/thermal_zone0/temp', '/sys/devices/platform/scpi/scpi:sensors/hwmon/hwmon0/temp1_input', ); my $fh; my $temp = 50; for my $fname (@fnames) { if( -f $fname ) { open $fh, "<", $fname; $temp = <$fh> / 1000.0; close $fh; return $temp; } } return $temp; } sub init { $speed_max = 100 if ($speed_max > 100); $speed_min = 0 if($speed_min < 0); my $fh; `rmmod pwm_fan 2>/dev/null`; open $fh, ">", "/sys/class/pwm/pwmchip0/export"; print $fh "0\n"; close $fh; open $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/period"; print $fh "$period\n"; close $fh; open $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/polarity"; print $fh "normal\n"; close $fh; open $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/enable"; print $fh "1\n"; close $fh; } sub set_fixed_speed { my $fixed_speed = shift; # 最大值0.99 my $coeff_speed = ($fixed_speed / 100.0) > 1 ? 0.99 :($fixed_speed / 100.0); #0.1-0.19 定义为死区 $coeff_speed = 0.20 if $coeff_speed > 0 and $coeff_speed < 0.2; my $duty_cycle = int($coeff_speed * $period); open my $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/duty_cycle"; print $fh "$duty_cycle\n"; close $fh; } sub auto_speed { my $non_standby_disks = 0; if($disks[0] !~ /0/){ foreach my $disk (@disks) { # 检查每个硬盘的电源状态 my $state = `hdparm -C $disk`; if ($state !~ /standby/) { #print "Disk $disk is not in standby mode.\n"; $non_standby_disks++; } } } #根据硬盘状态调整风扇启停温度 if($non_standby_disks == 0){ $temp_low = temp_low_high; $temp_fanOn = temp_fanOn_high; }else { $temp_low = temp_low_low; $temp_fanOn = temp_fanOn_low; } my $temp = &get_soc_temp; #my $coeff_temp; if($temp <= $temp_low) { $coeff_temp = 0; $fanclose_temp = 0; #$fanclose_temp = 1; #去掉此行代码前的#测试风扇是否可以维持旋转,测试完毕此行代码前加# } elsif($temp > $temp_high) { $coeff_temp = 1; $fanclose_temp = 1; } elsif(($temp > $temp_fanOn)&&($fanclose_temp == 0)){ $fan_up = 1; #风扇启转,设置首启转志位 $fanclose_temp = 1; }else { $coeff_temp = ($temp - $temp_low) / (($temp_high - $temp_low)*$fan_n); } my $coeff_speed_min = $speed_min / $speed_max * ($speed_max / 100); my $coeff_speed = $coeff_temp; $coeff_speed = ($coeff_speed_min + $coeff_speed) > 0.99 ? 0.99 :($coeff_speed_min + $coeff_speed); my $duty_cycle = int($coeff_speed * $period); if($fanclose_temp == 0) { $duty_cycle = 0; }elsif(($fanclose_temp == 1)&&($fan_up == 1)){ $duty_cycle = $duty_cycle_on ; $fan_up = 0; #风扇已启动,清零首启转标志位 }else{ } open my $fh, ">", "/sys/class/pwm/pwmchip0/pwm0/duty_cycle"; print $fh "$duty_cycle\n"; close $fh; } ================================================ FILE: build-armbian/armbian-files/different-files/cm3588-nas/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false console=both extraargs=cma=256M overlay_prefix=rk3588 fdtfile=rockchip/rk3588-friendlyelec-cm3588-nas.dtb rootdev=/dev/mmcblk0p2 rootfstype=btrfs rootflags=compress=zstd:6 ================================================ FILE: build-armbian/armbian-files/different-files/cm3588-nas/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/cm3588-nas/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 7 ================================================ FILE: build-armbian/armbian-files/different-files/dc-a588/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3588-dc-a588.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyFIQ0 console=tty1 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u earlycon=on docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3588 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/dc-a588/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/e20c/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=true fdtfile=rockchip/rk3528-radxa-e20c.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS0,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xff9f0000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3528 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/e20c/bootfs/armbian_first_run.txt.template ================================================ #----------------------------------------------------------------- # Armbian first run configuration # Set optional end user configuration # - Rename this file from /boot/armbian_first_run.txt.template to /boot/armbian_first_run.txt # - Settings below will be applied only on 1st run of Armbian #----------------------------------------------------------------- #----------------------------------------------------------------- # General: # 1 = delete this file, after first run setup is completed. FR_general_delete_this_file_after_completion=1 #----------------------------------------------------------------- #Networking: # Change default network settings # Set to 1 to apply any network related settings below FR_net_change_defaults=0 # Enable WiFi or Ethernet. # NB: If both are enabled, WiFi will take priority and Ethernet will be disabled. FR_net_ethernet_enabled=1 FR_net_wifi_enabled=0 #Enter your WiFi creds # SECURITY WARN: Your wifi keys will be stored in plaintext, no encryption. FR_net_wifi_ssid='MySSID' FR_net_wifi_key='MyWiFiKEY' # Country code to enable power ratings and channels for your country. eg: GB US DE | https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 FR_net_wifi_countrycode='GB' #If you want to use a static ip, set it here FR_net_use_static=0 FR_net_static_ip='192.168.0.100' FR_net_static_mask='255.255.255.0' FR_net_static_gateway='192.168.0.1' FR_net_static_dns='8.8.8.8 8.8.4.4' #2 entries max, seperated by a space. #----------------------------------------------------------------- ================================================ FILE: build-armbian/armbian-files/different-files/e20c/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/e20c/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 eth0 4 eth1 3 ================================================ FILE: build-armbian/armbian-files/different-files/e25/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-radxa-e25.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,115200 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/e25/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/e25/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # Radxa E25 网卡中断优化配置 # 映射关系: 1->CPU0, 2->CPU1, 3->CPU2, 4->CPU3 # ========================== # 1. PCIe LAN (eth0 - RTL8125B) # 内网吞吐,RX 和 TX 分开,避开 WAN 的重负载核 # ========================== # RX 队列 (接收内网数据) -> 交给 CPU2, CPU3 (与 GMAC 共享,因为 GMAC 负载低) eth0-0 4 eth0-1 3 # TX 队列 (发送内网数据) -> 交给 CPU0, CPU1 (为 WAN 腾出 RX 资源) eth0-16 2 eth0-18 1 # ========================== # 2. PCIe WAN (eth1 - RTL8125B) [核心优化区] # 负载最重,必须打散! # 策略:TX (最重) 占用 CPU0, CPU1; RX 占用 CPU2, CPU3 # 这样每个核都有 WAN 的任务,但避免了单核过热 # ========================== # TX 队列 (NAT/防火墙主要消耗点) eth1-16 1 eth1-18 2 # RX 队列 (从外网进入) # 放在 CPU2, CPU3,与 LAN RX 共享,因为 RX 主要是 DMA,计算少 eth1-0 3 eth1-1 4 # ========================== # 4. USB & Others # ========================== # usb 3.0 xhci-hcd:usb2 2 # sata ahci[fc400000.sata] 4 ================================================ FILE: build-armbian/armbian-files/different-files/firefly-rk3399/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty0"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi kaslrseed booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/firefly-rk3399/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3399-firefly.dtb APPEND root=LABEL=ROOTFS console=ttyS2,1500000 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 splash plymouth.ignore-serial-consoles ================================================ FILE: build-armbian/armbian-files/different-files/gzpeite-p01/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-gzpeite.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3568 overlays= extraargs= extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on ================================================ FILE: build-armbian/armbian-files/different-files/gzpeite-p01/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi kaslrseed booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/gzpeite-p01/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3568-gzpeite.dtb APPEND root=LABEL=ROOTFS console=ttyS2,1500000 console=tty1 no_console_suspend consoleblank=0 loglevel=8 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian ================================================ FILE: build-armbian/armbian-files/different-files/h28k/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3528-hlink-h28k.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS0,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xff9f0000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3528 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/h28k/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/h28k/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 eth0 4 eth1 3 ================================================ FILE: build-armbian/armbian-files/different-files/h66k/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3568-hlink-h66k.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/h66k/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/h66k/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # pcie wan rx eth0-0 4 # pcie wan tx-0 eth0-16 1 # pcie wan tx-1 eth0-18 1 # pcie lan rx eth1-0 3 # pcie lan tx-0 eth1-16 2 # pcie lan tx-1 eth1-18 2 # pcie lan(option) rx eth2-0 3 # pcie lan tx-0 eth2-16 2 # pcie lan tx-1 eth2-18 2 # usb 3.0 xhci-hcd:usb1 2 xhci-hcd:usb3 1 ================================================ FILE: build-armbian/armbian-files/different-files/h68k/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3568-hlink-h68k.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/h68k/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/h68k/rootfs/etc/balance_irq ================================================ # H68K 网卡中断优化配置 # 映射关系: 1->CPU0, 2->CPU1, 3->CPU2, 4->CPU3 # ========================== # 1. GMAC LAN (eth0, eth1) # 负载较低,固定在两个核,避免干扰 PCIe 网卡 # ========================== eth0 3 eth1 4 # ========================== # 2. PCIe LAN (eth2 - RTL8125B) # 内网吞吐,RX 和 TX 分开,避开 WAN 的重负载核 # ========================== # RX 队列 (接收内网数据) -> 交给 CPU2, CPU3 (与 GMAC 共享,因为 GMAC 负载低) eth2-0 4 eth2-1 3 # TX 队列 (发送内网数据) -> 交给 CPU0, CPU1 (为 WAN 腾出 RX 资源) eth2-16 2 eth2-18 1 # ========================== # 3. PCIe WAN (eth3 - RTL8125B) [核心优化区] # 负载最重,必须打散! # 策略:TX (最重) 占用 CPU0, CPU1; RX 占用 CPU2, CPU3 # 这样每个核都有 WAN 的任务,但避免了单核过热 # ========================== # TX 队列 (NAT/防火墙主要消耗点) eth3-16 1 eth3-18 2 # RX 队列 (从外网进入) # 放在 CPU2, CPU3,与 LAN RX 共享,因为 RX 主要是 DMA,计算少 eth3-0 3 eth3-1 4 # ========================== # 4. USB & Others # ========================== xhci-hcd:usb1 2 xhci-hcd:usb3 4 ================================================ FILE: build-armbian/armbian-files/different-files/h69k/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3568-hlink-h69k.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/h69k/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/h69k/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # wan eth0 4 # lan eth1 1 # pcie lan rx eth2-0 3 # pcie lan tx-0 eth2-16 2 # pcie lan tx-1 eth2-18 2 # pcie lan rx eth3-0 2 # pcie lan tx-0 eth3-16 1 # pcie lan tx-1 eth3-18 1 # usb 3.0 xhci-hcd:usb1 2 xhci-hcd:usb3 4 ================================================ FILE: build-armbian/armbian-files/different-files/h88k/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3588-hlink-h88k.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyFIQ0 console=tty1 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u earlycon=on docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3588 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/h88k/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/h88k/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 7 ================================================ FILE: build-armbian/armbian-files/different-files/h88k-v3/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3588-hlink-h88k-v3.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyFIQ0 console=tty1 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u earlycon=on docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3588 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/h88k-v3/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/h88k-v3/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 7 ================================================ FILE: build-armbian/armbian-files/different-files/h96-max-m2/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3528-mangopi-m28k.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro extraargs=rw rootwait console=both consoleargs=console=ttyS2,1500000 overlay_prefix=rk35xx ================================================ FILE: build-armbian/armbian-files/different-files/h96-max-m2/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/hk1-rbox-k8s/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3528-hk1-rbox-k8s.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS0,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xff9f0000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3528 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/hk1-rbox-k8s/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/hk1-rbox-k8s/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 eth0 4 eth1 3 ================================================ FILE: build-armbian/armbian-files/different-files/ht2/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3528-ht2.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS0,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xff9f0000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3528 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/ht2/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/ht2/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 eth0 4 eth1 3 ================================================ FILE: build-armbian/armbian-files/different-files/hugsun-zm/rootfs/root/led-control/aw2028.c ================================================ #include #include #include #include #include #include #include #include #include #include #include #include #define I2C_DEV "/dev/i2c-2" #define AW2028_I2C_ADDR 0x65 int fd = -1; static uint8_t aw2028_init(void) { fd = open(I2C_DEV, O_RDWR); if (fd < 0) { perror("Can't open " I2C_DEV " \n"); exit(1); } printf("open " I2C_DEV " success !\n"); if (ioctl(fd, I2C_SLAVE, AW2028_I2C_ADDR) < 0) { perror("fail to set i2c device slave address!\n"); close(fd); return -1; } return 0; } static uint8_t i2c_write(uint8_t reg, uint8_t val) { int retries; uint8_t data[2]; data[0] = reg; data[1] = val; for (retries = 5; retries; retries--) { if (write(fd, data, 2) == 2) { return 0; } usleep(1000 * 10); } return -1; } static uint8_t i2c_read(uint8_t reg, uint8_t *val) { int retries; for (retries = 5; retries; retries--) { if (write(fd, ®, 1) == 1) { if (read(fd, val, 1) == 1) { return 0; } } } return -1; } unsigned char ms2timer(unsigned int time) { unsigned char i = 0; unsigned int ref[16] = {4, 128, 256, 384, 512, 762, 1024, 1524, 2048, 2560, 3072, 4096, 5120, 6144, 7168, 8192}; for (i = 0; i < 15; i++) { if (time <= ref[0]) { return 0; } else if (time > ref[15]) { return 15; } else if ((time > ref[i]) && (time <= ref[i + 1])) { if ((time - ref[i]) <= (ref[i + 1] - time)) { return i; } else { return (i + 1); } } } return 0; } unsigned char AW2028_LED_ON(unsigned char r, unsigned char g, unsigned char b) { i2c_write(0x00, 0x55); // software reset i2c_write(0x01, 0x01); // GCR i2c_write(0x03, 0x01); // IMAX i2c_write(0x04, 0x00); // LCFG1 i2c_write(0x05, 0x00); // LCFG2 i2c_write(0x06, 0x00); // LCFG3 i2c_write(0x07, 0x07); // LEDEN i2c_write(0x10, r); // ILED1 i2c_write(0x11, g); // ILED2 i2c_write(0x12, b); // ILED3 i2c_write(0x1C, 0xFF); // PWM1 i2c_write(0x1D, 0xFF); // PWM2 i2c_write(0x1E, 0xFF); // PWM3 return 0; } unsigned char AW2028_LED_OFF(void) { i2c_write(0x00, 0x55); // software reset return 0; } unsigned char AW2028_LED_Blink(unsigned char r, unsigned char g, unsigned char b, unsigned int trise_ms, unsigned int ton_ms, unsigned int tfall_ms, unsigned int toff_ms) { unsigned char trise, ton, tfall, toff; trise = ms2timer(trise_ms); ton = ms2timer(ton_ms); tfall = ms2timer(tfall_ms); toff = ms2timer(toff_ms); i2c_write(0x00, 0x55); // software reset i2c_write(0x01, 0x01); // GCR i2c_write(0x03, 0x01); // IMAX i2c_write(0x04, 0x01); // LCFG1 i2c_write(0x05, 0x01); // LCFG2 i2c_write(0x06, 0x01); // LCFG3 i2c_write(0x07, 0x07); // LEDEN i2c_write(0x08, 0x08); // LEDCTR i2c_write(0x10, r); // ILED1 i2c_write(0x11, g); // ILED2 i2c_write(0x12, b); // ILED3 i2c_write(0x1C, 0xFF); // PWM1 i2c_write(0x1D, 0xFF); // PWM2 i2c_write(0x1E, 0xFF); // PWM3 i2c_write(0x30, (trise << 4) | ton); // PAT_T1 Trise & Ton i2c_write(0x31, (tfall << 4) | toff); // PAT_T2 Tfall & Toff i2c_write(0x32, 0x00); // PAT_T3 Tdelay i2c_write(0x33, 0x00); // PAT_T4 PAT_CTR & Color i2c_write(0x34, 0x00); // PAT_T5 Timer i2c_write(0x09, 0x07); // PAT_RIN } unsigned char AW2028_Audio_Corss_Zero(void) { i2c_write(0x00, 0x55); // software reset i2c_write(0x01, 0x01); // GCR i2c_write(0x03, 0x01); // IMAX i2c_write(0x07, 0x07); // LEDEN i2c_write(0x10, 0xFF); // ILED1 i2c_write(0x11, 0xFF); // ILED2 i2c_write(0x12, 0xFF); // ILED3 i2c_write(0x1C, 0xFF); // PWM1 i2c_write(0x1D, 0xFF); // PWM2 i2c_write(0x1E, 0xFF); // PWM3 i2c_write(0x40, 0x11); // AUDIO_CTR i2c_write(0x41, 0x07); // AUDIO_LEDEN i2c_write(0x42, 0x00); // AUDIO_FLT i2c_write(0x43, 0x1A); // AGC_GAIN i2c_write(0x44, 0x1F); // GAIN_MAX i2c_write(0x45, 0x3D); // AGC_CFG i2c_write(0x46, 0x14); // ATTH i2c_write(0x47, 0x0A); // RLTH i2c_write(0x48, 0x00); // NOISE i2c_write(0x49, 0x02); // TIMER i2c_write(0x40, 0x13); // AUDIO_CTR return 0; } unsigned char AW2028_Audio_Timer(void) { i2c_write(0x00, 0x55); // software reset i2c_write(0x01, 0x01); // GCR i2c_write(0x03, 0x01); // IMAX i2c_write(0x07, 0x07); // LEDEN i2c_write(0x10, 0xFF); // ILED1 i2c_write(0x11, 0xFF); // ILED2 i2c_write(0x12, 0xFF); // ILED3 i2c_write(0x1C, 0xFF); // PWM1 i2c_write(0x1D, 0xFF); // PWM2 i2c_write(0x1E, 0xFF); // PWM3 i2c_write(0x40, 0x11); // AUDIO_CTR i2c_write(0x41, 0x07); // AUDIO_LEDEN i2c_write(0x42, 0x00); // AUDIO_FLT i2c_write(0x43, 0x1A); // AGC_GAIN i2c_write(0x44, 0x1F); // GAIN_MAX i2c_write(0x45, 0x3D); // AGC_CFG i2c_write(0x46, 0x14); // ATTH i2c_write(0x47, 0x0A); // RLTH i2c_write(0x48, 0x00); // NOISE i2c_write(0x49, 0x00); // TIMER i2c_write(0x40, 0x0B); // AUDIO_CTR return 0; } unsigned char AW2028_Audio(unsigned char mode) { if (mode > 5) { mode = 0; } i2c_write(0x00, 0x55); // software reset i2c_write(0x01, 0x01); // GCR i2c_write(0x03, 0x01); // IMAX i2c_write(0x07, 0x07); // LEDEN i2c_write(0x10, 0xFF); // ILED1 i2c_write(0x11, 0xFF); // ILED2 i2c_write(0x12, 0xFF); // ILED3 i2c_write(0x1C, 0xFF); // PWM1 i2c_write(0x1D, 0xFF); // PWM2 i2c_write(0x1E, 0xFF); // PWM3 i2c_write(0x40, (mode << 3) | 0x01); // AUDIO_CTR i2c_write(0x41, 0x07); // AUDIO_LEDEN i2c_write(0x42, 0x00); // AUDIO_FLT i2c_write(0x43, 0x1A); // AGC_GAIN i2c_write(0x44, 0x1F); // GAIN_MAX i2c_write(0x45, 0x3D); // AGC_CFG i2c_write(0x46, 0x14); // ATTH i2c_write(0x47, 0x0A); // RLTH i2c_write(0x48, 0x00); // NOISE i2c_write(0x49, 0x00); // TIMER i2c_write(0x40, (mode << 3) | 0x03); // AUDIO_CTR return 0; } int main(int argc, char **argv) { if (aw2028_init() != 0) { exit(-1); } AW2028_LED_OFF(); // AW2028_LED_ON(255, 255, 255); // AW2028_Audio(1); // AW2028_Audio_Corss_Zero(); // AW2028_Audio_Timer(); AW2028_Audio(3); // AW2028_LED_ON(255, 255, 255); // AW2028_LED_Blink(255,255,255, 10, 7, 10, 2); while (1) { AW2028_LED_Blink(255, 255, 255, 1000, 0, 1000, 1000); sleep(2); AW2028_LED_Blink(0, 255, 255, 1000, 0, 1000, 1000); sleep(2); AW2028_LED_Blink(255, 0, 255, 1000, 0, 1000, 1000); sleep(2); AW2028_LED_Blink(255, 255, 0, 1000, 0, 1000, 1000); sleep(2); AW2028_LED_Blink(0, 0, 0, 1000, 0, 1000, 1000); sleep(2); } return 0; } ================================================ FILE: build-armbian/armbian-files/different-files/ipc-r/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3588-nvr-demo-v10-android.dtb rootdev=/dev/mmcblk0p2 rootfstype=btrfs rootflags=compress=zstd:6 earlycon=on console=serial consoleargs=console=ttyFIQ0 console=tty1 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3588 overlays=uart7-m2 user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/ipc-r/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/ipc-r/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # lan eth0 1 # lan eth1 2 # pcie lan rx eth2-0 3 # pcie lan tx-0 eth2-16 2 # pcie lan tx-1 eth2-18 2 # pcie wan rx eth3-0 4 # pcie wan tx-0 eth3-16 1 # pcie wan tx-1 eth3-18 1 # usb 3.0 xhci-hcd:usb1 1 xhci-hcd:usb3 2 ================================================ FILE: build-armbian/armbian-files/different-files/jp-tvbox/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3566-jp-tvbox.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3566 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/jp-tvbox/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/lckfb-tspi/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3566-taishanpi-v10.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3566 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/lckfb-tspi/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/lz-d3588/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=true console=both extraargs=cma=256M overlay_prefix=rockchip-rk3588 fdtfile=rockchip/rk3588-lz-d3588.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 ================================================ FILE: build-armbian/armbian-files/different-files/lz-d3588/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/mrkaio-m68s/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-mrkaio-m68s.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,115200 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/mrkaio-m68s/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/mrkaio-m68s/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # pcie-lan rx eth0-0 3 # pcie-lan tx-0 eth0-16 2 # pcie-lan tx-1 eth0-18 2 # pcie-wan rx eth1-0 4 # pcie wan tx-0 eth1-16 1 # pcie wan tx-1 eth1-18 1 # usb 3.0 xhci-hcd:usb2 1 # sata ahci[fc400000.sata] 2 ================================================ FILE: build-armbian/armbian-files/different-files/nanopc-t6/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3588-nanopc-t6.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3588 overlays= extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on ================================================ FILE: build-armbian/armbian-files/different-files/nanopc-t6/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/nanopi-m5/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=true console=both overlay_prefix=rk35xx overlays= fdtfile=rockchip/rk3576-nanopi-m5.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 ================================================ FILE: build-armbian/armbian-files/different-files/nanopi-m5/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x48000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS0,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" elif load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g16-plus/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-nsy-g16-plus.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3568 overlays= extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g16-plus/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 coherent_pool=2M loglevel=${verbosity} ubootpart=${partuuid} libata.force=noncq usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" elif load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g16-plus/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3568-nsy-g16-plus.dtb APPEND root=LABEL=ROOTFS console=ttyS2,1500000 console=tty1 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g16-plus/rootfs/etc/modules-load.d/bridge.conf ================================================ br_netfilter ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g16-plus/rootfs/etc/sysctl.d/99-custom.conf ================================================ # Enable IP forwarding net.ipv4.ip_forward = 1 # Configure bridged traffic to bypass the firewall net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-arptables = 0 ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g68-plus/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-nsy-g68-plus.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3568 overlays= extraargs= extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g68-plus/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi kaslrseed booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g68-plus/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3568-nsy-g68-plus.dtb APPEND root=LABEL=ROOTFS console=ttyS2,1500000 console=tty1 no_console_suspend consoleblank=0 loglevel=8 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g68-plus/rootfs/etc/modules-load.d/bridge.conf ================================================ br_netfilter ================================================ FILE: build-armbian/armbian-files/different-files/nsy-g68-plus/rootfs/etc/sysctl.d/99-custom.conf ================================================ # Enable IP forwarding net.ipv4.ip_forward = 1 # Configure bridged traffic to bypass the firewall net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-arptables = 0 ================================================ FILE: build-armbian/armbian-files/different-files/orangepi-3b/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false console=both extraargs=cma=256M overlay_prefix=rk3566 fdtfile=rockchip/rk3566-orangepi-3b.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 ================================================ FILE: build-armbian/armbian-files/different-files/orangepi-3b/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" elif load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/orangepi-5-plus/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3588-orangepi-5-plus.dtb rootdev=/dev/mmcblk0p2 rootfstype=btrfs rootflags=compress=zstd:6 earlycon=on console=serial consoleargs=console=ttyFIQ0 console=tty1 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3588 overlays=uart7-m2 user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/orangepi-5-plus/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/orangepi-5-plus/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 7 ================================================ FILE: build-armbian/armbian-files/different-files/orangepi-5b/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3588s-orangepi-5b.dtb rootdev=/dev/mmcblk0p2 rootfstype=btrfs rootflags=compress=zstd:6 earlycon=on console=serial consoleargs=console=ttyFIQ0 console=tty1 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3588 overlays=uart7-m2 user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/orangepi-5b/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/orangepi-5b/rootfs/etc/balance_irq ================================================ xhci-hcd:usb2 2 xhci-hcd:usb7 3 ================================================ FILE: build-armbian/armbian-files/different-files/panther-x2/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3566-panther-x2.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro earlycon=on console=both consoleargs=console=ttyS02,1500000 console=tty0 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/panther-x2/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty0"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS02,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/photonicat/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-photonicat.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3568 overlays= extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on ================================================ FILE: build-armbian/armbian-files/different-files/photonicat/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs} net.ifnames=0 biosdevname=0" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi kaslrseed booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/photonicat/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 6 ================================================ FILE: build-armbian/armbian-files/different-files/r66s/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # pcie-lan rx eth0-0 3 # pcie-lan tx-0 eth0-16 2 # pcie-lan tx-1 eth0-18 1 # pcie-wan rx eth1-0 2 # pcie wan tx-0 eth1-16 3 # pcie wan tx-1 eth1-18 4 # usb 3.0 xhci-hcd:usb1 1 xhci-hcd:usb3 4 ================================================ FILE: build-armbian/armbian-files/different-files/r68s/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3568-fastrhino-r68s.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/r68s/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/r68s/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # lan eth0 1 # lan eth1 2 # pcie lan rx eth2-0 3 # pcie lan tx-0 eth2-16 2 # pcie lan tx-1 eth2-18 2 # pcie wan rx eth3-0 4 # pcie wan tx-0 eth3-16 1 # pcie wan tx-1 eth3-18 1 # usb 3.0 xhci-hcd:usb1 1 xhci-hcd:usb3 2 ================================================ FILE: build-armbian/armbian-files/different-files/rock-5-itx/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=true console=both extraargs=cma=256M overlay_prefix=rockchip-rk3588 fdtfile=rockchip/rk3588-rock-5-itx.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 ================================================ FILE: build-armbian/armbian-files/different-files/rock-5-itx/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/rock5b/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3588-rock-5b.dtb rootdev=/dev/mmcblk0p2 rootfstype=btrfs rootflags=compress=zstd:6 earlycon=on console=serial consoleargs=console=ttyFIQ0 console=tty1 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3588 overlays=uart7-m2 user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/rock5b/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/rock5b/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 7 ================================================ FILE: build-armbian/armbian-files/different-files/rock5c/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false overlay_prefix=rk3588 fdtfile=rockchip/rk3588s-rock-5c.dtb rootdev=/dev/mmcblk0p2 extraargs=rw rootwait rootfstype=ext4 rootflags=rw,errors=remount-ro ================================================ FILE: build-armbian/armbian-files/different-files/rock5c/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" echo "Testing for existence ${devtype} ${devnum} ${prefix}armbianEnv.txt ..." if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then echo "Found ${devtype} ${devnum} ${prefix}armbianEnv.txt - loading ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt ..." load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt echo "Loaded environment from ${devtype} ${devnum} ${prefix}armbianEnv.txt into ${load_addr} filesize ${filesize}..." echo "Importing into environment ..." env import -t ${load_addr} ${filesize} echo "armbianEnv.txt imported into environment" fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" elif load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/rock5c/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 6 ================================================ FILE: build-armbian/armbian-files/different-files/ruisen-box/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3568-ruisen-box.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/ruisen-box/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/ruisen-box/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # pcie wan rx eth0-0 4 # pcie wan tx-0 eth0-16 1 # pcie wan tx-1 eth0-18 1 # pcie lan rx eth1-0 3 # pcie lan tx-0 eth1-16 2 # pcie lan tx-1 eth1-18 2 # pcie lan(option) rx eth2-0 3 # pcie lan tx-0 eth2-16 2 # pcie lan tx-1 eth2-18 2 # usb 3.0 xhci-hcd:usb1 2 xhci-hcd:usb3 1 ================================================ FILE: build-armbian/armbian-files/different-files/s922x-oes-plus/bootfs/extlinux/extlinux.conf.bak ================================================ label Armbian kernel /zImage initrd /uInitrd fdt /dtb/amlogic/meson-g12b-s922x-oes-plus-00050000.dtb append root=LABEL=ROOTFS console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 coherent_pool=2M libata.force=noncq ubootpart= fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 loglevel=1 voutmode=hdmi disablehpd=false overscan=100 sdrmode=auto loglevel=1 splash=verbose usb-storage.quirks=0x2537:0x1066:u,0x2537:0x1068:u ================================================ FILE: build-armbian/armbian-files/different-files/s922x-oes-plus/bootfs/uEnv.txt ================================================ LINUX=/zImage INITRD=/uInitrd FDT=/dtb/amlogic/meson-g12b-s922x-oes-plus-00050000.dtb APPEND=root=LABEL=ROOTFS console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 coherent_pool=2M libata.force=noncq ubootpart= fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 loglevel=1 splash=verbose usb-storage.quirks=0x2537:0x1066:u,0x2537:0x1068:u ================================================ FILE: build-armbian/armbian-files/different-files/s922x-oes-plus/rootfs/etc/armbian-board-release.conf ================================================ #=========================================================================== # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # WXY-OES-Plus, 4GB-Mem,8GB-eMMC,3xSATA,1Gb-Nic,300MB-Nic # # Configuration: /etc/model_database.conf # MODEL_ID="410" # MODEL_BOARD="s922x-oes-plus" # SOC="s922x" # # ampart /dev/mmcblk2 # IO seek EPT: Seeking to 37748736 # EPT report: 5 partitions in the table: # =================================================================================== # ID| name | offset|( human)| size|( human)| masks # ----------------------------------------------------------------------------------- # 0: bootloader 0 ( 0.00B) 400000 ( 4.00M) 0 # (GAP) 2000000 ( 32.00M) # 1: reserved 2400000 ( 36.00M) 4000000 ( 64.00M) 0 # (GAP) 800000 ( 8.00M) # 2: cache 6c00000 ( 108.00M) 0 ( 0.00B) 0 # (GAP) 800000 ( 8.00M) # 3: env 7400000 ( 116.00M) 800000 ( 8.00M) 0 # (GAP) 800000 ( 8.00M) # 4: data 8400000 ( 132.00M) 1c9c00000 ( 7.15G) 4 # =================================================================================== # EPT report: Minumum block in table: 0x400000, 4194304, 4.000000M # CLI dispatcher: invalid mode # #=========================================================================== # Set the partition value of a special board (fixed parameter) skip_mb="117" # Set the bootloader write command for a special board (fixed parameters) write_board_file="yes" write_board_bootloader() { dd if="${bootloader_path}/${board}/bootloader.bin" of="${loop_new}" conv=fsync,notrunc bs=512 skip=1 seek=1 count=8191 2>/dev/null dd if="${bootloader_path}/${board}/reserved.bin" of="${loop_new}" conv=fsync,notrunc bs=1M seek=36 count=8 2>/dev/null dd if="${bootloader_path}/${board}/env.bin" of="${loop_new}" conv=fsync,notrunc bs=1M seek=116 count=1 2>/dev/null # echo -e "${INFO} For [ ${board} ] write special bootloader: ${bootloader_path}/${board}/bootloader.bin" } ================================================ FILE: build-armbian/armbian-files/different-files/s922x-oes-plus/rootfs/etc/fw_env.config ================================================ /dev/mmcblk2 0x7400000 0x10000 0x10000 #/dev/mmcblk2 0x27400000 0x10000 0x10000 ================================================ FILE: build-armbian/armbian-files/different-files/smart-am60/bootfs/armbianEnv.txt ================================================ verbosity=9 bootlogo=true fdtfile=rockchip/rk3588-smart-am60.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=compress=zstd:6 earlycon=on console=serial consoleargs=console=ttyFIQ0 console=tty1 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3588 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/smart-am60/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/smart-am60/rootfs/etc/balance_irq ================================================ xhci-hcd:usb5 5 xhci-hcd:usb7 7 ================================================ FILE: build-armbian/armbian-files/different-files/station-m2/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=true fdtfile=rockchip/rk3566-roc-pc.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=compress=zstd:6 earlycon=on console=serial consoleargs=console=ttyS2,1500000 extraargs=cma=256M rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk35xx ================================================ FILE: build-armbian/armbian-files/different-files/station-m2/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" test -n "${distro_bootpart}" || distro_bootpart=1 echo "Boot script loaded from ${devtype} ${devnum}:${distro_bootpart}" if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:${distro_bootpart} partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"; fi load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" elif load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}fixup.scr; then load ${devtype} ${devnum}:${distro_bootpart} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi echo "Trying 'kaslrseed' command... Info: 'Unknown command' can be safely ignored since 'kaslrseed' does not apply to all boards." kaslrseed # @TODO: This gives an error (Unknown command ' kaslrseed ' - try 'help') on many devices since CONFIG_CMD_KASLRSEED is not enabled booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/swan1-w28/bootfs/armbianEnv.txt ================================================ verbosity=9 bootlogo=false fdtfile=rockchip/rk3568-swan1-w28.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro console=serial consoleargs=console=ttyS2,1500000 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on earlycon=on earlyconargs=earlycon=uart8250,mmio32,0xfe660000 extraargs=rw rootwait extraboardargs=net.ifnames=0 overlay_prefix=rk3568 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/swan1-w28/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x39000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "${consoleargs} console=tty1"; fi if test "${earlycon}" = "on"; then setenv consoleargs "${earlyconargs} ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -n 'flatmax load script' -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/swan1-w28/rootfs/etc/balance_irq ================================================ # /etc/balance_irq # 用于中断设备的负载均衡 # 用法: # 首先, 用 cat /proc/interrupts 进行观察 # 如果某个cpu负载过重,可以把对应的中断设备迁移到其它cpu # /proc/interrupt格式: # 最左列:中断号 # 第 2 至第 2+cpus 列:cpu单核上产生的中断数量 # 最右列:对应的设备名 # # 本配置文件格式: # 第1列: 设备名 # 第2列: 期望绑定在第几个cpu (从1开始) # # 配置文件改好,运行 balethirq.pl 即时生效 # pcie-lan rx eth0-0 3 # pcie-lan tx-0 eth0-16 2 # pcie-lan tx-1 eth0-18 2 # pcie-wan rx eth1-0 4 # pcie wan tx-0 eth1-16 1 # pcie wan tx-1 eth1-18 1 # usb 3.0 xhci-hcd:usb2 1 # sata ahci[fc400000.sata] 2 ================================================ FILE: build-armbian/armbian-files/different-files/vplus/rootfs/usr/bin/rgb-vplus ================================================ #!/usr/bin/env perl use strict; use threads; use Getopt::Long qw(:config no_ignore_case); my $version="1.0.0"; my %leds = ( red => "surround:red", green => "surround:green", blue => "surround:blue", user => "led-user", ); my %fixed_delay_secs = ( red_on => 5, red_off => 2, green_on => 8, green_off => 4, blue_on => 13, blue_off => 8, ); my %triggers = ( on => "default-on", off => "none", heartbeat => "heartbeat", timer => "timer", ); my $opt_red_mode = "fixed"; # fixed | random my $opt_green_mode = "fixed"; # fixed | random my $opt_blue_mode = "fixed"; # fixed | random my $opt_red_led_name; my $opt_green_led_name; my $opt_blue_led_name; my $opt_red_led_on_secs; my $opt_red_led_off_secs; my $opt_green_led_on_secs; my $opt_green_led_off_secs; my $opt_blue_led_on_secs; my $opt_blue_led_off_secs; my $opt_want_help; GetOptions( 'RedMode=s' => \$opt_red_mode, 'GreenMode=s' => \$opt_green_mode, 'BlueMode=s' => \$opt_blue_mode, 'RedName=s' => \$opt_red_led_name, 'GreenName=s' => \$opt_green_led_name, 'BlueName=s' => \$opt_blue_led_name, 'RedOnSecs=i' => \$opt_red_led_on_secs, 'RedOffSecs=i' => \$opt_red_led_off_secs, 'GreenOnSecs=i' => \$opt_green_led_on_secs, 'GreenOffSecs=i' => \$opt_green_led_off_secs, 'BlueOnSecs=i' => \$opt_blue_led_on_secs, 'BlueOffSecs=i' => \$opt_blue_led_off_secs, 'help|?' => \$opt_want_help, ); &usage if $opt_want_help; $leds{red} = $opt_red_led_name if $opt_red_led_name; $leds{green} = $opt_green_led_name if $opt_green_led_name; $leds{blue} = $opt_blue_led_name if $opt_blue_led_name; $fixed_delay_secs{red_on} = $opt_red_led_on_secs if $opt_red_led_on_secs; $fixed_delay_secs{red_off} = $opt_red_led_off_secs if $opt_red_led_off_secs; $fixed_delay_secs{green_on} = $opt_green_led_on_secs if $opt_green_led_on_secs; $fixed_delay_secs{green_off} = $opt_green_led_off_secs if $opt_green_led_off_secs; $fixed_delay_secs{blue_on} = $opt_blue_led_on_secs if $opt_blue_led_on_secs; $fixed_delay_secs{blue_off} = $opt_blue_led_off_secs if $opt_blue_led_off_secs; my $th_red = threads->create( {'exit'=>'thread_only'}, \&led_tune, "red", $opt_red_mode); my $th_green = threads->create( {'exit'=>'thread_only'}, \&led_tune, "green", $opt_green_mode); my $th_blue = threads->create( {'exit'=>'thread_only'}, \&led_tune, "blue", $opt_blue_mode); $th_red->join(); $th_green->join(); $th_blue->join(); exit(0); ### subs ######################################################################################### sub led_trigger { my($led_name, $led_trigger) = @_; my $led_sys_path = "/sys/class/leds/$leds{${led_name}}"; if(! -d $led_sys_path) { return; } if(! $triggers{$led_trigger}) { return; } open my $fh, ">" , "${led_sys_path}/trigger" or warn $!; print $fh $triggers{$led_trigger}; close $fh; } sub led_tune { my ($led_name, $tune_mode) = @_; if($tune_mode eq "fixed") { my $current_stats = "off"; while(1) { if($current_stats eq "off") { my $delay_sec = $fixed_delay_secs{${led_name}."_on"}; &led_trigger($led_name, "on"); sleep($delay_sec); $current_stats = "on"; } else { my $delay_sec = $fixed_delay_secs{${led_name}."_off"}; &led_trigger($led_name, "off"); sleep($delay_sec); $current_stats = "off"; } } } elsif($tune_mode eq "random") { my $current_stats = "off"; while(1) { my $delay_sec = int(rand(9)) + 1; if($current_stats eq "off") { &led_trigger($led_name, "on"); sleep($delay_sec); $current_stats = "on"; } else { &led_trigger($led_name, "off"); sleep($delay_sec); $current_stats = "off"; } } } elsif($tune_mode eq "on") { &led_trigger($led_name, "on"); exit; } elsif($tune_mode eq "off") { &led_trigger($led_name, "off"); exit; } } sub usage { my $usage = "\n". "程序描述: RGB LED Control\n". "版 本: $version\n". "作 者: flippy (flippy\@sina.com)\n". "\n". "用法: $0 [可选参数]". "\n". "可选参数:\n". " --RedMode=fixed|random|on|off 红色 LED 闪烁模式: 固定间隔(fixed)或随机间隔(random)或常开或常闭 (默认: fixed)\n". " --GreenMode=fixed|random|on|off 绿色 LED 闪烁模式: 固定间隔(fixed)或随机间隔(random)或常开或常闭 (默认: fixed)\n". " --BlueMode=fixed|random|on|off 蓝色 LED 闪烁模式: 固定间隔(fixed)或随机间隔(random)或常开或常闭 (默认: fixed)\n". "\n". " --RedName=name 红色 LED 对应的系统设备名 (默认: surround:red)\n". " --GreenName=name 绿色 LED 对应的系统设备名 (默认: surround:green)\n". " --BlueName=name 蓝色 LED 对应的系统设备名 (默认: surround:blue)\n". "\n". " --RedOnSecs=secs 红色 LED 固定模式下每次点亮的秒数 (默认: 5)\n". " --RedOffSecs=secs 红色 LED 固定模式下每次关闭的秒数 (默认: 2)\n". "\n". " --GreenOnSecs=secs 绿色 LED 固定模式下每次点亮的秒数 (默认: 8)\n". " --GreenOffSecs=secs 绿色 LED 固定模式下每次关闭的秒数 (默认: 4)\n". "\n". " --BlueOnSecs=secs 蓝色 LED 固定模式下每次点亮的秒数 (默认: 13)\n". " --BlueOffSecs=secs 蓝色 LED 固定模式每次关闭的秒数 (默认: 8)\n". "\n". " --help 或 -h 或 -? 打印帮助信息\n". "\n" ; die $usage; } ================================================ FILE: build-armbian/armbian-files/different-files/wocyber-a3/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3568-wocyber-a3.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3568 overlays= extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on ================================================ FILE: build-armbian/armbian-files/different-files/wocyber-a3/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi kaslrseed booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/wxy-oect/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3566-wxy-oec-turbo-4g.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3566 overlays= extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u ================================================ FILE: build-armbian/armbian-files/different-files/wxy-oect/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv scriptaddr "0x32000000" setenv kernel_addr_r "0x34000000" setenv fdt_addr_r "0x4080000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk1p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" # odroid c4 legacy kernel values from boot.ini setenv dtb_loadaddr "0x1000000" setenv k_addr "0x1100000" setenv loadaddr "0x1B00000" setenv initrd_loadaddr "0x4080000" setenv display_autodetect "true" # HDMI Mode # Resolution Configuration # Symbol | Resolution # ----------------------+------------- # "480x272p60hz" | 480x272 Progressive 60Hz # "480x320p60hz" | 480x320 Progressive 60Hz # "480p60hz" | 720x480 Progressive 60Hz # "576p50hz" | 720x576 Progressive 50Hz # "720p60hz" | 1280x720 Progressive 60Hz # "720p50hz" | 1280x720 Progressive 50Hz # "1080p60hz" | 1920x1080 Progressive 60Hz # "1080p50hz" | 1920x1080 Progressive 50Hz # "1080p30hz" | 1920x1080 Progressive 30Hz # "1080p24hz" | 1920x1080 Progressive 24Hz # "1080i60hz" | 1920x1080 Interlaced 60Hz # "1080i50hz" | 1920x1080 Interlaced 50Hz # "2160p60hz" | 3840x2160 Progressive 60Hz # "2160p50hz" | 3840x2160 Progressive 50Hz # "2160p30hz" | 3840x2160 Progressive 30Hz # "2160p25hz" | 3840x2160 Progressive 25Hz # "2160p24hz" | 3840x2160 Progressive 24Hz # "smpte24hz" | 3840x2160 Progressive 24Hz SMPTE # "2160p60hz420" | 3840x2160 Progressive 60Hz YCbCr 4:2:0 # "2160p50hz420" | 3840x2160 Progressive 50Hz YCbCr 4:2:0 # "640x480p60hz" | 640x480 Progressive 60Hz # "800x480p60hz" | 800x480 Progressive 60Hz # "800x600p60hz" | 800x600 Progressive 60Hz # "1024x600p60hz" | 1024x600 Progressive 60Hz # "1024x768p60hz" | 1024x768 Progressive 60Hz # "1280x800p60hz" | 1280x800 Progressive 60Hz # "1280x1024p60hz" | 1280x1024 Progressive 60Hz # "1360x768p60hz" | 1360x768 Progressive 60Hz # "1440x900p60hz" | 1440x900 Progressive 60Hz # "1600x900p60hz" | 1600x900 Progressive 60Hz # "1600x1200p60hz" | 1600x1200 Progressive 60Hz # "1680x1050p60hz" | 1680x1050 Progressive 60Hz # "1920x1200p60hz" | 1920x1200 Progressive 60Hz # "2560x1080p60hz" | 2560x1080 Progressive 60Hz # "2560x1440p60hz" | 2560x1440 Progressive 60Hz # "2560x1600p60hz" | 2560x1600 Progressive 60Hz # "3440x1440p60hz" | 3440x1440 Progressive 60Hz setenv hdmimode "1080p60hz" setenv monitor_onoff "false" setenv overscan "100" setenv sdrmode "auto" setenv voutmode "hdmi" setenv disablehpd "false" setenv cec "false" setenv disable_vu7 "true" setenv max_freq_a55 "1908" #setenv max_freq_a55 "2100" setenv maxcpus "4" # Show what uboot default fdtfile is echo "U-boot default fdtfile: ${fdtfile}" echo "Current variant: ${variant}" # there is a mismatch between u-boot and kernel in the n2-plus/n2_plus DTB filename. # Also u-boot can't seem to decide between having, or not, 'amlogic/' in there. if test "${variant}" = "n2_plus"; then setenv fdtfile "amlogic/meson-g12b-odroid-n2-plus.dtb" echo "For variant ${variant}, set default fdtfile: ${fdtfile}" fi if test "${variant}" = "n2-plus"; then setenv fdtfile "amlogic/meson-g12b-odroid-n2-plus.dtb" echo "For variant ${variant} (dash version, 2021.07 or up), set default fdtfile: ${fdtfile}" fi # legacy kernel values from boot.ini if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${scriptaddr} ${prefix}armbianEnv.txt env import -t ${scriptaddr} ${filesize} fi # get PARTUUID of first partition on SD/eMMC it was loaded from # mmc 0 is always mapped to device u-boot (2016.09+) was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi if test "${console}" = "display"; then setenv consoleargs "console=tty1"; fi echo "Current fdtfile after armbianEnv: ${fdtfile}" if test -e ${devtype} ${devnum} ${prefix}zImage; then # legacy kernel boot if test "${console}" = "serial"; then setenv consoleargs "console=ttyS0,115200"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=ttyS0,115200 console=tty1"; fi if test "${console}" = "serial"; then setenv consoleargs "console=ttyS0,115200"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 coherent_pool=2M loglevel=${verbosity} ${amlogic} no_console_suspend fsck.repair=yes net.ifnames=0 elevator=noop hdmimode=${hdmimode} cvbsmode=576cvbs max_freq_a55=${max_freq_a55} maxcpus=${maxcpus} voutmode=${voutmode} ${cmode} disablehpd=${disablehpd} cvbscable=${cvbscable} overscan=${overscan} ${hid_quirks} monitor_onoff=${monitor_onoff} ${cec_enable} sdrmode=${sdrmode}" echo "Legacy bootargs: ${bootargs}" load ${devtype} ${devnum} ${k_addr} boot/zImage load ${devtype} ${devnum} ${dtb_loadaddr} boot/dtb/${fdtfile} load ${devtype} ${devnum} ${initrd_loadaddr} boot/uInitrd fdt addr ${dtb_loadaddr} unzip ${k_addr} ${loadaddr} booti ${loadaddr} ${initrd_loadaddr} ${dtb_loadaddr} else # modern kernel boot if test "${console}" = "serial"; then setenv consoleargs "console=ttyAML0,115200"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=ttyAML0,115200 console=tty1"; fi if test "${console}" = "serial"; then setenv consoleargs "console=ttyAML0,115200"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi if test "${disable_vu7}" = "false"; then setenv usbhidquirks "usbhid.quirks=0x0eef:0x0005:0x0004"; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 coherent_pool=2M loglevel=${verbosity} ubootpart=${partuuid} libata.force=noncq usb-storage.quirks=${usbstoragequirks} ${usbhidquirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=memory"; fi echo "Mainline bootargs: ${bootargs}" load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${scriptaddr} ${prefix}dtb/amlogic/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${scriptaddr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${scriptaddr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${scriptaddr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${scriptaddr} ${prefix}dtb/amlogic/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${scriptaddr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${scriptaddr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${scriptaddr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} fi # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/wxy-oect/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3566-wxy-oec-turbo-4g.dtb APPEND root=LABEL=ROOTFS earlycon=uart8250,mmio32,0xfe660000 console=ttyS2,1500000 console=tty1 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian ================================================ FILE: build-armbian/armbian-files/different-files/wxy-oect/rootfs/etc/armbian-board-release.conf ================================================ #=========================================================================== # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # WXY-OEC-turbo-4g(Original-Edition), 4GB-LPDDR4,8G-eMMC,1xSATA,1Gb-Nic # # Configuration: /etc/model_database.conf # MODEL_ID="r306" # MODEL_BOARD="wxy-oect" # #=========================================================================== # Set the partition value of a special board (fixed parameter) skip_mb="180" # Set the bootloader write command for a special board (fixed parameters) write_board_file="yes" write_board_bootloader() { dd if="${bootloader_path}/env.bin" of="${loop_new}" conv=fsync,notrunc bs=512 seek=294912 2>/dev/null # echo -e "${INFO} For [ ${board} ] write special bootloader: ${bootloader_path}/env.bin" } # Set the kernel file adjustment command for a special board (fixed parameters) adjust_kernel_files="yes" adjust_kernel_files_cmd() { (cd ${tag_bootfs} && ln -sf initrd.img-${kernel_name} uInitrd) } ================================================ FILE: build-armbian/armbian-files/different-files/wxy-oect/rootfs/etc/fw_env.config ================================================ /dev/mmcblk0 0x9000000 0x10000 0x10000 ================================================ FILE: build-armbian/armbian-files/different-files/wxy-oect-mod/bootfs/armbianEnv.txt ================================================ verbosity=7 bootlogo=true fdtfile=rockchip/rk3566-wxy-oec-turbo-4g.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro earlycon=on console=both consoleargs=console=ttyS02,1500000 console=tty0 usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u docker_optimizations=on extraargs=systemd.unified_cgroup_hierarchy=0 rw rootwait extraboardargs=net.ifnames=0 max_loop=128 overlay_prefix=rk3566 overlays= user_overlays= ================================================ FILE: build-armbian/armbian-files/different-files/wxy-oect-mod/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv rootflags "rw,errors=remount-ro" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty0"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS02,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "bootsplash.bootfile=bootsplash.armbian ${consoleargs}"; fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from # if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi # get PARTUUID of first partition on current boot device the boot script was loaded from part uuid ${devtype} ${devnum}:1 partuuid setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} rootflags=${rootflags} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/different-files/wxy-oect-mod/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3566-wxy-oec-turbo-4g.dtb APPEND root=LABEL=ROOTFS earlycon=uart8250,mmio32,0xfe660000 console=ttyS2,1500000 console=tty1 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian systemd.unified_cgroup_hierarchy=0 ================================================ FILE: build-armbian/armbian-files/platform-files/allwinner/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=allwinner/sun50i-h6-vplus-cloud.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=sun50i-h6 overlays= extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on ================================================ FILE: build-armbian/armbian-files/platform-files/allwinner/bootfs/armbian_first_run.txt.template ================================================ #----------------------------------------------------------------- # Armbian first run configuration # Set optional end user configuration # - Rename this file from /boot/armbian_first_run.txt.template to /boot/armbian_first_run.txt # - Settings below will be applied only on 1st run of Armbian #----------------------------------------------------------------- #----------------------------------------------------------------- # General: # 1 = delete this file, after first run setup is completed. FR_general_delete_this_file_after_completion=1 #----------------------------------------------------------------- #Networking: # Change default network settings # Set to 1 to apply any network related settings below FR_net_change_defaults=0 # Enable WiFi or Ethernet. # NB: If both are enabled, WiFi will take priority and Ethernet will be disabled. FR_net_ethernet_enabled=1 FR_net_wifi_enabled=0 #Enter your WiFi creds # SECURITY WARN: Your wifi keys will be stored in plaintext, no encryption. FR_net_wifi_ssid='MySSID' FR_net_wifi_key='MyWiFiKEY' # Country code to enable power ratings and channels for your country. eg: GB US DE | https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 FR_net_wifi_countrycode='GB' #If you want to use a static ip, set it here FR_net_use_static=0 FR_net_static_ip='192.168.0.100' FR_net_static_mask='255.255.255.0' FR_net_static_gateway='192.168.0.1' FR_net_static_dns='8.8.8.8 8.8.4.4' #2 entries max, separated by a space. #----------------------------------------------------------------- ================================================ FILE: build-armbian/armbian-files/platform-files/allwinner/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # # default values setenv load_addr "0x45000000" setenv overlay_error "false" setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv rootfstype "ext4" setenv console "both" setenv docker_optimizations "on" setenv bootlogo "false" setenv vendor "allwinner" # Remember the default fdtfile provided by u-boot and delete the vendor name if setexpr subfdt sub ${vendor}/ "" ${fdtfile};then setenv deffdt_file ${subfdt} fi # Remember the default u-boot fdtdir setenv deffdt_dir "${prefix}dtb" if test "$fdtdir" = ""; then setenv fdtdir "${deffdt_dir}/${vendor}";fi # Print boot source itest.b *0x10028 == 0x00 && echo "U-boot loaded from SD" itest.b *0x10028 == 0x02 && echo "U-boot loaded from eMMC or secondary SD" itest.b *0x10028 == 0x03 && echo "U-boot loaded from SPI" echo "Boot script loaded from ${devtype}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi # Delete the vendor's name from the fdtfile variable and record the result # after the file with the environment variables has been read if setexpr subfdt sub ${vendor}/ "" ${fdtfile};then setenv fdtfile ${subfdt} fi # In this shell, we can only check the existence of the file. # Make a check of reasonable ways to find the dtb file. # Set the true value of the paths. if test -e ${devtype} ${devnum} "${fdtdir}/${fdtfile}"; then echo "Load fdt: ${fdtdir}/${fdtfile}" else echo "The file ${fdtfile} was not found in the path ${fdtdir}" if test -e ${devtype} ${devnum} "${deffdt_dir}/${fdtfile}"; then setenv fdtdir "${deffdt_dir}" echo "Load fdt: ${fdtdir}/${fdtfile}" else if test -e ${devtype} ${devnum} "${deffdt_dir}/${vendor}/${deffdt_file}"; then setenv fdtdir "${deffdt_dir}/${vendor}" setenv fdtfile "${deffdt_file}" echo "Load fdt: ${fdtdir}/${fdtfile}" else if test -e ${devtype} ${devnum} "${deffdt_dir}/${deffdt_file}"; then setenv fdtdir "${deffdt_dir}" setenv fdtfile "${deffdt_file}" echo "Load fdt: ${fdtdir}/${fdtfile}" fi fi fi fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=ttyS0,115200 console=tty1"; fi if test "${console}" = "serial"; then setenv consoleargs "console=ttyS0,115200"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC it was loaded from # mmc 0 is always mapped to device u-boot (2016.09+) was loaded from if test "${devtype}" = "mmc"; then part uuid mmc 0:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=memory"; fi load ${devtype} ${devnum} ${fdt_addr_r} ${fdtdir}/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${fdtdir}/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${fdtdir}/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${fdtdir}/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/platform-files/allwinner/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/allwinner/sun50i-h6-tanix-tx6.dtb APPEND root=LABEL=ROOTFS console=ttyS0,115200 console=tty0 video=HDMI-A-1:e no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian earlycon ================================================ FILE: build-armbian/armbian-files/platform-files/allwinner/rootfs/usr/sbin/armbian-install ================================================ #!/bin/bash #================================================================================================ # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Function: Install Armbian to eMMC for Allwinner devices # Copyright (C) 2021- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Command: armbian-install # #======================================== Functions list ======================================== # # error_msg : Output error message and abort execution # check_depends : Check and install required dependencies # init_var : Initialize all runtime variables # set_rootfs_type : Select the root filesystem type # create_partition : Create eMMC partition layout # copy_bootfs : Copy boot partition files to eMMC # copy_rootfs : Copy root partition files to eMMC # #==================================== Set default parameters ==================================== # # Add custom Armbian configuration information ophub_release_file="/etc/ophub-release" # Set the installation file preprocessing directory tmp_path="/ddbr" # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" OPTIONS="[\033[93m OPTIONS \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #================================================================================================ # Encountered a critical error, output the message and abort execution error_msg() { echo -e "${ERROR} ${1}" exit 1 } # Check and install required dependencies check_depends() { echo -e "${STEPS} Checking required dependencies..." is_missing="0" necessary_packages=("tar" "hexdump" "mkfs.vfat" "mkfs.ext4" "mkfs.btrfs" "parted" "losetup" "fdisk" "lsblk") install_packages=("tar" "bsdextrautils" "dosfstools" "e2fsprogs" "btrfs-progs" "parted" "mount" "fdisk" "util-linux") i="1" for package in ${necessary_packages[*]}; do [[ -n "$(which "${package}" 2>/dev/null)" ]] || is_missing="1" ((i++)) done if [[ "${is_missing}" -eq "1" ]]; then echo -e "${INFO} Installing missing dependencies..." sudo apt-get update sudo apt-get install -y ${install_packages[*]} [[ "${?}" -eq "0" ]] || error_msg "Failed to install dependencies. Installation aborted." else echo -e "${INFO} All dependencies are satisfied. Proceeding with installation..." fi } # Initialize all runtime variables init_var() { echo -e "${STEPS} Initializing the environment..." # View device configuration information [[ -s "${ophub_release_file}" ]] || error_msg "[ ${ophub_release_file} ] file is missing!" PLATFORM="$(cat "${ophub_release_file}" | grep -E "^PLATFORM" | awk -F"'" '{print $2}')" FDTFILE="$(cat "${ophub_release_file}" | grep -E "^FDTFILE" | awk -F"'" '{print $2}')" FAMILY="$(cat "${ophub_release_file}" | grep -E "^FAMILY" | awk -F"'" '{print $2}')" MAINLINE_UBOOT="$(cat "${ophub_release_file}" | grep -E "^MAINLINE_UBOOT" | awk -F"'" '{print $2}')" BOOTLOADER_IMG="$(cat "${ophub_release_file}" | grep -E "^BOOTLOADER_IMG" | awk -F"'" '{print $2}')" [[ -n "${PLATFORM}" && -n "${FDTFILE}" && -n "${FAMILY}" && -n "${BOOTLOADER_IMG}" ]] || { error_msg "Required configuration is missing in [ ${ophub_release_file} ]." } # Display device configuration echo -e "${INFO} PLATFORM: [ ${PLATFORM} ]" echo -e "${INFO} FDTFILE: [ ${FDTFILE} ]" echo -e "${INFO} FAMILY: [ ${FAMILY} ]" echo -e "${INFO} MAINLINE_UBOOT: [ ${MAINLINE_UBOOT} ]" echo -e "${INFO} BOOTLOADER_IMG: [ ${BOOTLOADER_IMG} ]" # Check the current system running disk root_devname="$(df / | tail -n1 | awk '{print $1}' | awk -F '/' '{print substr($3, 1, length($3)-2)}')" if lsblk -l | grep -E "^${root_devname}boot0" >/dev/null; then error_msg "System is running from eMMC. Please boot from USB or TF card first!" fi # Find emmc disk, first find emmc containing boot0 partition install_emmc="$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?boot0)' | sed "s/boot0//g")" # Find emmc disk, find emmc that does not contain the boot0 partition [[ -z "${install_emmc}" ]] && install_emmc="$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?)' | grep -vE ^${root_devname} | sort -u)" # Check if emmc exists [[ -z "${install_emmc}" ]] && error_msg "No eMMC storage found on this device!" # Location of eMMC DEV_EMMC="/dev/${install_emmc}" echo -e "${INFO} Detected eMMC device: [ ${DEV_EMMC} ]" # Create a file preprocessing directory DIR_INSTALL="${tmp_path}/install" [[ -d "${DIR_INSTALL}" ]] && rm -rf ${DIR_INSTALL} mkdir -p ${DIR_INSTALL} && chmod 777 ${tmp_path} # Regenerate new machine-id rm -f /etc/machine-id /var/lib/dbus/machine-id dbus-uuidgen --ensure=/etc/machine-id dbus-uuidgen --ensure # Generate New ROOTFS UUID ROOTFS_UUID="$(cat /proc/sys/kernel/random/uuid)" [[ -z "${ROOTFS_UUID}" ]] && ROOTFS_UUID="$(uuidgen)" [[ -z "${ROOTFS_UUID}" ]] && error_msg "The new UUID is invalid, cannot continue." } # Select the root filesystem type set_rootfs_type() { echo -e "${STEPS} Selecting root filesystem type..." cat </dev/null | tail -c 2 | hexdump -e '1/1 "%02x"' 2>/dev/null || true)" if [[ "${MAGIC_SIG}" != "55aa" ]]; then echo -e "${INFO} Existing backup is invalid (No 55aa signature). Re-backing up..." dd if="${DEV_EMMC}" of="${MYBOX_UBOOT}" bs=1M count=4 conv=fsync [[ "${?}" -eq "0" ]] || error_msg "Using dd to backup [ ${MYBOX_UBOOT} ] failed." else echo -e "${INFO} Bootloader backup file [ ${MYBOX_UBOOT} ] already exists." fi fi # Clear emmc disk data exists_pts="$(parted ${DEV_EMMC} print 2>/dev/null | grep 'primary' | wc -l)" if [[ "${exists_pts}" -gt "0" ]]; then echo -e "${INFO} Deleting existing [ ${exists_pts} ] partition(s)." i=1 while [[ "${i}" -le "${exists_pts}" ]]; do umount -f ${DEV_EMMC}p${i} 2>/dev/null parted -s ${DEV_EMMC} rm ${i} [[ "${?}" -eq "0" ]] || error_msg "Failed to delete the [ ${i} ] partition. Please try again." ((i++)) done fi # Set partition size (Unit: MiB) BLANK1="16" BOOT="512" BLANK2="0" # Format emmc disk echo -e "${INFO} Creating MBR partition table and partitions." parted -s "${DEV_EMMC}" mklabel msdos parted -s "${DEV_EMMC}" mkpart primary fat32 $((BLANK1))MiB $((BLANK1 + BOOT - 1))MiB parted -s "${DEV_EMMC}" mkpart primary ${file_system_type} $((BLANK1 + BOOT + BLANK2))MiB 100% [[ "${?}" -eq "0" ]] || error_msg "Failed to create partition using [ parted ]." # Write bootloader if [[ -n "${BOOTLOADER_IMG}" && -f "${BOOTLOADER_IMG}" ]] && [[ -n "${MAINLINE_UBOOT}" && -f "${MAINLINE_UBOOT}" ]]; then echo -e "${INFO} 01. Write bootloader: [ ${MAINLINE_UBOOT} ]" dd if="${BOOTLOADER_IMG}" of="${DEV_EMMC}" conv=fsync,notrunc bs=8k seek=1 dd if="${MAINLINE_UBOOT}" of="${DEV_EMMC}" conv=fsync,notrunc bs=8k seek=5 elif [[ -n "${BOOTLOADER_IMG}" && -f "${BOOTLOADER_IMG}" ]]; then echo -e "${INFO} 02. Write bootloader: [ ${BOOTLOADER_IMG} ]" dd if="${BOOTLOADER_IMG}" of="${DEV_EMMC}" conv=fsync,notrunc bs=8k seek=1 elif [[ -n "${MYBOX_UBOOT}" && -f "${MYBOX_UBOOT}" ]]; then echo -e "${INFO} 03. Restore original bootloader from backup: [ ${MYBOX_UBOOT} ]" dd if="${MYBOX_UBOOT}" of="${DEV_EMMC}" conv=fsync bs=512 skip=1 seek=1 count=8191 fi [[ "${?}" -eq "0" ]] || error_msg "Failed to write bootloader using [ dd ]." } # Copy boot partition files to eMMC copy_bootfs() { cd / echo -e "${STEPS} Processing BOOTFS partition..." PART_BOOT="${DEV_EMMC}p1" if grep -q ${PART_BOOT} /proc/mounts; then echo -e "${INFO} Unmounting BOOT partition." umount -f ${PART_BOOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to umount [ ${PART_BOOT} ]." fi echo -e "${INFO} Formatting BOOTFS partition..." mkfs.vfat -F 32 -n "BOOT_EMMC" ${PART_BOOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to format BOOTFS with [ mkfs.vfat ]." mount -o rw ${PART_BOOT} ${DIR_INSTALL} [[ "${?}" -eq "0" ]] || error_msg "Failed to mount BOOTFS partition." echo -e "${INFO} Copying BOOTFS partition data..." cp -rf /boot/* ${DIR_INSTALL} rm -rf ${DIR_INSTALL}/'System Volume Information' # Update [ /boot/uEnv.txt ] settings uenv_conf_file="${DIR_INSTALL}/uEnv.txt" [[ -f "${uenv_conf_file}" ]] && { echo -e "${INFO} Update the [ uEnv.txt ] file." BOOT_CONF="uEnv.conf" sed -i "s|root=.*console=ttyS0|root=${uenv_mount_string} console=ttyS0|g" ${uenv_conf_file} sed -i "s|sun.*.dtb|${FDTFILE}|g" ${uenv_conf_file} } # Update [ /boot/armbianEnv.txt ] settings armbianenv_conf_file="${DIR_INSTALL}/armbianEnv.txt" [[ -f "${armbianenv_conf_file}" ]] && { echo -e "${INFO} Update the [ armbianEnv.conf ] file." BOOT_CONF="armbianEnv.conf" sed -i "s|^fdtfile=.*|fdtfile=${PLATFORM}/${FDTFILE}|g" ${armbianenv_conf_file} sed -i "s|^rootfstype=.*|rootfstype=${file_system_type}|g" ${armbianenv_conf_file} sed -i "s|^rootdev=.*|rootdev=${armbianenv_rootdev}|g" ${armbianenv_conf_file} sed -i "s|^rootflags=.*|rootflags=${armbianenv_rootflags}|g" ${armbianenv_conf_file} sed -i "s|^overlay_prefix=.*|overlay_prefix=${FAMILY}|g" ${armbianenv_conf_file} } # Update [ /boot/extlinux/extlinux.conf ] settings boot_extlinux_file="${DIR_INSTALL}/extlinux/extlinux.conf" [[ -f "${boot_extlinux_file}" ]] && { echo -e "${INFO} Update the [ extlinux.conf ] file." BOOT_CONF="extlinux.conf" sed -i "s|root=.*console=ttyS0|root=${uenv_mount_string} console=ttyS0|g" ${boot_extlinux_file} sed -i "s|sun.*.dtb|${FDTFILE}|g" ${boot_extlinux_file} } # Replace eMMC boot files [[ -f "${DIR_INSTALL}/boot-emmc.scr" ]] && mv -f ${DIR_INSTALL}/boot-emmc.scr ${DIR_INSTALL}/boot.scr [[ -f "${DIR_INSTALL}/boot-emmc.cmd" ]] && mv -f ${DIR_INSTALL}/boot-emmc.cmd ${DIR_INSTALL}/boot.cmd sync && sleep 3 umount -f ${DIR_INSTALL} [[ "${?}" -eq "0" ]] || error_msg "Failed to umount [ ${DIR_INSTALL} ]." } # Copy root partition files to eMMC copy_rootfs() { cd / echo -e "${STEPS} Processing ROOTFS partition..." PART_ROOT="${DEV_EMMC}p2" if grep -q ${PART_ROOT} /proc/mounts; then echo -e "${INFO} Unmounting ROOT partition." umount -f ${PART_ROOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to umount [ ${PART_ROOT} ]." fi echo -e "${INFO} Formatting ROOTFS partition..." if [[ "${file_system_type}" == "btrfs" ]]; then mkfs.btrfs -f -U ${ROOTFS_UUID} -L "ROOTFS_EMMC" -m single ${PART_ROOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to format using [ mkfs.btrfs ]" mount -t btrfs -o compress=zstd:6 ${PART_ROOT} ${DIR_INSTALL} [[ "${?}" -eq "0" ]] || error_msg "Failed to mount ROOTFS partition." else mkfs.ext4 -F -q -U ${ROOTFS_UUID} -L "ROOTFS_EMMC" -b 4k -m 0 ${PART_ROOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to format using [ mkfs.ext4 ]" mount -t ext4 ${PART_ROOT} ${DIR_INSTALL} [[ "${?}" -eq "0" ]] || error_msg "Failed to mount ROOTFS partition." fi echo -e "${INFO} Copying ROOTFS partition data..." # Create relevant directories mkdir -p ${DIR_INSTALL}/{boot/,dev/,media/,mnt/,proc/,run/,sys/,tmp/} chmod 1777 ${DIR_INSTALL}/tmp # Copy the relevant directory COPY_SRC="etc home opt root selinux srv usr var" for src in ${COPY_SRC}; do if [[ -d "${src}" ]]; then echo -e "${INFO} Copying [ ${src} ] ..." tar -cf - ${src} | ( cd ${DIR_INSTALL} tar -xpf - ) fi done # Create relevant symbolic link ln -sf usr/bin ${DIR_INSTALL}/bin ln -sf usr/lib ${DIR_INSTALL}/lib ln -sf usr/sbin ${DIR_INSTALL}/sbin echo -e "${INFO} Generate the new fstab file." rm -f ${DIR_INSTALL}/etc/fstab cat >${DIR_INSTALL}/etc/fstab </dev/null)" ]] || is_missing="1" ((i++)) done if [[ "${is_missing}" -eq "1" ]]; then echo -e "${INFO} Installing necessary dependencies." sudo apt-get update sudo apt-get install -y ${install_packages[*]} [[ "${?}" -eq "0" ]] || error_msg "Failed to install dependencies, aborting!" else echo -e "${INFO} Dependency check completed. Proceeding installation..." fi } # Initialize all variables init_var() { echo -e "${STEPS} Initializing the environment..." # If it is followed by [ : ], it means that the option requires a parameter value get_all_ver="$(getopt "m:a:l:" "${@}")" while [[ -n "${1}" ]]; do case "${1}" in -m | --Mainline_u-boot) if [[ -n "${2}" ]]; then [[ "${2}" == "yes" ]] && auto_mainline_uboot="yes" || auto_mainline_uboot="no" shift else error_msg "Invalid -m parameter [ ${2} ]!" fi ;; -a | --Ampart_tool) if [[ -n "${2}" ]]; then [[ "${2}" == "yes" ]] && use_ampart="yes" || use_ampart="no" shift else error_msg "Invalid -a parameter [ ${2} ]!" fi ;; -l | --List_all) if [[ -n "${2}" ]]; then [[ "${2}" == "yes" ]] && show_all_list="yes" || show_all_list="no" shift else error_msg "Invalid -l parameter [ ${2} ]!" fi ;; *) error_msg "Invalid option [ ${1} ]!" ;; esac shift done # Display settings results echo -e "${INFO} Use mainline u-boot: [ ${auto_mainline_uboot} ]" echo -e "${INFO} Use ampart tool: [ ${use_ampart} ]" echo -e "${INFO} Show all devices: [ ${show_all_list} ]" # Find a list of devices of the same family SEARCH_FAMILY="" [[ "${show_all_list}" == "no" ]] && { [[ -s "${ophub_release_file}" ]] || error_msg "[ ${ophub_release_file} ] file is missing!" source "${ophub_release_file}" && SEARCH_FAMILY="$(basename ${FAMILY})" [[ -n "${SEARCH_FAMILY}" ]] && SEARCH_FAMILY=":${SEARCH_FAMILY}:" } # Check if the ${model_conf} file exists [[ -s "${model_conf}" ]] || error_msg "[ ${model_conf} ] file is missing!" model_database="$(cat ${model_conf} | sed -e 's/NA//g' -e 's/NULL//g' -e 's/[ ][ ]*//g' | grep -E "^[0-9]{1,3}:.*${SEARCH_FAMILY}.*")" if [[ -z "${model_database}" ]]; then if [[ "${SEARCH_FAMILY}" == ":meson-gxbb:" ]]; then error_msg "The [ s905 ] series do not support writing to eMMC. Please use it via USB." else error_msg "The [ ${SEARCH_FAMILY} ] series in the [ ${model_conf} ] file is empty and does not support write to eMMC!" fi fi # Check if current system is already running from eMMC root_devname="$(df / | tail -n1 | awk '{print $1}' | awk -F '/' '{print substr($3, 1, length($3)-2)}')" if lsblk -l | grep -E "^${root_devname}boot0" >/dev/null; then error_msg "System is already installed to eMMC!" fi # Find emmc disk, first find emmc containing boot0 partition install_emmc="$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?boot0)' | sed "s/boot0//g")" # Find emmc disk, find emmc that does not contain the boot0 partition [[ -z "${install_emmc}" ]] && install_emmc="$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?)' | grep -vE ^${root_devname} | sort -u)" # Check if emmc exists [[ -z "${install_emmc}" ]] && error_msg "No internal eMMC storage found on this device!" # Location of eMMC DEV_EMMC="/dev/${install_emmc}" echo -e "${INFO} Detected eMMC device: [ ${DEV_EMMC} ]" # Create a file preprocessing directory DIR_INSTALL="${tmp_path}/install" [[ -d "${DIR_INSTALL}" ]] && rm -rf ${DIR_INSTALL} mkdir -p ${DIR_INSTALL} && chmod 777 ${tmp_path} # Regenerate new machine-id rm -f /etc/machine-id /var/lib/dbus/machine-id dbus-uuidgen --ensure=/etc/machine-id dbus-uuidgen --ensure # Generate New ROOTFS UUID ROOTFS_UUID="$(cat /proc/sys/kernel/random/uuid)" [[ -z "${ROOTFS_UUID}" ]] && ROOTFS_UUID="$(uuidgen)" [[ -z "${ROOTFS_UUID}" ]] && error_msg "The new UUID is invalid, cannot continue." # Get kernel TEXT_OFFSET, For u-boot.ext and u-boot.emmc # With TEXT_OFFSET patch is [ 0108 ], without TEXT_OFFSET patch is [ 0000 ] and need to ues [ UBOOT_OVERLOAD ] file. NEED_OVERLOAD="yes" [[ "$(hexdump -n 15 -x "/boot/zImage" 2>/dev/null | head -n 1 | awk '{print $7}')" == "0108" ]] && NEED_OVERLOAD="no" } # Search the model list search_aml_model() { local search_soc_id="${1}" local ret_count="$(echo "${model_database}" | grep -E "^${search_soc_id}:" | wc -l)" if [[ "${ret_count}" -eq "1" ]]; then echo "${model_database}" | grep -E "^${search_soc_id}:" fi } # Functions: Displays a list of supported amlogic devices # Configure: View ${model_database} # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION # 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD show_aml_model() { echo -e "${STEPS} Start selecting device..." # Define split line style split_line="-----------------------------------------------------------------------------------------------------" # Print header information printf "%-s\n" "${split_line}" printf "%-5s %-10s %-45s %-50s\n" ID SOC MODEL DTB printf "%-s\n" "${split_line}" # Print device list echo "${model_database}" | awk -F':' '{print $1,$3,$2,$4}' | while read line; do # Print device information printf "%-5s %-10s %-45s %-50s\n" $(echo "${line}") # Add a split line every 10 lines [[ "$(echo ${line} | awk '{print $1}')" == *"0" ]] && printf "%-s\n" "${split_line}" done # Print custom options and end split lines printf "%-5s %-10s %-45s %-50s\n" 0 Other Customize Enter-custom-dtb-name printf "%-s\n" "${split_line}" # Display device options echo -ne "${OPTIONS} Please Input ID: " read boxid if [[ "${boxid}" -eq "0" ]]; then read -p "Please Input SoC Name(such as s9xxx): " AMLOGIC_SOC AMLOGIC_SOC="${AMLOGIC_SOC}" # read -p "Please Input DTB Name(such as meson-xxx.dtb): " FDTFILE FDTFILE="${FDTFILE}" # read -p "Please Input UBOOT_OVERLOAD Name(such as u-boot-xxx.bin): " UBOOT_OVERLOAD UBOOT_OVERLOAD="${UBOOT_OVERLOAD}" # read -p "Please Input MAINLINE_UBOOT Name(such as xxx-u-boot.bin.sd.bin): " MAINLINE_UBOOT MAINLINE_UBOOT="${MAINLINE_UBOOT}" # read -p "Please Input BOOTLOADER_IMG Name(such as xxx-bootloader.img): " BOOTLOADER_IMG BOOTLOADER_IMG="${BOOTLOADER_IMG}" else ret="$(search_aml_model "${boxid}")" [[ -z "${ret}" ]] && error_msg "Input error, exit!" MODEL_NAME="$(echo "${ret}" | awk -F ':' '{print $2}')" AMLOGIC_SOC="$(echo "${ret}" | awk -F ':' '{print $3}')" FDTFILE="$(echo "${ret}" | awk -F ':' '{print $4}')" UBOOT_OVERLOAD="$(echo "${ret}" | awk -F ':' '{print $5}')" MAINLINE_UBOOT="$(echo "${ret}" | awk -F ':' '{print $6}')" BOOTLOADER_IMG="$(echo "${ret}" | awk -F ':' '{print $7}')" fi echo -e "${INFO} Input Box ID: [ ${boxid} ]" echo -e "${INFO} Model Name: [ ${MODEL_NAME} ]" echo -e "${INFO} FDTFILE: [ ${FDTFILE} ]" echo -e "${INFO} MAINLINE_UBOOT: [ ${MAINLINE_UBOOT} ]" echo -e "${INFO} BOOTLOADER_IMG: [ ${BOOTLOADER_IMG} ]" echo -e "${INFO} UBOOT_OVERLOAD: [ ${UBOOT_OVERLOAD} ]" echo -e "${INFO} NEED_OVERLOAD: [ ${NEED_OVERLOAD} ]" # Check DTB file [[ -n "${FDTFILE}" && -f "/boot/dtb/amlogic/${FDTFILE}" ]] || error_msg "DTB file [ ${FDTFILE} ] not found. Installation aborted!" # Check UBOOT_OVERLOAD file [[ -n "${UBOOT_OVERLOAD}" && -f "/boot/${UBOOT_OVERLOAD}" ]] || error_msg "U-Boot overload file [ ${UBOOT_OVERLOAD} ] not found. Installation aborted!" } # Select the root filesystem type set_rootfs_type() { echo -e "${STEPS} Selecting root filesystem type..." cat </dev/null if ((${?})); then # Handle the situation where ampart fails to change the layout return 1 fi local log="$(ampart "${DEV_EMMC}" --mode dsnapshot 2>/dev/null)" if ((${?})); then # Handle the situation where ampart fails to read the new partitions return 2 fi local snapshots readarray -d $'\n' -t snapshots <<<"${log}" # compare snapshots, 0 here refers to the decimal one if [[ "${snapshots[0]}" == "${snapshot_expected}" ]]; then # Successfully written the partitions return 0 else # Result partitions different, maybe should handle it return 3 fi } # Create eMMC partition layout create_partition() { cd / echo -e "${STEPS} Creating eMMC partition layout..." # Backup the bootloader, necessary for system recovery [[ -d "/usr/lib/u-boot" ]] || mkdir -p /usr/lib/u-boot MYBOX_UBOOT="/usr/lib/u-boot/mybox-bootloader.img" if [[ ! -f "${MYBOX_UBOOT}" ]]; then echo -e "${INFO} Start backing up the default bootloader." dd if="${DEV_EMMC}" of="${MYBOX_UBOOT}" bs=1M count=4 conv=fsync [[ "${?}" -eq "0" ]] || error_msg "Using dd to backup [ ${MYBOX_UBOOT} ] failed." else MAGIC_SIG="$(head -c 512 "${MYBOX_UBOOT}" 2>/dev/null | tail -c 2 | hexdump -e '1/1 "%02x"' 2>/dev/null || true)" if [[ "${MAGIC_SIG}" != "55aa" ]]; then echo -e "${INFO} Existing backup is invalid (No 55aa signature). Re-backing up..." dd if="${DEV_EMMC}" of="${MYBOX_UBOOT}" bs=1M count=4 conv=fsync [[ "${?}" -eq "0" ]] || error_msg "Using dd to backup [ ${MYBOX_UBOOT} ] failed." else echo -e "${INFO} Bootloader backup file [ ${MYBOX_UBOOT} ] already exists." fi fi # Clear emmc disk data exists_pts="$(parted ${DEV_EMMC} print 2>/dev/null | grep 'primary' | wc -l)" if [[ "${exists_pts}" -gt "0" ]]; then echo -e "${INFO} Deleting existing [ ${exists_pts} ] partition(s)." i=1 while [[ "${i}" -le "${exists_pts}" ]]; do umount -f ${DEV_EMMC}p${i} 2>/dev/null parted -s ${DEV_EMMC} rm ${i} [[ "${?}" -eq "0" ]] || error_msg "Failed to delete partition [ ${i} ]. Please try again." ((i++)) done fi # Use the ampart partition tool AMPART_STATUS="no" [[ -x "/usr/bin/ampart" && "${use_ampart}" == "yes" ]] && { ampart_tool [[ "${?}" -eq "0" ]] && AMPART_STATUS="yes" && echo -e "${STEPS} Successfully repartitioned eMMC with ampart." } # Set partition size (Unit: MiB) if [[ "${AMPART_STATUS}" == "yes" ]]; then BLANK1="117" # After using the ampart to part disk, space after [ 117 MiB ] could be used. BOOT="512" BLANK2="0" elif [[ "${AMLOGIC_SOC}" == "s912" && "${boxid}" -eq "213" ]]; then BLANK1="700" # OneCloudPro-V1.2 BOOT="512" BLANK2="220" elif [[ "${AMLOGIC_SOC}" == "s912" && "${boxid}" -eq "214" ]]; then BLANK1="256" # new OneCloudPro-V1.2 based on base image android_tv_onethingcloud-money-maker-pro-3rd-s912.tar.xz BOOT="256" BLANK2="0" elif [[ "${AMLOGIC_SOC}" == "s912" || "${AMLOGIC_SOC}" == "s905d" ]]; then BLANK1="68" BOOT="512" BLANK2="220" elif [[ "${AMLOGIC_SOC}" == "s905x" ]]; then BLANK1="700" BOOT="512" BLANK2="0" elif [[ "${AMLOGIC_SOC}" == "s905l3a" && "${boxid}" -eq "304" ]]; then BLANK1="570" # e900v22c/d: The first [ 570 MiB ] is not writable. BOOT="512" BLANK2="0" elif [[ "${AMLOGIC_SOC}" == "s905l3a" && "${boxid}" -eq "305" ]]; then BLANK1="108" # CM311-1a-YST: Must skip [ 108 MiB ] BOOT="512" # A total of [ 1024 MiB ] can be used in this block, gave up [ 1024-512=512 MiB ] BLANK2="778" # Rootfs partition could be set after [ 1398 MiB ] of the total disk, Multi-backward offset 100 MiB, [ 1398-108-512=778 MiB ] elif [[ "${AMLOGIC_SOC}" == "s905l3b" ]]; then BLANK1="128" # https://github.com/janko888/MBH-M30xA BOOT="512" # M302A/M304A, Compatible with Android 4 and Android 9 firmware BLANK2="720" elif [[ "${FDTFILE}" == "meson-sm1-skyworth-lb2004-a4091.dtb" ]]; then BLANK1="108" # Tencent Aurora 3Pro: Must skip [ 108 MiB ] BOOT="512" # A total of [ 768 MiB ] can be used in this block, gave up [ 768-512=256 MiB ] BLANK2="562" # Rootfs partition could be set after [ 1182 MiB ] of the total disk, [ 1182-108-512=562 MiB ] elif [[ "${boxid}" -eq "525" ]]; then BLANK1="108" # Whale(S905X3): Must skip [ 108 MiB ] BOOT="512" # A total of [ 1024 MiB ] can be used in this block, gave up [ 1024-512=512 MiB ] BLANK2="650" # Rootfs partition could be set after [ 1270 MiB ] of the total disk, [ 1270-108-512=650 MiB ] elif [[ "${boxid}" -eq "409" || "${boxid}" -eq "410" ]]; then BLANK1="700" # WXY-OES(A311D), WXY-OES-Plus(s922x): Must skip [ 700 MiB ] BOOT="512" BLANK2="0" else BLANK1="68" BOOT="512" # S905x3: A total of [ 1120 MiB ] can be used in this block, and the remaining [ 608 MiB ] can be used. BLANK2="770" # Rootfs partition could be set after [ 1350 MiB ] of the total disk. fi # Format emmc disk echo -e "${INFO} Creating MBR partition table and partitions." parted -s "${DEV_EMMC}" mklabel msdos parted -s "${DEV_EMMC}" mkpart primary fat32 $((BLANK1))MiB $((BLANK1 + BOOT - 1))MiB parted -s "${DEV_EMMC}" mkpart primary ${file_system_type} $((BLANK1 + BOOT + BLANK2))MiB 100% [[ "${?}" -eq "0" ]] || error_msg "Failed to create eMMC partition using [ parted ]." # Write bootloader if [[ -n "${MAINLINE_UBOOT}" && -f "/usr/lib/u-boot/${MAINLINE_UBOOT}" && "${auto_mainline_uboot}" == "yes" ]]; then echo -e "${INFO} 01. Write Mainline bootloader: [ ${MAINLINE_UBOOT} ]" dd if="/usr/lib/u-boot/${MAINLINE_UBOOT}" of="${DEV_EMMC}" conv=fsync bs=1 count=444 dd if="/usr/lib/u-boot/${MAINLINE_UBOOT}" of="${DEV_EMMC}" conv=fsync bs=512 skip=1 seek=1 elif [[ -n "${BOOTLOADER_IMG}" && -f "/usr/lib/u-boot/${BOOTLOADER_IMG}" ]]; then echo -e "${INFO} 02. Write Android bootloader: [ ${BOOTLOADER_IMG} ]" dd if="/usr/lib/u-boot/${BOOTLOADER_IMG}" of="${DEV_EMMC}" conv=fsync bs=1 count=444 dd if="/usr/lib/u-boot/${BOOTLOADER_IMG}" of="${DEV_EMMC}" conv=fsync bs=512 skip=1 seek=1 elif [[ -n "${MYBOX_UBOOT}" && -f "${MYBOX_UBOOT}" ]]; then echo -e "${INFO} 03. Write the mybox bootloader: [ ${MYBOX_UBOOT} ]" dd if="${MYBOX_UBOOT}" of="${DEV_EMMC}" conv=fsync bs=1 count=444 dd if="${MYBOX_UBOOT}" of="${DEV_EMMC}" conv=fsync bs=512 skip=1 seek=1 count=8191 fi [[ "${?}" -eq "0" ]] || error_msg "Failed to write bootloader using [ dd ]." } # Copy boot partition files to eMMC copy_bootfs() { cd / echo -e "${STEPS} Processing BOOTFS partition..." PART_BOOT="${DEV_EMMC}p1" if grep -q ${PART_BOOT} /proc/mounts; then echo -e "${INFO} Unmounting BOOT partition." umount -f ${PART_BOOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to umount [ ${PART_BOOT} ]." fi echo -e "${INFO} Formatting BOOTFS partition..." sleep 1 mkfs.vfat -F 32 -n "BOOT_EMMC" ${PART_BOOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to format BOOTFS with [ mkfs.vfat ]." mount -o rw ${PART_BOOT} ${DIR_INSTALL} [[ "${?}" -eq "0" ]] || error_msg "Failed to mount BOOTFS partition." echo -e "${INFO} Copying BOOTFS partition data..." cp -rf /boot/* ${DIR_INSTALL} # Remove useless files rm -rf ${DIR_INSTALL}/'System Volume Information' rm -f ${DIR_INSTALL}/s9* rm -f ${DIR_INSTALL}/aml* # Replace eMMC boot files [[ -f "${DIR_INSTALL}/boot-emmc.scr" ]] && mv -f ${DIR_INSTALL}/boot-emmc.scr ${DIR_INSTALL}/boot.scr [[ -f "${DIR_INSTALL}/boot-emmc.cmd" ]] && mv -f ${DIR_INSTALL}/boot-emmc.cmd ${DIR_INSTALL}/boot.cmd [[ -f "${DIR_INSTALL}/boot-emmc.ini" ]] && mv -f ${DIR_INSTALL}/boot-emmc.ini ${DIR_INSTALL}/boot.ini [[ -f "${DIR_INSTALL}/boot.ini" ]] && sed -i "s|u-boot.ext|u-boot.emmc|g" ${DIR_INSTALL}/boot.ini # Update [ /boot/uEnv.txt ] settings uenv_conf_file="${DIR_INSTALL}/uEnv.txt" [[ -f "${uenv_conf_file}" ]] && { echo -e "${INFO} Update the [ uEnv.txt ] file." BOOT_CONF="uEnv.conf" sed -i "s|root=.*console=ttyAML0|root=${uenv_mount_string} console=ttyAML0|g" ${uenv_conf_file} sed -i "s|meson.*.dtb|${FDTFILE}|g" ${uenv_conf_file} } # Update [ /boot/extlinux/extlinux.conf ] settings boot_extlinux_file="${DIR_INSTALL}/extlinux/extlinux.conf" [[ -f "${boot_extlinux_file}" ]] && { echo -e "${INFO} Update the [ extlinux.conf ] file." BOOT_CONF="extlinux.conf" sed -i "s|root=.*console=ttyAML0|root=${uenv_mount_string} console=ttyAML0|g" ${boot_extlinux_file} sed -i "s|meson.*.dtb|${FDTFILE}|g" ${boot_extlinux_file} } # Copy u-boot.ext and u-boot.emmc if { [[ "${NEED_OVERLOAD}" == "yes" || "${auto_mainline_uboot}" == "yes" ]]; } && { [[ -n "${UBOOT_OVERLOAD}" && -f "${DIR_INSTALL}/${UBOOT_OVERLOAD}" ]]; }; then echo -e "${INFO} Copy [ ${UBOOT_OVERLOAD} ] to u-boot.emmc" if [[ -f "${DIR_INSTALL}/u-boot.ext" ]]; then cp -f ${DIR_INSTALL}/u-boot.ext ${DIR_INSTALL}/u-boot.emmc else cp -f ${DIR_INSTALL}/${UBOOT_OVERLOAD} ${DIR_INSTALL}/u-boot.ext cp -f ${DIR_INSTALL}/${UBOOT_OVERLOAD} ${DIR_INSTALL}/u-boot.emmc fi chmod +x ${DIR_INSTALL}/u-boot.ext chmod +x ${DIR_INSTALL}/u-boot.emmc fi sync && sleep 3 umount -f ${DIR_INSTALL} [[ "${?}" -eq "0" ]] || error_msg "Failed to umount [ ${DIR_INSTALL} ]." } # Copy root partition files to eMMC copy_rootfs() { cd / echo -e "${STEPS} Processing ROOTFS partition..." PART_ROOT="${DEV_EMMC}p2" if grep -q ${PART_ROOT} /proc/mounts; then echo -e "${INFO} Unmounting ROOT partition." umount -f ${PART_ROOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to umount [ ${PART_ROOT} ]." fi echo -e "${INFO} Formatting ROOTFS partition..." if [[ "${file_system_type}" == "btrfs" ]]; then mkfs.btrfs -f -U ${ROOTFS_UUID} -L "ROOTFS_EMMC" -m single ${PART_ROOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to format ROOTFS with [ mkfs.btrfs ]" mount -t btrfs -o compress=zstd:6 ${PART_ROOT} ${DIR_INSTALL} [[ "${?}" -eq "0" ]] || error_msg "Failed to mount ROOTFS." else mkfs.ext4 -F -q -U ${ROOTFS_UUID} -L "ROOTFS_EMMC" -b 4k -m 0 ${PART_ROOT} [[ "${?}" -eq "0" ]] || error_msg "Failed to format ROOTFS with [ mkfs.ext4 ]" mount -t ext4 ${PART_ROOT} ${DIR_INSTALL} [[ "${?}" -eq "0" ]] || error_msg "Failed to mount ROOTFS partition." fi echo -e "${INFO} Copying ROOTFS partition data..." # Create relevant directories mkdir -p ${DIR_INSTALL}/{boot/,dev/,media/,mnt/,proc/,run/,sys/,tmp/} chmod 1777 ${DIR_INSTALL}/tmp # Copy the relevant directory COPY_SRC="etc home opt root selinux srv usr var" for src in ${COPY_SRC}; do if [[ -d "${src}" ]]; then echo -e "${INFO} Copying [ ${src} ] ..." tar -cf - ${src} | ( cd ${DIR_INSTALL} tar -xpf - ) fi done # Create relevant symbolic link ln -sf usr/bin ${DIR_INSTALL}/bin ln -sf usr/lib ${DIR_INSTALL}/lib ln -sf usr/sbin ${DIR_INSTALL}/sbin echo -e "${INFO} Generate the new fstab file." rm -f ${DIR_INSTALL}/etc/fstab cat >${DIR_INSTALL}/etc/fstab < # One-key to stop : armbian-openvfd 0 # Update config : armbian-openvfd -u # #============================= Functions list ============================= # # do_start : Enable LED screen display # do_stop : Disable LED screen display # do_update_conf : Update OpenVFD configuration files # do_select_box : Select and apply device configuration # #========================================================================== # # Openvfd files storage path openvfd_path="/usr/share/openvfd" openvfd_service="${openvfd_path}/vfdservice" # The openvfd files download repository openvfd_repo="https://github.com/ophub/amlogic-s9xxx-armbian.git" openvfd_dir="build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd" # # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" OPTIONS="[\033[93m OPTIONS \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #========================================================================== # Output error message and abort error_msg() { echo -e "${ERROR} ${1}" exit 1 } # Update OpenVFD configuration files do_update_conf() { echo -e "${STEPS} Updating OpenVFD configuration files..." # Check dependencies [[ -z "$(dpkg -l | awk '{print $2}' | grep -w "^git$")" ]] && sudo apt-get update && sudo apt-get install -y git # Get the latest scripts git_tmp_path="$(mktemp -d)" cd ${git_tmp_path} git init --quiet git config core.sparseCheckout true echo "${openvfd_dir}/*" >>.git/info/sparse-checkout git remote add origin ${openvfd_repo} git pull --quiet --depth=1 origin main [[ "${?}" -ne "0" ]] && error_msg "Failed to download scripts from [ ${openvfd_repo} ]." # Update related files mkdir -p ${openvfd_path} cp -af --no-preserve=ownership ${git_tmp_path}/${openvfd_dir}/* ${openvfd_path} [[ "${?}" -ne "0" ]] && error_msg "Failed to sync scripts from [ ${openvfd_repo} ]." chmod +x ${openvfd_path}/vfdservice # Clean up temporary files rm -rf ${git_tmp_path} 2>/dev/null sync && sleep 3 echo -e "${SUCCESS} OpenVFD configuration files updated successfully." exit 0 } # Enable LED screen display do_start() { echo -e "${STEPS} Enabling LED screen display..." # Check config files and services conf_file="${openvfd_path}/conf/${1}" if [[ -s "${conf_file}" && -x "${openvfd_service}" ]]; then source "${conf_file}" 2>/dev/null echo -e "${INFO} Using LED Profiles: ${conf_file}" else error_msg "The LED profile [ ${conf_file} ] does not exist!" fi modprobe openvfd vfd_gpio_clk=${vfd_gpio_clk} \ vfd_gpio_dat=${vfd_gpio_dat} \ vfd_gpio_stb=${vfd_gpio_stb:-0,0,0xFF} \ vfd_gpio0=${vfd_gpio0:-0,0,0xFF} \ vfd_gpio1=${vfd_gpio1:-0,0,0xFF} \ vfd_gpio2=${vfd_gpio2:-0,0,0xFF} \ vfd_gpio3=${vfd_gpio3:-0,0,0xFF} \ vfd_gpio_protocol=${vfd_gpio_protocol:-0,0} \ vfd_chars=${vfd_chars} vfd_dot_bits=${vfd_dot_bits} \ vfd_display_type=${vfd_display_type} "${openvfd_service}" & trap "killall ${openvfd_service}; rmmod openvfd; exit" 2 3 15 if [[ -n "${functions}" ]]; then for func in ${functions}; do echo -e "${INFO} turn led ${func} on ... " echo "${func}" >/sys/class/leds/openvfd/led_on 2>/dev/null done fi echo -e "${SUCCESS} LED display enabled!" exit 0 } # Disable LED screen display do_stop() { echo -e "${STEPS} Disabling LED screen display..." killall -9 vfdservice 2>/dev/null rmmod openvfd -f 2>/dev/null echo -e "${SUCCESS} LED display disabled!" exit 0 } # Select and apply device configuration do_select_box() { case "${1}" in 11 | x96max) do_start x96max.conf ;; 12 | x96maxplus) do_start x96maxplus.conf ;; 13 | x96air) do_start x96air.conf ;; 14 | h96max-x3) do_start h96max-x3.conf ;; 15 | hk1-x3) do_start hk1-x3.conf ;; 16 | hk1box) do_start hk1box.conf ;; 17 | tx3) do_start tx3.conf ;; 18 | tx3-mini) do_start tx3-mini.conf ;; 19 | t95) do_start t95.conf ;; 20 | t95z-plus) do_start t95z-plus.conf ;; 21 | tx9-pro) do_start tx9-pro.conf ;; 22 | x92) do_start x92.conf ;; 23 | whale) do_start whale.conf ;; 24 | x88pro-x3) do_start x88pro-x3.conf ;; 99 | diy) do_start diy.conf ;; 0 | stop) do_stop ;; 1 | quit) echo "quit!" && exit 0 ;; *) error_msg "Invalid input!" ;; esac } # Execute according to the classification of input parameters case "${1}" in -u | u | -update | update) do_update_conf ;; [0-9]*) do_select_box "${1}" ;; *) clear cat < Order of display chars (D=dots, represented by a single char) vfd_chars='0,4,3,2,1' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,3,2,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x00,0x00,0x00,0x06' functions='alarm usb play pause colon eth wifi' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/hk1-x3.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # HK1 X3 (S905X3) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='0,0,0xFF' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='0,4,3,2,1' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,3,2,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x00,0x00,0x00,0x06' functions='wifi eth usb alarm play pause' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/hk1box.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # HK1Box / Vontar X3 (S905X3) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='0,0,0xFF' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='0,4,3,2,1' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,3,2,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x00,0x00,0x00,0x06' functions='alarm usb play pause colon lan wlan' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/t95.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # T95m (S905X) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-gxl-gpio.h # [2] Reserved - must be 0. vfd_gpio_clk='1,4,0' vfd_gpio_dat='1,3,0' vfd_gpio_stb='1,2,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='0,1,2,3,4' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0. # [2] - Flags. (bit 0 = '1' - Common Anode display, bits [1-7] - Reserved.) # [3] - Controller. vfd_display_type='0x01,0x00,0x00,0x00' functions='' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/t95z-plus.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # T95Z Plus configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-gxl-gpio.h # [2] Reserved - must be 0. vfd_gpio_clk='0,71,0' vfd_gpio_dat='0,72,0' vfd_gpio_stb='0,70,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='0,1,2,3,4' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0. # [2] - Flags. (bit 0 = '1' - Common Anode display, bits [1-7] - Reserved.) # [3] - Controller. vfd_display_type='0x01,0x00,0x00,0x00' functions='wifi eth usb alarm play pause' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/tx3-mini.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # Tanix TX3-MINI (S905W) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,76,0' vfd_gpio_dat='0,75,0' vfd_gpio_stb='1,4,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='4,3,2,1,0' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,3,2,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x01,0x00,0x00,0x00' #functions='alarm usb play pause colon lan wlan' functions='usb colon eth wifi' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/tx3.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # Tanix TX3 (S905X3) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='0,0,0xFF' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='0,4,3,2,1' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,3,2,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x01,0x00,0x00,0x06' #functions='alarm usb play pause colon lan wlan' functions='' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/tx9-pro.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # Tanix TX9 Pro (S912) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-gxl-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,75,0' vfd_gpio_dat='0,74,0' vfd_gpio_stb='0,53,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='4,0,1,2,3' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x00,0x00,0x00,0x00' #functions='alarm usb play pause colon lan wlan' functions='' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/whale.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # Whale (S905X3) configuration # Share by: https://github.com/9runner #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='1,10,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='4,0,1,2,3' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x02,0x00,0x01,0x06' # ok functions='usb apps setup sd hdmi cvbs' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/x88pro-x3.conf ================================================ #-------------------- # X88 PRO X3 (S905X3) configuration # shared by https://github.com/araczkowski #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='1,10,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='4,0,1,2,3' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x02,0x00,0x00,0x06' # ok functions='usb apps setup sd hdmi cvbs' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/x92.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # X92 S912 configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-gxl-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='0,66,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='4,0,1,2,3' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x02,0x00,0x01,0x00' #functions='alarm usb play pause colon lan wlan' functions='' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/x96air.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # X96 Air (S905X3) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='1,10,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='4,0,1,2,3' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x02,0x00,0x01,0x00' # ok functions='usb apps setup sd hdmi cvbs' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/x96max.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # X96 Max (S905X2) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='1,10,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='4,0,1,2,3' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x02,0x00,0x01,0x00' # ok functions='usb apps setup sd hdmi cvbs' ================================================ FILE: build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/x96maxplus.conf ================================================ # This file must be renamed to vfd.conf and placed in the /storage/.config/ folder. # # X96 Max Plus (S905X3) configuration #-------------------- #gpio_xxx: # [0] 0 = &gpio, 1 = &gpio_ao. # [1] pin number - https://github.com/openSUSE/kernel/blob/master/include/dt-bindings/gpio/meson-g12a-gpio.h # [0] Reserved - must be 0. vfd_gpio_clk='0,64,0' vfd_gpio_dat='0,63,0' vfd_gpio_stb='1,10,0' #chars: # < DHHMM > Order of display chars (D=dots, represented by a single char) vfd_chars='4,0,1,2,3' #dot_bits: # Order of dot bits. Typical configurations: # Display Type 0, 1 usually has Alarm, USB, Play, Pause, Col, Ethernet, Wifi dots # Alarm = 0, USB = 1, Play = 2, Pause = 3, Col = 4, Eth = 5, Wifi = 6 # Display Type 2 usually has APPS, USB, SETUP, CARD, Col, HDMI, CVBS dots # APPS = 0, USB = 1, SETUP = 2, CARD = 3, Col = 4, HDMI = 5, CVBS = 6 # Display Type 3 Power, LAN, Col, Low Wifi, High Wifi # N/A = 0, N/A = 1, Power = 2, LAN = 3, Col = 4, Low Wifi = 5, High Wifi = 6 vfd_dot_bits='0,1,2,3,4,5,6' #display_type: # [0] - Display type. # [1] - Reserved - must be 0.. # [2] - Flags. (bit 0 = '1' - Common Anode display) # [3] - Controller. vfd_display_type='0x02,0x00,0x01,0x00' # ok functions='usb apps setup sd hdmi cvbs' ================================================ FILE: build-armbian/armbian-files/platform-files/rockchip/bootfs/armbianEnv.txt ================================================ verbosity=1 bootlogo=false fdtfile=rockchip/rk3399-king3399.dtb rootdev=/dev/mmcblk0p2 rootfstype=ext4 rootflags=rw,errors=remount-ro overlay_prefix=rk3399 overlays= extraargs=rw rootwait extraboardargs=net.ifnames=0 max_loop=128 docker_optimizations=on ================================================ FILE: build-armbian/armbian-files/platform-files/rockchip/bootfs/armbian_first_run.txt.template ================================================ #----------------------------------------------------------------- # Armbian first run configuration # Set optional end user configuration # - Rename this file from /boot/armbian_first_run.txt.template to /boot/armbian_first_run.txt # - Settings below will be applied only on 1st run of Armbian #----------------------------------------------------------------- #----------------------------------------------------------------- # General: # 1 = delete this file, after first run setup is completed. FR_general_delete_this_file_after_completion=1 #----------------------------------------------------------------- #Networking: # Change default network settings # Set to 1 to apply any network related settings below FR_net_change_defaults=0 # Enable WiFi or Ethernet. # NB: If both are enabled, WiFi will take priority and Ethernet will be disabled. FR_net_ethernet_enabled=1 FR_net_wifi_enabled=0 #Enter your WiFi creds # SECURITY WARN: Your wifi keys will be stored in plaintext, no encryption. FR_net_wifi_ssid='MySSID' FR_net_wifi_key='MyWiFiKEY' # Country code to enable power ratings and channels for your country. eg: GB US DE | https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 FR_net_wifi_countrycode='GB' #If you want to use a static ip, set it here FR_net_use_static=0 FR_net_static_ip='192.168.0.100' FR_net_static_mask='255.255.255.0' FR_net_static_gateway='192.168.0.1' FR_net_static_dns='8.8.8.8 8.8.4.4' #2 entries max, separated by a space. #----------------------------------------------------------------- ================================================ FILE: build-armbian/armbian-files/platform-files/rockchip/bootfs/boot.cmd ================================================ # DO NOT EDIT THIS FILE # # Please edit /boot/armbianEnv.txt to set supported parameters # setenv load_addr "0x9000000" setenv overlay_error "false" # default values setenv rootdev "/dev/mmcblk0p1" setenv verbosity "1" setenv console "both" setenv bootlogo "false" setenv rootfstype "ext4" setenv docker_optimizations "on" setenv earlycon "off" echo "Boot script loaded from ${devtype} ${devnum}" if test -e ${devtype} ${devnum} ${prefix}armbianEnv.txt; then load ${devtype} ${devnum} ${load_addr} ${prefix}armbianEnv.txt env import -t ${load_addr} ${filesize} fi if test "${logo}" = "disabled"; then setenv logo "logo.nologo"; fi if test "${console}" = "display" || test "${console}" = "both"; then setenv consoleargs "console=tty1"; fi if test "${console}" = "serial" || test "${console}" = "both"; then setenv consoleargs "console=ttyS2,1500000 ${consoleargs}"; fi if test "${earlycon}" = "on"; then setenv consoleargs "earlycon ${consoleargs}"; fi if test "${bootlogo}" = "true"; then setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" else setenv consoleargs "splash=verbose ${consoleargs}" fi # get PARTUUID of first partition on SD/eMMC the boot script was loaded from if test "${devtype}" = "mmc"; then part uuid mmc ${devnum}:1 partuuid; fi setenv bootargs "root=${rootdev} rootwait rootfstype=${rootfstype} ${consoleargs} consoleblank=0 loglevel=${verbosity} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1"; fi load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} fdt addr ${fdt_addr_r} fdt resize 65536 for overlay_file in ${overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-${overlay_file}.dtbo; then echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done for overlay_file in ${user_overlays}; do if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then echo "Applying user provided DT overlay ${overlay_file}.dtbo" fdt apply ${load_addr} || setenv overlay_error "true" fi done if test "${overlay_error}" = "true"; then echo "Error applying DT overlays, restoring original DT" load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}dtb/${fdtfile} else if load ${devtype} ${devnum} ${load_addr} ${prefix}dtb/rockchip/overlay/${overlay_prefix}-fixup.scr; then echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" source ${load_addr} fi if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr echo "Applying user provided fixup script (fixup.scr)" source ${load_addr} fi fi kaslrseed booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} # Recompile with: # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr ================================================ FILE: build-armbian/armbian-files/platform-files/rockchip/bootfs/extlinux/extlinux.conf.bak ================================================ LABEL Armbian LINUX /Image INITRD /uInitrd FDT /dtb/rockchip/rk3399-king3399.dtb APPEND root=LABEL=ROOTFS console=ttyS2,1500000 console=tty1 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 max_loop=128 bootsplash.bootfile=bootsplash.armbian ================================================ FILE: compile-kernel/README.cn.md ================================================ # 内核编译与使用指南 [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) 本项目编译的内核兼容 `Armbian` 和 `OpenWrt` 系统,可用于 [amlogic-s9xxx-armbian](https://github.com/ophub/amlogic-s9xxx-armbian)、[amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt)、[flippy-openwrt-actions](https://github.com/ophub/flippy-openwrt-actions) 和 [unifreq/openwrt_packit](https://github.com/unifreq/openwrt_packit) 等项目。既可在编译固件时集成,也可安装到已有系统中使用。 你可以根据需要调整内核配置,例如添加驱动和补丁。也可以编译带有个性化签名的内核,如 `5.10.95-happy-new-year`、`5.10.96-beijing-winter-olympics`、`5.10.99-valentines-day` 等。 ## 内核仓库 在 [ophub/kernel](https://github.com/ophub/kernel) 的 [Releases](https://github.com/ophub/kernel/releases) 中提供了预编译的内核文件。 ## 本地编译 - ### 在 Ubuntu 系统下运行 1. 克隆仓库到本地:`git clone --depth 1 https://github.com/ophub/amlogic-s9xxx-armbian.git` 2. 安装必要的软件包(以 Ubuntu 24.04 为例): 进入 `~/amlogic-s9xxx-armbian` 根目录,然后执行安装命令: ```yaml sudo apt-get update -y sudo apt-get full-upgrade -y # For Ubuntu-24.04 sudo apt-get install -y $(cat compile-kernel/tools/script/ubuntu2404-build-armbian-depends) ``` 3. 进入 `~/amlogic-s9xxx-armbian` 根目录,执行 `sudo ./recompile -k 5.15.100` 等指定参数命令即可编译内核。脚本将自动下载并安装编译环境和内核源代码,并完成全部配置。编译完成的内核文件保存在当前源码树的 `compile-kernel/output` 目录中,或通过 `-h` 参数指定的目录中。 - ### 在 Armbian 系统下运行 可以直接在 [Armbian](https://github.com/ophub/amlogic-s9xxx-armbian/releases) 系统中编译内核,也可以在 Ubuntu/Debian 等系统上通过 [Docker](https://hub.docker.com/u/ophub) 容器运行 Armbian 系统来编译内核。Armbian 系统 Docker 镜像的制作方法可参考 [armbian_docker](./tools/script/docker) 构建脚本。 1. 更新本地编译环境和配置文件:`armbian-kernel -u` 2. 编译内核:执行 `armbian-kernel -k 5.15.100` 等指定参数命令即可编译内核。脚本将自动下载并安装编译环境和内核源代码,并完成全部配置。编译完成的内核文件保存在 `/opt/kernel/compile-kernel/output` 目录中。 - ### 本地编译参数说明 | 参数 | 含义 | 说明 | | ------ | ----------- | ------------------------------- | | -r | Repository | 指定编译内核的源代码仓库。可选择 `github.com` 上的内核源代码仓库,例如 `-r unifreq`。参数格式支持 `owner/repo@branch` 三部分组合,其中所有者名称 `owner` 为必选参数,仓库名称 `/repo` 和分支名称 `@branch` 为可选参数。当仅指定所有者名称时,将自动匹配该所有者下名称符合 `linux-5.x.y` 格式且分支为 `main` 的内核源代码仓库。若仓库名称或分支名称不同,请使用组合方式指定,如 `owner@branch`、`owner/repo` 或 `owner/repo@branch`。默认值:`unifreq` | | -k | Kernel | 指定内核版本,如 `-k 5.15.100`。多个内核以 `_` 分隔,如 `-k 5.15.100_5.15.50`。使用 `-k all` 表示编译全部主线内核,当前等价于 `-k 5.10.y_5.15.y_6.1.y_6.6.y_6.12.y_6.18.y`,内核列表会随上游内核源码仓库 [unifreq](https://github.com/unifreq) 的维护状态动态调整。 | | -a | AutoKernel | 设置是否自动采用同系列最新版本内核。设为 `true` 时,将自动检查 `-k` 指定的内核(如 `5.15.100`)同系列是否存在更新版本,若存在则自动切换为最新版。设为 `false` 时则编译指定版本。默认值:`true` | | -m | MakePackage | 设置内核构建的包列表。设为 `all` 时生成 `Image、modules、dtbs` 全部文件;设为 `dtbs` 时仅生成 3 个 DTB 文件。默认值:`all` | | -f | configFlavor | 指定从内核仓库 [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) 下载的配置文件 `config-*` 到本地 [tools/config](tools/config) 目录。若本地已存在对应内核版本的配置文件且未设置此参数,则跳过下载。可选项为内核仓库中存在的[目录名](https://github.com/ophub/kernel/tree/main/kernel-config/release),例如:`stable` / `rk3588` / `rk35xx` / `h6`。默认值:`stable` | | -p | AutoPatch | 设置是否应用自定义内核补丁。设为 `true` 时将使用 [tools/patch](tools/patch) 目录下的内核补丁,详细说明参考[内核补丁添加方法](../documents/README.cn.md#9-编译-armbian-内核)。默认值:`false` | | -n | CustomName | 设置内核自定义签名。例如设为 `-ophub` 时,生成的内核名称为 `5.15.100-ophub`。签名中请勿包含空格。默认值:`-ophub` | | -t | Toolchain | 设置编译内核的工具链。可选项:`clang / gcc / gcc-`。默认值:`gcc` | | -z | CompressFormat | 设置内核中 initrd 使用的压缩格式。可选项:`xz / gzip / zstd / lzma`。默认值:`xz` | | -d | DeleteSource | 设置内核编译完成后是否删除源代码。可选项:`true / false`。默认值:`false` | | -s | SilentLog | 设置编译时是否启用静默模式以减少日志输出。可选项:`true / false`。默认值:`false` | | -l | EnableLog | 设置是否将编译过程记录到日志文件:`/var/log/kernel_compile_*.log`。可选项:`true / false`。默认值:`false` | | -c | CcacheClear | 设置编译前是否清除 ccache 缓存。可选项:`true / false`。默认值:`false` | | -h | DockerHostpath | 设置内核编译时 Docker 容器在宿主机的挂载路径。默认使用当前目录。 | | -i | DockerImage | 设置编译内核的 Docker 容器镜像。默认值:`ophub/armbian-trixie:arm64` | - `sudo ./recompile` : 使用默认配置编译内核。 - `sudo ./recompile -k 5.15.100` : 使用默认配置,并通过 `-k` 进行指定需要编译的内核版本,多个版本同时编译时使用 `_` 进行连接。 - `sudo ./recompile -k 5.15.100 -f stable` : 使用默认配置,并通过 `-k 5.15.100` 参数指定需要编译的内核版本,通过 `-f stable` 参数指定从内核仓库下载 `stable` 目录下的配置文件。 - `sudo ./recompile -k 5.15.100 -a true` : 使用默认配置,并通过 `-a` 参数设置编译内核时,是否自动升级到同系列最新内核。 - `sudo ./recompile -k 5.15.100 -n -ophub` : 使用默认配置,并通过 `-n` 参数设置内核自定义签名。 - `sudo ./recompile -k 5.15.100 -m dtbs` : 使用默认配置,并通过 `-m` 参数指定仅制作 dtbs 文件。 - `sudo ./recompile -k 5.15.100_6.1.10 -a true -n -ophub` : 使用默认配置,并通过多个参数进行设置。 ’ 提示:推荐使用 `unifreq` 的 [linux-6.1.y](https://github.com/unifreq/linux-6.1.y)、[linux-5.15.y](https://github.com/unifreq/linux-5.15.y)、[linux-5.10.y](https://github.com/unifreq/linux-5.10.y) 等仓库的内核源代码进行编译,其中已针对相关设备添加了驱动和补丁。配置文件推荐使用 [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) 中的模板,已针对支持的设备进行了预配置,可在此基础上进行个性化定制。 ## 使用 GitHub Actions 编译内核 1. 在 [Action](https://github.com/ophub/amlogic-s9xxx-armbian/actions) 页面选择 **_`Compile the kernel`_**,点击 **_`Run workflow`_** 按钮即可开始编译。 2. 详见模板 [compile-kernel-via-docker.yml](../.github/workflows/compile-kernel-via-docker.yml)。代码如下: ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 6.12.y_6.18.y kernel_auto: true kernel_sign: -yourname ``` ’ 注意:若你 `fork` 仓库并进行了修改,使用时须将 Actions 的用户名改为你自己的仓库,例如: ```yaml uses: YOUR-REPO/amlogic-s9xxx-armbian@main ``` - ### GitHub Action 输入参数说明 相关参数与`本地编译命令`相对应,请参考上述说明。 | 参数 | 默认值 | 说明 | |-------------------|------------------|-----------------------------------------------------------| | build_target | kernel | 固定参数 `kernel`,设置编译目标为内核。 | | kernel_source | unifreq | 指定编译内核的源代码仓库。默认值:`unifreq`。功能参考 `-r` | | kernel_version | 6.12.y_6.18.y | 指定内核版本,如 `5.15.100`。功能参考 `-k` | | kernel_auto | true | 设置是否自动采用同系列最新版本内核。默认值:`true`。功能参考 `-a` | | kernel_package | all | 设置内核构建的包列表。默认值:`all`。功能参考 `-m` | | kernel_sign | -ophub | 设置内核自定义签名。默认值:`-ophub`。功能参考 `-n` | | kernel_toolchain | gcc | 设置编译内核的工具链。默认值:`gcc`。功能参考 `-t` | | config_flavor | stable | 指定从内核仓库 [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) 下载的配置文件 `config-*` 到本地 [tools/config](tools/config) 目录。若本地已存在对应内核版本的配置文件且未设置此参数,则跳过下载。可选项为内核仓库中存在的[目录名](https://github.com/ophub/kernel/tree/main/kernel-config/release),例如:`stable` / `rk3588` / `rk35xx` / `h6`。默认值:`stable`。若同时设置了 `kernel_config` 参数,最终优先采用 `config_flavor` 指定的配置文件。这两个参数互斥,可任选其一:通过前者使用 [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) 的内核配置文件,或通过后者使用你自己仓库的配置文件。功能参考 `-f` | | kernel_config | false | 默认使用 [tools/config](tools/config) 目录下的配置模板。可指定你仓库中存放内核配置文件的目录,如 `kernel/config_path`。该目录下的配置模板须以内核主版本命名,如 `config-5.10`、`config-5.15` 等。 | | kernel_patch | false | 指定你仓库中自定义内核补丁文件的目录。若设置此参数,编译前将自动从指定目录下载补丁文件;未设置则跳过。 | | auto_patch | false | 设置是否应用自定义内核补丁。默认值:`false`。功能参考 `-p` | | compress_format | xz | 设置内核中 initrd 使用的压缩格式。默认值:`xz`。功能参考 `-z` | | delete_source | false | 设置编译完成后是否删除内核源代码。默认值:`false`。功能参考 `-d` | | silent_log | false | 设置编译时是否启用静默模式以减少日志输出。默认值:`false`。功能参考 `-s` | | enable_log | false | 设置是否将编译过程记录到日志文件:`/var/log/kernel_compile_*.log`。默认值:`false`。功能参考 `-l` | | ccache_clear | false | 设置编译前是否清除 ccache 缓存。默认值:`false`。功能参考 `-c` | | docker_hostpath | . | 设置内核编译时 Docker 容器在宿主机的挂载路径。默认使用当前目录。功能参考 `-h` | | docker_image | ophub/armbian-trixie:arm64 | 设置编译内核的 Docker 容器镜像。功能参考 `-i` | - ### GitHub Action 输出变量说明 上传到 `Releases` 需要给仓库设置 `Workflow 读写权限`,详见[使用说明](../documents/README.cn.md#2-设置隐私变量-github_token)。 | 参数 | 默认值 | 说明 | | ------------------------------ | --------------------- | ------------------------------ | | ${{ env.PACKAGED_OUTPUTTAGS }} | 6.12.y_6.18.y | 编译完成的内核名称 | | ${{ env.PACKAGED_OUTPUTPATH }} | compile-kernel/output | 编译完成的内核文件所在目录 | | ${{ env.PACKAGED_OUTPUTDATE }} | 04.13.1058 | 编译日期(月.日.时分) | | ${{ env.PACKAGED_STATUS }} | success | 编译状态:success / failure | ## 内核使用指南 本项目编译的内核兼容 `Armbian` 和 `OpenWrt` 系统。以下以 ophub 的项目为例进行说明。 ### 在 Armbian 系统中使用 以下分别介绍如何在编译 Armbian 固件时集成内核,以及如何将内核安装到已有系统中。 - #### 使用内核编译 Armbian 固件 Armbian 固件编译支持本地操作,也支持通过 github.com 的 Actions 在线编译。本地编译方法详见:[本地化打包](../README.cn.md#本地化打包),使用 Actions 在线编译的方法详见:[使用 GitHub Actions 进行编译](../README.cn.md#使用-github-actions-进行编译) - #### 将内核安装到已有的 Armbian 系统 使用 `armbian-update` 命令可将编译好的内核安装到已有的 Armbian 系统中,具体操作方法详见:[更新 Armbian 内核](../README.cn.md#更新-armbian-内核) - #### 自定义编译驱动模块 在 Linux 主线内核中,部分驱动尚未被支持,可自行编译所需的驱动模块。具体操作方法详见:[编译驱动模块](../documents/README.cn.md#93-如何自定义编译驱动模块) ### 在 OpenWrt 系统中使用 以下分别介绍如何在 OpenWrt 系统编译固件时集成内核,以及如何将内核安装到已有系统中。 - #### 使用内核编译 OpenWrt 固件 OpenWrt 固件编译支持本地操作,也支持通过 github.com 的 Actions 在线编译。本地编译方法详见:[本地化打包](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.cn.md#本地化打包),使用 Actions 在线编译的方法详见:[使用 Github Actions 进行编译](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.cn.md#使用-github-actions-进行编译) - #### 将内核安装到已有的 OpenWrt 系统 使用 [luci-app-amlogic](https://github.com/ophub/luci-app-amlogic/blob/main/README.cn.md) 插件可将编译好的内核安装到已有的 OpenWrt 系统中,具体操作方法详见:[升级 OpenWrt](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.cn.md#升级-openwrt) ================================================ FILE: compile-kernel/README.ja.md ================================================ # カーネルのコンパイルと使用ガイド [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) 本プロジェクトでコンパイルしたカーネルは `Armbian` と `OpenWrt` システムに対応しており、[amlogic-s9xxx-armbian](https://github.com/ophub/amlogic-s9xxx-armbian)、[amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt)、[flippy-openwrt-actions](https://github.com/ophub/flippy-openwrt-actions)、[unifreq/openwrt_packit](https://github.com/unifreq/openwrt_packit) などのプロジェクトで使用できます。ファームウェアのコンパイル時に統合することも、既存のシステムにインストールして使用することもできます。 必要に応じてカーネル設定を調整し、ドライバやパッチを追加できます。また、`5.10.95-happy-new-year`、`5.10.96-beijing-winter-olympics`、`5.10.99-valentines-day` など、個性的な署名付きカーネルをコンパイルすることもできます。 ## カーネルリポジトリ [ophub/kernel](https://github.com/ophub/kernel) の [Releases](https://github.com/ophub/kernel/releases) にコンパイル済みのカーネルファイルが提供されています。 ## ローカルコンパイル - ### Ubuntu システムでの実行 1. リポジトリをローカルにクローン:`git clone --depth 1 https://github.com/ophub/amlogic-s9xxx-armbian.git` 2. 必要なパッケージのインストール(Ubuntu 24.04 を例として): `~/amlogic-s9xxx-armbian` ルートディレクトリに移動し、インストールコマンドを実行します: ```yaml sudo apt-get update -y sudo apt-get full-upgrade -y # For Ubuntu-24.04 sudo apt-get install -y $(cat compile-kernel/tools/script/ubuntu2404-build-armbian-depends) ``` 3. `~/amlogic-s9xxx-armbian` ルートディレクトリに移動し、`sudo ./recompile -k 5.15.100` などの指定パラメータコマンドを実行してカーネルをコンパイルします。スクリプトはコンパイル環境とカーネルソースコードを自動的にダウンロード・インストールし、すべての設定を完了します。コンパイル済みのカーネルファイルは現在のソースツリーの `compile-kernel/output` ディレクトリ、または `-h` パラメータで指定したディレクトリに保存されます。 - ### Armbian システムでの実行 [Armbian](https://github.com/ophub/amlogic-s9xxx-armbian/releases) システム上で直接カーネルをコンパイルすることも、Ubuntu/Debian などのシステム上で [Docker](https://hub.docker.com/u/ophub) コンテナを介して Armbian システムを実行してカーネルをコンパイルすることもできます。Armbian システムの Docker イメージの作成方法は [armbian_docker](./tools/script/docker) ビルドスクリプトを参照してください。 1. ローカルコンパイル環境と設定ファイルの更新:`armbian-kernel -u` 2. カーネルのコンパイル:`armbian-kernel -k 5.15.100` などの指定パラメータコマンドを実行してカーネルをコンパイルします。スクリプトはコンパイル環境とカーネルソースコードを自動的にダウンロード・インストールし、すべての設定を完了します。コンパイル済みのカーネルファイルは `/opt/kernel/compile-kernel/output` ディレクトリに保存されます。 - ### ローカルコンパイルパラメータの説明 | パラメータ | 意味 | 説明 | | --------- | ------------ | ------------------------------- | | -r | Repository | カーネルソースコードリポジトリを指定します。`github.com` 上のカーネルソースコードリポジトリを選択でき、例えば `-r unifreq`。パラメータ形式は `owner/repo@branch` の3部分の組み合わせをサポートし、オーナー名 `owner` は必須、リポジトリ名 `/repo` とブランチ名 `@branch` は任意です。オーナー名のみ指定した場合、そのオーナー配下で `linux-5.x.y` 形式の名前かつ `main` ブランチのカーネルソースコードリポジトリを自動的にマッチします。リポジトリ名やブランチ名が異なる場合は、`owner@branch`、`owner/repo`、`owner/repo@branch` のように組み合わせて指定してください。デフォルト値:`unifreq` | | -k | Kernel | カーネルバージョンを指定します。例:`-k 5.15.100`。複数のカーネルは `_` で区切ります。例:`-k 5.15.100_5.15.50`。`-k all` を使用するとすべてのメインラインカーネルをコンパイルし、現在は `-k 5.10.y_5.15.y_6.1.y_6.6.y_6.12.y_6.18.y` と同等です。カーネルリストは上流カーネルソースリポジトリ [unifreq](https://github.com/unifreq) のメンテナンス状況に応じて動的に調整されます。 | | -a | AutoKernel | 同系列の最新バージョンカーネルを自動的に採用するかどうかを設定します。`true` に設定すると、`-k` で指定したカーネル(例:`5.15.100`)と同じ系列にさらに新しいバージョンがあるか自動的にチェックし、存在する場合は最新版に自動切り替えします。`false` に設定すると指定バージョンをコンパイルします。デフォルト値:`true` | | -m | MakePackage | カーネルビルドのパッケージリストを設定します。`all` に設定すると `Image、modules、dtbs` のすべてのファイルを生成し、`dtbs` に設定すると DTB ファイル3つのみ生成します。デフォルト値:`all` | | -f | configFlavor | カーネルリポジトリ [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) から設定ファイル `config-*` をローカルの [tools/config](tools/config) ディレクトリにダウンロードする際のフレーバーを指定します。対応するカーネルバージョンの設定ファイルがローカルに既に存在し、このパラメータが未設定の場合はダウンロードをスキップします。選択肢はカーネルリポジトリに存在する[ディレクトリ名](https://github.com/ophub/kernel/tree/main/kernel-config/release)で、例:`stable` / `rk3588` / `rk35xx` / `h6`。デフォルト値:`stable` | | -p | AutoPatch | カスタムカーネルパッチを適用するかどうかを設定します。`true` に設定すると [tools/patch](tools/patch) ディレクトリのカーネルパッチを使用します。詳細は[カーネルパッチの追加方法](../documents/README.ja.md#9-armbian-カーネルのコンパイル)を参照してください。デフォルト値:`false` | | -n | CustomName | カーネルのカスタム署名を設定します。例えば `-ophub` に設定すると、生成されるカーネル名は `5.15.100-ophub` になります。署名にスペースを含めないでください。デフォルト値:`-ophub` | | -t | Toolchain | カーネルコンパイルのツールチェーンを設定します。選択肢:`clang / gcc / gcc-`。デフォルト値:`gcc` | | -z | CompressFormat | カーネル内の initrd で使用する圧縮フォーマットを設定します。選択肢:`xz / gzip / zstd / lzma`。デフォルト値:`xz` | | -d | DeleteSource | カーネルのコンパイル完了後にソースコードを削除するかどうかを設定します。選択肢:`true / false`。デフォルト値:`false` | | -s | SilentLog | コンパイル時にサイレントモードを有効にしてログ出力を削減するかどうかを設定します。選択肢:`true / false`。デフォルト値:`false` | | -l | EnableLog | コンパイルプロセスをログファイルに記録するかどうかを設定します:`/var/log/kernel_compile_*.log`。選択肢:`true / false`。デフォルト値:`false` | | -c | CcacheClear | コンパイル前に ccache キャッシュをクリアするかどうかを設定します。選択肢:`true / false`。デフォルト値:`false` | | -h | DockerHostpath | カーネルコンパイル時の Docker コンテナのホストマシン上のマウントパスを設定します。デフォルトは現在のディレクトリを使用します。 | | -i | DockerImage | カーネルコンパイル用の Docker コンテナイメージを設定します。デフォルト値:`ophub/armbian-trixie:arm64` | - `sudo ./recompile` :デフォルト設定でカーネルをコンパイルします。 - `sudo ./recompile -k 5.15.100` :デフォルト設定を使用し、`-k` でコンパイルするカーネルバージョンを指定します。複数バージョンを同時にコンパイルする場合は `_` で連結します。 - `sudo ./recompile -k 5.15.100 -f stable` :デフォルト設定を使用し、`-k 5.15.100` でカーネルバージョンを指定、`-f stable` でカーネルリポジトリの `stable` ディレクトリから設定ファイルをダウンロードします。 - `sudo ./recompile -k 5.15.100 -a true` :デフォルト設定を使用し、`-a` パラメータでカーネルコンパイル時に同系列の最新カーネルへ自動アップグレードするかどうかを設定します。 - `sudo ./recompile -k 5.15.100 -n -ophub` :デフォルト設定を使用し、`-n` パラメータでカーネルのカスタム署名を設定します。 - `sudo ./recompile -k 5.15.100 -m dtbs` :デフォルト設定を使用し、`-m` パラメータで dtbs ファイルのみを生成するよう指定します。 - `sudo ./recompile -k 5.15.100_6.1.10 -a true -n -ophub` :デフォルト設定を使用し、複数のパラメータで設定を行います。 💡 ヒント:`unifreq` の [linux-6.1.y](https://github.com/unifreq/linux-6.1.y)、[linux-5.15.y](https://github.com/unifreq/linux-5.15.y)、[linux-5.10.y](https://github.com/unifreq/linux-5.10.y) などのリポジトリのカーネルソースコードを使用してコンパイルすることをお勧めします。これらには対象デバイス向けのドライバとパッチが追加されています。設定ファイルは [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) のテンプレートの使用を推奨します。サポートデバイス向けに事前設定されており、これをベースにカスタマイズできます。 ## GitHub Actions でのカーネルコンパイル 1. [Action](https://github.com/ophub/amlogic-s9xxx-armbian/actions) ページで **_`Compile the kernel`_** を選択し、**_`Run workflow`_** ボタンをクリックするとコンパイルを開始できます。 2. テンプレート [compile-kernel-via-docker.yml](../.github/workflows/compile-kernel-via-docker.yml) を参照してください。コードは以下の通りです: ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 6.12.y_6.18.y kernel_auto: true kernel_sign: -yourname ``` 💡 注意:リポジトリを `fork` して変更を加えた場合、使用時に Actions のユーザー名を自分のリポジトリに変更する必要があります。例: ```yaml uses: YOUR-REPO/amlogic-s9xxx-armbian@main ``` - ### GitHub Action 入力パラメータの説明 関連パラメータは`ローカルコンパイルコマンド`に対応しています。上記の説明を参照してください。 | パラメータ | デフォルト値 | 説明 | |-------------------|------------------|-----------------------------------------------------------| | build_target | kernel | 固定パラメータ `kernel`。コンパイル対象をカーネルに設定します。 | | kernel_source | unifreq | カーネルソースコードリポジトリを指定します。デフォルト値:`unifreq`。機能は `-r` を参照 | | kernel_version | 6.12.y_6.18.y | カーネルバージョンを指定します。例:`5.15.100`。機能は `-k` を参照 | | kernel_auto | true | 同系列の最新バージョンカーネルを自動採用するかどうかを設定します。デフォルト値:`true`。機能は `-a` を参照 | | kernel_package | all | カーネルビルドのパッケージリストを設定します。デフォルト値:`all`。機能は `-m` を参照 | | kernel_sign | -ophub | カーネルのカスタム署名を設定します。デフォルト値:`-ophub`。機能は `-n` を参照 | | kernel_toolchain | gcc | カーネルコンパイルのツールチェーンを設定します。デフォルト値:`gcc`。機能は `-t` を参照 | | config_flavor | stable | カーネルリポジトリ [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) から設定ファイル `config-*` をローカルの [tools/config](tools/config) ディレクトリにダウンロードする際のフレーバーを指定します。対応するカーネルバージョンの設定ファイルがローカルに既に存在し、このパラメータが未設定の場合はダウンロードをスキップします。選択肢はカーネルリポジトリに存在する[ディレクトリ名](https://github.com/ophub/kernel/tree/main/kernel-config/release)で、例:`stable` / `rk3588` / `rk35xx` / `h6`。デフォルト値:`stable`。`kernel_config` パラメータも同時に設定した場合、最終的には `config_flavor` で指定した設定ファイルが優先されます。この2つのパラメータは排他的で、どちらか一方を選択できます:前者で [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) のカーネル設定ファイルを使用するか、後者で独自リポジトリの設定ファイルを使用します。機能は `-f` を参照 | | kernel_config | false | デフォルトでは [tools/config](tools/config) ディレクトリの設定テンプレートを使用します。リポジトリ内のカーネル設定ファイルが保存されているディレクトリを指定できます。例:`kernel/config_path`。このディレクトリの設定テンプレートはカーネルメジャーバージョンで命名する必要があります。例:`config-5.10`、`config-5.15` など。 | | kernel_patch | false | リポジトリ内のカスタムカーネルパッチファイルのディレクトリを指定します。このパラメータを設定すると、コンパイル前に指定ディレクトリからパッチファイルを自動ダウンロードします。未設定の場合はスキップします。 | | auto_patch | false | カスタムカーネルパッチを適用するかどうかを設定します。デフォルト値:`false`。機能は `-p` を参照 | | compress_format | xz | カーネル内の initrd で使用する圧縮フォーマットを設定します。デフォルト値:`xz`。機能は `-z` を参照 | | delete_source | false | コンパイル完了後にカーネルソースコードを削除するかどうかを設定します。デフォルト値:`false`。機能は `-d` を参照 | | silent_log | false | コンパイル時にサイレントモードを有効にしてログ出力を削減するかどうかを設定します。デフォルト値:`false`。機能は `-s` を参照 | | enable_log | false | コンパイルプロセスをログファイルに記録するかどうかを設定します:`/var/log/kernel_compile_*.log`。デフォルト値:`false`。機能は `-l` を参照 | | ccache_clear | false | コンパイル前に ccache キャッシュをクリアするかどうかを設定します。デフォルト値:`false`。機能は `-c` を参照 | | docker_hostpath | . | カーネルコンパイル時の Docker コンテナのホストマシン上のマウントパスを設定します。デフォルトは現在のディレクトリ。機能は `-h` を参照 | | docker_image | ophub/armbian-trixie:arm64 | カーネルコンパイル用の Docker コンテナイメージを設定します。機能は `-i` を参照 | - ### GitHub Action 出力変数の説明 `Releases` へのアップロードには、リポジトリに `Workflow の読み書き権限` を設定する必要があります。詳細は[使用説明](../documents/README.ja.md#2-プライバシー変数-github_token-等の設定)を参照してください。 | パラメータ | デフォルト値 | 説明 | | -------------------------------- | --------------------- | ------------------------------ | | ${{ env.PACKAGED_OUTPUTTAGS }} | 6.12.y_6.18.y | コンパイル済みカーネル名 | | ${{ env.PACKAGED_OUTPUTPATH }} | compile-kernel/output | コンパイル済みカーネルファイルのディレクトリ | | ${{ env.PACKAGED_OUTPUTDATE }} | 04.13.1058 | コンパイル日付(月.日.時分) | | ${{ env.PACKAGED_STATUS }} | success | コンパイル状態:success / failure | ## カーネル使用ガイド 本プロジェクトでコンパイルしたカーネルは `Armbian` と `OpenWrt` システムに対応しています。以下では ophub のプロジェクトを例に説明します。 ### Armbian システムでの使用 以下では、Armbian ファームウェアのコンパイル時にカーネルを統合する方法と、既存のシステムにカーネルをインストールする方法をそれぞれ紹介します。 - #### カーネルを使用した Armbian ファームウェアのコンパイル Armbian ファームウェアのコンパイルはローカル操作と github.com の Actions を使用したオンラインコンパイルの両方をサポートしています。ローカルコンパイル方法の詳細は[ローカルパッケージング](../README.ja.md#ローカルパッケージング)を、Actions を使用したオンラインコンパイル方法の詳細は[GitHub Actions でのコンパイル](../README.ja.md#github-actionsを使用したコンパイル)を参照してください。 - #### 既存の Armbian システムへのカーネルインストール `armbian-update` コマンドを使用して、コンパイル済みのカーネルを既存の Armbian システムにインストールできます。具体的な操作方法の詳細は[Armbian カーネルの更新](../README.ja.md#armbianカーネルの更新)を参照してください。 - #### カスタムドライバモジュールのコンパイル Linux メインラインカーネルでは一部のドライバがまだサポートされていないため、必要なドライバモジュールを自分でコンパイルできます。具体的な操作方法の詳細は[ドライバモジュールのコンパイル](../documents/README.ja.md#93-カスタムドライバモジュールのコンパイル方法)を参照してください。 ### OpenWrt システムでの使用 以下では、OpenWrt システムでファームウェアをコンパイルする際にカーネルを統合する方法と、既存のシステムにカーネルをインストールする方法をそれぞれ紹介します。 - #### カーネルを使用した OpenWrt ファームウェアのコンパイル OpenWrt ファームウェアのコンパイルはローカル操作と github.com の Actions を使用したオンラインコンパイルの両方をサポートしています。ローカルコンパイル方法の詳細は[ローカルパッケージング](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.cn.md#本地化打包)を、Actions を使用したオンラインコンパイル方法の詳細は[GitHub Actions でのコンパイル](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.cn.md#使用-github-actions-进行编译)を参照してください。 - #### 既存の OpenWrt システムへのカーネルインストール [luci-app-amlogic](https://github.com/ophub/luci-app-amlogic/blob/main/README.cn.md) プラグインを使用して、コンパイル済みのカーネルを既存の OpenWrt システムにインストールできます。具体的な操作方法の詳細は[OpenWrt のアップグレード](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.cn.md#升级-openwrt)を参照してください。 ================================================ FILE: compile-kernel/README.md ================================================ # Kernel Compilation and Usage Guide [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) The compiled kernel is compatible with both `Armbian` and `OpenWrt` systems. It can be used in projects such as [amlogic-s9xxx-armbian](https://github.com/ophub/amlogic-s9xxx-armbian), [amlogic-s9xxx-openwrt](https://github.com/ophub/amlogic-s9xxx-openwrt), [flippy-openwrt-actions](https://github.com/ophub/flippy-openwrt-actions), and [unifreq/openwrt_packit](https://github.com/unifreq/openwrt_packit). The kernel can be integrated during firmware compilation or installed into an existing system. You can adjust the kernel configuration as needed—for example, adding drivers and patches. You can also compile personalized kernels with custom signatures, such as `5.10.95-happy-new-year`, `5.10.96-beijing-winter-olympics`, `5.10.99-valentines-day`, and so on. ## Kernel Repository Pre-compiled kernels are available in the [Releases](https://github.com/ophub/kernel/releases) of [ophub/kernel](https://github.com/ophub/kernel). ## Local Compilation - ### Running on Ubuntu System 1. Clone the repository to local: `git clone --depth 1 https://github.com/ophub/amlogic-s9xxx-armbian.git` 2. Install the required packages (for Ubuntu 24.04): Navigate to the `~/amlogic-s9xxx-armbian` root directory, then run the installation command: ```yaml sudo apt-get update -y sudo apt-get full-upgrade -y # For Ubuntu-24.04 sudo apt-get install -y $(cat compile-kernel/tools/script/ubuntu2404-build-armbian-depends) ``` 3. Navigate to the `~/amlogic-s9xxx-armbian` root directory, then run `sudo ./recompile -k 5.15.100` or other specified parameters to compile the kernel. The script automatically downloads and installs the build environment and kernel source code, and completes all necessary configuration. The compiled kernel files are saved in the `compile-kernel/output` directory within the source tree, or in the directory specified by the `-h` option. - ### Running on Armbian System You can compile the kernel directly in an [Armbian](https://github.com/ophub/amlogic-s9xxx-armbian/releases) system, or run the Armbian system within a [Docker](https://hub.docker.com/u/ophub) container on Ubuntu/Debian to compile the kernel. For instructions on creating the Armbian Docker image, refer to the [armbian_docker](./tools/script/docker) build script. 1. Update the local build environment and configuration files: `armbian-kernel -u` 2. Compile the kernel: Run `armbian-kernel -k 5.15.100` or other specified parameters to compile the kernel. The script automatically downloads and installs the build environment and kernel source code, and completes all necessary configuration. The compiled kernel files are saved in the `/opt/kernel/compile-kernel/output` directory. - ### Local Compilation Parameter Reference | Parameter | Meaning | Description | | --------- | ----------- | ----------- | | -r | Repository | Specifies the kernel source code repository for compilation. You can choose a kernel source code repository from `github.com`, e.g., `-r unifreq`. The parameter format supports a combination of three components: `owner/repo@branch`. The owner name `owner` is required; the repository name `/repo` and branch name `@branch` are optional. When only the owner name is specified, the script automatically matches a repository named `linux-5.x.y` on the `main` branch under that owner. If the repository name or branch name differs, specify them in combination, e.g., `owner@branch`, `owner/repo`, or `owner/repo@branch`. Default: `unifreq` | | -k | Kernel | Specifies the kernel version, e.g., `-k 5.15.100`. Multiple kernels are separated with `_`, e.g., `-k 5.15.100_5.15.50`. Using `-k all` compiles all mainline kernels, currently equivalent to `-k 5.10.y_5.15.y_6.1.y_6.6.y_6.12.y_6.18.y`. The kernel list is dynamically adjusted based on the maintenance status of the upstream source repository [unifreq](https://github.com/unifreq). | | -a | AutoKernel | Sets whether to automatically adopt the latest version within the same kernel series. When set to `true`, the script checks if a newer version exists in the same series as the kernel specified via `-k` (e.g., `5.15.100`), and automatically switches to the latest version if available. When set to `false`, the specified kernel version is compiled as-is. Default: `true` | | -m | MakePackage | Sets the package list for building the kernel. When set to `all`, all files including `Image, modules, dtbs` are built. When set to `dtbs`, only the 3 DTB files are generated. Default: `all` | | -f | configFlavor | Specifies which configuration file `config-*` to download from the kernel repository [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) to the local [tools/config](tools/config) directory. If a configuration file matching the kernel version already exists locally and this parameter is not set, the download is skipped. Available options correspond to the [directory names](https://github.com/ophub/kernel/tree/main/kernel-config/release) in the kernel repository, e.g., `stable` / `rk3588` / `rk35xx` / `h6`. Default: `stable`. | | -p | AutoPatch | Sets whether to apply custom kernel patches. When set to `true`, patches from the [tools/patch](tools/patch) directory are applied. For details, refer to [how to add kernel patches](../documents/README.md#9-compiling-armbian-kernel). Default: `false` | | -n | CustomName | Sets the custom signature appended to the kernel version. For example, setting `-ophub` produces a kernel named `5.15.100-ophub`. Do not include spaces in the custom signature. Default: `-ophub` | | -t | Toolchain | Sets the toolchain for kernel compilation. Options: `clang / gcc / gcc-`. Default: `gcc` | | -z | CompressFormat | Sets the compression format for initrd in the kernel. Options: `xz / gzip / zstd / lzma`. Default: `xz` | | -d | DeleteSource | Sets whether to delete the kernel source code after compilation. Options: `true / false`. Default: `false` | | -s | SilentLog | Sets whether to enable silent mode to reduce log output during compilation. Options: `true / false`. Default: `false` | | -l | EnableLog | Sets whether to log the kernel compilation process to a file: `/var/log/kernel_compile_*.log`. Options: `true / false`. Default: `false` | | -c | CcacheClear | Sets whether to clear the ccache before compilation. Options: `true / false`. Default: `false` | | -h | DockerHostpath | Sets the host mount path for kernel compilation in Docker. Default: current directory. | | -i | DockerImage | Sets the Docker container image used for kernel compilation. Default: `ophub/armbian-trixie:arm64` | - `sudo ./recompile`: Compile the kernel using the default configuration. - `sudo ./recompile -k 5.15.100`: Use the default configuration and specify the kernel version to be compiled through `-k`. Multiple versions are connected using `_` for simultaneous compilation. - `sudo ./recompile -k 5.15.100 -f stable` : Use the default configuration and specify the kernel version to be compiled through `-k 5.15.100`, and specify the configuration files to be downloaded from the `stable` directory of the kernel repository through `-f stable`. - `sudo ./recompile -k 5.15.100 -a true`: Use the default configuration and set whether to automatically upgrade to the latest kernel of the same series during kernel compilation through the `-a` parameter. - `sudo ./recompile -k 5.15.100 -n -ophub`: Use the default configuration and set the kernel custom signature through the `-n` parameter. - `sudo ./recompile -k 5.15.100 -m dtbs`: Use the default configuration and specify only the creation of dtbs files through the `-m` parameter. - `sudo ./recompile -k 5.15.100_6.1.10 -a true -n -ophub`: Use the default configuration and set multiple parameters. 💡 Tip: We recommend using the kernel source code from repositories such as [linux-6.1.y](https://github.com/unifreq/linux-6.1.y), [linux-5.15.y](https://github.com/unifreq/linux-5.15.y), [linux-5.10.y](https://github.com/unifreq/linux-5.10.y) of `unifreq` for compilation, who added drivers and patches for related boxes. It is recommended to use the template in [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release), which has been pre-configured according to the related boxes and can be customized based on this. ## Compile Kernel Using GitHub Actions 1. In the [Action](https://github.com/ophub/amlogic-s9xxx-armbian/actions) page, select **_`Compile the kernel`_** and click the **_`Run workflow`_** button to compile. 2. See the use of the template [compile-kernel-via-docker.yml](../.github/workflows/compile-kernel-via-docker.yml). The code is as follows: ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 6.12.y_6.18.y kernel_auto: true kernel_sign: -yourname ``` ’ Note: If you `fork` the repository and make modifications, you must change the Actions `username` to your own repository when using it, for example: ```yaml uses: YOUR-REPO/amlogic-s9xxx-armbian@main ``` - ### GitHub Action Input Parameters These parameters correspond to the `local compilation commands`. Refer to the descriptions above. | Parameter | Default Value | Description | |------------------|---------------|-----------------------------------------------------------------| | build_target | kernel | Fixed parameter `kernel`. Sets the compilation target to the kernel. | | kernel_source | unifreq | Specifies the kernel source code repository for compilation. Default: `unifreq`. Refer to `-r` for details. | | kernel_version | 6.12.y_6.18.y | Specifies the kernel version, e.g., `5.15.100`. Refer to `-k` for details. | | kernel_auto | true | Sets whether to automatically adopt the latest version within the same kernel series. Default: `true`. Refer to `-a` for details. | | kernel_package | all | Sets the package list for building the kernel. Default: `all`. Refer to `-m` for details. | | kernel_sign | -ophub | Sets the custom signature for the kernel. Default: `-ophub`. Refer to `-n` for details. | | kernel_toolchain | gcc | Sets the toolchain for kernel compilation. Default: `gcc`. Refer to `-t` for details. | | config_flavor | stable | Specifies which configuration file `config-*` to download from the kernel repository [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release) to the local [tools/config](tools/config) directory. If a configuration file matching the kernel version already exists locally and this parameter is not set, the download is skipped. Available options correspond to the [directory names](https://github.com/ophub/kernel/tree/main/kernel-config/release) in the kernel repository, e.g., `stable` / `rk3588` / `rk35xx` / `h6`. Default: `stable`. If `kernel_config` is also set, the configuration file specified by `config_flavor` takes precedence. These two parameters are mutually exclusive: use one to select kernel configuration files from [ophub/kernel](https://github.com/ophub/kernel/tree/main/kernel-config/release), or the other to use files from your own repository. Refer to `-f` for details. | | kernel_config | false | By default, uses the configuration templates in the [tools/config](tools/config) directory. You can specify the directory in your repository containing kernel configuration files, e.g., `kernel/config_path`. The configuration files in that directory must follow the naming convention based on major kernel version, e.g., `config-5.10`, `config-5.15`, etc. | | kernel_patch | false | Sets the directory in your repository containing custom kernel patch files. If specified, patch files are automatically downloaded from the designated directory before compilation. If not set, this step is skipped. | | auto_patch | false | Sets whether to apply custom kernel patches. Default: `false`. Refer to `-p` for details. | | compress_format | xz | Sets the compression format for initrd in the kernel. Default: `xz`. Refer to `-z` for details. | | delete_source | false | Sets whether to delete the kernel source code after compilation. Default: `false`. Refer to `-d` for details. | | silent_log | false | Sets whether to enable silent mode to reduce log output during compilation. Default: `false`. Refer to `-s` for details. | | enable_log | false | Sets whether to log the kernel compilation process to a file: `/var/log/kernel_compile_*.log`. Default: `false`. Refer to `-l` for details. | | ccache_clear | false | Sets whether to clear the ccache before compilation. Default: `false`. Refer to `-c` for details. | | docker_hostpath | . | Sets the host mount path for kernel compilation in Docker. Defaults to the current working directory. Refer to `-h` for details. | | docker_image | ophub/armbian-trixie:arm64 | Sets the Docker container image used for kernel compilation. Refer to `-i` for details. | - ### GitHub Action Output Variables To upload to `Releases`, you need to set `Workflow read/write permissions` for the repository. For details, see [Usage Instructions](../documents/README.md#2-set-up-private-variable-github_token). | Parameter | Default Value | Description | |----------------------------------|-----------------|----------------------------------------| | ${{ env.PACKAGED_OUTPUTTAGS }} | 6.12.y_6.18.y | The name of the compiled kernel. | | ${{ env.PACKAGED_OUTPUTPATH }} | compile-kernel/output | The directory path where the compiled kernel files are stored. | | ${{ env.PACKAGED_OUTPUTDATE }} | 04.13.1058 | Compilation date (month.day.hourminute). | | ${{ env.PACKAGED_STATUS }} | success | Compilation status: success / failure. | ## Kernel Usage Guide The compiled kernel supports both `Armbian` and `OpenWrt` systems. The following examples use ophub's projects. ### Using in Armbian The following sections describe how to integrate the kernel during Armbian firmware compilation and how to install it in an existing system. - #### Compiling Armbian Firmware with the Kernel Armbian firmware compilation supports both local and online workflows via GitHub Actions. For local compilation, see [Local Packaging](../README.md#local-packaging). For online compilation via Actions, see [Using GitHub Actions for Compilation](../README.md#using-github-actions-for-compilation). - #### Installing the Kernel in an Existing Armbian System Use the `armbian-update` command to install the compiled kernel into an existing Armbian system. For detailed instructions, see [Update Armbian Kernel](../README.md#update-armbian-kernel). - #### Compiling Custom Driver Modules Some drivers are not yet included in the Linux mainline kernel. You can compile custom driver modules as needed. For instructions, see [Compile Driver Module](../documents/README.md#93-how-to-customize-compilation-of-driver-modules). ### Using in OpenWrt The following sections describe how to integrate the kernel during OpenWrt firmware compilation and how to install it in an existing system. - #### Compiling OpenWrt Firmware with the Kernel OpenWrt firmware compilation supports both local and online workflows via GitHub Actions. For local compilation, see [Local Packaging](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.md#local-packaging). For online compilation via Actions, see [Use GitHub Actions for Compilation](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.md#use-gitHub-actions-for-compilation). - #### Installing the Kernel in an Existing OpenWrt System Use the [luci-app-amlogic](https://github.com/ophub/luci-app-amlogic) plugin to install the compiled kernel into an existing OpenWrt system. For detailed instructions, see [Update OpenWrt](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/README.md#update-openwrt). ================================================ FILE: compile-kernel/tools/config/.gitkeep ================================================ ================================================ FILE: compile-kernel/tools/patch/.gitkeep ================================================ ================================================ FILE: compile-kernel/tools/script/armbian-compile-kernel-depends ================================================ acl aptly aria2 bc binfmt-support binutils bison btrfs-progs build-essential busybox ca-certificates ccache clang coreutils cpio crossbuild-essential-arm64 cryptsetup curl debian-archive-keyring debian-keyring debootstrap device-tree-compiler dialog dirmngr distcc dosfstools dwarves e2fsprogs f2fs-tools fakeroot flex gawk gcc gdisk git gpg gzip imagemagick jq kmod libbison-dev libcrypto++-dev libelf-dev libfdt-dev libfile-fcntllock-perl libfl-dev libfuse-dev libgmp3-dev libmpc-dev libncurses-dev libpython3-dev libssl-dev libusb-1.0-0-dev linux-base lld llvm locales lz4 lzma lzop make mtools ncurses-base ncurses-term nfs-kernel-server openssl p7zip p7zip-full parallel parted patchutils pigz pixz pkg-config pv python3 python3-dev python3-setuptools qemu-user-static rename rsync sudo swig tar u-boot-tools udev unzip util-linux uuid uuid-dev uuid-runtime vim wget whiptail xfsprogs xz-utils zip zlib1g-dev zstd ================================================ FILE: compile-kernel/tools/script/armbian_compile_kernel.sh ================================================ #!/bin/bash #================================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Run on Armbian, Compile the kernel. # Copyright (C) 2021~ https://www.kernel.org # Copyright (C) 2021~ https://github.com/unifreq # Copyright (C) 2021~ https://github.com/ophub/amlogic-s9xxx-armbian # # Command: armbian-kernel # Command optional parameters please refer to the source code repository # #================================= Functions list ================================= # # error_msg : Output error message and exit # log_to_file : Log kernel compilation output to a file # # init_var : Initialize all variables # toolchain_check : Check and install the toolchain # query_version : Query the latest kernel version # apply_patch : Apply custom kernel patches # get_kernel_source : Get the kernel source code # get_kernel_config : Get the kernel config files # # collect_headers : Collect kernel headers for building modules # compile_env : Set up the kernel compilation environment # compile_dtbs : Compile the dtbs # compile_kernel : Compile the kernel # generate_uinitrd : Generate initrd.img and uInitrd # packit_dtbs : Package dtbs files # packit_kernel : Package boot, modules, and header files # create_debs_image : Create deb packages for linux-image # create_debs_libc : Create deb packages for linux-libc-dev # create_debs_headers : Create deb packages for linux-headers # create_debs_dtb : Create deb packages for linux-dtb # create_debs : Create all deb packages # compile_selection : Choose to compile dtbs or all kernels # clean_tmp : Clean up temporary files # # loop_recompile : Loop to compile kernels # #========================= Set make environment variables ========================= # # Related file storage path current_path="${PWD}" compile_path="${current_path}/compile-kernel" config_path="${compile_path}/tools/config" script_path="${compile_path}/tools/script" kernel_patch_path="${compile_path}/tools/patch" kernel_path="${compile_path}/kernel" output_path="${compile_path}/output" [[ -d "${kernel_path}" ]] || mkdir -p ${kernel_path} [[ -d "${output_path}" ]] || mkdir -p ${output_path} # Set the temporary backup path for the current system kernel tmp_backup_path="/ddbr/tmp" boot_backup_path="${tmp_backup_path}/boot" modules_backup_path="${tmp_backup_path}/modules" # Set the system file path to be used arch_info="$(uname -m)" host_release="$(cat /etc/os-release 2>/dev/null | grep '^VERSION_CODENAME=.*' | cut -d"=" -f2)" initramfs_conf="/etc/initramfs-tools/update-initramfs.conf" ophub_release_file="/etc/ophub-release" # Set the default for downloading kernel sources from github.com repo_owner="unifreq" repo_branch="main" build_kernel=("6.12.y" "6.18.y") all_kernel=("5.10.y" "5.15.y" "6.1.y" "6.6.y" "6.12.y" "6.18.y") # Set whether to use the latest kernel, options: [ true / false ] auto_kernel="true" # Set whether to apply custom kernel patches, options: [ true / false ] auto_patch="false" # Set custom signature for the kernel custom_name="-ophub" pkg_maintainer="ophub " # Set the kernel compile object, options: [ dtbs / all ] package_list="all" # Set the compression format, options: [ gzip / lzma / xz / zstd ] compress_format="xz" # Set whether to clear ccache before compiling the kernel, options: [ true / false ] ccache_clear="false" # Set whether to automatically delete the source code after the kernel is compiled delete_source="false" # Set make log silent output, options: [ true / false ] silent_log="false" # Set whether to log compilation output to file, options: [ true / false ] enable_log="false" output_logfile="/var/log/kernel_compile_$(date +%Y-%m-%d_%H-%M-%S).log" # Set the kernel configuration download repository, branch and path kernel_config_repo="https://github.com/ophub/kernel" kernel_config_repo_branch="main" kernel_config_path="kernel-config/release" # Set the kernel config tag directory, options: [ stable / rk3588 / rk35xx / h6 ] config_flavor="stable" config_download="false" # Compile toolchain download mirror, run on Armbian dev_repo="https://github.com/ophub/kernel/releases/download/dev" # Arm GNU Toolchain source: https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads gun_file="arm-gnu-toolchain-15.2.rel1-aarch64-aarch64-none-linux-gnu.tar.xz" # Set the toolchain path toolchain_path="/usr/local/toolchain" # Set the default cross-compilation toolchain: [ clang / gcc / gcc-14.2, etc. ] toolchain_name="gcc" # CCACHE Configuration # Force specific cache directory (Override defaults) export CCACHE_DIR="/root/.ccache" # Rewrite absolute paths to relative (Enable Host/Docker sharing) export CCACHE_BASEDIR="${compile_path}" export CCACHE_NOHASHDIR="true" # Check compiler by content hash, not modification time export CCACHE_SLOPPINESS="time_macros,file_macro,include_file_ctime,include_file_mtime,system_headers,locale" export CCACHE_COMPILERCHECK="content" # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" WARNING="[\033[93m WARNING \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #================================================================================== error_msg() { echo -e " ${ERROR} ${1}" exit 1 } log_to_file() { echo -e "${STEPS} Initializing kernel compilation log..." if touch "${output_logfile}" 2>/dev/null; then echo -e "${INFO} Kernel compilation log will be saved to: [ ${output_logfile} ]" exec &> >(tee -a "${output_logfile}") else echo -e "${WARNING} Failed to create log file [ ${output_logfile} ]. Logging to console only." fi } init_var() { echo -e "${STEPS} Initializing variables..." # If it is followed by [ : ], it means that the option requires a parameter value local options="k:a:n:m:p:r:t:c:d:s:z:l:f:h:i:" parsed_args=$(getopt -o "${options}" -- "${@}") [[ ${?} -ne 0 ]] && error_msg "Parameter parsing failed." eval set -- "${parsed_args}" while true; do case "${1}" in -k | --Kernel) if [[ -n "${2}" ]]; then if [[ "${2}" == "all" ]]; then build_kernel=(${all_kernel[@]}) else oldIFS="${IFS}" IFS="_" build_kernel=(${2}) IFS="${oldIFS}" fi shift 2 else error_msg "Invalid -k parameter [ ${2} ]!" fi ;; -f | --configFlavor) if [[ -n "${2}" ]]; then config_flavor="${2}" config_download="true" shift 2 else error_msg "Invalid -f parameter [ ${2} ]!" fi ;; -a | --AutoKernel) if [[ -n "${2}" ]]; then auto_kernel="${2}" shift 2 else error_msg "Invalid -a parameter [ ${2} ]!" fi ;; -n | --customName) if [[ -n "${2}" ]]; then custom_name="${2// /}" [[ -n "${custom_name}" ]] || custom_name="-ophub" [[ "${custom_name:0:1}" != "-" ]] && custom_name="-${custom_name}" shift 2 else error_msg "Invalid -n parameter [ ${2} ]!" fi ;; -m | --MakePackage) if [[ -n "${2}" ]]; then package_list="${2}" shift 2 else error_msg "Invalid -m parameter [ ${2} ]!" fi ;; -p | --AutoPatch) if [[ -n "${2}" ]]; then auto_patch="${2}" shift 2 else error_msg "Invalid -p parameter [ ${2} ]!" fi ;; -r | --Repository) if [[ -n "${2}" ]]; then repo_owner="${2}" shift 2 else error_msg "Invalid -r parameter [ ${2} ]!" fi ;; -t | --Toolchain) if [[ -n "${2}" ]]; then toolchain_name="${2}" shift 2 else error_msg "Invalid -t parameter [ ${2} ]!" fi ;; -z | --CompressFormat) if [[ -n "${2}" ]]; then compress_format="${2}" shift 2 else error_msg "Invalid -z parameter [ ${2} ]!" fi ;; -d | --DeleteSource) if [[ -n "${2}" ]]; then delete_source="${2}" shift 2 else error_msg "Invalid -d parameter [ ${2} ]!" fi ;; -s | --SilentLog) if [[ -n "${2}" ]]; then silent_log="${2}" shift 2 else error_msg "Invalid -s parameter [ ${2} ]!" fi ;; -c | --CcacheClear) if [[ -n "${2}" ]]; then ccache_clear="${2}" shift 2 else error_msg "Invalid -c parameter [ ${2} ]!" fi ;; -l | --EnableLog) if [[ -n "${2}" ]]; then enable_log="${2}" shift 2 else error_msg "Invalid -l parameter [ ${2} ]!" fi ;; # Ignore parameters used by the host system -h | -i) if [[ -n "${2}" ]]; then shift 2 else error_msg "Invalid ${1} parameter [ ${2} ]!" fi ;; --) shift break ;; *) [[ -n "${1}" ]] && error_msg "Invalid option [ ${1} ]!" break ;; esac done # Receive the value entered by the [ -r ] parameter input_r_value="${repo_owner//https\:\/\/github\.com\//}" code_owner="$(echo "${input_r_value}" | awk -F '@' '{print $1}' | awk -F '/' '{print $1}')" code_repo="$(echo "${input_r_value}" | awk -F '@' '{print $1}' | awk -F '/' '{print $2}')" code_branch="$(echo "${input_r_value}" | awk -F '@' '{print $2}')" # [[ -n "${code_owner}" ]] || error_msg "The [ -r ] parameter is invalid." [[ -n "${code_branch}" ]] || code_branch="${repo_branch}" # Set the gcc version code [[ "${toolchain_name}" =~ ^gcc-[0-9]+.[0-9]+ ]] && { gcc_version_code="${toolchain_name#*-}" gun_file="arm-gnu-toolchain-${gcc_version_code}.rel1-aarch64-aarch64-none-linux-gnu.tar.xz" } # Set compilation parameters export SRC_ARCH="arm64" export LOCALVERSION="${custom_name}" # Get Armbian PLATFORM value PLATFORM="$(cat ${ophub_release_file} 2>/dev/null | grep -E "^PLATFORM=.*" | cut -d"'" -f2)" [[ -n "${PLATFORM}" ]] && echo -e "${INFO} Armbian PLATFORM: [ ${PLATFORM} ]" } toolchain_check() { cd ${current_path} echo -e "${STEPS} Checking the toolchain for kernel compilation..." # Install dependencies sudo apt-get -qq update sudo apt-get -qq install -y $(cat compile-kernel/tools/script/armbian-compile-kernel-depends) echo -e "${INFO} Configuring Git for large file downloads..." git config --global http.postBuffer 524288000 git config --global core.compression 0 git config --global http.version HTTP/1.1 echo -e "${INFO} Checking and installing the [ ${toolchain_name} ] toolchain..." # Set the default path path_os_variable="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" # Download the cross-compilation toolchain: [ clang / gcc ] [[ -d "/etc/apt/sources.list.d" ]] || mkdir -p /etc/apt/sources.list.d if [[ "${toolchain_name}" == "clang" ]]; then # Install LLVM echo -e "${INFO} Installing the LLVM toolchain..." sudo apt-get -qq install -y lsb-release software-properties-common gnupg curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s all [[ "${?}" -eq "0" ]] || error_msg "LLVM installation failed." # Set cross compilation parameters export PATH="${path_os_variable}" export CROSS_COMPILE="aarch64-linux-gnu-" export CC="ccache clang" export LD="ld.lld" export MFLAGS=" LLVM=1 LLVM_IAS=1 " else # Download Arm GNU Toolchain [[ -d "${toolchain_path}" ]] || mkdir -p ${toolchain_path} if [[ ! -d "${toolchain_path}/${gun_file//.tar.xz/}/bin" ]]; then echo -e "${INFO} Downloading the ARM GNU toolchain [ ${gun_file} ]..." # Download the ARM GNU toolchain. If it fails, wait 1 minute and try again, try 10 times. for i in {1..10}; do curl -fsSL "${dev_repo}/${gun_file}" -o "${toolchain_path}/${gun_file}" [[ "${?}" -eq "0" ]] && break || sleep 60 done [[ "${?}" -eq "0" ]] || error_msg "GNU toolchain file download failed." # Decompress the ARM GNU toolchain tar -xJf ${toolchain_path}/${gun_file} -C ${toolchain_path} rm -f ${toolchain_path}/${gun_file} # List and check directory names, and change them all to lowercase for dir in $(ls ${toolchain_path}); do if [[ -d "${toolchain_path}/${dir}" && "${dir}" != "${dir,,}" ]]; then mv -f ${toolchain_path}/${dir} ${toolchain_path}/${dir,,} fi done [[ -d "${toolchain_path}/${gun_file//.tar.xz/}/bin" ]] || error_msg "The gcc is not set!" fi # Add ${PATH} variable path_gcc="${toolchain_path}/${gun_file//.tar.xz/}/bin:${path_os_variable}" export PATH="${path_gcc}" # Set cross compilation parameters export CROSS_COMPILE="${toolchain_path}/${gun_file//.tar.xz/}/bin/aarch64-none-linux-gnu-" export CC="ccache ${CROSS_COMPILE}gcc" export LD="${CROSS_COMPILE}ld.bfd" export MFLAGS="" fi # Setup ccache echo -e "${INFO} Setting up ccache..." ccache -M 10G 2>/dev/null ccache -z 2>/dev/null } query_version() { cd ${current_path} echo -e "${STEPS} Querying the latest kernel version..." # Set empty array tmp_arr_kernels=() # Query the latest kernel in a loop i=1 for KERNEL_VAR in ${build_kernel[@]}; do echo -e "${INFO} (${i}) Auto query the latest kernel version of the same series for [ ${KERNEL_VAR} ]" # Identify the kernel mainline MAIN_LINE="$(echo ${KERNEL_VAR} | awk -F '.' '{print $1"."$2}')" if [[ -z "${code_repo}" ]]; then linux_repo="linux-${MAIN_LINE}.y"; else linux_repo="${code_repo}"; fi github_kernel_repo="${code_owner}/${linux_repo}/${code_branch}" github_kernel_ver="https://raw.githubusercontent.com/${github_kernel_repo}/Makefile" # latest_version="125" latest_version="$(curl -s ${github_kernel_ver} | grep -oE "SUBLEVEL =.*" | head -n 1 | grep -oE '[0-9]{1,3}')" if [[ "${?}" -eq "0" && -n "${latest_version}" ]]; then tmp_arr_kernels[${i}]="${MAIN_LINE}.${latest_version}" else error_msg "Failed to query the kernel version in [ github.com/${github_kernel_repo} ]" fi echo -e "${INFO} (${i}) [ ${tmp_arr_kernels[$i]} ] is github.com/${github_kernel_repo} latest kernel. \n" ((i++)) done # Reset the kernel array to the latest kernel version unset build_kernel build_kernel="${tmp_arr_kernels[@]}" } apply_patch() { cd ${current_path} echo -e "${STEPS} Applying custom kernel patches..." # Apply the common kernel patches if [[ -d "${kernel_patch_path}/common-kernel-patches" ]]; then echo -e "${INFO} Copying common kernel patches..." rm -f ${kernel_path}/${local_kernel_path}/*.patch cp -vf ${kernel_patch_path}/common-kernel-patches/*.patch -t ${kernel_path}/${local_kernel_path} cd ${kernel_path}/${local_kernel_path} for file in *.patch; do echo -e "${INFO} Applying kernel patch file: [ ${file} ]" patch -p1 <"${file}" || echo -e "${WARNING} Failed to apply the patch, skipping." done rm -f *.patch else echo -e "${INFO} No common kernel patches found, skipping." fi # Apply the dedicated kernel patches if [[ -d "${kernel_patch_path}/${local_kernel_path}" ]]; then echo -e "${INFO} Copying [ ${local_kernel_path} ] version dedicated kernel patches..." rm -f ${kernel_path}/${local_kernel_path}/*.patch cp -vf ${kernel_patch_path}/${local_kernel_path}/*.patch -t ${kernel_path}/${local_kernel_path} cd ${kernel_path}/${local_kernel_path} for file in *.patch; do echo -e "${INFO} Applying kernel patch file: [ ${file} ]" patch -p1 <"${file}" || echo -e "${WARNING} Failed to apply the patch, skipping." done rm -f *.patch else echo -e "${INFO} No [ ${local_kernel_path} ] version dedicated kernel patches found, skipping." fi } get_kernel_source() { cd ${current_path} echo -e "${STEPS} Downloading the kernel source code..." [[ -d "${kernel_path}" ]] || mkdir -p ${kernel_path} if [[ ! -d "${kernel_path}/${local_kernel_path}" ]]; then echo -e "${INFO} Cloning from [ https://github.com/${server_kernel_repo} -b ${code_branch} ]" # Clone the latest kernel source code. If it fails, wait 1 minute and try again, try 10 times. for i in {1..10}; do git clone -q --single-branch --depth=1 --branch=${code_branch} https://github.com/${server_kernel_repo} ${kernel_path}/${local_kernel_path} [[ "${?}" -eq "0" ]] && break || sleep 60 done [[ "${?}" -eq "0" ]] || error_msg "[ https://github.com/${server_kernel_repo} ] Clone failed." else # Get a local kernel version local_makefile="${kernel_path}/${local_kernel_path}/Makefile" local_makefile_version="$(cat ${local_makefile} | grep -oE "VERSION =.*" | head -n 1 | grep -oE '[0-9]{1,3}')" local_makefile_patchlevel="$(cat ${local_makefile} | grep -oE "PATCHLEVEL =.*" | head -n 1 | grep -oE '[0-9]{1,3}')" local_makefile_sublevel="$(cat ${local_makefile} | grep -oE "SUBLEVEL =.*" | head -n 1 | grep -oE '[0-9]{1,3}')" # Local version and server version comparison if [[ "${auto_kernel}" =~ ^(true|yes)$ ]] && [[ "${kernel_sub}" -gt "${local_makefile_sublevel}" ]]; then # Pull the latest source code of the server cd ${kernel_path}/${local_kernel_path} git checkout ${code_branch} && git reset --hard origin/${code_branch} && git pull unset kernel_version kernel_version="${local_makefile_version}.${local_makefile_patchlevel}.${kernel_sub}" echo -e "${INFO} Synchronize the upstream source code, compile the kernel version [ ${kernel_version} ]." else # Reset to local kernel version number unset kernel_version kernel_version="${local_makefile_version}.${local_makefile_patchlevel}.${local_makefile_sublevel}" echo -e "${INFO} Use local source code, compile the kernel version [ ${kernel_version} ]." fi fi # Remove the local version number rm -f ${kernel_path}/${local_kernel_path}/localversion # Apply custom kernel patches [[ "${auto_patch}" =~ ^(true|yes)$ ]] && apply_patch } get_kernel_config() { echo -e "${STEPS} Downloading the kernel config files..." # Check if the kernel config file already exists if [[ -s "${config_path}/config-${kernel_verpatch}" && "${config_download}" == "false" ]]; then echo -e "${INFO} The kernel config file [ config-${kernel_verpatch} ] already exists, skipping download." echo -e "${INFO} Config files: \n$(ls -lh ${config_path}/ 2>/dev/null)" return fi # Download the kernel config files tmp_path="$(mktemp -d)" for i in {1..10}; do git clone --quiet --single-branch --depth=1 --branch=${kernel_config_repo_branch} ${kernel_config_repo} ${tmp_path} [[ "${?}" -eq 0 ]] && break || sleep 60 done [[ "${?}" -eq 0 ]] || error_msg "Failed to clone the [ ${kernel_config_repo} ] repository." rm -rf ${config_path}/* cp -f ${tmp_path}/${kernel_config_path}/${config_flavor}/config-* ${config_path}/ [[ "${?}" -eq 0 ]] || error_msg "Failed to copy the kernel config file." echo -e "${INFO} Kernel config files [ ${config_flavor} ] downloaded to [ ${config_path} ]." echo -e "${INFO} Config files: \n$(ls -lh ${config_path}/ 2>/dev/null)" } collect_headers() { cd ${kernel_path}/${local_kernel_path} # Set headers files list head_list="$(mktemp)" ( find . arch/${SRC_ARCH} -maxdepth 1 -name Makefile\* find include scripts -type f -o -type l find arch/${SRC_ARCH} -name Kbuild.platforms -o -name Platform find $(find arch/${SRC_ARCH} -name include -o -name scripts -type d) -type f ) >${head_list} # Set object files list obj_list="$(mktemp)" { [[ -n "$(grep "^CONFIG_OBJTOOL=y" include/config/auto.conf 2>/dev/null)" ]] && echo "tools/objtool/objtool" find arch/${SRC_ARCH}/include Module.symvers include scripts -type f [[ -n "$(grep "^CONFIG_GCC_PLUGINS=y" include/config/auto.conf 2>/dev/null)" ]] && find scripts/gcc-plugins -name \*.so } >${obj_list} # Install related files to the specified directory tar --exclude '*.orig' -c -f - -C ${kernel_path}/${local_kernel_path} -T ${head_list} | tar -xf - -C ${output_path}/header tar --exclude '*.orig' -c -f - -T ${obj_list} | tar -xf - -C ${output_path}/header # Copy the necessary files to the specified directory cp -af include/config "${output_path}/header/include" cp -af include/generated "${output_path}/header/include" cp -af arch/${SRC_ARCH}/include/generated "${output_path}/header/arch/${SRC_ARCH}/include" cp -af .config Module.symvers ${output_path}/header # Delete temporary files rm -f ${head_list} ${obj_list} } compile_env() { cd ${current_path} echo -e "${STEPS} Checking local compilation environment..." # Get kernel output name kernel_outname="${kernel_version}${custom_name}" echo -e "${INFO} Compile kernel output name [ ${kernel_outname} ]. \n" # Set package version and architecture pkg_version="${kernel_version}" pkg_arch="arm64" pkg_revision="1" deb_path="${output_path}/deb-${kernel_version}" # Create a temp directory rm -rf ${output_path}/{boot/,dtb/,modules/,header/,libc_headers/,${kernel_version}/,deb-${kernel_version}/} mkdir -p ${output_path}/{boot/,dtb/{allwinner/,amlogic/,rockchip/},modules/,header/,libc_headers/,${kernel_version}/,deb-${kernel_version}/} cd ${kernel_path}/${local_kernel_path} echo -e "${STEPS} Setting compilation parameters..." # Show variable echo -e "${INFO} ARCH: [ ${SRC_ARCH} ]" echo -e "${INFO} LOCALVERSION: [ ${LOCALVERSION} ]" echo -e "${INFO} CROSS_COMPILE: [ ${CROSS_COMPILE} ]" echo -e "${INFO} CC: [ ${CC} ]" echo -e "${INFO} LD: [ ${LD} ]" # Set generic make string MAKE_SET_STRING=" ARCH=${SRC_ARCH} CROSS_COMPILE=${CROSS_COMPILE} ${MFLAGS} LOCALVERSION=${LOCALVERSION} " # Make clean/mrproper make ${MAKE_SET_STRING} CC="${CC}" LD="${LD}" mrproper # Clear ccache if enabled [[ "${ccache_clear}" =~ ^(true|yes)$ ]] && { echo -e "${INFO} Clear ccache before compiling the kernel..." ccache -C 2>/dev/null } # Check .config file if [[ ! -s ".config" ]]; then [[ -s "${config_path}/config-${kernel_verpatch}" ]] || error_msg "Missing [ config-${kernel_verpatch} ] template!" echo -e "${INFO} Copy [ ${config_path}/config-${kernel_verpatch} ] to [ .config ]" cp -f ${config_path}/config-${kernel_verpatch} .config else echo -e "${INFO} Use the .config file in the current directory." fi # Clear kernel signature sed -i "s|CONFIG_LOCALVERSION=.*|CONFIG_LOCALVERSION=\"\"|" .config # Enable/Disabled Linux Kernel Clang LTO [[ "${toolchain_name}" == "clang" ]] && { kernel_x="$(echo "${kernel_version}" | cut -d '.' -f1)" kernel_y="$(echo "${kernel_version}" | cut -d '.' -f2)" if [[ "${kernel_x}" -ge "6" ]] || [[ "${kernel_x}" -eq "5" && "${kernel_y}" -ge "12" ]]; then scripts/config -e LTO_CLANG_THIN else scripts/config -d LTO_CLANG_THIN fi # Add RUST support for version 6.1.y and later versions if [[ "${kernel_x}" -gt 6 ]] || [[ "${kernel_x}" -eq 6 && "${kernel_y}" -ge 1 ]]; then echo -e "${INFO} Kernel version [ ${kernel_version} ] requires RUST. Preparing the environment..." curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y export PATH="${HOME}/.cargo/bin:${PATH}" echo -e "${INFO} Setting Rust toolchain to version required by the kernel..." rustup override set $(scripts/min-tool-version.sh rustc) echo -e "${INFO} Adding rust-src component..." rustup component add rust-src echo -e "${INFO} Installing correct bindgen version..." cargo uninstall bindgen-cli bindgen >/dev/null 2>&1 || true BINDGEN_VERSION="$(scripts/min-tool-version.sh bindgen 2>/dev/null || echo "0.65.1")" cargo install --locked --version "${BINDGEN_VERSION}" bindgen-cli 2>/dev/null || cargo install --locked --version "${BINDGEN_VERSION}" bindgen echo -e "${INFO} Rust environment is ready. Enabling RUST support in kernel config..." scripts/config -e RUST scripts/config -e RUST_IS_AVAILABLE else echo -e "${INFO} Skip Rust environment configuration for kernel version [ ${kernel_version} ]" fi } # Make menuconfig #make ${MAKE_SET_STRING} CC="${CC}" LD="${LD}" menuconfig # Set max process PROCESS="$(($(nproc 2>/dev/null || echo 2) - 1))" [[ -z "${PROCESS}" || "${PROCESS}" -lt "1" ]] && PROCESS="1" && echo "PROCESS: 1" } compile_dtbs() { cd ${kernel_path}/${local_kernel_path} # Make dtbs echo -e "${STEPS} Compiling dtbs [ ${local_kernel_path} ]..." make ${MAKE_SET_STRING} CC="${CC}" LD="${LD}" dtbs -j${PROCESS} [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} The dtbs compiled successfully." } compile_kernel() { cd ${kernel_path}/${local_kernel_path} # Set the make log silent output [[ "${silent_log}" =~ ^(true|yes)$ ]] && silent_print="-s" || silent_print="" # Make kernel echo -e "${STEPS} Compiling kernel [ ${local_kernel_path} ]..." make ${silent_print} ${MAKE_SET_STRING} CC="${CC}" LD="${LD}" Image modules dtbs -j${PROCESS} #make ${MAKE_SET_STRING} CC="${CC}" LD="${LD}" bindeb-pkg KDEB_COMPRESS=xz KBUILD_DEBARCH=arm64 -j${PROCESS} [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} The kernel compiled successfully." || error_msg "Kernel compilation failed." # Install modules echo -e "${STEPS} Installing modules..." make ${silent_print} ${MAKE_SET_STRING} CC="${CC}" LD="${LD}" INSTALL_MOD_PATH=${output_path}/modules modules_install [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} Modules installed successfully." || error_msg "Modules installation failed." # Strip debug information STRIP="${CROSS_COMPILE}strip" find ${output_path}/modules -name "*.ko" -print0 | xargs -0 ${STRIP} --strip-debug 2>/dev/null [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} Modules stripped successfully." || echo -e "${WARNING} Modules stripping failed." # Collect kernel headers for building external modules echo -e "${STEPS} Collecting kernel headers..." collect_headers [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} Kernel headers collected successfully." || error_msg "Kernel headers collection failed." # Install libc headers (for linux-libc-dev package) echo -e "${STEPS} Installing libc headers..." make ${silent_print} ${MAKE_SET_STRING} CC="${CC}" LD="${LD}" INSTALL_HDR_PATH=${output_path}/libc_headers headers_install [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} Libc headers installed successfully." || error_msg "Libc headers installation failed." } generate_uinitrd() { cd ${current_path} echo -e "${STEPS} Initializing uInitrd generation environment..." # Backup current system files for /boot echo -e "${INFO} Backup the files in the [ ${boot_backup_path} ] directory." rm -rf ${boot_backup_path} && mkdir -p ${boot_backup_path} mv -f /boot/{config-*,initrd.img-*,System.map-*,vmlinuz-*,uInitrd*,*Image} -t ${boot_backup_path} 2>/dev/null # Copy /boot related files into armbian system [[ -d "/boot" ]] || mkdir -p /boot cp -f ${kernel_path}/${local_kernel_path}/System.map /boot/System.map-${kernel_outname} cp -f ${kernel_path}/${local_kernel_path}/.config /boot/config-${kernel_outname} cp -f ${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/Image /boot/vmlinuz-${kernel_outname} if [[ -z "${PLATFORM}" || "${PLATFORM}" =~ ^(rockchip|allwinner)$ ]]; then cp -f /boot/vmlinuz-${kernel_outname} /boot/Image else cp -f /boot/vmlinuz-${kernel_outname} /boot/zImage fi #echo -e "${INFO} Kernel copy results in the [ /boot ] directory: \n$(ls -l /boot) \n" # Backup current system files for /usr/lib/modules echo -e "${INFO} Backup the files in the [ ${modules_backup_path} ] directory." rm -rf ${modules_backup_path} && mkdir -p ${modules_backup_path} mv -f /usr/lib/modules/$(uname -r) -t ${modules_backup_path} 2>/dev/null # Copy modules files [[ -d "/usr/lib/modules" ]] || mkdir -p /usr/lib/modules cp -rf ${output_path}/modules/lib/modules/${kernel_outname} -t /usr/lib/modules #echo -e "${INFO} Kernel copy results in the [ /usr/lib/modules ] directory: \n$(ls -l /usr/lib/modules) \n" # COMPRESS: [ gzip | lzma | xz | zstd | lz4 ] [[ "${compress_format}" =~ ^(gzip|lzma|xz|zstd|lz4)$ ]] || { echo -e "${WARNING} The compression format [ ${compress_format} ] is invalid, reset to [ xz ] format." compress_format="xz" } compress_initrd_file="/etc/initramfs-tools/initramfs.conf" if [[ -f "${compress_initrd_file}" ]]; then sed -i "s|^COMPRESS=.*|COMPRESS=${compress_format}|g" ${compress_initrd_file} compress_settings="$(cat ${compress_initrd_file} | grep -E ^COMPRESS=)" echo -e "${INFO} Set the [ ${compress_settings} ] in the initramfs.conf file." else error_msg "The [ ${compress_initrd_file} ] file does not exist." fi cd /boot echo -e "${STEPS} Generating uInitrd file..." # Enable update_initramfs [[ -f "${initramfs_conf}" ]] && sed -i "s|^update_initramfs=.*|update_initramfs=yes|g" ${initramfs_conf} # Generate uInitrd file directly under armbian system update-initramfs -c -k ${kernel_outname} # Disable update_initramfs [[ -f "${initramfs_conf}" ]] && sed -i "s|^update_initramfs=.*|update_initramfs=no|g" ${initramfs_conf} if [[ -f "uInitrd" ]]; then echo -e "${SUCCESS} The initrd.img and uInitrd files generated successfully." [[ ! -L "uInitrd" ]] && mv -vf uInitrd uInitrd-${kernel_outname} else echo -e "${WARNING} The initrd.img and uInitrd files were not updated." fi echo -e "${INFO} File situation in the /boot directory after update: \n$(ls -hl *${kernel_outname})" # Restore the files in the [ /boot ] directory mv -f *${kernel_outname} ${output_path}/boot mv -f ${boot_backup_path}/* -t . 2>/dev/null # Restore the files in the [ /usr/lib/modules ] directory rm -rf /usr/lib/modules/${kernel_outname} mv -f ${modules_backup_path}/* -t /usr/lib/modules 2>/dev/null # Remove temporary backup directory sync && sleep 3 rm -rf ${boot_backup_path} ${modules_backup_path} } packit_dtbs() { # Pack 3 dtbs files echo -e "${STEPS} Packing the [ ${kernel_outname} ] dtbs packages..." cd ${output_path}/dtb/allwinner cp -f ${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/allwinner/*.dtb . 2>/dev/null [[ "${?}" -eq "0" ]] && { [[ -d "${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/allwinner/overlay" ]] && { mkdir -p overlay cp -f ${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/allwinner/overlay/*.dtbo overlay/ 2>/dev/null } tar -czf dtb-allwinner-${kernel_outname}.tar.gz * mv -f *.tar.gz ${output_path}/${kernel_version} echo -e "${SUCCESS} The [ dtb-allwinner-${kernel_outname}.tar.gz ] file packaged successfully." } cd ${output_path}/dtb/amlogic cp -f ${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/amlogic/*.dtb . 2>/dev/null [[ "${?}" -eq "0" ]] && { [[ -d "${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/amlogic/overlay" ]] && { mkdir -p overlay cp -f ${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/amlogic/overlay/*.dtbo overlay/ 2>/dev/null } tar -czf dtb-amlogic-${kernel_outname}.tar.gz * mv -f *.tar.gz ${output_path}/${kernel_version} echo -e "${SUCCESS} The [ dtb-amlogic-${kernel_outname}.tar.gz ] file packaged successfully." } cd ${output_path}/dtb/rockchip cp -f ${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/rockchip/*.dtb . 2>/dev/null [[ "${?}" -eq "0" ]] && { [[ -d "${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/rockchip/overlay" ]] && { mkdir -p overlay cp -f ${kernel_path}/${local_kernel_path}/arch/${SRC_ARCH}/boot/dts/rockchip/overlay/*.dtbo overlay/ 2>/dev/null } tar -czf dtb-rockchip-${kernel_outname}.tar.gz * mv -f *.tar.gz ${output_path}/${kernel_version} echo -e "${SUCCESS} The [ dtb-rockchip-${kernel_outname}.tar.gz ] file packaged successfully." } } packit_kernel() { # Pack 3 kernel files echo -e "${STEPS} Packing the [ ${kernel_outname} ] boot, modules and header packages..." cd ${output_path}/boot rm -rf dtb-* chmod +x * tar -czf boot-${kernel_outname}.tar.gz * mv -f *.tar.gz ${output_path}/${kernel_version} echo -e "${SUCCESS} The [ boot-${kernel_outname}.tar.gz ] file packaged successfully." cd ${output_path}/modules/lib/modules tar -czf modules-${kernel_outname}.tar.gz * mv -f *.tar.gz ${output_path}/${kernel_version} echo -e "${SUCCESS} The [ modules-${kernel_outname}.tar.gz ] file packaged successfully." cd ${output_path}/header tar -czf header-${kernel_outname}.tar.gz * mv -f *.tar.gz ${output_path}/${kernel_version} echo -e "${SUCCESS} The [ header-${kernel_outname}.tar.gz ] file packaged successfully." } create_debs_image() { cd ${output_path} # 01. Create linux-image deb package (includes boot files and modules) echo -e "${STEPS} Creating the [ linux-image ] deb packages..." image_pkg="linux-image${custom_name}" image_dir="${deb_path}/${image_pkg}" mkdir -p ${image_dir}/{DEBIAN,boot,usr/lib/modules} # Copy boot files cp -rf ${output_path}/boot/* ${image_dir}/boot/ rm -f ${image_dir}/boot/*.tar.gz 2>/dev/null # Copy modules files cp -rf ${output_path}/modules/lib/modules/${kernel_outname} ${image_dir}/usr/lib/modules/ rm -f ${image_dir}/usr/lib/modules/${kernel_outname}/{build,source} 2>/dev/null # Generate boot file list for preinst boot_file_list="$(cd ${image_dir} && find boot -type f | sort)" # Create copyright file mkdir -p ${image_dir}/usr/share/doc/${image_pkg} cat >${image_dir}/usr/share/doc/${image_pkg}/copyright <${image_dir}/DEBIAN/control <${image_dir}/DEBIAN/preinst </dev/null || true done <<'BOOT_LIST' ${boot_file_list} BOOT_LIST # Remove old modules files that will be overwritten by this package for d in /usr/lib/modules/*; do if [[ -d "\${d}" ]]; then rm -f "\${d}/build" "\${d}/source" 2>/dev/null || true rm -f "\${d}"/modules.* 2>/dev/null || true fi done # Cleaning up beforehand ensures a fresh unpack with no leftover files. rm -rf /usr/lib/modules/${kernel_outname} 2>/dev/null || true exit 0 EOF chmod 755 ${image_dir}/DEBIAN/preinst # Create prerm script to remove modules before uninstall cat >${image_dir}/DEBIAN/prerm </dev/null || true ;; esac exit 0 EOF chmod 755 ${image_dir}/DEBIAN/prerm # Create postrm script to remove modules after uninstall cat >${image_dir}/DEBIAN/postrm </dev/null || true ;; esac exit 0 EOF chmod 755 ${image_dir}/DEBIAN/postrm # Create postinst script for linux-image- package cat >${image_dir}/DEBIAN/postinst <<'POSTINST' #!/bin/bash set -e # Read platform info from ophub-release ophub_release_file="/etc/ophub-release" if [[ -f "${ophub_release_file}" ]]; then source "${ophub_release_file}" fi cd /boot # Handle kernel image based on platform if [[ -f vmlinuz-KERNEL_NAME ]]; then case "${PLATFORM}" in amlogic) [[ -f zImage ]] && rm -f zImage cp -f vmlinuz-KERNEL_NAME zImage ;; rockchip) [[ -f Image ]] && rm -f Image ln -sf vmlinuz-KERNEL_NAME Image ;; allwinner) [[ -f Image ]] && rm -f Image cp -f vmlinuz-KERNEL_NAME Image ;; *) # Default: Copy to both Image and zImage for compatibility [[ -f Image ]] && rm -f Image [[ -f zImage ]] && rm -f zImage cp -f vmlinuz-KERNEL_NAME Image cp -f vmlinuz-KERNEL_NAME zImage ;; esac fi # Run depmod to generate modules.dep and map files depmod -a KERNEL_NAME 2>/dev/null || true # Generate initrd.img and uInitrd if not exist if [[ ! -f /boot/initrd.img-KERNEL_NAME || ! -f /boot/uInitrd-KERNEL_NAME ]]; then echo "initrd.img-KERNEL_NAME or uInitrd-KERNEL_NAME not found, generating with update-initramfs..." if command -v update-initramfs >/dev/null 2>&1; then initramfs_conf="/etc/initramfs-tools/update-initramfs.conf" [[ -f "${initramfs_conf}" ]] && sed -i "s|^update_initramfs=.*|update_initramfs=yes|g" "${initramfs_conf}" update-initramfs -c -k KERNEL_NAME [[ -f "${initramfs_conf}" ]] && sed -i "s|^update_initramfs=.*|update_initramfs=no|g" "${initramfs_conf}" else echo "WARNING: update-initramfs not found, system may not boot correctly!" fi fi # Handle uInitrd based on platform and model if [[ "${MODEL_ID}" =~ ^(r304|r306)$ ]]; then # Special handling for MODEL_ID r304 and r306 [[ -f initrd.img-KERNEL_NAME ]] && { [[ -f uInitrd ]] && rm -f uInitrd ln -sf initrd.img-KERNEL_NAME uInitrd } elif [[ -f uInitrd-KERNEL_NAME ]]; then [[ -f uInitrd ]] && rm -f uInitrd case "${PLATFORM}" in amlogic|allwinner) cp -f uInitrd-KERNEL_NAME uInitrd ;; rockchip) ln -sf uInitrd-KERNEL_NAME uInitrd ;; *) cp -f uInitrd-KERNEL_NAME uInitrd ;; esac fi # Clean up old kernels (keep only the newly installed kernel) # This matches armbian-update behavior CURRENT_KERNEL="KERNEL_NAME" # Clean old boot files (config, initrd.img, System.map, uInitrd, vmlinuz) for f in /boot/config-* /boot/initrd.img-* /boot/System.map-* /boot/uInitrd-* /boot/vmlinuz-*; do [[ -f "${f}" ]] || continue [[ "${f}" == *"${CURRENT_KERNEL}"* ]] && continue rm -f "${f}" 2>/dev/null || true done # Clean old modules directories for d in /usr/lib/modules/*; do [[ -d "${d}" ]] || continue [[ "${d}" == *"${CURRENT_KERNEL}"* ]] && continue rm -rf "${d}" 2>/dev/null || true done # Remove old linux-image packages from dpkg database (background, wait for dpkg lock release) ( # Wait for the parent dpkg process to release the lock while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done for pkg in $(dpkg-query -W -f='${Package}\n' 2>/dev/null | grep -E "^linux-image-"); do [[ "${pkg}" == "CURRENT_IMAGE_PKG" ]] && continue dpkg --purge --force-depends "${pkg}" 2>/dev/null || true done ) & exit 0 POSTINST sed -i "s|KERNEL_NAME|${kernel_outname}|g" ${image_dir}/DEBIAN/postinst sed -i "s|CURRENT_IMAGE_PKG|${image_pkg}|g" ${image_dir}/DEBIAN/postinst chmod 755 ${image_dir}/DEBIAN/postinst # Build the deb package (include version in filename since package name has no version) image_deb="linux-image_${pkg_version}-${pkg_revision}${custom_name}_${pkg_arch}.deb" dpkg-deb -Zxz --build ${image_dir} ${deb_path}/${image_deb} >/dev/null [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} The [ ${image_deb} ] file packaged successfully." } create_debs_libc() { cd ${output_path} # 02. Create linux-libc-dev deb package echo -e "${STEPS} Creating the [ linux-libc-dev ] deb packages..." libc_pkg="linux-libc-dev${custom_name}" libc_dir="${deb_path}/${libc_pkg}" mkdir -p ${libc_dir}/{DEBIAN,usr/include} # Copy libc headers and organize for aarch64 cp -rf ${output_path}/libc_headers/include/* ${libc_dir}/usr/include/ # Move arch-specific asm headers to aarch64-linux-gnu directory if [[ -d "${libc_dir}/usr/include/asm" ]]; then mkdir -p ${libc_dir}/usr/include/aarch64-linux-gnu mv ${libc_dir}/usr/include/asm ${libc_dir}/usr/include/aarch64-linux-gnu/ fi # Create copyright file mkdir -p ${libc_dir}/usr/share/doc/${libc_pkg} cat >${libc_dir}/usr/share/doc/${libc_pkg}/copyright <${libc_dir}/DEBIAN/control <${libc_dir}/DEBIAN/preinst <${libc_dir}/DEBIAN/postinst <<'POSTINST' #!/bin/bash set -e # Remove old linux-libc-dev packages ( while fuser /var/lib/dpkg/lock >/dev/null 2>&1 || fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do sleep 1; done for pkg in $(dpkg-query -W -f='${Package}\n' 2>/dev/null | grep -E '^linux-libc-dev-'); do [[ "${pkg}" == "CURRENT_LIBC_PKG" ]] && continue dpkg --purge --force-depends "${pkg}" 2>/dev/null || true done ) & exit 0 POSTINST sed -i "s|CURRENT_LIBC_PKG|${libc_pkg}|g" ${libc_dir}/DEBIAN/postinst chmod 755 ${libc_dir}/DEBIAN/postinst # Build the deb package (include version in filename since package name has no version) libc_deb="linux-libc-dev_${pkg_version}-${pkg_revision}${custom_name}_${pkg_arch}.deb" dpkg-deb -Zxz --build ${libc_dir} ${deb_path}/${libc_deb} >/dev/null [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} The [ ${libc_deb} ] file packaged successfully." } create_debs_headers() { cd ${output_path} # 03. Create linux-headers deb package echo -e "${STEPS} Creating the [ linux-headers ] deb packages..." headers_pkg="linux-headers${custom_name}" headers_dir="${deb_path}/${headers_pkg}" mkdir -p ${headers_dir}/{DEBIAN,usr/src} # Copy header files cp -rf ${output_path}/header ${headers_dir}/usr/src/linux-headers-${kernel_outname} # Create copyright file mkdir -p ${headers_dir}/usr/share/doc/${headers_pkg} cat >${headers_dir}/usr/share/doc/${headers_pkg}/copyright <${headers_dir}/DEBIAN/control # Create preinst script to remove old linux-headers files before install cat >${headers_dir}/DEBIAN/preinst <<'PREINST' #!/bin/bash set -e exit 0 PREINST chmod 755 ${headers_dir}/DEBIAN/preinst # Create prerm script to remove build and source symlinks before uninstall cat >${headers_dir}/DEBIAN/prerm </dev/null || true ;; esac exit 0 EOF chmod 755 ${headers_dir}/DEBIAN/prerm # Create postrm script to remove header files after uninstall cat >${headers_dir}/DEBIAN/postrm </dev/null || true ;; esac exit 0 EOF chmod 755 ${headers_dir}/DEBIAN/postrm # Create postinst script to create build symlink and clean old headers cat >${headers_dir}/DEBIAN/postinst <<'POSTINST' #!/bin/bash set -e CURRENT_KERNEL="KERNEL_NAME" # Ensure build symlink exists in modules directory if [[ -d /usr/lib/modules/${CURRENT_KERNEL} ]]; then cd /usr/lib/modules/${CURRENT_KERNEL} [[ -L build ]] || ln -sf /usr/src/linux-headers-${CURRENT_KERNEL} build fi # Clean old kernel headers directories for d in /usr/src/linux-headers-*; do [[ -d "${d}" ]] || continue [[ "${d}" == *"${CURRENT_KERNEL}"* ]] && continue rm -rf "${d}" 2>/dev/null || true done # Remove old linux-headers packages from dpkg database (background, wait for dpkg lock release) ( while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done for pkg in $(dpkg-query -W -f='${Package}\n' 2>/dev/null | grep -E "^linux-headers-"); do [[ "${pkg}" == "CURRENT_HEADERS_PKG" ]] && continue dpkg --purge --force-depends "${pkg}" 2>/dev/null || true done ) & exit 0 POSTINST sed -i "s|KERNEL_NAME|${kernel_outname}|g" ${headers_dir}/DEBIAN/postinst sed -i "s|CURRENT_HEADERS_PKG|${headers_pkg}|g" ${headers_dir}/DEBIAN/postinst chmod 755 ${headers_dir}/DEBIAN/postinst headers_deb="linux-headers_${pkg_version}-${pkg_revision}${custom_name}_${pkg_arch}.deb" dpkg-deb -Zxz --build ${headers_dir} ${deb_path}/${headers_deb} >/dev/null [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} The [ ${headers_deb} ] file packaged successfully." } create_debs_dtb() { cd ${output_path} # 04. Create linux-dtb deb packages for each platform echo -e "${STEPS} Creating the [ linux-dtb ] deb packages..." declare -A platform_family=(["amlogic"]="meson64" ["rockchip"]="rockchip64" ["allwinner"]="sunxi64") platform_list=("amlogic" "rockchip" "allwinner") for platform in "${platform_list[@]}"; do dtb_source="${output_path}/dtb/${platform}" family="${platform_family[${platform}]}" # Check if dtb files exist for this platform (at least 30 files) dtb_count="$(ls ${dtb_source}/*.dtb 2>/dev/null | wc -l)" if [[ "${dtb_count}" -le "30" ]]; then echo -e "${INFO} No DTB files for ${family} (${platform}), skipping..." continue fi #echo -e "${INFO} Creating linux-dtb-${family} deb package..." dtb_pkg="linux-dtb-${family}${custom_name}" dtb_dir="${deb_path}/${dtb_pkg}" mkdir -p ${dtb_dir}/{DEBIAN,boot/dtb/${platform}} # Copy dtb files cp -rf ${dtb_source}/* ${dtb_dir}/boot/dtb/${platform}/ # Create copyright file mkdir -p ${dtb_dir}/usr/share/doc/${dtb_pkg} cat >${dtb_dir}/usr/share/doc/${dtb_pkg}/copyright <${dtb_dir}/DEBIAN/control <${dtb_dir}/DEBIAN/preinst </dev/null || true exit 0 EOF chmod 755 ${dtb_dir}/DEBIAN/preinst # Create postinst script to manage dtb symlinks and clean old packages cat >${dtb_dir}/DEBIAN/postinst </dev/null || true done # Platform-specific handling for rockchip if [[ "DTB_FAMILY" == "rockchip64" || "DTB_PLATFORM" == "rockchip" ]]; then # Create dtb symlink for rockchip platform (matches armbian-update behavior) cd /boot [[ -d dtb ]] && ln -sf dtb dtb-\${CURRENT_KERNEL} fi exit 0 EOF sed -i "s|KERNEL_NAME|${kernel_outname}|g" ${dtb_dir}/DEBIAN/postinst sed -i "s|DTB_FAMILY|${family}|g" ${dtb_dir}/DEBIAN/postinst sed -i "s|DTB_PLATFORM|${platform}|g" ${dtb_dir}/DEBIAN/postinst chmod 755 ${dtb_dir}/DEBIAN/postinst # Build the deb package dtb_deb="linux-dtb-${family}_${pkg_version}-${pkg_revision}${custom_name}_${pkg_arch}.deb" dpkg-deb -Zxz --build ${dtb_dir} ${deb_path}/${dtb_deb} >/dev/null [[ "${?}" -eq "0" ]] && echo -e "${SUCCESS} The [ ${dtb_deb} ] file packaged successfully." done } create_debs() { cd ${output_path} # Create deb packages for kernel installation echo -e "${STEPS} Creating all deb packages..." # Create all deb packages create_debs_image create_debs_libc create_debs_headers create_debs_dtb } compile_selection() { # Compile by selection if [[ "${package_list}" == "dtbs" ]]; then compile_dtbs packit_dtbs else compile_kernel generate_uinitrd packit_dtbs packit_kernel create_debs fi cd ${output_path}/${kernel_version} # Add sha256sum integrity verification file sha256sum *.tar.gz >sha256sums 2>/dev/null || true cd ${output_path}/deb-${kernel_version} # Cleanup temporary build directories, keep only .deb files find . -mindepth 1 -maxdepth 1 -type d -exec rm -rf {} \; # Add sha256sum integrity verification file sha256sum *.deb >sha256sums 2>/dev/null || true cd ${output_path} # Package all kernel tar files into a single tar.gz file tar -czf ${kernel_version}.tar.gz ${kernel_version} echo -e "${SUCCESS} All kernel tar packages packaged successfully." # Package all kernel deb files into a single tar.gz file tar -czf deb-${kernel_version}.tar.gz deb-${kernel_version} echo -e "${SUCCESS} All kernel deb packages packaged successfully." echo -e "${INFO} Kernel series files are stored in [ ${output_path} ]." echo -e "${INFO} Current space usage: \n$(df -hT ${output_path}) \n" } clean_tmp() { cd ${current_path} echo -e "${STEPS} Cleaning up temporary files..." sync && sleep 3 rm -rf ${output_path}/{boot/,dtb/,modules/,header/,libc_headers/,${kernel_version}/,deb-${kernel_version}/} || true [[ "${delete_source}" =~ ^(true|yes)$ ]] && rm -rf ${kernel_path}/* || true rm -rf ${tmp_backup_path} || true # Show ccache statistics echo -e "${INFO} ccache statistics:" ccache -s 2>/dev/null echo -e "${SUCCESS} Cleanup completed successfully." } loop_recompile() { cd ${current_path} j="1" for k in ${build_kernel[@]}; do # kernel_version, such as [ 6.1.15 ] kernel_version="${k}" # kernel and , such as [ 6.1 ] kernel_verpatch="$(echo ${kernel_version} | awk -F '.' '{print $1"."$2}')" # kernel , such as [ 15 ] kernel_sub="$(echo ${kernel_version} | awk -F '.' '{print $3}')" # The loop variable assignment if [[ -z "${code_repo}" ]]; then server_kernel_repo="${code_owner}/linux-${kernel_verpatch}.y" local_kernel_path="linux-${kernel_verpatch}.y" else server_kernel_repo="${code_owner}/${code_repo}" local_kernel_path="${code_repo}-${code_branch}" fi # Show compilation start information echo -e "${INFO} Armbian space usage before compilation: \n$(df -hT ${kernel_path}) \n" # Check disk space size echo -ne "(${j}) Compiling kernel [\033[92m ${kernel_version} \033[0m]. " now_remaining_space="$(df -Tk ${kernel_path} | tail -n1 | awk '{print $5}' | echo $(($(xargs) / 1024 / 1024)))" if [[ "${now_remaining_space}" -le "15" ]]; then echo -e "${WARNING} Remaining space is less than 15G, exiting compilation." break else echo "Remaining space is ${now_remaining_space}G." fi # Execute the following functions in sequence get_kernel_source get_kernel_config compile_env compile_selection clean_tmp ((j++)) done } # Show welcome message echo -e "${STEPS} Starting kernel compilation with Armbian..." echo -e "${INFO} The Armbian environment: [ ${host_release} / ${arch_info} ]" # Check script permission, supports running on Armbian system. [[ "$(id -u)" == "0" ]] || error_msg "Please run this script as root: [ sudo ./${0} ]" [[ "${arch_info}" == "aarch64" ]] || error_msg "The script only supports running under Armbian system." # Initialize variables init_var "${@}" # Output log to file [[ "${enable_log}" =~ ^(true|yes)$ ]] && log_to_file # Check and install the toolchain toolchain_check # Query the latest kernel version [[ "${auto_kernel}" =~ ^(true|yes)$ ]] && query_version # Show compile settings echo -e "${INFO} Kernel compilation toolchain: [ ${toolchain_name} ]" echo -e "${INFO} Kernel source: [ ${code_owner} ]" echo -e "${INFO} Kernel patch: [ ${auto_patch} ]" echo -e "${INFO} Kernel arch: [ ${SRC_ARCH} ]" echo -e "${INFO} Kernel package: [ ${package_list} ]" echo -e "${INFO} Kernel signature: [ ${custom_name} ]" echo -e "${INFO} Latest kernel version: [ ${auto_kernel} ]" echo -e "${INFO} Kernel initrd compress: [ ${compress_format} ]" echo -e "${INFO} Ccache clear: [ ${ccache_clear} ]" echo -e "${INFO} Delete source: [ ${delete_source} ]" echo -e "${INFO} Silent log: [ ${silent_log} ]" echo -e "${INFO} Kernel list: [ $(echo ${build_kernel[@]} | xargs) ] \n" # Loop to compile the kernel loop_recompile # Show compilation end information echo -e "${STEPS} Armbian space usage after compilation: \n$(df -hT ${kernel_path}) \n" echo -e "${SUCCESS} Kernel compilation completed successfully." ================================================ FILE: compile-kernel/tools/script/docker/Dockerfile ================================================ FROM scratch ADD armbian-rootfs.tar.gz / # Install necessary packages RUN apt-get update && apt-get install -y \ tzdata \ ca-certificates \ gnupg2 \ openssh-server \ nginx \ && rm -rf /var/lib/apt/lists/* # Set timezone ENV TZ=Etc/UTC RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && \ echo "${TZ}" > /etc/timezone # Copy custom startup script COPY docker_startup.sh /usr/local/bin/docker_startup.sh # Make the script executable RUN chmod +x /usr/local/bin/docker_startup.sh # Expose necessary ports (SSH and HTTP/HTTPS) EXPOSE 22 80 443 # Set the default command to run our script CMD ["/usr/local/bin/docker_startup.sh"] ================================================ FILE: compile-kernel/tools/script/docker/build_armbian_docker_image.sh ================================================ #!/bin/bash #================================================================================================ # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Build Armbian docker image. # Copyright (C) 2021~ https://github.com/ophub/amlogic-s9xxx-armbian # # # Command: ./compile-kernel/tools/script/docker/build_armbian_docker_image.sh # #======================================== Functions list ======================================== # # error_msg : Output error message and exit # check_docker : Check and install Docker environment # find_armbian : Find Armbian rootfs file (armbian/*rootfs.tar.gz) # build_docker : Build the Armbian Docker image # export_docker : Export offline Docker image # #================================ Set make environment variables ================================ # # Set default parameters current_path="${PWD}" armbian_path="${current_path}/armbian" armbian_rootfs_file="*rootfs.tar.gz" docker_path="${current_path}/compile-kernel/tools/script/docker" out_path="${current_path}/out" # Set Docker image name and tag [[ -n "${1}" ]] && docker_os="${1}" || docker_os="server" [[ -n "${2}" ]] && docker_arch="${2}" || docker_arch="arm64" # Set default parameters STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" WARNING="[\033[93m WARNING \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #================================================================================================ error_msg() { echo -e "${ERROR} ${1}" exit 1 } check_docker() { echo -e "${STEPS} Checking Docker environment..." # Check if docker command exists if command -v docker >/dev/null 2>&1; then local docker_ver="$(docker --version 2>/dev/null)" echo -e "${INFO} Docker is installed: [ ${docker_ver} ]" # Check if Docker daemon is running if docker info >/dev/null 2>&1; then echo -e "${INFO} Docker daemon is running." else echo -e "${WARNING} Docker daemon is not running, attempting to start..." sudo systemctl start docker 2>/dev/null || sudo service docker start 2>/dev/null sleep 3 docker info >/dev/null 2>&1 || error_msg "Failed to start Docker daemon." echo -e "${SUCCESS} Docker daemon started successfully." fi return 0 fi echo -e "${INFO} Docker is not installed, installing..." # Install Docker using the official convenience script curl -fsSL https://get.docker.com | sudo sh sudo usermod -aG docker ${USER} # Verify installation command -v docker >/dev/null 2>&1 || error_msg "Docker installation failed." # Start and enable Docker service sudo systemctl start docker 2>/dev/null || sudo service docker start 2>/dev/null sudo systemctl enable docker 2>/dev/null sleep 3 docker info >/dev/null 2>&1 || error_msg "Docker installed but daemon failed to start." echo -e "${SUCCESS} Docker installed and started successfully: [ $(docker --version) ]" } find_armbian() { cd ${current_path} echo -e "${STEPS} Searching for Armbian rootfs file..." # Find whether the Armbian file exists armbian_file_name="$(ls ${armbian_path}/${armbian_rootfs_file} 2>/dev/null | head -n 1 | awk -F "/" '{print $NF}')" if [[ -n "${armbian_file_name}" ]]; then echo -e "${INFO} Armbian docker image file: [ ${armbian_file_name} ]." else error_msg "There is no [ ${armbian_rootfs_file} ] file in the [ ${armbian_path} ] directory." fi # Check whether the Dockerfile exists [[ -f "${docker_path}/Dockerfile" ]] || error_msg "Missing Dockerfile." } build_docker() { cd ${current_path} echo -e "${STEPS} Building Armbian Docker image..." # Move the docker image to the output directory rm -rf ${out_path} && mkdir -p ${out_path} cp -f ${armbian_path}/${armbian_file_name} ${out_path}/${armbian_file_name} [[ "${?}" -eq "0" ]] || error_msg "Docker image move failed." echo -e "${INFO} Docker rootfs file added successfully." # Add Dockerfile cp -f ${docker_path}/Dockerfile ${out_path} [[ "${?}" -eq "0" ]] || error_msg "Dockerfile addition failed." cp -f ${docker_path}/docker_startup.sh ${out_path} [[ "${?}" -eq "0" ]] || error_msg "Custom startup script addition failed." sed -i "s|^ADD armbian-.*.tar.gz|ADD ${armbian_file_name}|g" ${out_path}/Dockerfile [[ "${?}" -eq "0" ]] || error_msg "Dockerfile version codename replacement failed." echo -e "${INFO} Dockerfile added successfully." # Display the output directory sync && sleep 3 echo -e "${INFO} Docker files list: \n$(ls -lh ${out_path})" } export_docker() { cd ${current_path} echo -e "${STEPS} Building and exporting offline Docker image..." # Set image name and tag (Docker requires lowercase image names) local docker_image_name="armbian-docker-${docker_os}-${docker_arch}" local full_image="${docker_image_name}:${docker_arch}" # Build docker image locally cd ${out_path} docker build --platform linux/${docker_arch} -t "${full_image}" . [[ "${?}" -eq "0" ]] || error_msg "Docker image build failed." echo -e "${INFO} Docker image [ ${full_image} ] built successfully." # Clean up build artifacts, keep only the exported image rm -f ${out_path}/{${armbian_file_name},Dockerfile,docker_startup.sh} # Export image to tar.gz file local export_file="${out_path}/${docker_image_name}.tar.gz" (set -o pipefail && docker save "${full_image}" | gzip >"${export_file}") [[ "${?}" -eq "0" ]] || error_msg "Docker image export failed." # Display export info local file_size="$(ls -lh ${export_file} | awk '{print $5}')" echo -e "${SUCCESS} Offline Docker image exported: [ ${export_file} ] (${file_size})" echo -e "${INFO} Users can import with: [ docker load -i $(basename ${export_file}) ]" } # Show welcome message echo -e "${STEPS} Welcome to the Armbian Docker Image Builder." echo -e "${INFO} Current path: [ ${current_path} ]" # check_docker find_armbian build_docker export_docker # echo -e "${SUCCESS} Docker image files created successfully." ================================================ FILE: compile-kernel/tools/script/docker/build_armbian_rootfs_file.sh ================================================ #!/bin/bash #========================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Build Armbian rootfs file. # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # # Optional parameters: # -v, --VERSION_CODENAME: Set the version codename of Armbian rootfs file, e.g., bookworm, resolute, etc. # -s, --SSHD_CONFIG: Enable or disable sshd_config file, default is false. # -c, --COMMAND_COLORS: Enable or disable command colors, default is false. # -k, --COMPILE_KERNEL: Add armbian-kernel and uInitrd generation script, default none. # # Usage: ./compile-kernel/tools/script/docker/build_armbian_rootfs_file.sh -v bookworm -s true -c true -k true # ./compile-kernel/tools/script/docker/build_armbian_rootfs_file.sh -v bookworm # #===================== Set make environment variables ===================== # # Set environment variables current_path="${PWD}" build_path="${current_path}/build" image_path="${build_path}/output/images" cache_path="${build_path}/cache/rootfs" tmp_rootfs="${image_path}/tmp_rootfs" # # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" WARNING="[\033[93m WARNING \033[0m]" NOTE="[\033[93m NOTE \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #========================================================================== error_msg() { echo -e " ${ERROR} ${1}" exit 1 } init_var() { echo -e "${STEPS} Initializing variables..." # If it is followed by [ : ], it means that the option requires a parameter value local options="v:s:c:k:p:" parsed_args=$(getopt -o "${options}" -- "${@}") [[ ${?} -ne 0 ]] && error_msg "Parameter parsing failed." eval set -- "${parsed_args}" while true; do case "${1}" in -v | --VERSION_CODENAME) if [[ -n "${2}" ]]; then version_codename="${2}" shift 2 else error_msg "Invalid -v parameter [ ${2} ]!" fi ;; -s | --SSHD_CONFIG) if [[ -n "${2}" ]]; then sshd_config_enable="${2}" shift 2 else error_msg "Invalid -s parameter [ ${2} ]!" fi ;; -c | --COMMAND_COLORS) if [[ -n "${2}" ]]; then command_colors="${2}" shift 2 else error_msg "Invalid -c parameter [ ${2} ]!" fi ;; -k | --COMPILE_KERNEL) if [[ -n "${2}" ]]; then compile_kernel="${2}" shift 2 else error_msg "Invalid -k parameter [ ${2} ]!" fi ;; -p | --PLATFORM_TYPE) if [[ -n "${2}" ]]; then platform_type="${2}" shift 2 else error_msg "Invalid -p parameter [ ${2} ]!" fi ;; --) shift break ;; *) [[ -n "${1}" ]] && error_msg "Invalid option [ ${1} ]!" break ;; esac done echo -e "${INFO} VERSION CODENAME: [ ${version_codename} ]" } redo_rootfs() { echo -e "${STEPS} Rebuilding Armbian [ ${version_codename} ] rootfs file..." # Searching for Armbian image image_file="$(basename $(ls ${image_path}/*.img 2>/dev/null | head -n 1))" # Get image version, such as 25.11.0 image_version="$(echo "${image_file}" | grep -oE '[0-9]{2}\.[0-9]{1,2}\.[0-9]{1,2}' | head -n 1)" # Get image kernel version, such as 6.12.56 image_kernel="$(echo "${image_file}" | grep -oE '[0-9]+\.[0-9]{1,2}\.[0-9]{1,3}' | grep -v "${image_version}" | head -n 1)" # Set image save name image_save_name="Armbian_${image_version}-trunk_${version_codename}_${platform_type:-arm64}_${image_kernel}.img" # Searching for rootfs file rootfs_file="$(ls ${cache_path}/rootfs-*.tar.zst 2>/dev/null | head -n 1)" rootfs_save_name="Armbian_${image_version}-${version_codename}_${platform_type:-arm64}_${image_kernel}_rootfs.tar.gz" # Create temporary directory mkdir -p ${tmp_rootfs} sudo chown root:root ${tmp_rootfs} [[ "${?}" == "0" ]] && echo -e "${INFO} 01. Temporary directory created successfully." || error_msg "01. Failed to create directory!" # Redo Armbian rootfs if [[ -n "${rootfs_file}" ]]; then sudo tar -mxf ${rootfs_file} -C ${tmp_rootfs}/ [[ "${?}" == "0" ]] && echo -e "${INFO} 02. Armbian rootfs unpacked successfully." || error_msg "02. Failed to unpack rootfs file!" cd ${tmp_rootfs}/ # 03. Set sshd_config if [[ -n "${sshd_config_enable}" && "${sshd_config_enable}" =~ ^(true|yes)$ ]]; then # SSH access is enabled by default ssh_config="etc/ssh/sshd_config" [[ -f "${ssh_config}" ]] && { sudo sed -i "s|^#*Port .*|Port 22|g" ${ssh_config} sudo sed -i "s|^#*PermitRootLogin .*|PermitRootLogin yes|g" ${ssh_config} sudo sed -i "s|^#*PasswordAuthentication .*|PasswordAuthentication yes|g" ${ssh_config} [[ -d "var/run/sshd" ]] || sudo mkdir -p -m0755 var/run/sshd echo -e "${INFO} 03.01 sshd_config adjusted successfully." } || error_msg "03.01 Failed to adjust sshd_config!" # Set root password to 1234 [[ -f "etc/shadow" ]] && { rootnewpasswd="$(openssl passwd -6 "1234")" sudo sed -i "s|^root:\*|root:${rootnewpasswd}|" etc/shadow echo -e "${INFO} 03.02 Default account adjusted successfully." } || error_msg "03.02 Failed to adjust root password!" else echo -e "${NOTE} 03. Skipping sshd_config adjustment." fi # 04. Set command colors if [[ -n "${command_colors}" && "${command_colors}" =~ ^(true|yes)$ ]]; then # Set terminal colors [[ -f "usr/bin/dircolors" ]] && { # Set the default color for command sudo chmod +x usr/bin/dircolors # Add color support for command and set the default prompt sudo tee -a root/.bashrc >/dev/null <<'EOF' # enable color support of ls and also add handy aliases if [ -x /usr/bin/dircolors ]; then test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" alias ls='ls --color=auto' alias grep='grep --color=auto' alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto' fi # Color prompt (green username@hostname + blue path) PS1='\[\e[1;32m\]\u@\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]\$ ' EOF # Add the bashrc file to the root profile sudo tee -a root/.profile >/dev/null <<'EOF' if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi EOF echo -e "${INFO} 04. Default color scheme adjusted successfully." } || error_msg "04. Failed to adjust dircolors!" else echo -e "${NOTE} 04. Skipping sshd_config adjustment." fi # 05. Add armbian-kernel script if [[ -n "${compile_kernel}" && "${compile_kernel}" =~ ^(true|yes)$ ]]; then down_script="https://raw.githubusercontent.com/ophub/amlogic-s9xxx-armbian/refs/heads/main/build-armbian/armbian-files/common-files/usr/sbin/armbian-kernel" add_script="usr/sbin/armbian-kernel" sudo mkdir -p usr/sbin/ sudo wget -q --show-progress --no-check-certificate -O ${add_script} ${down_script} [[ "${?}" == "0" ]] && { sudo chmod +x ${add_script} sudo chown root:root ${add_script} echo -e "${INFO} 05.01. armbian-kernel script added successfully." } || error_msg "05.01. Failed to add armbian-kernel script!" # Add uInitrd generation script sudo mkdir -p etc/initramfs/post-update.d/ sudo chown root:root etc/initramfs/post-update.d/ sudo tee etc/initramfs/post-update.d/99-uboot >/dev/null <<'EOF' #!/bin/bash -e tempname="/boot/uInitrd-$1" echo "update-initramfs: Armbian: Converting to u-boot format: ${tempname}" >&2 mkimage -A arm64 -O linux -T ramdisk -C gzip -n uInitrd -d $2 $tempname echo "update-initramfs: Armbian: Symlinking ${tempname} to /boot/uInitrd" >&2 ln -sfv $(basename $tempname) /boot/uInitrd || { echo "update-initramfs: Symlink failed, moving ${tempname} to /boot/uInitrd" >&2 mv -v $tempname /boot/uInitrd } echo "update-initramfs: Armbian: done." >&2 exit 0 EOF sudo chmod +x etc/initramfs/post-update.d/99-uboot [[ "${?}" == "0" ]] && echo -e "${INFO} 05.02. uInitrd generation script added successfully." || error_msg "05.02. Failed to adjust uInitrd!" else echo -e "${NOTE} 05. Skipping armbian-kernel script addition." fi # Compress the rootfs file sudo tar -czf ${rootfs_save_name} * sudo mv -f ${rootfs_save_name} ../ [[ "${?}" == "0" ]] && echo -e "${INFO} 06. Armbian rootfs created successfully." || error_msg "06. Failed to redo rootfs!" else error_msg "02. Failed to find rootfs file!" fi # Rename Armbian image if [[ -n "${image_file}" ]]; then cd ${image_path}/ mv -f ${image_file} ${image_save_name} pigz -qf *.img || gzip -qf *.img [[ "${?}" == "0" ]] && echo -e "${INFO} 07. Armbian image renamed successfully." || error_msg "07. Failed to rename the image!" else error_msg "07. Failed to find Armbian image!" fi # Clean up files in the image directory cd ${image_path}/ sudo rm -rf $(ls . | grep -vE ".img.gz|.tar.gz" | xargs) 2>/dev/null #for file in *; do [[ ! -d "${file}" ]] && sha256sum "${file}" >"${file}.sha"; done [[ "${?}" == "0" ]] && echo -e "${INFO} 08. The files in the current directory:\n$(ls -lh .)" || error_msg "08. Failed to clean up!" # Delete Armbian build source codes and temporary files cd ${build_path}/ sudo rm -rf $(ls . | grep -v "^output$" | xargs) [[ "${?}" == "0" ]] && echo -e "${INFO} 09. Armbian source code cleaned up successfully." || error_msg "09. Failed to clean up!" cd ${current_path}/ sync && sleep 3 } echo -e "${STEPS} Starting to rebuild the Armbian rootfs file..." echo -e "${INFO} Current path: [ ${current_path} ]" # Initialize variables init_var "${@}" # Redo Armbian rootfs redo_rootfs echo -e "${SUCCESS} Armbian rootfs file rebuilt successfully." ================================================ FILE: compile-kernel/tools/script/docker/docker_startup.sh ================================================ #!/bin/bash #============================== [License Information] =============================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Custom startup script for Armbian Docker container. # Copyright (C) 2021- https://github.com/ophub/amlogic-s9xxx-armbian # #======================== [Container Initialization Section] ======================== # # Try to start Nginx service in the background if it exists. start_nginx_service() { echo "[SETUP] Checking and starting Nginx service..." if ! command -v nginx >/dev/null 2>&1; then echo "[INFO] Nginx not found, skipping." return fi # Test Nginx configuration before trying to start it. if nginx -t; then echo "[INFO] Nginx configuration test passed." # Start Nginx in the background. nginx || echo "[WARNING] Failed to start Nginx daemon, but script will continue." else # If the configuration is bad, report it clearly and do not start. echo "[ERROR] Nginx configuration test failed! Nginx will not be started." fi } # Placeholder for other tasks. other_initialization() { echo "[SETUP] Performing other initialization tasks..." # Add any other necessary commands here, for example: # cp -rf /path/to/website_code /var/www/html/myblog } echo "[INIT] Container initialization started..." # Start Nginx services. start_nginx_service # Perform other setup tasks. other_initialization #======================== [Start the Main Foreground Process] ======================== # # This command keeps the container alive. Its lifecycle is the container's lifecycle. # We choose sshd as the primary foreground process. echo "[INIT] Initialization complete. Starting main process..." if command -v sshd >/dev/null 2>&1; then echo "[RUN] Starting SSHD as the main process..." # Ensure the sshd run directory exists. mkdir -p /var/run/sshd # Use 'exec' to replace this script with the sshd process. exec /usr/sbin/sshd -D else # Fallback if sshd is somehow not installed. echo "[RUN] FATAL: sshd command not found." echo "[RUN] Starting 'tail -f /dev/null' to keep the container alive for debugging." exec tail -f /dev/null fi ================================================ FILE: compile-kernel/tools/script/ubuntu2204-build-armbian-depends ================================================ acl aptly aria2 axel bc binfmt-support binutils-aarch64-linux-gnu bison bsdextrautils btrfs-progs build-essential busybox ca-certificates ccache clang coreutils cpio crossbuild-essential-arm64 cryptsetup curl debian-archive-keyring debian-keyring debootstrap device-tree-compiler dialog dirmngr distcc dosfstools dwarves e2fsprogs expect f2fs-tools fakeroot fdisk file flex gawk gcc-arm-linux-gnueabi gdisk git gpg gzip imagemagick jq kmod libbison-dev libc6-dev-armhf-cross libcrypto++-dev libelf-dev libfdt-dev libfile-fcntllock-perl libfl-dev libfuse-dev libgcc-12-dev-arm64-cross libgmp3-dev liblz4-tool libmpc-dev libncurses-dev libpython3-dev libssl-dev libusb-1.0-0-dev linux-base lld llvm locales lz4 lzma lzop make mtools ncurses-base ncurses-term nfs-kernel-server ntpdate openssl p7zip p7zip-full parallel parted patchutils pbzip2 pigz pixz pkg-config pv python3 python3-dev python3-setuptools qemu-user-static rdfind rename rsync sudo swig tar tree u-boot-tools udev unzip util-linux uuid uuid-dev uuid-runtime vim wget whiptail xfsprogs xsltproc xz-utils zip zlib1g-dev zstd ================================================ FILE: compile-kernel/tools/script/ubuntu2404-build-armbian-depends ================================================ acl aptly aria2 axel bc binfmt-support binutils-aarch64-linux-gnu bison bsdextrautils btrfs-progs build-essential busybox ca-certificates ccache clang coreutils cpio crossbuild-essential-arm64 cryptsetup curl debian-archive-keyring debian-keyring debootstrap device-tree-compiler dialog dirmngr distcc dosfstools dwarves e2fsprogs expect f2fs-tools fakeroot fdisk file flex gawk gcc-arm-linux-gnueabi gdisk git gpg gzip imagemagick jq kmod libbison-dev libc6-dev-armhf-cross libcrypto++-dev libelf-dev libfdt-dev libfile-fcntllock-perl libfl-dev libfuse-dev libgcc-12-dev-arm64-cross libgmp3-dev liblz4-tool libmpc-dev libncurses-dev libpython3-dev libssl-dev libusb-1.0-0-dev linux-base lld llvm locales lz4 lzma lzop make mtools ncurses-base ncurses-term nfs-kernel-server ntpdate openssl p7zip p7zip-full parallel parted patchutils pbzip2 pigz pixz pkg-config pv python3 python3-dev python3-setuptools qemu-user-static rdfind rename rsync sudo swig tar tree u-boot-tools udev unzip util-linux uuid uuid-dev uuid-runtime vim wget whiptail xfsprogs xsltproc xz-utils zip zlib1g-dev zstd ================================================ FILE: documents/README.cn.md ================================================ # Armbian 构建及使用方法 [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) GitHub Actions 是 Microsoft 推出的一项服务,提供高性能的虚拟服务器环境,可用于构建、测试、打包和部署项目。公开仓库可免费无时间限制地使用,单次编译时间长达 6 小时,足以满足 Armbian 的编译需求(通常 3 小时左右即可完成编译)。本项目仅供技术交流,不足之处敬请谅解。请勿发起网络攻击或恶意使用 GitHub Actions。 # 目录 - [Armbian 构建及使用方法](#armbian-构建及使用方法) - [目录](#目录) - [1. 注册自己的 Github 的账户](#1-注册自己的-github-的账户) - [2. 设置隐私变量 GITHUB\_TOKEN 等](#2-设置隐私变量-github_token-等) - [3. Fork 仓库并设置工作流权限](#3-fork-仓库并设置工作流权限) - [4. 个性化 Armbian 系统定制文件说明](#4-个性化-armbian-系统定制文件说明) - [5. 编译系统](#5-编译系统) - [5.1 手动编译](#51-手动编译) - [5.2 定时编译](#52-定时编译) - [5.3 自定义默认系统配置](#53-自定义默认系统配置) - [5.4 使用逻辑卷扩大 Github Actions 编译空间](#54-使用逻辑卷扩大-github-actions-编译空间) - [5.5 制作 Armbian Docker 镜像](#55-制作-armbian-docker-镜像) - [6. 保存系统](#6-保存系统) - [7. 下载系统](#7-下载系统) - [8. 安装 Armbian 到 EMMC](#8-安装-armbian-到-emmc) - [8.1 Amlogic 系列安装方法](#81-amlogic-系列安装方法) - [8.2 Rockchip 系列安装方法](#82-rockchip-系列安装方法) - [8.2.1 Radxa-Rock5B 的安装方法](#821-radxa-rock5b-的安装方法) - [8.2.1.1 安装系统至 microSD](#8211-安装系统至-microsd) - [8.2.1.2 安装系统至 eMMC](#8212-安装系统至-emmc) - [8.2.1.3 安装系统至 NVMe](#8213-安装系统至-nvme) - [8.2.2 电犀牛 R66S 的安装方法](#822-电犀牛-r66s-的安装方法) - [8.2.3 电犀牛 R68S 的安装方法](#823-电犀牛-r68s-的安装方法) - [8.2.4 贝壳云的安装方法](#824-贝壳云的安装方法) - [8.2.5 我家云的安装方法](#825-我家云的安装方法) - [8.2.6 泰山派的安装方法](#826-泰山派的安装方法) - [8.3 Allwinner 系列安装方法](#83-allwinner-系列安装方法) - [8.4 Docker 版本的 Armbian 安装方法](#84-docker-版本的-armbian-安装方法) - [8.4.1 安装 Docker 运行环境](#841-安装-docker-运行环境) - [8.4.2 设置 macvlan 网络](#842-设置-macvlan-网络) - [8.4.3 运行 Armbian Docker 容器](#843-运行-armbian-docker-容器) - [9. 编译 Armbian 内核](#9-编译-armbian-内核) - [9.1 如何添加自定义内核补丁](#91-如何添加自定义内核补丁) - [9.2 如何制作内核补丁](#92-如何制作内核补丁) - [9.3 如何自定义编译驱动模块](#93-如何自定义编译驱动模块) - [10. 更新 Armbian 内核](#10-更新-armbian-内核) - [11. 安装常用软件](#11-安装常用软件) - [12. 常见问题](#12-常见问题) - [12.1 每个盒子的 dtb 和 u-boot 对应关系表](#121-每个盒子的-dtb-和-u-boot-对应关系表) - [12.2 LED 屏显示控制说明](#122-led-屏显示控制说明) - [12.3 如何恢复原安卓 TV 系统](#123-如何恢复原安卓-tv-系统) - [12.3.1 使用 armbian-ddbr 备份恢复](#1231-使用-armbian-ddbr-备份恢复) - [12.3.2 使用 Amlogic 刷机工具恢复](#1232-使用-amlogic-刷机工具恢复) - [12.4 设置盒子从 USB/TF/SD 中启动](#124-设置盒子从-usbtfsd-中启动) - [12.4.1 初次安装 Armbian 系统](#1241-初次安装-armbian-系统) - [12.4.2 重新安装 Armbian 系统](#1242-重新安装-armbian-系统) - [12.5 禁用红外接收器](#125-禁用红外接收器) - [12.6 启动引导文件的选择](#126-启动引导文件的选择) - [12.7 网络设置](#127-网络设置) - [12.7.1 使用 interfaces 设置网络](#1271-使用-interfaces-设置网络) - [12.7.1.1 由 DHCP 动态分配 IP 地址](#12711-由-dhcp-动态分配-ip-地址) - [12.7.1.2 手动设置静态 IP 地址](#12712-手动设置静态-ip-地址) - [12.7.1.3 在 docker 中使用 OpenWrt 建立互通网络](#12713-在-docker-中使用-openwrt-建立互通网络) - [12.7.2 使用 NetworkManager 管理网络](#1272-使用-networkmanager-管理网络) - [12.7.2.1 新建网络连接](#12721-新建网络连接) - [12.7.2.1.1 获取网络接口名称](#127211-获取网络接口名称) - [12.7.2.1.2 获取现有网络连接名称](#127212-获取现有网络连接名称) - [12.7.2.1.3 新建有线网络连接](#127213-新建有线网络连接) - [12.7.2.1.4 新建无线网络连接](#127214-新建无线网络连接) - [12.7.2.2 修改无线网络连接中的 WiFi SSID or PASSWD](#12722-修改无线网络连接中的-wifi-ssid-or-passwd) - [12.7.2.3 修改网络地址分配方式](#12723-修改网络地址分配方式) - [12.7.2.3.1 静态 IP 地址 - IPv4](#127231-静态-ip-地址---ipv4) - [12.7.2.3.2 DHCP 获取动态 IP 地址 - IPv4 / IPv6](#127232-dhcp-获取动态-ip-地址---ipv4--ipv6) - [12.7.2.4 修改网络连接 MAC 地址](#12724-修改网络连接-mac-地址) - [12.7.2.4.1 方法一:使用 `nmcli` 命令修改 MAC 地址](#127241-方法一使用-nmcli-命令修改-mac-地址) - [12.7.2.4.2 方法二:通过配置文件修改 MAC 地址](#127242-方法二通过配置文件修改-mac-地址) - [12.7.2.5 如何禁用 IPv6](#12725-如何禁用-ipv6) - [12.7.3 如何启用无线](#1273-如何启用无线) - [12.7.4 如何启用蓝牙](#1274-如何启用蓝牙) - [12.8 如何添加开机启动任务](#128-如何添加开机启动任务) - [12.9 如何更新系统中的服务脚本](#129-如何更新系统中的服务脚本) - [12.10 如何获取 eMMC 上的安卓系统分区信息](#1210-如何获取-emmc-上的安卓系统分区信息) - [12.10.1 获取分区信息](#12101-获取分区信息) - [12.10.2 分区信息分享](#12102-分区信息分享) - [12.10.3 分区信息解读](#12103-分区信息解读) - [12.10.4 用于 eMMC 安装](#12104-用于-emmc-安装) - [12.11 如何制作 u-boot 文件](#1211-如何制作-u-boot-文件) - [12.11.1 如何制作 Amlogic 设备的 u-boot 文件](#12111-如何制作-amlogic-设备的-u-boot-文件) - [12.11.1.1 如何提取 bootloader 和 dtb 文件](#121111-如何提取-bootloader-和-dtb-文件) - [12.11.1.2 如何制作 acs.bin 文件](#121112-如何制作-acsbin-文件) - [12.11.1.3 如何编译 u-boot 文件](#121113-如何编译-u-boot-文件) - [12.11.2 如何制作 Rockchip 设备的 u-boot 文件](#12112-如何制作-rockchip-设备的-u-boot-文件) - [12.11.2.1 如何使用 Radxa 的 u-boot 制作脚本](#121121-如何使用-radxa-的-u-boot-制作脚本) - [12.11.2.2 如何使用 cm9vdA 的 u-boot 制作脚本](#121122-如何使用-cm9vda-的-u-boot-制作脚本) - [12.12 内存大小识别错误](#1212-内存大小识别错误) - [12.13 如何反编译 dtb 文件](#1213-如何反编译-dtb-文件) - [12.14 如何修改 cmdline 设置](#1214-如何修改-cmdline-设置) - [12.15 如何添加新的支持设备](#1215-如何添加新的支持设备) - [12.15.1 添加设备配置文件](#12151-添加设备配置文件) - [12.15.2 添加系统文件](#12152-添加系统文件) - [12.15.3 添加 u-boot 文件](#12153-添加-u-boot-文件) - [12.15.3.1 查看分区信息布局情况](#121531-查看分区信息布局情况) - [12.15.3.2 备份关键分区](#121532-备份关键分区) - [12.15.3.3 添加特殊分区写入文件](#121533-添加特殊分区写入文件) - [12.15.4 添加流程控制文件](#12154-添加流程控制文件) - [12.16 如何解决写入 eMMC 时 I/O 错误的问题](#1216-如何解决写入-emmc-时-io-错误的问题) - [12.17 如何解决 Bullseye 版本没有声音的问题](#1217-如何解决-bullseye-版本没有声音的问题) - [12.18 如何编译 boot.scr 文件](#1218-如何编译-bootscr-文件) - [12.19 如何开启远程桌面和修改默认端口](#1219-如何开启远程桌面和修改默认端口) - [12.20 TCP 拥塞控制优化方案](#1220-tcp-拥塞控制优化方案) ## 1. 注册自己的 Github 的账户 注册账户以进行后续的系统定制操作。点击 github.com 网站右上角的 `Sign up` 按钮,根据提示完成注册。 ## 2. 设置隐私变量 GITHUB_TOKEN 等 根据 [GitHub 文档](https://docs.github.com/zh/actions/security-guides/automatic-token-authentication#about-the-github_token-secret),在每个工作流作业开始时,GitHub 会自动创建唯一的 `GITHUB_TOKEN` 机密以在工作流中使用。可以使用 `${{ secrets.GITHUB_TOKEN }}` 在工作流作业中进行身份验证。 在 Actions 中制作 [Armbian Docker](../.github/workflows/build-armbian-arm64-docker-image.yml) 镜像并推送到 Docker Hub 时,需要设置 `DOCKERHUB_USERNAME` 和 `DOCKERHUB_PASSWORD` 两个隐私变量。在自己的仓库页面,点击右上角的 `Settings` > `Secrets and variables` > `Actions` > `Repository secrets` > `New repository secret` 按钮,添加如下两个隐私变量: - 变量名 `DOCKERHUB_USERNAME`:值是登录 Docker Hub 的用户名 - 变量名 `DOCKERHUB_PASSWORD`:值是登录 Docker Hub 的密码 ## 3. Fork 仓库并设置工作流权限 打开仓库 https://github.com/ophub/amlogic-s9xxx-armbian ,点击右上角的 Fork 按钮,将仓库代码复制到自己的账户下。Fork 完成后,访问自己账户中的 amlogic-s9xxx-armbian 仓库,在右上角的 `Settings` > `Actions` > `General` > `Workflow permissions` 下选择 `Read and write permissions` 并保存。操作示意如下:
## 4. 个性化 Armbian 系统定制文件说明 系统编译流程由 [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) 文件控制,workflows 目录下的其他 .yml 文件用于实现不同功能。编译时采用 Armbian 官方的最新代码进行实时编译,相关参数请参阅官方文档。 ```yaml - name: Compile Armbian [ ${{ inputs.set_release }} ] id: compile if: ${{ steps.down.outputs.status }} == 'success' && !cancelled() run: | # Compile method and parameter description: https://docs.armbian.com/Developer-Guide_Build-Options cd build/ ./compile.sh RELEASE=${{ inputs.set_release }} BOARD=odroidn2 BRANCH=current BUILD_MINIMAL=no \ BUILD_ONLY=default HOST=armbian BUILD_DESKTOP=no EXPERT=yes KERNEL_CONFIGURE=no \ COMPRESS_OUTPUTIMAGE="sha" SHARE_LOG=yes echo "status=success" >> ${GITHUB_OUTPUT} ``` 使用 `ophub` 打包 Armbian 时,可通过 `armbian_files` 参数将自定义文件添加或覆盖至 ophub 的 [common-files](https://github.com/ophub/amlogic-s9xxx-armbian/tree/main/build-armbian/armbian-files/common-files) 目录。目录结构必须与 Armbian 根目录保持一致,以确保文件被正确覆盖到固件中(例如:默认配置文件应存放于 `etc/default/` 子目录下)。示例如下: ```yaml - name: Rebuild Armbian uses: ophub/amlogic-s9xxx-armbian@main with: build_target: armbian armbian_path: build/output/images/*.img.gz armbian_files: files ... ``` ## 5. 编译系统 系统编译支持多种方式,包括手动编译、定时编译以及特定事件触发编译。 ### 5.1 手动编译 在仓库导航栏中点击 Actions,依次点击 Build armbian > Run workflow > Run workflow 即可开始编译。全部流程约需 3 小时。操作示意如下:
### 5.2 定时编译 在 [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) 文件里,使用 Cron 设置定时编译,5 个不同位置分别代表的意思为 分钟 (0 - 59) / 小时 (0 - 23) / 日期 (1 - 31) / 月份 (1 - 12) / 星期几 (0 - 6)(星期日 - 星期六)。通过修改不同位置的数值来设定时间。系统默认使用 UTC 标准时间,请根据你所在国家时区的不同进行换算。 ```yaml schedule: - cron: '0 17 * * *' ``` ### 5.3 自定义默认系统配置 默认系统配置信息记录在 [model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) 文件中,`BOARD` 名称必须唯一。 其中 `BUILD` 值为 `yes` 的是默认构建的设备,这些设备可直接使用对应系统。默认值为 `no` 的设备未包含在默认构建中,使用时需下载相同 `FAMILY` 的已构建系统。写入 `USB` 后,在电脑上打开 `USB 中的 boot 分区`,修改 `/boot/uEnv.txt` 文件中的 `FDT dtb 名称`,即可适配列表中的其他设备。 本地编译时通过 `-b` 参数指定,GitHub Actions 编译时通过 `armbian_board` 参数指定。`-b all` 表示构建所有 `BUILD` 为 `yes` 的设备。指定 `BOARD` 参数时,无论 `BUILD` 值为 `yes` 或 `no` 均可构建,例如:`-b r68s_s905x3-tx3_s905l3a-cm311` ### 5.4 使用逻辑卷扩大 Github Actions 编译空间 GitHub Actions 默认编译空间为 84G,去除系统和必要软件包后可用空间约 50G。编译全部固件时可能遇到空间不足的问题,可通过逻辑卷将编译空间扩大至约 110G。参照 [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) 文件中的方法,使用以下命令创建逻辑卷,并在编译时使用逻辑卷路径。 ```yaml - name: Create simulated physical disk run: | mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1) root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4) sudo truncate -s "${mnt_size}"G /mnt/mnt.img sudo truncate -s "${root_size}"G /root.img sudo losetup /dev/loop6 /mnt/mnt.img sudo losetup /dev/loop7 /root.img sudo pvcreate /dev/loop6 sudo pvcreate /dev/loop7 sudo vgcreate github /dev/loop6 /dev/loop7 sudo lvcreate -n runner -l 100%FREE github sudo mkfs.xfs /dev/github/runner sudo mkdir -p /builder sudo mount /dev/github/runner /builder sudo chown -R runner.runner /builder df -Th ``` ### 5.5 制作 Armbian Docker 镜像 Armbian 系统 [Docker](https://hub.docker.com/u/ophub) 镜像的制作方法请参考 [armbian_docker](../compile-kernel/tools/script/docker) 制作脚本。 ## 6. 保存系统 系统保存设置同样在 [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) 文件中控制。编译完成的系统将通过脚本自动上传至 GitHub 官方的 Releases。 ```yaml - name: Upload Armbian image to Release uses: ncipollo/release-action@main if: ${{ env.PACKAGED_STATUS }} == 'success' && !cancelled() with: tag: Armbian_${{ env.ARMBIAN_RELEASE }}_${{ env.PACKAGED_OUTPUTDATE }} artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/* allowUpdates: true token: ${{ secrets.GITHUB_TOKEN }} body: | These are the Armbian OS image * OS information Default username: root Default password: 1234 Install command: armbian-install Update command: armbian-update ``` ## 7. 下载系统 从仓库首页右下角的 Release 版块进入,选择与自身设备型号对应的系统。操作示意如下:
## 8. 安装 Armbian 到 EMMC Amlogic、Rockchip 和 Allwinner 的安装方法各不相同。不同设备支持不同的存储介质,包括外置 microSD 卡、eMMC 和 NVMe 等,以下按设备类型分别介绍安装方法。首先从 [Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases) 下载对应设备的 Armbian 系统,解压为 .img 格式备用,然后根据设备类型参照以下相应章节进行安装。 安装完成后,将设备接入`路由器`,开机约 `2 分钟`后,在路由器中查找设备名称为 Armbian 的 `IP` 地址,使用 `SSH` 工具连接即可进行管理配置。默认用户名为 `root`,默认密码为 `1234`,默认端口为 `22`


### 8.1 Amlogic 系列安装方法 登录 Armbian 系统 (默认用户: root, 默认密码: 1234) → 输入命令: ```shell armbian-install ``` | 可选参数 | 默认值 | 选项 | 说明 | | ------- | ------- | ------ | ----------------- | | -m | no | yes/no | 使用 Mainline u-boot | | -a | yes | yes/no | 使用 [ampart](https://github.com/7Ji/ampart) 分区表调整工具 | | -l | no | yes/no | List. 显示全部设备列表 | 举例: `armbian-install -m yes -a no` ### 8.2 Rockchip 系列安装方法 各设备的安装方法如下。 #### 8.2.1 Radxa-Rock5B 的安装方法 Radxa-Rock5B 支持 microSD/eMMC/NVMe 等多种存储介质,安装方法因介质而异。下载 [rk3588_spl_loader_v1.08.111.bin 和 spi_image.img](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/rock5b) 文件备用。下载 [RKDevTool](https://github.com/ophub/kernel/releases/download/tools/Radxa_rock5b_RKDevTool_Release_v2.96__DriverAssitant_v5.1.1.tar.gz) 工具及驱动备用。下载 [Rufus](https://rufus.ie/) 或者 [balenaEtcher](https://www.balena.io/etcher/) 写盘工具备用。 ##### 8.2.1.1 安装系统至 microSD 使用 Rufus 或 balenaEtcher 等工具将 Armbian 系统镜像写入 microSD,然后将 microSD 插入设备即可使用。

##### 8.2.1.2 安装系统至 eMMC 使用 microSD 卡安装:将 Armbian 系统镜像写入 microSD 卡,将 microSD 卡插入设备并启动,上传 `armbian.img` 镜像文件到 microSD 卡,使用 `dd` 命令将 Armbian 镜像写入 NVMe,命令如下: ```Shell dd if=armbian.img of=/dev/mmcblk1 bs=1M status=progress ``` - 使用 USB 转 eMMC 读卡器安装:将 eMMC 模块与电脑连接,使用 Rufus 或 balenaEtcher 等工具将 Armbian 系统镜像写入 eMMC,然后将 eMMC 插入设备即可使用。 - 使用 Maskrom 模式安装:关闭开发板电源。按住金色按钮。将 USB-A 转 C 型电缆插入 ROCK 5B C 型端口,另一端插入 PC。松开金色按钮。检查 USB 设备提示找到一个 MASKROM 设备。右键单击列表的空白区域,然后选择加载 `rock-5b-emmc.cfg` 配置文件(配置文件和 RKDevTool 在同一个目录下)。将 `rk3588_spl_loader_v1.08.111.bin` 和 `Armbian.img` 按下图所示设置,选择写入即可。



##### 8.2.1.3 安装系统至 NVMe ROCK-5B 主板配备 SPI 闪存,将引导加载程序写入 SPI 闪存后,可支持 SoC maskrom 模式不直接支持的启动介质(如 SATA、USB3 或 NVMe)。使用 NVMe 启动前需先写入 SPI 文件,方法如下: 关闭开发板电源,移除 MicroSD 卡、eMMC 模块等可启动设备。按住金色(或部分修订版上的银色)按钮,将 USB-A 转 Type-C 线缆插入 ROCK-5B 的 Type-C 端口,另一端插入 PC。松开按钮,检查 USB 设备是否发现 MASKROM 设备。在列表框中右键选择加载配置,在资源管理器中选择配置文件(配置文件和 RKDevTool 在同一目录下),根据下图选择 `rk3588_spl_loader_v1.08.111.bin` 和 `spi_image.img` 文件,点击写入即可,如下图所示:



- 使用读卡器安装:将 M.2 NVMe SSD 插入 M.2 NVMe SSD 转 USB3.0 读卡器以连接到主机。使用 Rufus 或 balenaEtcher 等工具将 Armbian 系统镜像写入 NVMe,然后将 NVMe 插入设备即可使用。 - 使用 microSD 卡安装:将 Armbian 系统镜像写入 microSD 卡,将 microSD 卡插入设备并启动,上传 `armbian.img` 镜像文件到 microSD 卡,使用 `dd` 命令将 Armbian 镜像写入 NVMe 中,命令如下: ```Shell dd if=armbian.img of=/dev/nvme0n1 bs=1M status=progress ``` #### 8.2.2 电犀牛 R66S 的安装方法 使用 Rufus 或 balenaEtcher 等工具将 Armbian 系统镜像写入 microSD,然后将 microSD 插入设备即可使用。 #### 8.2.3 电犀牛 R68S 的安装方法 - 下载 [RKDevTool](https://github.com/ophub/kernel/releases/download/tools/FastRhino_r68s_RKDevTool_Release_v2.86___DriverAssitant_v5.1.1.tar.gz) 工具及驱动,解压并安装 DriverAssitant 驱动程序,打开 RKDevTool 工具备用。 - R68s 在关机状态下,先插入 USB 双公头线,然后按住 Recovery 键并插上 12V 电源,两秒之后松开 Recovery 键,刷机工具会`发现一个 LOADER 设备`。 - 在 RKDevTool 工具操作界面的空白处点右键,添加项。 - 地址是 `0x00000000`,名字是 `armbian`,路径点击右侧选择 `armbian.img` 系统文件。 - 选择添加的 armbian 一行外,`取消其他行的选择`,点击`执行`写入即可。 - 补充说明:如果 eMMC 中写入了其他系统,请先在高级功能里擦除,再写入 Armbian 系统。如果无法擦除,先重新写入一次 `MiniLoaderAll.bin` 引导文件,然后再次进入 `MASKROM` 写入 Armbian 系统。MiniLoaderAll.bin 引导文件设置:地址 `0xCCCCCCCC`, 名字 `Loader`, 路径选择 RKDevTool 刷机工具 Image 目录下的 `MiniLoaderAll.bin` 文件。



#### 8.2.4 贝壳云的安装方法 方法转载自 [milton](https://www.cnblogs.com/milton/p/15391525.html) 的教程。刷机需要进入 Maskrom 模式。先断开所有连接,通过短接 CLK 和 GND(使用 TTL 的 GND, 或者旁边小按钮的 GND 均可)这两个触点,然后将 USB 连接到 PC 就会检测到 MASKROM 设备了。短接点位置如下:

打开 RKDevTool 刷机工具,右键添加项。 - 地址 `0xCCCCCCCC`, 名字 `Boot`, 路径[选择](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/beikeyun) `rk3328_loader_v1.14.249.bin`。 - 地址 `0x00000000`, 名字 `system`, 路径选择要刷的 `Armbian.img` 系统。 - 勾选`强制按地址写入`,点`执行`,等右侧下载面板显示进度完成即可。 #### 8.2.5 我家云的安装方法 方法转载自 [cc747](https://post.smzdm.com/p/a4wkdo7l/) 的教程。刷机需要进入 Maskrom 模式。确保设备处于断电状态,拔掉所有线缆。用 USB 双公头线,一头插入我家云的 USB2.0 接口,一头插入电脑。用回形针插入 Reset 孔并按住不松开。插入电源线,等待数秒,直到 RKDevTool 下方出现`发现一个LOADER设备`后松开回形针。将 RKDevTool 切换到`高级功能`点击`进入Maskrom`按钮,提示`发现一个MASKROM设备`。右键添加项。 - 地址 `0xCCCCCCCC`, 名字 `Boot`, 路径[选择](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/chainedbox) `rk3328_loader_v1.14.249.bin`。 - 地址 `0x00000000`, 名字 `system`, 路径选择要刷的 `Armbian.img` 系统。 - 勾选`强制按地址写入`,点`执行`,等右侧下载面板显示进度完成即可。

#### 8.2.6 泰山派的安装方法 - 下载 [RKDevTool](https://github.com/ophub/kernel/releases/download/tools/FastRhino_r68s_RKDevTool_Release_v2.86___DriverAssitant_v5.1.1.tar.gz) 工具及驱动,解压并安装 DriverAssitant 驱动程序,打开 RKDevTool 工具。(注意,请使用2.86版本工具而不是2.92,2.92版本刷入时会闪退) - 泰山派关机状态下按住 Recovery 键后插入type-c数据线,待 RKDevTool 提示`发现一个 LOADER 设备`后松开 Recovery 键。右键添加项。 - 地址 `0x00000000`, 名字 `system`, 路径选择要刷的 `Armbian.img` 系统。 - 点击执行,等待进度条完成即可 ### 8.3 Allwinner 系列安装方法 登录 Armbian 系统 (默认用户: root, 默认密码: 1234) → 输入命令: ```shell armbian-install ``` ### 8.4 Docker 版本的 Armbian 安装方法 可以在 Ubuntu/Debian/Armbian 系统中使用 Docker 版本的 Armbian 镜像。这些镜像托管在 [Docker Hub](https://hub.docker.com/r/ophub) 上,可以直接下载使用。 提供了四个不同内核版本的 Armbian Docker 镜像:`armbian-trixie`,`armbian-bookworm`,`armbian-noble`,`armbian-resolute`。每个版本均提供 `arm64` 和 `amd64` 架构,可根据需要选择。 其中 armbian-trixie 基于 debian13,armbian-bookworm 基于 debian12,armbian-noble 基于 ubuntu24.04,armbian-resolute 基于 ubuntu26.04。 arm64 版本适用于 Amlogic/Rockchip/Allwinner 等平台架构的设备,amd64 版本适用于 x86_64 架构的电脑和服务器。 #### 8.4.1 安装 Docker 运行环境 ```shell curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER sudo newgrp docker ``` #### 8.4.2 设置 macvlan 网络 ```shell # 查看已有的 docker 网络是否包含 macvlan 网络 docker network ls # 如果没有 macvlan 网络,则创建 macvlan 网络 # 其中的网段、网关和网卡名称根据自己的实际网络修改 docker network create -d macvlan \ --subnet=10.1.1.0/24 \ --gateway=10.1.1.1 \ -o parent=eth0 \ macvlan ``` #### 8.4.3 运行 Armbian Docker 容器 以 `armbian-trixie:arm64` 镜像为例,说明如何运行 Armbian 容器。 ```shell # 以后台方式运行 Armbian 容器 # 其中的容器名称,IP 地址,镜像版本等根据自己的实际情况修改 docker run -itd --name=armbian-trixie \ --privileged \ --network macvlan \ --ip 10.1.1.15 \ --hostname=armbian-trixie \ -e TZ=Asia/Shanghai \ --restart unless-stopped \ ophub/armbian-trixie:arm64 # 查看 Armbian 容器日志 docker logs -f armbian-trixie # 进入 Armbian 容器 docker exec -it armbian-trixie bash # 退出 Armbian 容器 exit # 停止并删除 Armbian 容器 docker rm -f armbian-trixie ``` ## 9. 编译 Armbian 内核 支持在 Ubuntu、Debian 或 Armbian 系统中编译内核,同时支持本地编译和 GitHub Actions 云编译,具体方法详见 [内核编译说明](../../compile-kernel/README.cn.md)。 ### 9.1 如何添加自定义内核补丁 当内核补丁目录 [tools/patch](../../compile-kernel/tools/patch) 中有通用内核补丁目录(`common-kernel-patches`),或者有 `与内核源码库同名` 的目录时(例如 [linux-5.15.y](https://github.com/unifreq/linux-5.15.y)),可以使用 `-p true` 自动应用内核补丁。补丁目录的命名规范如下: ```shell ~/amlogic-s9xxx-armbian └── compile-kernel └── tools └── patch ├── common-kernel-patches # 固定目录名:存放各版本都通用的内核补丁 ├── linux-5.15.y # 与内核源码库同名:存放专用补丁 ├── linux-6.1.y ├── linux-5.10.y-rk35xx └── more kernel directory... ``` - 在本地编译内核时,可以手动创建相应目录,添加对应的自定义内核补丁。 - 在 GitHub Actions 云编译时,可通过 `kernel_patch` 参数指定内核补丁在仓库中的目录,例如 [kernel](https://github.com/ophub/kernel) 仓库中 [compile-beta-kernel.yml](https://github.com/ophub/kernel/blob/main/.github/workflows/compile-beta-kernel.yml) 的使用方法: ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 5.15.1_6.1.1 kernel_auto: true kernel_patch: kernel-patch/beta auto_patch: true ``` 当使用 `kernel_patch` 参数指定自定义内核补丁时,补丁目录请参照上述规范进行命名。 ### 9.2 如何制作内核补丁 - 从 [Armbian](https://github.com/armbian/build) 和 [OpenWrt](https://github.com/openwrt/openwrt) 等仓库获取:例如 [armbian/patch/kernel](https://github.com/armbian/build/tree/main/patch/kernel/archive) 和 [openwrt/rockchip/patches-6.1](https://github.com/openwrt/openwrt/tree/main/target/linux/rockchip/patches-6.1),[lede/rockchip/patches-5.15](https://github.com/coolsnowwolf/lede/tree/master/target/linux/rockchip/patches-5.15) 等,这些基于主线内核的仓库中的补丁通常可直接使用。 - 从 github.com 仓库的 commits 中获取:在对应的 `commit` 地址后添加 `.patch` 后缀即可生成补丁。 添加自定义内核补丁前,需先与上游内核源码仓库 [unifreq/linux-k.x.y](https://github.com/unifreq) 进行比对,确认该补丁尚未被合入,以避免冲突。通过测试的内核补丁,建议向 unifreq 维护的系列内核仓库提交。社区的每一份贡献,都将使 Armbian 和 OpenWrt 系统更加稳定可靠。 ### 9.3 如何自定义编译驱动模块 Linux 主线内核中部分驱动尚未内置,可自行编译驱动模块。请选择支持主线内核的驱动,安卓驱动通常不兼容主线内核,无法编译。示例如下: ```shell # 第一步,更新最新内核 # 由于早期的 header 文件不全,所以需要更新到最新的内核。 # 各内核版本要求不低于 5.10.222, 5.15.163, 6.1.100, 6.6.41。 armbian-sync armbian-update -k 6.1 # 第二步,安装编译工具 mkdir -p /usr/local/toolchain cd /usr/local/toolchain # 下载编译工具 wget https://github.com/ophub/kernel/releases/download/dev/arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz # 解压 tar -Jxf arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz # 安装其他编译依赖包(可选项,可根据错误提示手动安装缺少项) armbian-kernel -u # 第三步,下载驱动,编译 # 下载驱动源码 cd ~/ git clone https://github.com/jwrdegoede/rtl8189ES_linux cd rtl8189ES_linux # 设置编译环境 gun_file="arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz" toolchain_path="/usr/local/toolchain" toolchain_name="gcc" export CROSS_COMPILE="${toolchain_path}/${gun_file//.tar.xz/}/bin/aarch64-none-linux-gnu-" export CC="${CROSS_COMPILE}gcc" export LD="${CROSS_COMPILE}ld.bfd" export ARCH="arm64" export KSRC=/usr/lib/modules/$(uname -r)/build # 根据源码的实际路径设置 M 变量 export M="/root/rtl8189ES_linux" # 编译驱动 make # 第四步,安装驱动 sudo cp -f 8189es.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/ # 更新模块依赖关系 sudo depmod -a # 加载驱动模块 sudo modprobe 8189es # 检查驱动是否加载成功 lsmod | grep 8189es # 可以看到成功加载驱动 8189es 1843200 0 cfg80211 917504 2 8189es,brcmfmac ``` 图示如下:
image
image
image
## 10. 更新 Armbian 内核 登录 Armbian 系统 → 输入命令: ```shell # 使用 root 用户运行 (sudo -i) # 如果不指定参数,将更新为最新版本。 armbian-update ``` | 可选参数 | 默认值 | 选项 | 说明 | | -------- | ------------ | ------------- | -------------------------------- | | -r | ophub/kernel | `/` | 设置从 github.com 下载内核的仓库 | | -u | 自动化 | stable/flippy/beta/rk3588/rk35xx/h6 | 设置使用的内核的 [tags 后缀](https://github.com/ophub/kernel/releases) | | -k | 最新版 | 内核版本 | 设置[内核版本](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | -b | yes | yes/no | 更新内核时自动备份当前系统使用的内核 | | -d | deb | tar/deb | 设置优先使用的内核包格式。若指定格式不存在,脚本将自动尝试另一种格式。如需编译自定义驱动推荐选择 `deb` 格式。 | | -m | no | yes/no | 使用主线 u-boot | | -s | 无 | 无/磁盘名称 | [SOS] 恢复 eMMC/NVMe/sdX 等磁盘中的系统内核 | | -h | 无 | 无 | 查看使用帮助 | 举例: `armbian-update -k 5.15 -u stable -d deb` 通过 `-k` 参数指定内核版本号时,既可精确指定版本号(如 `armbian-update -k 5.15.50`),也可指定内核系列(如 `armbian-update -k 5.15`),指定系列时将自动使用该系列的最新版本。 更新内核时将自动备份当前使用的内核至 `/ddbr/backup` 目录,保留最近 3 个版本。若新内核不稳定,可随时恢复至备份版本: ```shell # 进入备份的内核目录,如 6.6.12 cd /ddbr/backup/6.6.12 # 执行更新内核命令,会自动安装当前目录下的内核 armbian-update ``` [SOS]:当因异常情况导致更新不完整、系统无法从 eMMC/NVMe/sdX 启动时,可从 USB 等其他磁盘启动任意版本的 Armbian 系统,然后运行 `armbian-update -s` 命令将 USB 中的系统内核恢复至 eMMC/NVMe/sdX,实现系统救援。不指定磁盘参数时,默认从 USB 设备恢复 eMMC/NVMe/sdX 中的内核。若设备有多个磁盘,可精确指定目标磁盘名称,示例如下: ```shell # 恢复 eMMC 中的内核 armbian-update -s mmcblk1 # 恢复 NVMe 中的内核 armbian-update -s nvme0n1 # 恢复移动存储设备中的内核 armbian-update -s sda # 磁盘名称可以简写为 mmcblk0/mmcblk1/nvme0n1/nvme1n1/sda/sdb/sdc 等,也可以使用完整的名称,如 /dev/sda armbian-update -s /dev/sda # 当设备只有 eMMC/NVMe/sdX 中的一个内置存储时,可以省略磁盘名称参数 armbian-update -s ``` 如果您因网络问题无法访问 github.com 进行在线更新,可以手动下载内核文件并上传至 Armbian 系统的任意目录。随后进入该目录,运行 `armbian-update` 命令即可执行本地安装。若当前目录下存在完整的内核文件集,系统将优先使用本地文件进行更新。内核支持 `tar` 和 `deb` 两种格式,各自所需的 4 个核心文件如下: - `tar` 格式更新所需的 4 个文件为:`header-xxx.tar.gz`,`boot-xxx.tar.gz`,`dtb-xxx.tar.gz`,`modules-xxx.tar.gz`。 - `deb` 格式更新所需的 4 个文件为:`linux-image-xxx.deb`,`linux-dtb-xxx.deb`,`linux-headers-xxx.deb`,`linux-libc-dev-xxx.deb`。 - 无需移除其他无关的内核文件,即使它们同时存在也不会影响更新,系统能够精准识别所需文件。在设备支持的内核范围内,您可以自由切换版本,例如从 6.6.12 内核变更为 5.15.50 内核。 通过 `-r`/`-u`/`-b`/`-d` 等参数设置的自定义选项,可固化至配置文件 `/etc/ophub-release` 的相关参数中,无需每次手动输入。对应设置为: ```shell # 自定义修改参数的赋值 -r : KERNEL_REPO='ophub/kernel' -u : KERNEL_TAGS='stable' -b : KERNEL_BACKUP='yes' -d : DOWNLOAD_TYPE='deb' ``` ## 11. 安装常用软件 登录 Armbian 系统 → 输入命令: ```shell armbian-software ``` 使用 `armbian-software -u` 命令可更新本地软件中心列表。根据用户在 [Issue](https://github.com/ophub/amlogic-s9xxx-armbian/issues) 中的反馈,逐步整合常用[软件](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf),支持一键安装、更新和卸载。包括 `docker 镜像`、`桌面软件`、`应用服务` 等。详见更多[说明](armbian_software.md)。 根据所在国家或地区,使用 `armbian-apt` 命令选择合适的软件源以提高下载速度。例如,选择中国的清华大学源: ```shell armbian-apt [ STEPS ] Welcome to the Armbian source change script. [ INFO ] Please select a [ bookworm ] mirror site. ┌──────┬───────────────────┬────────────────────────────────┐ │ ID │ Country/Region │ Mirror Site │ ├──────┼───────────────────┼────────────────────────────────┤ │ 0 │ - │ Restore default source │ │ 1 │ China │ mirrors.tuna.tsinghua.edu.cn │ │ 2 │ China │ mirrors.bfsu.edu.cn │ │ 3 │ China │ mirrors.aliyun.com │ │ 4 │ Hongkong, China │ mirrors.xtom.hk │ │ 5 │ Taiwan, China │ opensource.nchc.org.tw │ ├──────┼───────────────────┼────────────────────────────────┤ │ 6 │ United States │ mirrors.ocf.berkeley.edu │ │ 7 │ United States │ mirrors.xtom.com │ │ 8 │ United States │ mirrors.mit.edu │ │ 9 │ Canada │ mirror.csclub.uwaterloo.ca │ │ 10 │ Canada │ muug.ca/mirror │ ├──────┼───────────────────┼────────────────────────────────┤ │ 11 │ Finland │ mirror.kumi.systems │ │ 12 │ Netherlands │ mirrors.xtom.nl │ │ 13 │ Germany │ mirrors.xtom.de │ │ 14 │ Russia │ mirror.yandex.ru │ │ 15 │ India │ in.mirror.coganng.com │ ├──────┼───────────────────┼────────────────────────────────┤ │ 16 │ Estonia │ mirrors.xtom.ee │ │ 17 │ Australia │ mirrors.xtom.au │ │ 18 │ South Korea │ mirror.yuki.net.uk │ │ 19 │ Singapore │ mirror.sg.gs │ │ 20 │ Japan │ mirrors.xtom.jp │ └──────┴───────────────────┴────────────────────────────────┘ [ OPTIONS ] Please Input ID: 1 [ INFO ] Your selected source ID is: [ 1 ] [ STEPS ] Start to change the source of the system: [ mirrors.tuna.tsinghua.edu.cn ] [ INFO ] The system release is: [ bookworm ] [ SUCCESS ] Change the source of the system successfully. ``` ## 12. 常见问题 以下汇总了使用 Armbian 过程中可能遇到的常见问题。 ### 12.1 每个盒子的 dtb 和 u-boot 对应关系表 支持的设备列表位于 Armbian 系统的配置文件 [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf)。 ### 12.2 LED 屏显示控制说明 请查阅[说明](led_screen_display_control.md) ### 12.3 如何恢复原安卓 TV 系统 通常使用 `armbian-ddbr` 对设备的安卓 TV 系统进行备份和恢复。 此外,也可通过线刷方式将安卓系统写入 eMMC。安卓系统镜像可在 [Tools](https://github.com/ophub/kernel/releases/tag/tools) 中查找。 #### 12.3.1 使用 armbian-ddbr 备份恢复 建议在安装 Armbian 系统前,先备份设备原有的安卓 TV 系统,以便后续需要时恢复。从 `TF/SD/USB` 启动 Armbian 系统后,输入 `armbian-ddbr` 命令,根据提示输入 `b` 执行备份,备份文件存放路径为 `/ddbr/BACKUP-arm-64-emmc.img.gz`,请妥善保存。需要恢复时,将备份文件上传至 `TF/SD/USB` 设备的相同路径,输入 `armbian-ddbr` 命令,根据提示输入 `r` 执行恢复。 #### 12.3.2 使用 Amlogic 刷机工具恢复 - 通常情况下,重新接入电源后若能从 USB 启动,重新安装即可,可多次尝试。 - 若接入显示器后屏幕黑屏且无法从 USB 启动,则需对设备进行短接初始化。先将设备恢复至原安卓系统,再重新刷入 Armbian。首先下载并安装 [amlogic_usb_burning_tool](https://github.com/ophub/kernel/releases/tag/tools) 系统恢复工具。准备一条 [USB 双公头数据线](https://user-images.githubusercontent.com/68696949/159267576-74ad69a5-b6fc-489d-b1a6-0f8f8ff28634.png),准备一个 [曲别针](https://user-images.githubusercontent.com/68696949/159267790-38cf4681-6827-4cb6-86b2-19c7f1943342.png)。 - 以 x96max+ 为例,确认主板上[短接点](https://user-images.githubusercontent.com/68696949/110590933-67785300-81b3-11eb-9860-986ef35dca7d.jpg)的位置,下载设备的 [Android TV 系统包](https://github.com/ophub/kernel/releases/tag/tools)。其他常见设备的安卓 TV 系统及对应短接点示意图也可在此[下载查看](https://github.com/ophub/kernel/releases/tag/tools)。 ```shell 操作方法: 1. 打开刷机软件 USB Burning Tool: [ 文件 → 导入系统包 ]: X96Max_Plus2_20191213-1457_ATV9_davietPDA_v1.5.img [ 选择 ]:擦除 flash [ 选择 ]:擦除 bootloader 点击 [ 开始 ] 按钮 2. 使用 [ 曲别针 ] 将盒子主板上的 [ 两个短接点进行短接连接 ], 并同时使用 [ USB 双公头数据线 ] 将 [ 盒子 ] 与 [ 电脑 ] 进行连接。 3. 当看到 [ 进度条开始走动 ] 后,拿走曲别针,不再短接。 4. 当看到 [ 进度条 100% ], 则刷机完成,盒子已经恢复成 Android TV 系统。 点击 [ 停止 ] 按钮, 拔掉 [ 盒子 ] 和 [ 电脑 ] 之间的 [ USB 双公头数据线] 。 5. 如果以上某个步骤失败,就再来一次,直至成功。 如果进度条没有走动,可以尝试插入电源。通常情况下不用电源支持供电,只 USB 双公头的供电即可满足刷机要求。 ``` 恢复出厂设置完成后,设备已还原为 Android TV 系统。后续安装 Armbian 的操作与首次安装相同,按原流程操作即可。 ### 12.4 设置盒子从 USB/TF/SD 中启动 根据实际情况,选择初次安装或重新安装 Armbian 系统的对应方法。 #### 12.4.1 初次安装 Armbian 系统 - 将写好系统的 USB/TF/SD 插入设备。 - 开启开发者模式: 设置 → 关于本机 → 版本号 (如: X96max plus...), 快速点击版本号 5 次,直到系统显示 `开启开发者模式` 提示。 - 开启 USB 调试模式: 系统 → 高级选项 → 开发者选项 (设置 `开启USB调试` 为启用)。启用 `ADB` 调试。 - 安装 ADB 工具:下载 [adb](https://github.com/ophub/kernel/releases/tag/tools) 并解压,将 `adb.exe`,`AdbWinApi.dll`,`AdbWinUsbApi.dll` 三个文件复制到 `c://windows/` 目录下的 `system32` 和 `syswow64` 文件夹中。打开 `cmd` 命令面板,执行 `adb --version` 命令,若有输出则表示安装成功。 - 进入 `cmd` 命令模式,输入 `adb connect 192.168.1.137` 命令(其中 IP 根据设备实际情况修改,可在路由器管理界面查看),连接成功后将显示 `connected to 192.168.1.137:5555` - 输入 `adb shell reboot update` 命令,设备将重启并从 USB/TF/SD 启动。通过浏览器访问系统 IP 地址或使用 SSH 连接即可进入系统。 #### 12.4.2 重新安装 Armbian 系统 - 正常情况下,将写好 Armbian 的 U 盘插入 USB 即可直接启动,USB 启动优先于 eMMC。 - 若个别设备无法从 U 盘启动,可将 eMMC 中 Armbian 系统 `/boot` 目录下的 `boot.scr` 文件重命名(如 `boot.scr.bak`),再插入 U 盘即可正常启动。 ### 12.5 禁用红外接收器 系统默认启用红外接收器支持。若将设备用作服务器,建议禁用 IR 内核模块以防止误触关机。完全禁用 IR 的方法:添加以下内容 ```shell blacklist meson_ir ``` 至 `/etc/modprobe.d/blacklist.conf` 并重启。 ### 12.6 启动引导文件的选择 - 目前已知设备中,仅 `T95(s905x)` / `T95Z-Plus(s912)` / `BesTV-R3300L(s905l-b)` 等少数设备需要使用 `/bootfs/extlinux/extlinux.conf` 文件,系统已默认添加。其他设备如有需要,将系统写入 USB 后打开 `boot` 分区,将系统自带的 `/boot/extlinux/extlinux.conf.bak` 文件名称中的 `.bak` 删除即可使用。写入 eMMC 时,`armbian-install` 会自动检查并在 `extlinux.conf` 文件存在时自动创建。 - 其他设备仅需 `/boot/uEnv.txt` 即可启动,请勿修改 `extlinux.conf.bak` 文件。 ### 12.7 网络设置 #### 12.7.1 使用 interfaces 设置网络 网络配置文件 `/etc/network/interfaces` 的默认内容如下: ```shell source /etc/network/interfaces.d/* # Network is managed by Network manager auto lo iface lo inet loopback ``` ##### 12.7.1.1 由 DHCP 动态分配 IP 地址 ```shell source /etc/network/interfaces.d/* auto eth0 iface eth0 inet dhcp ``` ##### 12.7.1.2 手动设置静态 IP 地址 其中的 IP 和网关和 DNS 根据自己的网络情况修改。 ```shell source /etc/network/interfaces.d/* auto eth0 allow-hotplug eth0 iface eth0 inet static hwaddress ether 12:34:56:78:9A:DA address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1 ``` ##### 12.7.1.3 在 docker 中使用 OpenWrt 建立互通网络 其中的 MAC 地址根据自己的需要修改。 ```shell source /etc/network/interfaces.d/* allow-hotplug eth0 no-auto-down eth0 auto eth0 iface eth0 inet manual auto macvlan iface macvlan inet dhcp pre-up ip link add macvlan link eth0 type macvlan mode bridge post-down ip link del macvlan link eth0 type macvlan mode bridge auto lo iface lo inet loopback ``` #### 12.7.2 使用 NetworkManager 管理网络 ##### 12.7.2.1 新建网络连接 新建或修改网络连接前的准备工作 ###### 12.7.2.1.1 获取网络接口名称 查看设备中可用的网络接口。 ```shell nmcli device | grep -E "^[e].*|^[w].*|^[D].*|^[T].*" | awk '{printf "%-19s%-19s\n",$1,$2}' ``` 执行命令后返回内容, `DEVICE` 列显示网络接口名称, `TYPE` 列显示网络接口类型。 其中 `eth0` = 第1块有线网卡的名称, `eth1` = 第2块有线网卡的名称, 以此类推, 无线网卡同理。 ```shell DEVICE TYPE eth0 ethernet eth1 ethernet eth2 ethernet eth3 ethernet wlan0 wifi wlan1 wifi ``` ###### 12.7.2.1.2 获取现有网络连接名称 查看设备现有的网络连接(包含已启用和未启用的连接)。新建连接时,建议使用不同于现有连接的名称。 ```shell nmcli connection show | grep -E ".*|^[N].*" | awk '{printf "%-19s%-19s\n", $1,$3}' ``` 执行命令后返回内容, `NAME` 列显示现有网络连接名称, `TYPE` 列显示网络接口类型。 其中 `ethernet` = 有线网卡, `wifi` = 无线网卡, `bridge` = 网桥 ```shell NAME TYPE cnc ethernet lan ethernet lte ethernet tel ethernet docker0 bridge titanium wifi cpe wifi ``` ###### 12.7.2.1.3 新建有线网络连接 在网络接口 `eth0` 上新建网络连接并立即生效 (`动态 IP 地址` - `IPv4 / IPv6`)。 ```shell # Set ENV MYCON=ether1 # 新建网络连接名称 MYETH=eth0 # 网络接口名称 = eth0 / eth1 / eht2 / eth3 IPV6AGM=stable-privacy # IPv6 地址状态模式 = stable-privacy / eui64 # Add ETH nmcli connection add \ con-name $MYCON \ type ethernet \ ifname $MYETH \ autoconnect yes \ ipv6.addr-gen-mode $IPV6AGM nmcli connection up $MYCON ip -c -br address ``` 在网络接口 `eth0` 上新建网络连接并立即生效 (`静态 IP 地址` - `IPv4`)。 ```shell # Set ENV MYCON=ether1 # 网络连接名称 MYETH=eth0 # 网络接口名称 = eth0 / eth1 / eht2 / eth3 IP=192.168.67.167/24 # HOST IP 地址, 其中 24 是子网掩码 对应 255.255.255.0 GW=192.168.67.1 # 网关 DNS=119.29.29.29,223.5.5.5 # DNS 服务器地址 # Chg CON nmcli connection add \ con-name $MYCON \ type ethernet \ ifname $MYETH \ autoconnect yes \ ipv4.method manual \ ipv4.addresses $IP \ ipv4.gateway $GW \ ipv4.dns $DNS nmcli connection up $MYCON ip -c -br address ``` ###### 12.7.2.1.4 新建无线网络连接 在网络接口 `wlan0` 上新建网络连接并立即生效 (`动态 IP 地址` - `IPv4 / IPv6`)。 ```shell # Set ENV MYCON=ssid # 新建网络连接名称, 建议使用 WiFi SSID 来指定连接名称 MYSSID=ssid # WiFi SSID 区分大小写 MYPSWD=passwd # WiFi 密码 MYWSKM=wpa-psk # 安全性选择 WPA-WPA2 = wpa-psk or WPA3 = sae (无线路由器或 AP 中查看是哪一种加密方式) MYWLAN=wlan0 # 网络接口名称 = wlan0 / wlan1 IPV6AGM=stable-privacy # IPv6 地址状态模式 = stable-privacy / eui64 # Add WLAN nmcli connection add \ con-name $MYCON \ type wifi \ ifname $MYWLAN \ autoconnect yes \ ipv6.addr-gen-mode $IPV6AGM \ wifi.ssid $MYSSID \ wifi-sec.key-mgmt $MYWSKM \ wifi-sec.psk $MYPSWD nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.2 修改无线网络连接中的 WiFi SSID or PASSWD 修改无线网络连接 `ssid` 中的 `WiFi SSID or PASSWD` 并立即生效。 ```shell # Set ENV MYCON=ssid # 无线网络连接名称 MYSSID=ssid # WiFi SSID 区分大小写 MYPSWD=passwd # WiFi 密码 MYWSKM=wpa-psk # 安全性选择 WPA-WPA2 = wpa-psk or WPA3 = sae # Add WLAN nmcli connection modify $MYCON \ wifi.ssid $MYSSID \ wifi-sec.key-mgmt $MYWSKM \ wifi-sec.psk $MYPSWD nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.3 修改网络地址分配方式 ###### 12.7.2.3.1 静态 IP 地址 - IPv4 在网络连接 `ether1` 上修改 IP 地址分配方式为 `静态 IP 地址` 并立即生效。 *适用 有线连接 / 无线连接 ```shell # Set ENV MYCON=ether1 # 网络连接名称 IP=192.168.67.167/24 # HOST IP 地址, 其中 24 是子网掩码 对应 255.255.255.0 GW=192.168.67.1 # 网关 DNS=119.29.29.29,223.5.5.5 # DNS 服务器地址 # Chg CON nmcli connection modify $MYCON \ ipv4.method manual \ ipv4.addresses $IP \ ipv4.gateway $GW \ ipv4.dns $DNS nmcli connection up $MYCON ip -c -br address ``` ###### 12.7.2.3.2 DHCP 获取动态 IP 地址 - IPv4 / IPv6 在网络连接 `ether1` 上修改 IP 地址分配方式为 `DHCP 获取动态 IP 地址` 并立即生效。 *适用 有线连接 / 无线连接 ```shell # Set ENV MYCON=ether1 # 网络连接名称 # Chg CON nmcli connection modify $MYCON \ ipv4.method auto \ ipv6.method auto nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.4 修改网络连接 MAC 地址 在网络连接上修改 `MAC 地址` 以解决局域网 MAC 地址冲突问题。 ###### 12.7.2.4.1 方法一:使用 `nmcli` 命令修改 MAC 地址 ```shell # 使用 nmcli connection show 命令查看网络连接名称 nmcli connection show # 返回的结果中包含网口名字,例如'Wired connection 1' NAME UUID TYPE DEVICE Wired connection 1 24d63dc7-c46f-3bf1-912f-1c33eb94338b ethernet eth0 lo 35ca24e5-bdc0-4658-8ac8-435ee22e07f3 loopback lo Wired connection 2 59660b21-b460-30e0-8cb3-89b886556955 ethernet -- # 设置变量 MYCON='Wired connection 1' # 网络连接名称, 注意匹配网络接口类型 MYTYPE='802-3-ethernet' # 网络接口类型 = 有线网卡 / 无线网卡 # = 802-3-ethernet / 802-11-wireless MYMAC='12:34:56:78:9A:BC' # 设置新的 MAC 地址 # 执行修改 nmcli connection modify "${MYCON}" ${MYTYPE}.cloned-mac-address ${MYMAC} nmcli connection up "${MYCON}" ip -c a show "${MYCON}" ``` * 新建或修改部分网络参数, 网络连接可能会被断开, 并重新连接网络。 * 由于软硬件环境不同(盒子, 系统, 网络设备等), 生效所需时间 `1-15` 秒左右, 更长时间未生效的建议检查软硬件环境。 ###### 12.7.2.4.2 方法二:通过配置文件修改 MAC 地址 添加 Mac 地址覆盖配置文件。 ```shell sudo mkdir -p /etc/systemd/network/ sudo nano /etc/systemd/network/10-mac-override.link ``` 添加以下内容: ```shell [Match] # 设置需要修改 MAC 地址的网络接口名称 OriginalName=eth0 [Link] # 设置符合规范的 MAC 地址 MACAddress=02:55:66:77:88:99 ``` 重启后生效。 ##### 12.7.2.5 如何禁用 IPv6 您可以使用 `nmcli` 实用程序在命令行中禁用 `IPv6` 协议,参考来源 [disable-ipv6](https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/using-networkmanager-to-disable-ipv6-for-a-specific-connection_configuring-and-managing-networking)。 第一步,先使用 `nmcli connection show` 命令查看网络连接列表,返回结果如下: ```shell NAME UUID TYPE DEVICE Wired connection 1 8a7e0151-9c66-4e6f-89ee-65bb2d64d366 ethernet eth0 ... ``` 第二步,将连接的 ipv6.method 参数设为 disabled : ```shell nmcli connection modify "Wired connection 1" ipv6.method "disabled" ``` 第三步,重新连接网络: ```shell nmcli connection up "Wired connection 1" ``` 第四步,查看网络连接状态,如果没有显示 inet6 条目,则 IPv6 在该设备上被禁用: ```shell ip address show eth0 ``` 第五步,验证 `/proc/sys/net/ipv6/conf/eth0/disable_ipv6` 文件现在是否包含值 `1` ```shell # cat /proc/sys/net/ipv6/conf/eth0/disable_ipv6 1 ``` 也可以通过修改 `/etc/sysctl.conf` 文件来禁用 IPv6: ```shell # Disable IPv6 by default net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 ``` #### 12.7.3 如何启用无线 部分设备支持无线网络,启用方法如下: ```shell # 安装管理工具 sudo apt-get install network-manager # 查看网络设备 sudo nmcli dev # 启用无线 sudo nmcli r wifi on # 扫描无线 sudo nmcli dev wifi # 连接无线 sudo nmcli dev wifi connect "wifi名称" password "wifi密码" # 显示已保存的网络连接列表 sudo nmcli connection show # 断开连接 sudo nmcli connection down "wifi名称" # 忘记连接并取消自动连接 sudo nmcli connection delete "wifi名称" ```
image
#### 12.7.4 如何启用蓝牙 部分设备支持蓝牙,启用方法如下: ```shell # 安装蓝牙支持 armbian-config >> Network >> BT: Install Bluetooth support # 重启系统 reboot ``` 系统重启后,检查蓝牙驱动是否正常加载。桌面系统可通过菜单连接蓝牙设备,也可通过终端命令操作。 ```shell dmesg | grep Bluetooth ```
image
image
```shell # 连接蓝牙设备 armbian-config >> Network >> BT: Discover and connect Bluetooth devices ``` 也可以在终端中使用命令安装: ```shell # 查看蓝牙服务运行状态 sudo systemctl status bluetooth # 如果未启动,先开启蓝牙服务 sudo systemctl enable bluetooth sudo systemctl start bluetooth # 扫描附近的蓝牙设备 bluetoothctl scan on # 启用蓝牙发现 bluetoothctl discoverable on # 进行蓝牙 MAC 地址配对 bluetoothctl pair 12:34:56:78:90:AB # 查看配对好的蓝牙设备 bluetoothctl paired-devices # 连接蓝牙设备 bluetoothctl connect 12:34:56:78:90:AB # 信任设备,方便以后直接连接 bluetoothctl trust 12:34:56:78:90:AB # 断开蓝牙设备 bluetoothctl disconnect 12:34:56:78:90:AB # 解除蓝牙配对 bluetoothctl remove 12:34:56:78:90:AB # 阻止连接设备 bluetoothctl block 12:34:56:78:90:AB ``` ### 12.8 如何添加开机启动任务 系统已内置自定义开机启动任务脚本,路径为 [/etc/custom_service/start_service.sh](../build-armbian/armbian-files/common-files/etc/custom_service/start_service.sh),可根据个人需求在该脚本中添加自定义任务。 ### 12.9 如何更新系统中的服务脚本 使用 `armbian-sync` 命令可一键将本地系统中的全部服务脚本更新至最新版本。 若 `armbian-sync` 更新失败,可能因命令版本过旧,可通过以下方法手动更新: ```shell wget https://raw.githubusercontent.com/ophub/amlogic-s9xxx-armbian/main/build-armbian/armbian-files/common-files/usr/sbin/armbian-sync -O /usr/sbin/armbian-sync chmod +x /usr/sbin/armbian-sync armbian-sync ``` ### 12.10 如何获取 eMMC 上的安卓系统分区信息 将 Armbian 系统写入 eMMC 时,需先确认设备的安卓系统分区表,确保数据写入安全区域,避免破坏原分区表导致系统无法启动。若写入了不安全的区域,可能无法启动或出现如下错误:
image
#### 12.10.1 获取分区信息 若使用 2022.11 之后本仓库发布的 Armbian,可复制粘贴以下命令获取包含完整分区信息的网址(设备本身无需联网) ```shell ampart /dev/mmcblk2 --mode webreport 2>/dev/null ``` *ampart 的 webreport 模式为 2023.02.03 发布的 v1.2 版本引入的,如果你使用上面的命令无输出,则可能为不支持直接输出网址的旧版,你可以转而使用下面这条命令:* ```shell echo "https://7ji.github.io/ampart-web-reporter/?dsnapshot=$(ampart /dev/mmcblk2 --mode dsnapshot 2>/dev/null | head -n 1)&esnapshot=$(ampart /dev/mmcblk2 --mode esnapshot 2>/dev/null | head -n 1)" ``` 生成的网址格式类似如下: ```shell https://7ji.github.io/ampart-web-reporter/?esnapshot=bootloader:0:4194304:0%20reserved:37748736:67108864:0%20cache:113246208:754974720:2%20env:876609536:8388608:0%20logo:893386752:33554432:1%20recovery:935329792:33554432:1%20rsv:977272832:8388608:1%20tee:994050048:8388608:1%20crypt:1010827264:33554432:1%20misc:1052770304:33554432:1%20instaboot:1094713344:536870912:1%20boot:1639972864:33554432:1%20system:1681915904:1073741824:1%20params:2764046336:67108864:2%20bootfiles:2839543808:754974720:2%20data:3602907136:4131389440:4&dsnapshot=logo::33554432:1%20recovery::33554432:1%20rsv::8388608:1%20tee::8388608:1%20crypt::33554432:1%20misc::33554432:1%20instaboot::536870912:1%20boot::33554432:1%20system::1073741824:1%20cache::536870912:2%20params::67108864:2%20data::-1:4 ``` 将此网址复制到浏览器打开,即可查看格式清晰的 DTB 分区信息和 eMMC 分区信息:
image image
#### 12.10.2 分区信息分享 需要向他人分享分区信息时(如向本仓库汇报新设备情况或寻求帮助),请优先分享网址而非截图。若网址过长,可使用免费的短链接服务。 - 一方面,网页上的分区信息每次访问时均会动态生成,分区可写入的标注及表格格式等可能随时更新。 - 另一方面,截图中的分区参数无法被方便地复制用于计算。 此外,无需额外将参数整理为表格文件,网页表格布局已专门设计为可直接复制粘贴导入 Excel 或 LibreOffice Calc。 #### 12.10.3 分区信息解读 DTB 表记录了安卓 DTB 中每台设备**系统**期望的分区布局,通常以一个大小为自动填充的 `data` 分区结尾。因此,相同系统(必然包括同型号)的设备,DTB 分区布局一定相同。设备上实际的分区布局因 eMMC 容量不同而有所差异,但始终由 DTB 分区布局决定(即已知 DTB 分区布局 +eMMC 准确大小,必然可推知 eMMC 分区情况。 *上面的 DTB 分区信息和 eMMC 分区信息并非来自同一个盒子,你看出来了吗?*)。 eMMC 表是设备上实际的 eMMC 分区布局。其中每一行表示一块存储区域,该区域可能是一个分区,也可能是分区间的间隙(由于晶晨的设计决策,每个分区之间至少有 8M 的间隙,原计划留作他用,但直至 S905X4 仍未使用,造成空间浪费)。对应分区的行中,字体为黑色,且偏移和掩码栏均有数值;对应空隙的行中,字体为灰色,偏移和掩码栏没有数值,且分区名为 `gap` 。 eMMC 表中,每一块存储区域的最后一栏为可写入的情况,绿色且 `yes` 表示这一区域可以写入,红色且 `no` 表示这一区域绝对不可以写入,黄色且有标注则表示某前提的下可以写入,或者只有部分可以写入。 以上表为例,`bootloader` 分区对应的 `0+4M` (`0M~4M`)绝对不可写入,其后的 `32M` 空隙(`4M~36M`)可以写入,`reserved` 分区对应的 `36M+64M` (`36M~100M`)绝对不可写入,其后的空隙一直到 `env` 前的空隙(`100M~836M`)都可以写入,`env` 的1M往后(`837M一直到结尾`)在不需要安卓启动 logo 的情况下都可以写入,则 eMMC 上所有可写入的范围为: - 4M~36M - 100M~836M - 837M~结尾 在需要安卓启动 logo 的情况下,额外的,`logo`分区对应的 852M + 32M (`852M~884M`)不能写入,则 eMMC 上所有的可写入范围为: - 4M~36M - 100M~836M - 837M~852M - 884M~结尾 #### 12.10.4 用于 eMMC 安装 若设备在使用 `armbian-install` 且 `-a` 参数(使用 [ampart](https://github.com/7Ji/ampart) 调整 eMMC 分区布局)为 `yes`(默认值)时失败,则该设备无法使用最优分区布局(即把 DTB 分区信息调整为只有 `data` ,再由此生成 eMMC 分区信息,然后将所有还存在的分区均向前挪动,如此一来,117M 向后的空间便均可使用),你需要在 [armbian-install](../build-armbian/armbian-files/common-files/usr/sbin/armbian-install) 中修改对应的分区信息。 此文件中,声明分区布局的关键参数有三个:`BLANK1`, `BOOT`, `BLANK2`。其中 `BLANK1` 表示从 eMMC 开头算起的不可使用的大小;`BOOT` 表示 `BLANK1` 之后用于存放内核、DTB 等文件的分区大小,建议不小于 256M;`BLANK2` 表示 `BOOT` 之后不可使用的大小;在此之后的空间会全部用来创建 `ROOT` 分区,储存整个系统中 `/boot` 挂载点以外的数据。三者均应为整数,且单位为MiB (1 MiB = 1024 KiB = 1024^2 Byte) 以上述不需要 `logo` 分区的情况为例,为充分利用所有可用空间,由于 `4M~36M` 区域过小无法用作 `BOOT`,只能将其计入 `BLANK1`。`100M~836M` 区域足以用作 `BOOT`,可将其 736M 全部分配给 `BOOT`。其后 `836M~837M` 的不可用区域计入 `BLANK2`,相应参数配置如下(以 `s905x3` 为例,其他 SoC 需修改对应代码块): ```shell # Set partition size (Unit: MiB) elif [[ "${AMLOGIC_SOC}" == "s905x3" ]]; then BLANK1="100" BOOT="736" BLANK2="1" ``` ### 12.11 如何制作 u-boot 文件 u-boot 是引导系统启动的关键文件。Amlogic、Allwinner 和 Rockchip 设备在源码获取和编译流程上略有差异。 #### 12.11.1 如何制作 Amlogic 设备的 u-boot 文件 由于 Amlogic 系列设备厂商大多不开源,需先从设备上提取 u-boot 相关文件,再进行编译。以下方法来自 [unifreq](https://github.com/unifreq) 分享的制作教程。 ##### 12.11.1.1 如何提取 bootloader 和 dtb 文件 提取过程需使用 HxD 软件,可从 [官网下载链接](https://mh-nexus.de/en/downloads.php?product=HxD20) 或 [备份下载链接](https://github.com/ophub/kernel/releases/download/tools/HxDSetup.2.5.0.0.zip) 获取并安装。 在 `cmd` 面板中依次执行以下命令提取相关文件并下载至本地。 ```shell # 使用 adb 工具进入盒子 adb connect 192.168.1.111 adb shell # 导出 bootloader 命令 dd if=/dev/block/bootloader of=/data/local/bootloader.bin # 导出 dtb 命令 cat /dev/dtb >/data/local/mybox.dtb # 导出 gpio 命令 cat /sys/kernel/debug/gpio >/data/local/mybox_gpio.txt # 依次把 bootloader、dtb 和 gpio 文件都下载到本地电脑C盘根目录下的 mybox 文件夹 adb pull /data/local/bootloader.bin C:\mybox adb pull /data/local/mybox.dtb C:\mybox adb pull /data/local/mybox_gpio.txt C:\mybox ``` ##### 12.11.1.2 如何制作 acs.bin 文件 主线 u-boot 中最关键的是 acs.bin 文件,用于内存初始化,原厂 u-boot 位于系统起始 4MB 区域。使用前面获取的 `bootloader.bin` 提取 `acs.bin` 文件。 打开 HxD 软件,打开上面导出的 `bootloader.bin` 文件,`右键 - 选择范围`,起始位置 `F200`,长度 `1000`,选`十六进制`。 image 复制选择的结果,然后新建文件,插入式粘贴,警告忽略,另存为 acs.bin 文件。
image image image
若 bootloader 已锁定,则该区域的代码将显示为乱码,无法使用。正常情况下,该区域应包含大量 `0`,`cfg` 会连续出现数次,并夹杂 `ddr` 相关字样,此类代码为有效可用数据。 ##### 12.11.1.3 如何编译 u-boot 文件 制作 u-boot 需要 https://github.com/unifreq/amlogic-boot-fip 和 https://github.com/unifreq/u-boot 两个源码仓库,用于编译设备所需的 u-boot 文件。 在 amlogic-boot-fip 源码中,各机型仅 acs.bin 文件不同,其余文件通用。 image 制作方法详见 https://github.com/unifreq/u-boot/tree/master/doc/board/amlogic 中的说明,选择对应设备型号进行编译测试。 根据 [unifreq](https://github.com/unifreq) 的方法制作 u-boot,需要使用设备的 acs.bin、dts 和 config 文件。其中安卓系统导出的 dts 无法直接转换为 Armbian 格式,需自行编写对应的 dts 文件。根据设备的具体硬件差异(如开关、LED、电源控制、TF 卡、SDIO WiFi 模块等),参照内核源码库中相似的 [dts](https://github.com/unifreq/linux-5.15.y/tree/main/arch/arm64/boot/dts/amlogic) 文件进行修改。 以制作 X96Max Plus 的 u-boot 为例: ```shell ~/make-uboot ├── amlogic-boot-fip │ ├── x96max-plus # 自己创建目录 │ │ ├── asc.bin # 自己制作源文件 │ │ └── other-copy-files... # 复制其他目录的文件 │ │ │ ├── other-source-directories... │ └── other-source-files... │ └── u-boot ├── configs │ └── x96max-plus_defconfig # 自己制作源文件 ├── arch │ └── arm │ └── dts │ ├── meson-sm1-x96-max-plus-u-boot.dtsi # 自己制作源文件 │ ├── meson-sm1-x96-max-plus.dts # 自己制作源文件 │ └── Makefile # 编辑 ├── fip │ ├── u-boot.bin # 生成文件 │ └── u-boot.bin.sd.bin # 生成文件 ├── u-boot.bin # 生成文件 │ ├── other-source-directories... └── other-source-files... ``` - 下载 [amlogic-boot-fip](https://github.com/unifreq/amlogic-boot-fip) 源码。在根目录创建 [x96max-plus](https://github.com/unifreq/amlogic-boot-fip/tree/master/x96max-plus) 目录,其中除自行制作的 `asc.bin` 文件外,其余文件可从其他目录复制。 - 下载 [u-boot](https://github.com/unifreq/u-boot) 源码。制作对应的 [x96max-plus_defconfig](https://github.com/unifreq/u-boot/blob/master/configs/x96max-plus_defconfig) 文件放入 [configs](https://github.com/unifreq/u-boot/tree/master/configs) 目录。制作对应的 [meson-sm1-x96-max-plus-u-boot.dtsi](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/meson-sm1-x96-max-plus-u-boot.dtsi) 和 [meson-sm1-x96-max-plus.dts](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/meson-sm1-x96-max-plus.dts) 文件放入 [arch/arm/dts](https://github.com/unifreq/u-boot/tree/master/arch/arm/dts) 目录,并编辑此目录中的 [Makefile](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/Makefile) 文件,添加 `meson-sm1-x96-max-plus.dtb` 文件的索引。 - 进入 u-boot 源码根目录,按照文档 https://github.com/unifreq/u-boot/blob/master/doc/board/amlogic/x96max-plus.rst 中的步骤操作。 最终生成两类文件:u-boot 根目录下的 `u-boot.bin` 为 `/boot` 目录使用的精简版 u-boot(对应仓库中的 [overload](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/overload) 目录);在 `fip` 目录下的 `u-boot.bin` 和 `u-boot.bin.sd.bin` 是 `/usr/lib/u-boot/` 目录下使用的完整版 u-boot 文件(对应仓库中的 [bootloader](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader) 目录),完整版两个文件相差 512 字节,较大的文件在头部填充了 512 字节的 0。
image image
💡提示:写入 eMMC 测试前,请先阅读 12.3 节的救砖方法。务必确认已掌握短接点位置、备有原厂 .img 格式的安卓系统文件,并已成功测试短接刷机流程后,方可进行写入测试。 #### 12.11.2 如何制作 Rockchip 设备的 u-boot 文件 Rockchip 设备的大部分厂商已开源 u-boot 源码,可在厂商源码仓库中获取并编译。同时,一些开源贡献者也分享了便捷的 u-boot 编译脚本,以下通过实例介绍几种编译方法。 ##### 12.11.2.1 如何使用 Radxa 的 u-boot 制作脚本 以编译 [Rock5b(rk3588)](https://wiki.radxa.com/Rock5/guide/build-u-boot-on-5b) 为例。 ```shell # 01.安装依赖 sudo apt-get update sudo apt-get install -y git device-tree-compiler libncurses5 libncurses5-dev build-essential libssl-dev mtools bc python dosfstools flex bison # 02.克隆源码 mkdir ~/rk3588-sdk && cd ~/rk3588-sdk git clone -b stable-5.10-rock5 https://github.com/radxa/u-boot.git git clone -b master https://github.com/radxa/rkbin.git git clone -b debian https://github.com/radxa/build.git # 源码说明: # ~/rk3588-sdk/build/:Radxa 辅助脚本文件和用于构建 U-Boot、Linux 内核和根文件系统的配置文件。 # ~/rk3588-sdk/rkbin/:预构建的 Rockchip 二进制文件,包括第一阶段加载程序和 ATF(Arm Trustzone固件)。 # ~/rk3588-sdk/u-boot/:用于启动操作系统(如 Linux 或 Android)的第二阶段引导加载程序。 # 03.编译 u-boot (For ROCK 5B) cd ~/rk3588-sdk ./build/mk-uboot.sh rk3588-rock-5b # 04.构建成功后,将放置在 ~/rk3588-sdk/out/u-boot 目录 ~/rk3588-sdk/out/u-boot ├── idbloader.img ├── rk3588_spl_loader_v1.08.111.bin ├── spi │ └── spi_image.img └── u-boot.itb ``` 通过在 [radxa/build](https://github.com/radxa/build) 源码的 `board_configs.sh` 和 `mk-uboot.sh` 中添加更多选项,可编译其他设备的 u-boot 文件。例如编译 [Beelink-IPC-R(rk3588)](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/415#issuecomment-1508234307) 设备的方法。 ##### 12.11.2.2 如何使用 cm9vdA 的 u-boot 制作脚本 cm9vdA 的开源项目 [cm9vdA/build-linux](https://github.com/cm9vdA/build-linux) 提供了编译 u-boot 和 kernel 的脚本及使用方法。以下为部分 Rockchip 设备 u-boot 编译的过程记录,摘录供参考。 - 编译 Lenovo-Leez-P710(rk3399) 设备的 u-boot:[Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1609#issuecomment-1681494735) - 编译 DLFR100(rk3399) 设备的 u-boot:[Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1522#issuecomment-1622919423) - 编译 ZYSJ(rk3399) 设备的 u-boot:[Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1380#issuecomment-1539325464) ### 12.12 内存大小识别错误 若内存大小识别不正确(4G 内存识别为 1-2G 属异常,识别为 3.7G 属正常),可尝试手动复制 `/boot/UBOOT_OVERLOAD` 文件(注意是`复制`而非`改名`,改名后安装或更新操作将导致无法启动):USB 中使用时保存为 `/boot/u-boot.ext`,eMMC 中使用时保存为 `/boot/u-boot.emmc`。 除排查内存识别问题外,请勿手动复制 u-boot 文件,错误操作可能导致无法启动或其他问题。 ### 12.13 如何反编译 dtb 文件 部分新设备不在当前支持列表中(或存在硬件变体),可通过反编译 dtb 文件调整相关参数进行适配尝试。 ```shell # 安装依赖 sudo apt-get update sudo apt-get install -y device-tree-compiler # 1. 反编译命令(使用 dtb 文件生成 dts 源码) dtc -I dtb -O dts -o xxx.dts xxx.dtb # 2. 编译命令(使用 dts 编译生成 dtb 文件) dtc -I dts -O dtb -o xxx.dtb xxx.dts # 3.保存数据并重启 sync && reboot # 4.[自选动作]根据需求进行测试 # 例如在解决 12.16 中介绍的问题时,重新安装测试 armbian-install ``` ### 12.14 如何修改 cmdline 设置 Amlogic 设备在 `/boot/uEnv.txt` 文件中配置。Rockchip 和 Allwinner 设备在 `/boot/armbianEnv.txt` 文件中配置(添加至 `extraargs` 或 `extraboardargs` 参数)。使用 `/boot/extlinux/extlinux.conf` 的设备在该文件中配置。每次修改后需重启生效。 - 例如 `Home Assistant Supervisor` 仅支持 `docker cgroup v1`,而当前 docker 默认安装 v2 版本。如需切换至 v1,可在 cmdline 中添加 `systemd.unified_cgroup_hierarchy=0` 参数,重启后即可切换至 `docker cgroup v1`。 - 通过在 cmdline 中添加 `max_loop=128` 设置,可以调整允许的 loop 挂载数量。 - 通过在 cmdline 中添加 `usbcore.usbfs_memory_mb=1024` 设置,可以永久将 USBFS 内存缓冲区从默认的 `16 mb` 改为更大(`cat /sys/module/usbcore/parameters/usbfs_memory_mb`),提升 USB 传输大文件的能力。 - 通过在 cmdline 中添加 `usbcore.usb3_disable=1` 设置,可以禁用 USB 3.0 的所有设备。 - 通过在 cmdline 中添加 `extraargs=video=HDMI-A-1:1920x1080@60` 设置,可以将视频显示模式强制为 1080p。
image
image
### 12.15 如何添加新的支持设备 为设备构建 Armbian 系统需要 `设备配置文件`、`系统文件`、`u-boot 文件`和`流程控制文件` 四部分,具体添加方法如下: #### 12.15.1 添加设备配置文件 在配置文件 [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) 中,根据设备的测试结果添加对应配置信息。其中 `BUILD` 值为 `yes` 的是默认构建的设备,对应的 `BOARD` 值`必须唯一`,这些设备可直接使用默认构建的 Armbian 系统。 默认值为 `no` 的设备未包含在默认构建中,使用时需下载相同 `FAMILY` 的 Armbian 系统。写入 `USB` 后,在电脑上打开 `USB 中的 boot 分区`,修改 `/boot/uEnv.txt` 文件中的 `FDT dtb 名称`,即可适配列表中的其他设备。 #### 12.15.2 添加系统文件 通用文件放在:`build-armbian/armbian-files/common-files` 目录下,各平台通用。 平台文件分别放在 `build-armbian/armbian-files/platform-files/` 目录下,[Amlogic](../build-armbian/armbian-files/platform-files/amlogic)、[Rockchip](../build-armbian/armbian-files/platform-files/rockchip) 和 [Allwinner](../build-armbian/armbian-files/platform-files/allwinner) 各自共享平台文件。其中 `bootfs` 目录存放 /boot 分区文件,`rootfs` 目录存放 Armbian 系统文件。 若个别设备有特殊配置需求,在 `build-armbian/armbian-files/different-files` 目录下创建以 `BOARD` 命名的独立目录,按需建立 `bootfs` 目录添加 `/boot` 分区文件,或建立 `rootfs` 目录添加系统文件。目录结构以 Armbian 系统中的实际路径为准,可用于添加新文件或覆盖通用文件和平台文件中的同名文件。 #### 12.15.3 添加 u-boot 文件 `Amlogic` 系列的设备,共用 [bootloader](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader) 文件和 [u-boot](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/overload) 文件,新增文件分别放入对应目录。`bootloader` 文件在系统构建时将自动添加至 Armbian 系统的 `/usr/lib/u-boot` 目录,`u-boot` 文件自动添加至 `/boot` 目录。 `Rockchip` 和 `Allwinner` 系列的设备,为每个设备添加以 `BOARD` 命名的独立 [u-boot](https://github.com/ophub/u-boot/tree/main/u-boot) 文件目录,对应的系列文件放在此目录中。 构建 Armbian 镜像时,这些 u-boot 文件将根据 [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) 中的配置,由 rebuild 脚本写入对应的 Armbian 镜像文件中。 能使用标准 U-Boot 文件的设备,建议优先直接使用。部分设备可能无法编译或获取适用的 U-Boot,若这类设备已能正常运行 Ubuntu 等 Linux 系统,可尝试保留引导相关的关键分区来安装 Armbian 或 OpenWrt。通常需要保留的关键分区包括 `bootloader`、`reserved` 和 `env`。 这些分区可备份后,在制作新的 Armbian 或 OpenWrt 镜像时写回相应位置。制作完成的包含原系统引导分区的镜像,可直接使用 `dd` 命令写入 eMMC,也可使用相应系统的内置工具安装,例如 Armbian 的 `armbian-install` 命令,或 OpenWrt 的 `晶晨宝盒` 插件。 目前采用此方法的设备有 [oes(a311d)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2666),[oes-plus(s922x)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3029),[oec-turbo(rk3566)](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2736),以下以 `oes(a311d)` 设备为例说明具体操作流程。 ##### 12.15.3.1 查看分区信息布局情况 ```shell ampart /dev/mmcblk2 # 得到的分区信息如下: # =================================================================================== # IO seek EPT: Seeking to 37748736 # EPT report: 20 partitions in the table: # =================================================================================== # ID| name | offset|( human)| size|( human)| masks # ----------------------------------------------------------------------------------- # 0: bootloader 0 ( 0.00B) 400000 ( 4.00M) 0 # (GAP) 2000000 ( 32.00M) # 1: reserved 2400000 ( 36.00M) 4000000 ( 64.00M) 0 # (GAP) 800000 ( 8.00M) # 2: cache 6c00000 ( 108.00M) 20000000 ( 512.00M) 2 # (GAP) 800000 ( 8.00M) # 3: env 27400000 ( 628.00M) 800000 ( 8.00M) 0 # (GAP) 800000 ( 8.00M) # ... other partitions ... # =================================================================================== ``` ##### 12.15.3.2 备份关键分区 ```shell dd if=/dev/mmcblk2 of=bootloader.bin bs=1M count=4 skip=0 dd if=/dev/mmcblk2 of=reserved.bin bs=1M count=8 skip=36 dd if=/dev/mmcblk2 of=env.bin bs=1M count=1 skip=628 ``` 备份的文件放在 [u-boot](https://github.com/ophub/u-boot) 仓库对应的目录 [u-boot/amlogic/bootloader/a311d-oes](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader/a311d-oes) 里面。 注意到 reserved 分区为 64MB,但仅备份了 8MB。原因在于 `oes(a311d)` 设备上 `reserved` 分区的前 8MB 为关键数据,后续 56MB 为空白,无需备份。具体查看方法: ```shell # 首先,备份 reserved 分区完整的 64MB 大小的文件: dd if=/dev/mmcblk2 of=reserved_64M.bin bs=1M count=64 skip=36 # 然后,把我们备份出来的 reserved_64M.bin 文件的前 8MB 提取出来: dd if=reserved_64M.bin of=reserved_first_8M.bin bs=1M count=8 # 接下来,查看十六进制内容: hexdump -C reserved_first_8M.bin | less # 现在,我们查看返回结果最后几行的内容: 0071ffd0 4c 5e a8 1f fc 5b 5b 98 ae ef b0 97 0c 3b e8 c2 |L^...[[......;..| 0071ffe0 c8 e0 b2 74 3d 67 d5 3d 24 7b 63 b7 c7 73 f5 d8 |...t=g.=${c..s..| 0071fff0 a1 b8 38 a7 57 d6 b4 b5 e8 1c ba c0 07 0f f5 79 |..8.W..........y| 00720000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00800000 ``` 分析输出结果,最后一个包含非零数据的行的地址是 `0071fff0`。从地址 `00720000` 开始,所有内容都变成了 `00`(零)。hexdump 工具使用 (`*`) 来表示重复的行,这意味着从 `00720000` 一直到 `00800000` (即8MB的末尾) 都是零。把效数据地址 `0x00720000` 换算成十进制是 `7,471,104` 字节,也就是 `7471104 / 1024 / 1024 = 7.125 MB` 大小,因此取整备份 8MB 即可。env 分区同理,仅前 80KB 为有效数据,其余为空白,因此仅备份 1MB。 ##### 12.15.3.3 添加特殊分区写入文件 具体实现细节请参考文件 [/etc/armbian-board-release.conf](https://github.com/ophub/amlogic-s9xxx-armbian/blob/main/build-armbian/armbian-files/different-files/a311d-oes/rootfs/etc/armbian-board-release.conf) 中定义的 `write_board_bootloader` 函数。该函数在镜像重构(rebuild)过程中被调用。此外,该配置文件也是功能强大的设备定制中心。您不仅可以通过 `skip_mb="700"` 等参数来精确控制镜像分区的布局与大小,还可以添加自定义脚本,以实现对内核或其他系统文件的特殊处理。所有针对特定设备的高级定制操作均集中在此文件中统一管理,确保配置清晰高效。 #### 12.15.4 添加流程控制文件 在 [yml 工作流控制文件](../.github/workflows/build-armbian-arm64-server-image.yml) 的 `armbian_board` 中添加对应的 `BOARD` 选项,使其支持在 GitHub Actions 中使用。 ### 12.16 如何解决写入 eMMC 时 I/O 错误的问题 部分设备可从 USB/SD/TF 正常启动 Armbian,但写入 eMMC 时会出现 I/O 写入错误,例如 [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/989) 中的案例,报错内容如下: ```shell [ 284.338449] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.341544] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write [ 284.446972] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.450074] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write [ 284.497746] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.500871] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write ``` 此时可调整 dtb 中的工作模式速度和频率以稳定存储读写。SDR 模式下频率为速度的 2 倍,DDR 模式下频率等于速度。可用模式如下: ```shell sd-uhs-sdr12 sd-uhs-sdr25 sd-uhs-sdr50 sd-uhs-ddr50 sd-uhs-sdr104 max-frequency = <208000000>; ``` 以内核源码的 [dts](https://github.com/unifreq/linux-5.15.y/tree/main/arch/arm64/boot/dts/amlogic) 文件中的代码片段举例: ```shell /* SD card */ &sd_emmc_b { status = "okay"; bus-width = <4>; cap-sd-highspeed; sd-uhs-sdr12; sd-uhs-sdr25; sd-uhs-sdr50; max-frequency = <100000000>; }; /* eMMC */ &sd_emmc_c { status = "okay"; bus-width = <8>; cap-mmc-highspeed; max-frequency = <100000000>; }; ``` 通常将 `&sd_emmc_c` 的频率从 `max-frequency = <200000000>;` 下调至 `max-frequency = <100000000>;` 即可解决。若无效可继续下调至 `50000000` 进行测试,同时可通过调整 `&sd_emmc_b` 配置 `USB/SD/TF`,或使用 `sd-uhs-sdr` 限速。可通过修改 dts 文件并[编译](https://github.com/ophub/amlogic-s9xxx-armbian/tree/main/compile-kernel)生成测试文件,也可参照 `12.13 节` 的方法对现有 dtb 文件进行反编译修改。反编译 dtb 文件时使用十六进制值,其中十进制的 `200000000` 对应的十六进制为 `0xbebc200`,十进制的 `100000000` 对应的十六进制为 `0x5f5e100`,十进制的 `50000000` 对应的十六进制为 `0x2faf080`,十进制的 `25000000` 对应的十六进制为 `0x17d7840`。 除软件层面的优化外,还可通过[硬件升级](https://github.com/ophub/amlogic-s9xxx-armbian/issues/998)和[动手改造](https://www.right.com.cn/forum/thread-901586-1-1.html)解决。 ### 12.17 如何解决 Bullseye 版本没有声音的问题 声音问题的错误日志信息: ```shell Mar 29 15:47:18 armbian-ct2000 kernel: fe.dai-link-0: ASoC: dpcm_fe_dai_prepare() failed (-22) Mar 29 15:47:18 armbian-ct2000 kernel: fe.dai-link-0: ASoC: no backend DAIs enabled for fe.dai-link-0 ``` 请参考 [Bullseye NO Sound](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1000) 中的方法进行设置。 ```shell curl -fsSOL https://github.com/ophub/kernel/releases/download/tools/bullseye_g12_sound-khadas-utils-4-2-any.tar.gz tar -xzf bullseye_g12_sound-khadas-utils-4-2-any.tar.gz -C / systemctl enable sound.service systemctl restart sound.service ``` 重启 Armbian 进行测试。若声音仍无输出,可能是设备使用了旧版 conf 对应的音频输出路径,需在 /usr/bin/g12_sound.sh 中注释掉 `L137-L142` 的新配置(该配置主要适用于 G12B/S922X,旧版 G12A/S905X2 及基于 G12A 的 SM1/S905X3 大多不兼容),并取消 `L130-L134` 旧配置的注释。 ### 12.18 如何编译 boot.scr 文件 Armbian 系统 `/boot` 目录下,`boot.scr` 是系统引导文件,由 `boot.cmd` 源码文件编译生成。修改 `boot.cmd` 后,通过 `mkimage` 命令重新编译即可生成新的 `boot.scr`。 通常无需修改这两个文件,如有调整需求可参考以下方法。 ```shell # 安装依赖 sudo apt-get update sudo apt-get install -y u-boot-tools # 编辑 boot.cmd 文件 cd /boot copy /boot/boot.cmd /boot/boot.cmd.bak copy /boot/boot.scr /boot/boot.scr.bak nano boot.cmd # 编译命令 mkimage -C none -A arm -T script -d boot.cmd boot.scr # 重启测试 sync reboot # 补充说明 # 在 Amlogic 设备中,在 USB 中使用的是 /boot/boot.scr 文件,写入 eMMC 时使用的是 /boot/boot-emmc.scr 文件。 ``` ### 12.19 如何开启远程桌面和修改默认端口 在软件中心 `armbian-software` 中选择 `201` 安装桌面。安装过程中会询问是否开启远程桌面,输入 `y` 即可启用。远程桌面默认端口为 `3389`,可根据需要自定义端口: ```shell sudo nano /etc/xrdp/xrdp.ini # 修改为自定义端口,例如 5000 port=5000 ``` ### 12.20 TCP 拥塞控制优化方案 针对不同性能的设备,建议采用差异化的网络栈配置以获得最佳体验。请根据您的设备实际情况,编辑配置文件 `/etc/sysctl.conf` 并修改以下两行: - 千兆设备(高性能/现代架构):建议使用 `fq + bbr` 组合,以最大化吞吐量并提升抗丢包能力。 - 百兆设备(低性能/老旧架构):建议使用 `fq_codel + cubic` 组合,以降低 CPU 负载并确保低延迟稳定性。 ```shell # 方案 A:千兆设备/高性能推荐 (Gigabit/High Performance) net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # 方案 B:百兆设备/低性能推荐 (100M/Low Performance) # net.core.default_qdisc = fq_codel # net.ipv4.tcp_congestion_control = cubic ``` ================================================ FILE: documents/README.ja.md ================================================ # Armbian の構築と使用方法 [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) GitHub Actions は Microsoft が提供するサービスであり、高性能な仮想サーバー環境を利用して、プロジェクトの構築、テスト、パッケージング、デプロイが可能です。パブリックリポジトリでは時間制限なく無料で利用でき、1回のコンパイル時間は最大6時間で、Armbian のコンパイルニーズを十分に満たします(通常3時間程度で完了します)。本プロジェクトは技術交流のみを目的としており、不備がありましたらご容赦ください。ネットワーク攻撃や GitHub Actions の悪用はお控えください。 # 目次 - [Armbian の構築と使用方法](#armbian-の構築と使用方法) - [目次](#目次) - [1. 自分の Github アカウントを登録する](#1-自分の-github-アカウントを登録する) - [2. プライバシー変数 GITHUB\_TOKEN 等の設定](#2-プライバシー変数-github_token-等の設定) - [3. リポジトリをフォークしてワークフロー権限を設定する](#3-リポジトリをフォークしてワークフロー権限を設定する) - [4. Armbian システムのカスタマイズファイルの説明](#4-armbian-システムのカスタマイズファイルの説明) - [5. システムのコンパイル](#5-システムのコンパイル) - [5.1 手動コンパイル](#51-手動コンパイル) - [5.2 定期コンパイル](#52-定期コンパイル) - [5.3 デフォルトシステム設定のカスタマイズ](#53-デフォルトシステム設定のカスタマイズ) - [5.4 論理ボリュームを使用して Github Actions のコンパイル領域を拡張する](#54-論理ボリュームを使用して-github-actions-のコンパイル領域を拡張する) - [5.5 Armbian Docker イメージの作成](#55-armbian-docker-イメージの作成) - [6. システムの保存](#6-システムの保存) - [7. システムのダウンロード](#7-システムのダウンロード) - [8. Armbian を EMMC にインストールする](#8-armbian-を-emmc-にインストールする) - [8.1 Amlogic シリーズのインストール方法](#81-amlogic-シリーズのインストール方法) - [8.2 Rockchip シリーズのインストール方法](#82-rockchip-シリーズのインストール方法) - [8.2.1 Radxa-Rock5B のインストール方法](#821-radxa-rock5b-のインストール方法) - [8.2.1.1 microSD へのシステムインストール](#8211-microsd-へのシステムインストール) - [8.2.1.2 eMMC へのシステムインストール](#8212-emmc-へのシステムインストール) - [8.2.1.3 NVMe へのシステムインストール](#8213-nvme-へのシステムインストール) - [8.2.2 電犀牛 R66S のインストール方法](#822-電犀牛-r66s-のインストール方法) - [8.2.3 電犀牛 R68S のインストール方法](#823-電犀牛-r68s-のインストール方法) - [8.2.4 貝殻クラウドのインストール方法](#824-貝殻クラウドのインストール方法) - [8.2.5 我家クラウドのインストール方法](#825-我家クラウドのインストール方法) - [8.2.6 泰山派のインストール方法](#826-泰山派のインストール方法) - [8.3 Allwinner シリーズのインストール方法](#83-allwinner-シリーズのインストール方法) - [8.4 Docker 版 Armbian のインストール方法](#84-docker-版-armbian-のインストール方法) - [8.4.1 Docker 実行環境のインストール](#841-docker-実行環境のインストール) - [8.4.2 macvlan ネットワークの設定](#842-macvlan-ネットワークの設定) - [8.4.3 Armbian Docker コンテナの実行](#843-armbian-docker-コンテナの実行) - [9. Armbian カーネルのコンパイル](#9-armbian-カーネルのコンパイル) - [9.1 カスタムカーネルパッチの追加方法](#91-カスタムカーネルパッチの追加方法) - [9.2 カーネルパッチの作成方法](#92-カーネルパッチの作成方法) - [9.3 カスタムドライバモジュールのコンパイル方法](#93-カスタムドライバモジュールのコンパイル方法) - [10. Armbian カーネルの更新](#10-armbian-カーネルの更新) - [11. よく使うソフトウェアのインストール](#11-よく使うソフトウェアのインストール) - [12. よくある質問](#12-よくある質問) - [12.1 各デバイスの dtb と u-boot の対応表](#121-各デバイスの-dtb-と-u-boot-の対応表) - [12.2 LED ディスプレイ制御の説明](#122-led-ディスプレイ制御の説明) - [12.3 元の Android TV システムの復元方法](#123-元の-android-tv-システムの復元方法) - [12.3.1 armbian-ddbr を使用したバックアップと復元](#1231-armbian-ddbr-を使用したバックアップと復元) - [12.3.2 Amlogic フラッシュツールを使用した復元](#1232-amlogic-フラッシュツールを使用した復元) - [12.4 デバイスを USB/TF/SD から起動する設定](#124-デバイスを-usbtfsd-から起動する設定) - [12.4.1 Armbian システムの初回インストール](#1241-armbian-システムの初回インストール) - [12.4.2 Armbian システムの再インストール](#1242-armbian-システムの再インストール) - [12.5 赤外線レシーバーの無効化](#125-赤外線レシーバーの無効化) - [12.6 ブートファイルの選択](#126-ブートファイルの選択) - [12.7 ネットワーク設定](#127-ネットワーク設定) - [12.7.1 interfaces を使用したネットワーク設定](#1271-interfaces-を使用したネットワーク設定) - [12.7.1.1 DHCP による動的 IP アドレスの割り当て](#12711-dhcp-による動的-ip-アドレスの割り当て) - [12.7.1.2 静的 IP アドレスの手動設定](#12712-静的-ip-アドレスの手動設定) - [12.7.1.3 Docker 内で OpenWrt を使用した相互通信ネットワークの構築](#12713-docker-内で-openwrt-を使用した相互通信ネットワークの構築) - [12.7.2 NetworkManager を使用したネットワーク管理](#1272-networkmanager-を使用したネットワーク管理) - [12.7.2.1 新しいネットワーク接続の作成](#12721-新しいネットワーク接続の作成) - [12.7.2.1.1 ネットワークインターフェース名の取得](#127211-ネットワークインターフェース名の取得) - [12.7.2.1.2 既存のネットワーク接続名の取得](#127212-既存のネットワーク接続名の取得) - [12.7.2.1.3 新しい有線ネットワーク接続の作成](#127213-新しい有線ネットワーク接続の作成) - [12.7.2.1.4 新しい無線ネットワーク接続の作成](#127214-新しい無線ネットワーク接続の作成) - [12.7.2.2 無線ネットワーク接続の WiFi SSID または PASSWD の変更](#12722-無線ネットワーク接続の-wifi-ssid-または-passwd-の変更) - [12.7.2.3 ネットワークアドレス割り当て方式の変更](#12723-ネットワークアドレス割り当て方式の変更) - [12.7.2.3.1 静的 IP アドレス - IPv4](#127231-静的-ip-アドレス---ipv4) - [12.7.2.3.2 DHCP による動的 IP アドレスの取得 - IPv4 / IPv6](#127232-dhcp-による動的-ip-アドレスの取得---ipv4--ipv6) - [12.7.2.4 ネットワーク接続の MAC アドレスの変更](#12724-ネットワーク接続の-mac-アドレスの変更) - [12.7.2.4.1 方法1:`nmcli` コマンドで MAC アドレスを変更する](#127241-方法1nmcli-コマンドで-mac-アドレスを変更する) - [12.7.2.4.2 方法2:設定ファイルで MAC アドレスを変更する](#127242-方法2設定ファイルで-mac-アドレスを変更する) - [12.7.2.5 IPv6 を無効にする方法](#12725-ipv6-を無効にする方法) - [12.7.3 ワイヤレスの有効化方法](#1273-ワイヤレスの有効化方法) - [12.7.4 Bluetooth の有効化方法](#1274-bluetooth-の有効化方法) - [12.8 起動時のタスク追加方法](#128-起動時のタスク追加方法) - [12.9 システム内のサービススクリプトの更新方法](#129-システム内のサービススクリプトの更新方法) - [12.10 eMMC 上の Android システムのパーティション情報の取得方法](#1210-emmc-上の-android-システムのパーティション情報の取得方法) - [12.10.1 パーティション情報の取得](#12101-パーティション情報の取得) - [12.10.2 パーティション情報の共有](#12102-パーティション情報の共有) - [12.10.3 パーティション情報の解読](#12103-パーティション情報の解読) - [12.10.4 eMMC インストールへの使用](#12104-emmc-インストールへの使用) - [12.11 u-boot ファイルの作成方法](#1211-u-boot-ファイルの作成方法) - [12.11.1 Amlogic デバイスの u-boot ファイルの作成方法](#12111-amlogic-デバイスの-u-boot-ファイルの作成方法) - [12.11.1.1 bootloader と dtb ファイルの抽出方法](#121111-bootloader-と-dtb-ファイルの抽出方法) - [12.11.1.2 acs.bin ファイルの作成方法](#121112-acsbin-ファイルの作成方法) - [12.11.1.3 u-boot ファイルのコンパイル方法](#121113-u-boot-ファイルのコンパイル方法) - [12.11.2 Rockchip デバイスの u-boot ファイルの作成方法](#12112-rockchip-デバイスの-u-boot-ファイルの作成方法) - [12.11.2.1 Radxa の u-boot 作成スクリプトの使用方法](#121121-radxa-の-u-boot-作成スクリプトの使用方法) - [12.11.2.2 cm9vdA の u-boot 作成スクリプトの使用方法](#121122-cm9vda-の-u-boot-作成スクリプトの使用方法) - [12.12 メモリサイズの誤認識](#1212-メモリサイズの誤認識) - [12.13 dtb ファイルの逆コンパイル方法](#1213-dtb-ファイルの逆コンパイル方法) - [12.14 cmdline 設定の変更方法](#1214-cmdline-設定の変更方法) - [12.15 新しいサポートデバイスの追加方法](#1215-新しいサポートデバイスの追加方法) - [12.15.1 デバイス設定ファイルの追加](#12151-デバイス設定ファイルの追加) - [12.15.2 システムファイルの追加](#12152-システムファイルの追加) - [12.15.3 u-boot ファイルの追加](#12153-u-boot-ファイルの追加) - [12.15.3.1 パーティション情報レイアウトの確認](#121531-パーティション情報レイアウトの確認) - [12.15.3.2 重要なパーティションのバックアップ](#121532-重要なパーティションのバックアップ) - [12.15.3.3 特殊パーティション書き込みファイルの追加](#121533-特殊パーティション書き込みファイルの追加) - [12.15.4 フロー制御ファイルの追加](#12154-フロー制御ファイルの追加) - [12.16 eMMC への書き込み時の I/O エラーの解決方法](#1216-emmc-への書き込み時の-io-エラーの解決方法) - [12.17 Bullseye バージョンで音が出ない問題の解決方法](#1217-bullseye-バージョンで音が出ない問題の解決方法) - [12.18 boot.scr ファイルのコンパイル方法](#1218-bootscr-ファイルのコンパイル方法) - [12.19 リモートデスクトップの有効化とデフォルトポートの変更方法](#1219-リモートデスクトップの有効化とデフォルトポートの変更方法) - [12.20 TCP 輻輳制御の最適化方法](#1220-tcp-輻輳制御の最適化方法) ## 1. 自分の Github アカウントを登録する 後続のシステムカスタマイズ操作を行うために、アカウントを登録してください。github.com ウェブサイトの右上にある `Sign up` ボタンをクリックし、案内に従って登録を完了してください。 ## 2. プライバシー変数 GITHUB_TOKEN 等の設定 [GitHub ドキュメント](https://docs.github.com/ja/actions/security-guides/automatic-token-authentication#about-the-github_token-secret)によると、各ワークフロージョブの開始時に、GitHub は自動的にユニークな `GITHUB_TOKEN` シークレットを作成し、ワークフローで使用します。ワークフロージョブ内で `${{ secrets.GITHUB_TOKEN }}` を使用して認証できます。 Actions で [Armbian Docker](../.github/workflows/build-armbian-arm64-docker-image.yml) イメージを作成して Docker Hub にプッシュする場合、`DOCKERHUB_USERNAME` と `DOCKERHUB_PASSWORD` の2つのプライバシー変数を設定する必要があります。自分のリポジトリページで、右上の `Settings` > `Secrets and variables` > `Actions` > `Repository secrets` > `New repository secret` ボタンをクリックし、以下の2つのプライバシー変数を追加してください: - 変数名 `DOCKERHUB_USERNAME`:値は Docker Hub のログインユーザー名 - 変数名 `DOCKERHUB_PASSWORD`:値は Docker Hub のログインパスワード ## 3. リポジトリをフォークしてワークフロー権限を設定する リポジトリ https://github.com/ophub/amlogic-s9xxx-armbian を開き、右上の Fork ボタンをクリックして、リポジトリのコードを自分のアカウントにコピーします。フォーク完了後、自分のアカウントの amlogic-s9xxx-armbian リポジトリにアクセスし、右上の `Settings` > `Actions` > `General` > `Workflow permissions` で `Read and write permissions` を選択して保存します。操作の流れは以下の通りです:
## 4. Armbian システムのカスタマイズファイルの説明 システムのコンパイルプロセスは [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) ファイルによって制御されます。workflows ディレクトリ内の他の .yml ファイルはそれぞれ異なる機能を実現するために使用されます。コンパイル時には Armbian 公式の最新コードを使用してリアルタイムにコンパイルされます。関連パラメータについては公式ドキュメントを参照してください。 ```yaml - name: Compile Armbian [ ${{ inputs.set_release }} ] id: compile if: ${{ steps.down.outputs.status }} == 'success' && !cancelled() run: | # Compile method and parameter description: https://docs.armbian.com/Developer-Guide_Build-Options cd build/ ./compile.sh RELEASE=${{ inputs.set_release }} BOARD=odroidn2 BRANCH=current BUILD_MINIMAL=no \ BUILD_ONLY=default HOST=armbian BUILD_DESKTOP=no EXPERT=yes KERNEL_CONFIGURE=no \ COMPRESS_OUTPUTIMAGE="sha" SHARE_LOG=yes echo "status=success" >> ${GITHUB_OUTPUT} ``` `ophub` を使用して Armbian をパッケージングする際、`armbian_files` パラメータにより、ophub の [common-files](https://github.com/ophub/amlogic-s9xxx-armbian/tree/main/build-armbian/armbian-files/common-files) ディレクトリにカスタムファイルを追加または上書きできます。ディレクトリ構造は Armbian のルートディレクトリと同じに保つ必要があり、ファイルがファームウェアに正しく上書きされるようにします(例:デフォルト設定ファイルは `etc/default/` サブディレクトリに配置する必要があります)。例は以下の通りです: ```yaml - name: Rebuild Armbian uses: ophub/amlogic-s9xxx-armbian@main with: build_target: armbian armbian_path: build/output/images/*.img.gz armbian_files: files ... ``` ## 5. システムのコンパイル システムのコンパイルは、手動コンパイル、定期コンパイル、特定イベントによるトリガーコンパイルなど、複数の方法をサポートしています。 ### 5.1 手動コンパイル リポジトリのナビゲーションバーで Actions をクリックし、Build armbian > Run workflow > Run workflow の順にクリックするとコンパイルが開始されます。全プロセスには約3時間かかります。操作の流れは以下の通りです:
### 5.2 定期コンパイル [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) ファイル内で、Cron を使用して定期コンパイルを設定します。5つの異なる位置はそれぞれ 分 (0 - 59) / 時 (0 - 23) / 日 (1 - 31) / 月 (1 - 12) / 曜日 (0 - 6)(日曜日 - 土曜日)を表します。各位置の数値を変更して時刻を設定してください。システムはデフォルトで UTC 標準時を使用しますので、お住まいの国のタイムゾーンに合わせて換算してください。 ```yaml schedule: - cron: '0 17 * * *' ``` ### 5.3 デフォルトシステム設定のカスタマイズ デフォルトのシステム設定情報は [model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) ファイルに記録されています。`BOARD` 名は一意でなければなりません。 `BUILD` 値が `yes` のデバイスはデフォルトで構築されるデバイスであり、対応するシステムを直接使用できます。デフォルト値が `no` のデバイスはデフォルトの構築に含まれておらず、使用する際は同じ `FAMILY` の構築済みシステムをダウンロードする必要があります。`USB` に書き込んだ後、パソコンで `USB の boot パーティション` を開き、`/boot/uEnv.txt` ファイル内の `FDT dtb 名` を変更することで、リスト内の他のデバイスに対応させることができます。 ローカルコンパイル時は `-b` パラメータで指定し、GitHub Actions でのコンパイル時は `armbian_board` パラメータで指定します。`-b all` は `BUILD` が `yes` の全デバイスを構築することを意味します。`BOARD` パラメータを指定する場合、`BUILD` 値が `yes` でも `no` でも構築可能です。例:`-b r68s_s905x3-tx3_s905l3a-cm311` ### 5.4 論理ボリュームを使用して Github Actions のコンパイル領域を拡張する GitHub Actions のデフォルトコンパイル領域は 84G で、システムと必要なパッケージを除くと利用可能な領域は約 50G です。全ファームウェアのコンパイル時に容量不足が発生する場合があり、論理ボリュームを使用してコンパイル領域を約 110G に拡張できます。[.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) ファイルの方法を参照し、以下のコマンドで論理ボリュームを作成し、コンパイル時に論理ボリュームのパスを使用してください。 ```yaml - name: Create simulated physical disk run: | mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1) root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4) sudo truncate -s "${mnt_size}"G /mnt/mnt.img sudo truncate -s "${root_size}"G /root.img sudo losetup /dev/loop6 /mnt/mnt.img sudo losetup /dev/loop7 /root.img sudo pvcreate /dev/loop6 sudo pvcreate /dev/loop7 sudo vgcreate github /dev/loop6 /dev/loop7 sudo lvcreate -n runner -l 100%FREE github sudo mkfs.xfs /dev/github/runner sudo mkdir -p /builder sudo mount /dev/github/runner /builder sudo chown -R runner.runner /builder df -Th ``` ### 5.5 Armbian Docker イメージの作成 Armbian システムの [Docker](https://hub.docker.com/u/ophub) イメージの作成方法については、[armbian_docker](../compile-kernel/tools/script/docker) 作成スクリプトを参照してください。 ## 6. システムの保存 システムの保存設定も [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) ファイルで制御されます。コンパイル完了したシステムはスクリプトにより自動的に GitHub 公式の Releases にアップロードされます。 ```yaml - name: Upload Armbian image to Release uses: ncipollo/release-action@main if: ${{ env.PACKAGED_STATUS }} == 'success' && !cancelled() with: tag: Armbian_${{ env.ARMBIAN_RELEASE }}_${{ env.PACKAGED_OUTPUTDATE }} artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/* allowUpdates: true token: ${{ secrets.GITHUB_TOKEN }} body: | These are the Armbian OS image * OS information Default username: root Default password: 1234 Install command: armbian-install Update command: armbian-update ``` ## 7. システムのダウンロード リポジトリのトップページ右下の Release セクションからアクセスし、自分のデバイスモデルに対応するシステムを選択してください。操作の流れは以下の通りです:
## 8. Armbian を EMMC にインストールする Amlogic、Rockchip、Allwinner のインストール方法はそれぞれ異なります。各デバイスは外部 microSD カード、eMMC、NVMe など異なるストレージメディアをサポートしており、以下ではデバイスタイプ別にインストール方法を説明します。まず [Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases) から対応デバイスの Armbian システムをダウンロードし、.img 形式に解凍して準備してから、デバイスタイプに応じて以下の該当セクションを参照してインストールしてください。 インストール完了後、デバイスを`ルーター`に接続し、起動から約 `2 分`後、ルーターでデバイス名が Armbian の `IP` アドレスを確認し、`SSH` ツールで接続して管理設定を行えます。デフォルトユーザー名は `root`、デフォルトパスワードは `1234`、デフォルトポートは `22` です。


### 8.1 Amlogic シリーズのインストール方法 Armbian システムにログイン(デフォルトユーザー: root, デフォルトパスワード: 1234)→ コマンドを入力: ```shell armbian-install ``` | オプションパラメータ | デフォルト値 | 選択肢 | 説明 | | ------- | ------- | ------ | ----------------- | | -m | no | yes/no | Mainline u-boot を使用 | | -a | yes | yes/no | [ampart](https://github.com/7Ji/ampart) パーティションテーブル調整ツールを使用 | | -l | no | yes/no | List. 全デバイスリストを表示 | 例: `armbian-install -m yes -a no` ### 8.2 Rockchip シリーズのインストール方法 各デバイスのインストール方法は以下の通りです。 #### 8.2.1 Radxa-Rock5B のインストール方法 Radxa-Rock5B は microSD/eMMC/NVMe など複数のストレージメディアをサポートしており、インストール方法はメディアによって異なります。[rk3588_spl_loader_v1.08.111.bin と spi_image.img](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/rock5b) ファイルをダウンロードしておきます。[RKDevTool](https://github.com/ophub/kernel/releases/download/tools/Radxa_rock5b_RKDevTool_Release_v2.96__DriverAssitant_v5.1.1.tar.gz) ツールとドライバをダウンロードしておきます。[Rufus](https://rufus.ie/) または [balenaEtcher](https://www.balena.io/etcher/) 書き込みツールをダウンロードしておきます。 ##### 8.2.1.1 microSD へのシステムインストール Rufus や balenaEtcher などのツールで Armbian システムイメージを microSD に書き込み、microSD をデバイスに挿入すれば使用できます。

##### 8.2.1.2 eMMC へのシステムインストール microSD カードを使用したインストール:Armbian システムイメージを microSD カードに書き込み、microSD カードをデバイスに挿入して起動し、`armbian.img` イメージファイルを microSD カードにアップロードし、`dd` コマンドで Armbian イメージを NVMe に書き込みます。コマンドは以下の通りです: ```Shell dd if=armbian.img of=/dev/mmcblk1 bs=1M status=progress ``` - USB-eMMC リーダーを使用したインストール:eMMC モジュールをパソコンに接続し、Rufus や balenaEtcher などのツールで Armbian システムイメージを eMMC に書き込み、eMMC をデバイスに挿入すれば使用できます。 - Maskrom モードを使用したインストール:開発ボードの電源をオフにします。金色のボタンを押し続けます。USB-A to Type-C ケーブルを ROCK 5B の Type-C ポートに挿し、もう一方を PC に接続します。金色のボタンを離します。USB デバイスで MASKROM デバイスが検出されたことを確認します。リストの空白部分を右クリックし、`rock-5b-emmc.cfg` 設定ファイルを読み込みます(設定ファイルは RKDevTool と同じディレクトリにあります)。`rk3588_spl_loader_v1.08.111.bin` と `Armbian.img` を下図のように設定し、書き込みを選択します。



##### 8.2.1.3 NVMe へのシステムインストール ROCK-5B メインボードには SPI フラッシュが搭載されており、ブートローダーを SPI フラッシュに書き込むことで、SoC の maskrom モードが直接サポートしていない起動メディア(SATA、USB3、NVMe など)からの起動が可能になります。NVMe での起動前に SPI ファイルを書き込む必要があります。方法は以下の通りです: 開発ボードの電源をオフにし、MicroSD カード、eMMC モジュールなどの起動可能なデバイスを取り外します。金色(または一部のリビジョンでは銀色)のボタンを押し続け、USB-A to Type-C ケーブルを ROCK-5B の Type-C ポートに挿し、もう一方を PC に接続します。ボタンを離し、USB デバイスで MASKROM デバイスが検出されたか確認します。リストボックスで右クリックして設定を読み込み、エクスプローラーで設定ファイルを選択します(設定ファイルは RKDevTool と同じディレクトリにあります)。下図に従って `rk3588_spl_loader_v1.08.111.bin` と `spi_image.img` ファイルを選択し、書き込みをクリックします:



- リーダーを使用したインストール:M.2 NVMe SSD を M.2 NVMe SSD-USB3.0 リーダーに挿入してホストに接続します。Rufus や balenaEtcher などのツールで Armbian システムイメージを NVMe に書き込み、NVMe をデバイスに挿入すれば使用できます。 - microSD カードを使用したインストール:Armbian システムイメージを microSD カードに書き込み、microSD カードをデバイスに挿入して起動し、`armbian.img` イメージファイルを microSD カードにアップロードし、`dd` コマンドで Armbian イメージを NVMe に書き込みます。コマンドは以下の通りです: ```Shell dd if=armbian.img of=/dev/nvme0n1 bs=1M status=progress ``` #### 8.2.2 電犀牛 R66S のインストール方法 Rufus や balenaEtcher などのツールで Armbian システムイメージを microSD に書き込み、microSD をデバイスに挿入すれば使用できます。 #### 8.2.3 電犀牛 R68S のインストール方法 - [RKDevTool](https://github.com/ophub/kernel/releases/download/tools/FastRhino_r68s_RKDevTool_Release_v2.86___DriverAssitant_v5.1.1.tar.gz) ツールとドライバをダウンロードし、解凍して DriverAssitant ドライバをインストールし、RKDevTool ツールを開いておきます。 - R68s が電源オフの状態で、まず USB デュアルオスケーブルを挿し、Recovery キーを押しながら 12V 電源を接続し、2秒後に Recovery キーを離すと、フラッシュツールが`LOADER デバイスを発見`します。 - RKDevTool ツールの操作画面の空白部分を右クリックし、項目を追加します。 - アドレスは `0x00000000`、名前は `armbian`、パスの右側をクリックして `armbian.img` システムファイルを選択します。 - 追加した armbian の行以外の`他の行の選択を解除`し、`実行`をクリックして書き込みます。 - 補足説明:eMMC に他のシステムが書き込まれている場合は、まず高度な機能で消去してから、Armbian システムを書き込んでください。消去できない場合は、まず `MiniLoaderAll.bin` ブートファイルを再度書き込み、その後 `MASKROM` に入って Armbian システムを書き込んでください。MiniLoaderAll.bin ブートファイルの設定:アドレス `0xCCCCCCCC`、名前 `Loader`、パスは RKDevTool フラッシュツールの Image ディレクトリにある `MiniLoaderAll.bin` ファイルを選択します。



#### 8.2.4 貝殻クラウドのインストール方法 方法は [milton](https://www.cnblogs.com/milton/p/15391525.html) のチュートリアルから転載しています。フラッシュするには Maskrom モードに入る必要があります。まずすべての接続を切断し、CLK と GND(TTL の GND、または隣の小さいボタンの GND のどちらでも可)の2つの接点をショートさせてから、USB を PC に接続すると MASKROM デバイスが検出されます。ショートポイントの位置は以下の通りです:

RKDevTool フラッシュツールを開き、右クリックで項目を追加します。 - アドレス `0xCCCCCCCC`、名前 `Boot`、パスは [こちら](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/beikeyun) から `rk3328_loader_v1.14.249.bin` を選択します。 - アドレス `0x00000000`、名前 `system`、パスはフラッシュする `Armbian.img` システムを選択します。 - `強制アドレス書き込み` にチェックを入れ、`実行` をクリックし、右側のダウンロードパネルに進捗が完了と表示されるまで待ちます。 #### 8.2.5 我家クラウドのインストール方法 方法は [cc747](https://post.smzdm.com/p/a4wkdo7l/) のチュートリアルから転載しています。フラッシュするには Maskrom モードに入る必要があります。デバイスが電源オフの状態であることを確認し、すべてのケーブルを抜きます。USB デュアルオスケーブルの一方を我家クラウドの USB2.0 ポートに、もう一方をパソコンに接続します。クリップを Reset 穴に挿し、押し続けます。電源ケーブルを接続し、数秒待ち、RKDevTool の下部に `LOADER デバイスを発見` と表示されたらクリップを離します。RKDevTool を `高度な機能` に切り替え、`Maskrom に入る` ボタンをクリックすると、`MASKROM デバイスを発見` と表示されます。右クリックで項目を追加します。 - アドレス `0xCCCCCCCC`、名前 `Boot`、パスは [こちら](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/chainedbox) から `rk3328_loader_v1.14.249.bin` を選択します。 - アドレス `0x00000000`、名前 `system`、パスはフラッシュする `Armbian.img` システムを選択します。 - `強制アドレス書き込み` にチェックを入れ、`実行` をクリックし、右側のダウンロードパネルに進捗が完了と表示されるまで待ちます。

#### 8.2.6 泰山派のインストール方法 - [RKDevTool](https://github.com/ophub/kernel/releases/download/tools/FastRhino_r68s_RKDevTool_Release_v2.86___DriverAssitant_v5.1.1.tar.gz) ツールとドライバをダウンロードし、解凍して DriverAssitant ドライバをインストールし、RKDevTool ツールを開きます。(注意:2.92ではなく2.86バージョンのツールを使用してください。2.92バージョンは書き込み時にクラッシュします) - 泰山派が電源オフの状態で Recovery キーを押しながら Type-C データケーブルを接続し、RKDevTool に `LOADER デバイスを発見` と表示されたら Recovery キーを離します。右クリックで項目を追加します。 - アドレス `0x00000000`、名前 `system`、パスはフラッシュする `Armbian.img` システムを選択します。 - 実行をクリックし、プログレスバーが完了するまで待ちます。 ### 8.3 Allwinner シリーズのインストール方法 Armbian システムにログイン(デフォルトユーザー: root, デフォルトパスワード: 1234)→ コマンドを入力: ```shell armbian-install ``` ### 8.4 Docker 版 Armbian のインストール方法 Ubuntu/Debian/Armbian システムで Docker 版の Armbian イメージを使用できます。これらのイメージは [Docker Hub](https://hub.docker.com/r/ophub) にホストされており、直接ダウンロードして使用できます。 4つの異なるカーネルバージョンの Armbian Docker イメージが提供されています:`armbian-trixie`、`armbian-bookworm`、`armbian-noble`、`armbian-resolute`。各バージョンとも `arm64` と `amd64` アーキテクチャを提供しており、必要に応じて選択できます。 armbian-trixie は debian13 ベース、armbian-bookworm は debian12 ベース、armbian-noble は ubuntu24.04 ベース、armbian-resolute は ubuntu26.04 ベースです。 arm64 バージョンは Amlogic/Rockchip/Allwinner などのプラットフォームアーキテクチャのデバイスに適用され、amd64 バージョンは x86_64 アーキテクチャの PC やサーバーに適用されます。 #### 8.4.1 Docker 実行環境のインストール ```shell curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER sudo newgrp docker ``` #### 8.4.2 macvlan ネットワークの設定 ```shell # 既存の docker ネットワークに macvlan ネットワークが含まれているか確認 docker network ls # macvlan ネットワークがない場合は作成 # サブネット、ゲートウェイ、ネットワークインターフェース名は実際のネットワークに合わせて変更してください docker network create -d macvlan \ --subnet=10.1.1.0/24 \ --gateway=10.1.1.1 \ -o parent=eth0 \ macvlan ``` #### 8.4.3 Armbian Docker コンテナの実行 `armbian-trixie:arm64` イメージを例に、Armbian コンテナの実行方法を説明します。 ```shell # バックグラウンドで Armbian コンテナを実行 # コンテナ名、IPアドレス、イメージバージョンなどは実際の状況に合わせて変更してください docker run -itd --name=armbian-trixie \ --privileged \ --network macvlan \ --ip 10.1.1.15 \ --hostname=armbian-trixie \ -e TZ=Asia/Shanghai \ --restart unless-stopped \ ophub/armbian-trixie:arm64 # Armbian コンテナのログを確認 docker logs -f armbian-trixie # Armbian コンテナに入る docker exec -it armbian-trixie bash # Armbian コンテナから出る exit # Armbian コンテナを停止して削除 docker rm -f armbian-trixie ``` ## 9. Armbian カーネルのコンパイル Ubuntu、Debian、Armbian システムでのカーネルコンパイルをサポートしており、ローカルコンパイルと GitHub Actions クラウドコンパイルの両方に対応しています。詳細な方法については [カーネルコンパイル説明](../../compile-kernel/README.ja.md) を参照してください。 ### 9.1 カスタムカーネルパッチの追加方法 カーネルパッチディレクトリ [tools/patch](../../compile-kernel/tools/patch) に共通カーネルパッチディレクトリ(`common-kernel-patches`)、または `カーネルソースリポジトリと同名` のディレクトリがある場合(例:[linux-5.15.y](https://github.com/unifreq/linux-5.15.y))、`-p true` でカーネルパッチを自動適用できます。パッチディレクトリの命名規則は以下の通りです: ```shell ~/amlogic-s9xxx-armbian └── compile-kernel └── tools └── patch ├── common-kernel-patches # 固定ディレクトリ名:各バージョン共通のカーネルパッチを格納 ├── linux-5.15.y # カーネルソースリポジトリと同名:専用パッチを格納 ├── linux-6.1.y ├── linux-5.10.y-rk35xx └── more kernel directory... ``` - ローカルでカーネルをコンパイルする場合、対応するディレクトリを手動で作成し、カスタムカーネルパッチを追加できます。 - GitHub Actions クラウドコンパイル時は、`kernel_patch` パラメータでリポジトリ内のカーネルパッチディレクトリを指定できます。例えば [kernel](https://github.com/ophub/kernel) リポジトリの [compile-beta-kernel.yml](https://github.com/ophub/kernel/blob/main/.github/workflows/compile-beta-kernel.yml) での使用方法: ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 5.15.1_6.1.1 kernel_auto: true kernel_patch: kernel-patch/beta auto_patch: true ``` `kernel_patch` パラメータでカスタムカーネルパッチを指定する場合、パッチディレクトリは上記の規則に従って命名してください。 ### 9.2 カーネルパッチの作成方法 - [Armbian](https://github.com/armbian/build) や [OpenWrt](https://github.com/openwrt/openwrt) などのリポジトリから取得:例えば [armbian/patch/kernel](https://github.com/armbian/build/tree/main/patch/kernel/archive) や [openwrt/rockchip/patches-6.1](https://github.com/openwrt/openwrt/tree/main/target/linux/rockchip/patches-6.1)、[lede/rockchip/patches-5.15](https://github.com/coolsnowwolf/lede/tree/master/target/linux/rockchip/patches-5.15) など、メインラインカーネルに基づくリポジトリのパッチは通常そのまま使用できます。 - github.com リポジトリのコミットから取得:対応する `commit` アドレスの末尾に `.patch` を追加するとパッチを生成できます。 カスタムカーネルパッチを追加する前に、上流のカーネルソースリポジトリ [unifreq/linux-k.x.y](https://github.com/unifreq) と照合し、そのパッチがまだマージされていないことを確認して、コンフリクトを避けてください。テスト済みのカーネルパッチは、unifreq が管理するカーネルリポジトリシリーズへの提出をお勧めします。コミュニティのすべての貢献が、Armbian と OpenWrt システムをより安定して信頼できるものにします。 ### 9.3 カスタムドライバモジュールのコンパイル方法 Linux メインラインカーネルには一部のドライバがまだ内蔵されていないため、自分でドライバモジュールをコンパイルできます。メインラインカーネルをサポートするドライバを選択してください。Android ドライバは通常メインラインカーネルと互換性がなく、コンパイルできません。例は以下の通りです: ```shell # ステップ1:最新カーネルに更新 # 初期の header ファイルが不完全なため、最新のカーネルに更新する必要があります。 # 各カーネルバージョンの要件:5.10.222, 5.15.163, 6.1.100, 6.6.41 以上 armbian-sync armbian-update -k 6.1 # ステップ2:コンパイルツールのインストール mkdir -p /usr/local/toolchain cd /usr/local/toolchain # コンパイルツールのダウンロード wget https://github.com/ophub/kernel/releases/download/dev/arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz # 解凍 tar -Jxf arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz # その他のコンパイル依存パッケージのインストール(オプション、エラーメッセージに応じて不足分を手動インストール可能) armbian-kernel -u # ステップ3:ドライバのダウンロードとコンパイル # ドライバソースコードのダウンロード cd ~/ git clone https://github.com/jwrdegoede/rtl8189ES_linux cd rtl8189ES_linux # コンパイル環境の設定 gun_file="arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz" toolchain_path="/usr/local/toolchain" toolchain_name="gcc" export CROSS_COMPILE="${toolchain_path}/${gun_file//.tar.xz/}/bin/aarch64-none-linux-gnu-" export CC="${CROSS_COMPILE}gcc" export LD="${CROSS_COMPILE}ld.bfd" export ARCH="arm64" export KSRC=/usr/lib/modules/$(uname -r)/build # ソースコードの実際のパスに基づいて M 変数を設定 export M="/root/rtl8189ES_linux" # ドライバのコンパイル make # ステップ4:ドライバのインストール sudo cp -f 8189es.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/ # モジュール依存関係の更新 sudo depmod -a # ドライバモジュールのロード sudo modprobe 8189es # ドライバがロードされたか確認 lsmod | grep 8189es # 正常にドライバがロードされたことを確認できます 8189es 1843200 0 cfg80211 917504 2 8189es,brcmfmac ``` 図は以下の通りです:
image
image
image
## 10. Armbian カーネルの更新 Armbian システムにログイン → コマンドを入力: ```shell # root ユーザーで実行 (sudo -i) # パラメータを指定しない場合、最新バージョンに更新されます。 armbian-update ``` | オプションパラメータ | デフォルト値 | 選択肢 | 説明 | | -------- | ------------ | ------------- | -------------------------------- | | -r | ophub/kernel | `/` | github.com からカーネルをダウンロードするリポジトリを設定 | | -u | 自動 | stable/flippy/beta/rk3588/rk35xx/h6 | 使用するカーネルの [tags サフィックス](https://github.com/ophub/kernel/releases) を設定 | | -k | 最新版 | カーネルバージョン | [カーネルバージョン](https://github.com/ophub/kernel/releases/tag/kernel_stable) を設定 | | -b | yes | yes/no | カーネル更新時に現在使用中のカーネルを自動バックアップ | | -d | deb | tar/deb | 優先使用するカーネルパッケージ形式を設定。指定形式が存在しない場合、スクリプトは自動的に別の形式を試行します。カスタムドライバをコンパイルする場合は `deb` 形式を推奨。 | | -m | no | yes/no | メインライン u-boot を使用 | | -s | なし | なし/ディスク名称 | [SOS] eMMC/NVMe/sdX などのディスク内のシステムカーネルを復旧 | | -h | なし | なし | 使用方法のヘルプを表示 | 例: `armbian-update -k 5.15 -u stable -d deb` `-k` パラメータでカーネルバージョン番号を指定する場合、正確なバージョン番号の指定(例:`armbian-update -k 5.15.50`)と、カーネルシリーズの指定(例:`armbian-update -k 5.15`)の両方が可能です。シリーズを指定した場合、そのシリーズの最新バージョンが自動的に使用されます。 カーネル更新時には、現在使用中のカーネルが自動的に `/ddbr/backup` ディレクトリにバックアップされ、最新の3バージョンが保持されます。新しいカーネルが不安定な場合、いつでもバックアップバージョンに復元できます: ```shell # バックアップしたカーネルディレクトリに移動(例:6.6.12) cd /ddbr/backup/6.6.12 # カーネル更新コマンドを実行すると、現在のディレクトリ内のカーネルが自動インストールされます armbian-update ``` [SOS]:異常によりアップデートが不完全な状態となり、eMMC/NVMe/sdX からシステムが起動できない場合、USB などの別のディスクから任意のバージョンの Armbian システムを起動し、`armbian-update -s` コマンドを実行して USB 内のシステムカーネルを eMMC/NVMe/sdX に復旧させることで、システムレスキューを行えます。ディスクパラメータを指定しない場合、デフォルトで USB デバイスから eMMC/NVMe/sdX 内のカーネルを復旧します。デバイスに複数のディスクがある場合、ターゲットディスク名を正確に指定できます。例は以下の通りです: ```shell # eMMC 内のカーネルを復旧 armbian-update -s mmcblk1 # NVMe 内のカーネルを復旧 armbian-update -s nvme0n1 # リムーバブルストレージデバイス内のカーネルを復旧 armbian-update -s sda # ディスク名は mmcblk0/mmcblk1/nvme0n1/nvme1n1/sda/sdb/sdc などの省略形や、/dev/sda のような完全名も使用可能 armbian-update -s /dev/sda # デバイスに eMMC/NVMe/sdX のうち1つの内蔵ストレージしかない場合、ディスク名パラメータを省略可能 armbian-update -s ``` ネットワークの問題で github.com にアクセスしてオンライン更新ができない場合、カーネルファイルを手動でダウンロードして Armbian システムの任意のディレクトリにアップロードできます。その後、そのディレクトリに移動し、`armbian-update` コマンドを実行するとローカルインストールが行えます。カレントディレクトリに完全なカーネルファイルセットが存在する場合、システムはローカルファイルを優先して更新に使用します。カーネルは `tar` と `deb` の2つの形式をサポートしており、それぞれ必要な4つのコアファイルは以下の通りです: - `tar` 形式の更新に必要な4ファイル:`header-xxx.tar.gz`、`boot-xxx.tar.gz`、`dtb-xxx.tar.gz`、`modules-xxx.tar.gz` - `deb` 形式の更新に必要な4ファイル:`linux-image-xxx.deb`、`linux-dtb-xxx.deb`、`linux-headers-xxx.deb`、`linux-libc-dev-xxx.deb` - 関係のないカーネルファイルを削除する必要はありません。同時に存在しても更新に影響はなく、システムは必要なファイルを正確に識別できます。デバイスがサポートするカーネル範囲内であれば、バージョンを自由に切り替えることができます(例:6.6.12 カーネルから 5.15.50 カーネルへの変更)。 `-r`/`-u`/`-b`/`-d` などのパラメータで設定したカスタムオプションは、設定ファイル `/etc/ophub-release` の関連パラメータに固定化でき、毎回手動入力する必要がなくなります。対応する設定は以下の通りです: ```shell # カスタムパラメータの値の設定 -r : KERNEL_REPO='ophub/kernel' -u : KERNEL_TAGS='stable' -b : KERNEL_BACKUP='yes' -d : DOWNLOAD_TYPE='deb' ``` ## 11. よく使うソフトウェアのインストール Armbian システムにログイン → コマンドを入力: ```shell armbian-software ``` `armbian-software -u` コマンドでローカルのソフトウェアセンターリストを更新できます。ユーザーからの [Issue](https://github.com/ophub/amlogic-s9xxx-armbian/issues) でのフィードバックに基づき、よく使う [ソフトウェア](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf) を段階的に統合し、ワンクリックでのインストール、更新、アンインストールをサポートしています。`docker イメージ`、`デスクトップソフトウェア`、`アプリケーションサービス` などが含まれます。詳しくは [説明](armbian_software.md) を参照してください。 お住まいの国や地域に応じて、`armbian-apt` コマンドで適切なソフトウェアソースを選択し、ダウンロード速度を向上させてください。例えば、中国の清華大学ソースを選択する場合: ```shell armbian-apt [ STEPS ] Welcome to the Armbian source change script. [ INFO ] Please select a [ bookworm ] mirror site. ┌──────┬───────────────────┬────────────────────────────────┐ │ ID │ Country/Region │ Mirror Site │ ├──────┼───────────────────┼────────────────────────────────┤ │ 0 │ - │ Restore default source │ │ 1 │ China │ mirrors.tuna.tsinghua.edu.cn │ │ 2 │ China │ mirrors.bfsu.edu.cn │ │ 3 │ China │ mirrors.aliyun.com │ │ 4 │ Hongkong, China │ mirrors.xtom.hk │ │ 5 │ Taiwan, China │ opensource.nchc.org.tw │ ├──────┼───────────────────┼────────────────────────────────┤ │ 6 │ United States │ mirrors.ocf.berkeley.edu │ │ 7 │ United States │ mirrors.xtom.com │ │ 8 │ United States │ mirrors.mit.edu │ │ 9 │ Canada │ mirror.csclub.uwaterloo.ca │ │ 10 │ Canada │ muug.ca/mirror │ ├──────┼───────────────────┼────────────────────────────────┤ │ 11 │ Finland │ mirror.kumi.systems │ │ 12 │ Netherlands │ mirrors.xtom.nl │ │ 13 │ Germany │ mirrors.xtom.de │ │ 14 │ Russia │ mirror.yandex.ru │ │ 15 │ India │ in.mirror.coganng.com │ ├──────┼───────────────────┼────────────────────────────────┤ │ 16 │ Estonia │ mirrors.xtom.ee │ │ 17 │ Australia │ mirrors.xtom.au │ │ 18 │ South Korea │ mirror.yuki.net.uk │ │ 19 │ Singapore │ mirror.sg.gs │ │ 20 │ Japan │ mirrors.xtom.jp │ └──────┴───────────────────┴────────────────────────────────┘ [ OPTIONS ] Please Input ID: 1 [ INFO ] Your selected source ID is: [ 1 ] [ STEPS ] Start to change the source of the system: [ mirrors.tuna.tsinghua.edu.cn ] [ INFO ] The system release is: [ bookworm ] [ SUCCESS ] Change the source of the system successfully. ``` ## 12. よくある質問 以下は Armbian 使用時に遭遇する可能性のあるよくある質問をまとめたものです。 ### 12.1 各デバイスの dtb と u-boot の対応表 サポートされるデバイスリストは、Armbian システムの設定ファイル [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) にあります。 ### 12.2 LED ディスプレイ制御の説明 [説明](led_screen_display_control.md) を参照してください。 ### 12.3 元の Android TV システムの復元方法 通常、`armbian-ddbr` を使用してデバイスの Android TV システムのバックアップと復元を行います。 また、ケーブルフラッシュ方式で Android システムを eMMC に書き込むこともできます。Android システムイメージは [Tools](https://github.com/ophub/kernel/releases/tag/tools) から検索できます。 #### 12.3.1 armbian-ddbr を使用したバックアップと復元 Armbian システムをインストールする前に、まずデバイスの元の Android TV システムをバックアップすることをお勧めします。後で必要な場合に復元できます。`TF/SD/USB` から Armbian システムを起動した後、`armbian-ddbr` コマンドを入力し、プロンプトに従って `b` を入力するとバックアップが実行されます。バックアップファイルは `/ddbr/BACKUP-arm-64-emmc.img.gz` に保存されます。大切に保管してください。復元が必要な場合は、バックアップファイルを `TF/SD/USB` デバイスの同じパスにアップロードし、`armbian-ddbr` コマンドを入力して、プロンプトに従って `r` を入力すると復元が実行されます。 #### 12.3.2 Amlogic フラッシュツールを使用した復元 - 通常、電源を再接続後に USB から起動できる場合は、再インストールするだけで済みます。何度か試してみてください。 - ディスプレイを接続後に画面が真っ暗で USB から起動できない場合は、デバイスのショート初期化が必要です。まずデバイスを元の Android システムに復元してから、Armbian を再度フラッシュします。まず [amlogic_usb_burning_tool](https://github.com/ophub/kernel/releases/tag/tools) システム復旧ツールをダウンロードしてインストールします。[USB デュアルオスケーブル](https://user-images.githubusercontent.com/68696949/159267576-74ad69a5-b6fc-489d-b1a6-0f8f8ff28634.png) と [クリップ](https://user-images.githubusercontent.com/68696949/159267790-38cf4681-6827-4cb6-86b2-19c7f1943342.png) を準備します。 - x96max+ を例にすると、メインボード上の [ショートポイント](https://user-images.githubusercontent.com/68696949/110590933-67785300-81b3-11eb-9860-986ef35dca7d.jpg) の位置を確認し、デバイスの [Android TV システムパッケージ](https://github.com/ophub/kernel/releases/tag/tools) をダウンロードします。その他の一般的なデバイスの Android TV システムと対応するショートポイントの図も [こちら](https://github.com/ophub/kernel/releases/tag/tools) からダウンロードして確認できます。 ```shell 操作方法: 1. フラッシュソフトウェア USB Burning Tool を開く: [ ファイル → システムパッケージをインポート ]: X96Max_Plus2_20191213-1457_ATV9_davietPDA_v1.5.img [ 選択 ]:flash を消去 [ 選択 ]:bootloader を消去 [ 開始 ] ボタンをクリック 2. [ クリップ ] を使用してデバイスのメインボード上の [ 2つのショートポイントを短絡接続 ] し、 同時に [ USB デュアルオスケーブル ] で [ デバイス ] と [ パソコン ] を接続する。 3. [ プログレスバーが動き始めた ] のを確認したら、クリップを外し、短絡を解除する。 4. [ プログレスバーが 100% ] になったらフラッシュ完了。デバイスは Android TV システムに復元されています。 [ 停止 ] ボタンをクリックし、[ デバイス ] と [ パソコン ] の間の [ USB デュアルオスケーブル ] を抜く。 5. 上記のいずれかのステップが失敗した場合は、成功するまで再試行してください。 プログレスバーが動かない場合は、電源を接続してみてください。通常は電源不要で、USB デュアルオスケーブルの給電のみでフラッシュ要件を満たせます。 ``` 工場出荷時設定へのリセットが完了すると、デバイスは Android TV システムに復元されています。後続の Armbian のインストール操作は初回インストールと同じで、元の手順に従って操作してください。 ### 12.4 デバイスを USB/TF/SD から起動する設定 実際の状況に応じて、Armbian システムの初回インストールまたは再インストールの対応する方法を選択してください。 #### 12.4.1 Armbian システムの初回インストール - システムを書き込んだ USB/TF/SD をデバイスに挿入します。 - 開発者モードを有効にする:設定 → 本機について → バージョン番号(例:X96max plus...)を素早く5回タップし、システムに `開発者モードを有効にしました` と表示されるまで続けます。 - USB デバッグモードを有効にする:システム → 詳細設定 → 開発者オプション(`USB デバッグを有効にする` を有効に設定)。`ADB` デバッグを有効にします。 - ADB ツールをインストール:[adb](https://github.com/ophub/kernel/releases/tag/tools) をダウンロードして解凍し、`adb.exe`、`AdbWinApi.dll`、`AdbWinUsbApi.dll` の3つのファイルを `c://windows/` ディレクトリ内の `system32` と `syswow64` フォルダにコピーします。`cmd` コマンドパネルを開き、`adb --version` コマンドを実行し、出力があればインストール成功です。 - `cmd` コマンドモードに入り、`adb connect 192.168.1.137` コマンドを入力します(IP はデバイスの実際の状況に合わせて変更し、ルーター管理画面で確認できます)。接続成功後 `connected to 192.168.1.137:5555` と表示されます。 - `adb shell reboot update` コマンドを入力すると、デバイスは再起動して USB/TF/SD から起動します。ブラウザでシステムの IP アドレスにアクセスするか、SSH 接続でシステムに入ることができます。 #### 12.4.2 Armbian システムの再インストール - 通常の場合、Armbian を書き込んだ USB を USB ポートに挿入するだけで直接起動できます。USB 起動は eMMC より優先されます。 - 一部のデバイスで USB から起動できない場合は、eMMC 内の Armbian システム `/boot` ディレクトリにある `boot.scr` ファイルの名前を変更し(例:`boot.scr.bak`)、USB を挿入すると正常に起動できます。 ### 12.5 赤外線レシーバーの無効化 システムはデフォルトで赤外線レシーバーのサポートが有効になっています。デバイスをサーバーとして使用する場合、誤操作によるシャットダウンを防ぐため、IR カーネルモジュールを無効にすることをお勧めします。IR を完全に無効にする方法:以下の内容を追加 ```shell blacklist meson_ir ``` `/etc/modprobe.d/blacklist.conf` に追加して再起動してください。 ### 12.6 ブートファイルの選択 - 現在判明しているデバイスの中で、`T95(s905x)` / `T95Z-Plus(s912)` / `BesTV-R3300L(s905l-b)` など少数のデバイスのみ `/bootfs/extlinux/extlinux.conf` ファイルの使用が必要で、システムにはデフォルトで追加されています。その他のデバイスで必要な場合は、システムを USB に書き込んだ後 `boot` パーティションを開き、システム付属の `/boot/extlinux/extlinux.conf.bak` ファイル名から `.bak` を削除すると使用できます。eMMC への書き込み時には、`armbian-install` が自動的にチェックし、`extlinux.conf` ファイルが存在する場合は自動的に作成します。 - その他のデバイスは `/boot/uEnv.txt` のみで起動でき、`extlinux.conf.bak` ファイルを変更しないでください。 ### 12.7 ネットワーク設定 #### 12.7.1 interfaces を使用したネットワーク設定 ネットワーク設定ファイル `/etc/network/interfaces` のデフォルト内容は以下の通りです: ```shell source /etc/network/interfaces.d/* # Network is managed by Network manager auto lo iface lo inet loopback ``` ##### 12.7.1.1 DHCP による動的 IP アドレスの割り当て ```shell source /etc/network/interfaces.d/* auto eth0 iface eth0 inet dhcp ``` ##### 12.7.1.2 静的 IP アドレスの手動設定 IP、ゲートウェイ、DNS は自分のネットワーク状況に合わせて変更してください。 ```shell source /etc/network/interfaces.d/* auto eth0 allow-hotplug eth0 iface eth0 inet static hwaddress ether 12:34:56:78:9A:DA address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1 ``` ##### 12.7.1.3 Docker 内で OpenWrt を使用した相互通信ネットワークの構築 MAC アドレスは必要に応じて変更してください。 ```shell source /etc/network/interfaces.d/* allow-hotplug eth0 no-auto-down eth0 auto eth0 iface eth0 inet manual auto macvlan iface macvlan inet dhcp pre-up ip link add macvlan link eth0 type macvlan mode bridge post-down ip link del macvlan link eth0 type macvlan mode bridge auto lo iface lo inet loopback ``` #### 12.7.2 NetworkManager を使用したネットワーク管理 ##### 12.7.2.1 新しいネットワーク接続の作成 新しいネットワーク接続の作成または変更前の準備作業 ###### 12.7.2.1.1 ネットワークインターフェース名の取得 デバイスで利用可能なネットワークインターフェースを確認します。 ```shell nmcli device | grep -E "^[e].*|^[w].*|^[D].*|^[T].*" | awk '{printf "%-19s%-19s\n",$1,$2}' ``` コマンド実行後の返却内容:`DEVICE` 列はネットワークインターフェース名、`TYPE` 列はネットワークインターフェースタイプを表示します。 `eth0` = 1番目の有線ネットワークカード名、`eth1` = 2番目の有線ネットワークカード名、以降同様。無線ネットワークカードも同様です。 ```shell DEVICE TYPE eth0 ethernet eth1 ethernet eth2 ethernet eth3 ethernet wlan0 wifi wlan1 wifi ``` ###### 12.7.2.1.2 既存のネットワーク接続名の取得 デバイスの既存のネットワーク接続(有効・無効を含む)を確認します。新しい接続を作成する際は、既存の接続と異なる名前を使用することをお勧めします。 ```shell nmcli connection show | grep -E ".*|^[N].*" | awk '{printf "%-19s%-19s\n", $1,$3}' ``` コマンド実行後の返却内容:`NAME` 列は既存のネットワーク接続名、`TYPE` 列はネットワークインターフェースタイプを表示します。 `ethernet` = 有線ネットワークカード、`wifi` = 無線ネットワークカード、`bridge` = ネットワークブリッジ ```shell NAME TYPE cnc ethernet lan ethernet lte ethernet tel ethernet docker0 bridge titanium wifi cpe wifi ``` ###### 12.7.2.1.3 新しい有線ネットワーク接続の作成 ネットワークインターフェース `eth0` に新しいネットワーク接続を作成し、即座に有効化(`動的 IP アドレス` - `IPv4 / IPv6`)。 ```shell # Set ENV MYCON=ether1 # 新しいネットワーク接続名 MYETH=eth0 # ネットワークインターフェース名 = eth0 / eth1 / eht2 / eth3 IPV6AGM=stable-privacy # IPv6 アドレス状態モード = stable-privacy / eui64 # Add ETH nmcli connection add \ con-name $MYCON \ type ethernet \ ifname $MYETH \ autoconnect yes \ ipv6.addr-gen-mode $IPV6AGM nmcli connection up $MYCON ip -c -br address ``` ネットワークインターフェース `eth0` に新しいネットワーク接続を作成し、即座に有効化(`静的 IP アドレス` - `IPv4`)。 ```shell # Set ENV MYCON=ether1 # ネットワーク接続名 MYETH=eth0 # ネットワークインターフェース名 = eth0 / eth1 / eht2 / eth3 IP=192.168.67.167/24 # ホスト IP アドレス。24 はサブネットマスク(255.255.255.0 に対応) GW=192.168.67.1 # ゲートウェイ DNS=119.29.29.29,223.5.5.5 # DNS サーバーアドレス # Chg CON nmcli connection add \ con-name $MYCON \ type ethernet \ ifname $MYETH \ autoconnect yes \ ipv4.method manual \ ipv4.addresses $IP \ ipv4.gateway $GW \ ipv4.dns $DNS nmcli connection up $MYCON ip -c -br address ``` ###### 12.7.2.1.4 新しい無線ネットワーク接続の作成 ネットワークインターフェース `wlan0` に新しいネットワーク接続を作成し、即座に有効化(`動的 IP アドレス` - `IPv4 / IPv6`)。 ```shell # Set ENV MYCON=ssid # 新しいネットワーク接続名。WiFi SSID を使用して接続名を指定することを推奨 MYSSID=ssid # WiFi SSID(大文字小文字を区別) MYPSWD=passwd # WiFi パスワード MYWSKM=wpa-psk # セキュリティ選択:WPA-WPA2 = wpa-psk または WPA3 = sae(無線ルーターまたは AP で暗号化方式を確認) MYWLAN=wlan0 # ネットワークインターフェース名 = wlan0 / wlan1 IPV6AGM=stable-privacy # IPv6 アドレス状態モード = stable-privacy / eui64 # Add WLAN nmcli connection add \ con-name $MYCON \ type wifi \ ifname $MYWLAN \ autoconnect yes \ ipv6.addr-gen-mode $IPV6AGM \ wifi.ssid $MYSSID \ wifi-sec.key-mgmt $MYWSKM \ wifi-sec.psk $MYPSWD nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.2 無線ネットワーク接続の WiFi SSID または PASSWD の変更 無線ネットワーク接続 `ssid` の `WiFi SSID or PASSWD` を変更し、即座に有効化。 ```shell # Set ENV MYCON=ssid # 無線ネットワーク接続名 MYSSID=ssid # WiFi SSID(大文字小文字を区別) MYPSWD=passwd # WiFi パスワード MYWSKM=wpa-psk # セキュリティ選択:WPA-WPA2 = wpa-psk or WPA3 = sae # Add WLAN nmcli connection modify $MYCON \ wifi.ssid $MYSSID \ wifi-sec.key-mgmt $MYWSKM \ wifi-sec.psk $MYPSWD nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.3 ネットワークアドレス割り当て方式の変更 ###### 12.7.2.3.1 静的 IP アドレス - IPv4 ネットワーク接続 `ether1` で IP アドレスの割り当て方式を `静的 IP アドレス` に変更し、即座に有効化。 *有線接続 / 無線接続に適用 ```shell # Set ENV MYCON=ether1 # ネットワーク接続名 IP=192.168.67.167/24 # ホスト IP アドレス。24 はサブネットマスク(255.255.255.0 に対応) GW=192.168.67.1 # ゲートウェイ DNS=119.29.29.29,223.5.5.5 # DNS サーバーアドレス # Chg CON nmcli connection modify $MYCON \ ipv4.method manual \ ipv4.addresses $IP \ ipv4.gateway $GW \ ipv4.dns $DNS nmcli connection up $MYCON ip -c -br address ``` ###### 12.7.2.3.2 DHCP による動的 IP アドレスの取得 - IPv4 / IPv6 ネットワーク接続 `ether1` で IP アドレスの割り当て方式を `DHCP による動的 IP アドレスの取得` に変更し、即座に有効化。 *有線接続 / 無線接続に適用 ```shell # Set ENV MYCON=ether1 # ネットワーク接続名 # Chg CON nmcli connection modify $MYCON \ ipv4.method auto \ ipv6.method auto nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.4 ネットワーク接続の MAC アドレスの変更 ネットワーク接続で `MAC アドレス` を変更して、LAN 内の MAC アドレスの競合問題を解決します。 ###### 12.7.2.4.1 方法1:`nmcli` コマンドで MAC アドレスを変更する ```shell # nmcli connection show コマンドでネットワーク接続名を確認 nmcli connection show # 返却結果にはネットワーク名が含まれます(例:'Wired connection 1') NAME UUID TYPE DEVICE Wired connection 1 24d63dc7-c46f-3bf1-912f-1c33eb94338b ethernet eth0 lo 35ca24e5-bdc0-4658-8ac8-435ee22e07f3 loopback lo Wired connection 2 59660b21-b460-30e0-8cb3-89b886556955 ethernet -- # 変数を設定 MYCON='Wired connection 1' # ネットワーク接続名(ネットワークインターフェースタイプと一致させてください) MYTYPE='802-3-ethernet' # ネットワークインターフェースタイプ = 有線ネットワークカード / 無線ネットワークカード # = 802-3-ethernet / 802-11-wireless MYMAC='12:34:56:78:9A:BC' # 新しい MAC アドレスを設定 # 変更を実行 nmcli connection modify "${MYCON}" ${MYTYPE}.cloned-mac-address ${MYMAC} nmcli connection up "${MYCON}" ip -c a show "${MYCON}" ``` * 一部のネットワークパラメータを新規作成または変更すると、ネットワーク接続が切断され、再接続される場合があります。 * ソフトウェアとハードウェアの環境の違い(デバイス、システム、ネットワーク機器等)により、有効になるまでに `1〜15` 秒程度かかります。それ以上かかる場合は、ソフトウェアとハードウェアの環境を確認することをお勧めします。 ###### 12.7.2.4.2 方法2:設定ファイルで MAC アドレスを変更する MAC アドレスの上書き設定ファイルを追加します。 ```shell sudo mkdir -p /etc/systemd/network/ sudo nano /etc/systemd/network/10-mac-override.link ``` 以下の内容を追加します: ```shell [Match] # MAC アドレスを変更するネットワークインターフェース名を設定 OriginalName=eth0 [Link] # 規則に準拠した MAC アドレスを設定 MACAddress=02:55:66:77:88:99 ``` 再起動後に有効になります。 ##### 12.7.2.5 IPv6 を無効にする方法 `nmcli` ユーティリティを使用してコマンドラインで `IPv6` プロトコルを無効にできます。参照元: [disable-ipv6](https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/using-networkmanager-to-disable-ipv6-for-a-specific-connection_configuring-and-managing-networking)。 ステップ1:`nmcli connection show` コマンドでネットワーク接続リストを確認します。返却結果は以下の通りです: ```shell NAME UUID TYPE DEVICE Wired connection 1 8a7e0151-9c66-4e6f-89ee-65bb2d64d366 ethernet eth0 ... ``` ステップ2:接続の ipv6.method パラメータを disabled に設定します: ```shell nmcli connection modify "Wired connection 1" ipv6.method "disabled" ``` ステップ3:ネットワークに再接続します: ```shell nmcli connection up "Wired connection 1" ``` ステップ4:ネットワーク接続状態を確認し、inet6 エントリが表示されなければ、そのデバイスで IPv6 が無効になっています: ```shell ip address show eth0 ``` ステップ5:`/proc/sys/net/ipv6/conf/eth0/disable_ipv6` ファイルに値 `1` が含まれているか確認します: ```shell # cat /proc/sys/net/ipv6/conf/eth0/disable_ipv6 1 ``` `/etc/sysctl.conf` ファイルを変更して IPv6 を無効にすることもできます: ```shell # Disable IPv6 by default net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 ``` #### 12.7.3 ワイヤレスの有効化方法 一部のデバイスは無線ネットワークをサポートしています。有効化方法は以下の通りです: ```shell # 管理ツールのインストール sudo apt-get install network-manager # ネットワークデバイスの確認 sudo nmcli dev # ワイヤレスの有効化 sudo nmcli r wifi on # ワイヤレスのスキャン sudo nmcli dev wifi # ワイヤレスへの接続 sudo nmcli dev wifi connect "wifi名" password "wifiパスワード" # 保存済みのネットワーク接続リストを表示 sudo nmcli connection show # 接続を切断 sudo nmcli connection down "wifi名" # 接続を削除して自動接続を解除 sudo nmcli connection delete "wifi名" ```
image
#### 12.7.4 Bluetooth の有効化方法 一部のデバイスは Bluetooth をサポートしています。有効化方法は以下の通りです: ```shell # Bluetooth サポートのインストール armbian-config >> Network >> BT: Install Bluetooth support # システムの再起動 reboot ``` システム再起動後、Bluetooth ドライバが正常にロードされているか確認します。デスクトップシステムではメニューから Bluetooth デバイスに接続でき、ターミナルコマンドでも操作可能です。 ```shell dmesg | grep Bluetooth ```
image
image
```shell # Bluetooth デバイスの接続 armbian-config >> Network >> BT: Discover and connect Bluetooth devices ``` ターミナルでコマンドを使用してインストールすることもできます: ```shell # Bluetooth サービスの実行状態を確認 sudo systemctl status bluetooth # 起動していない場合は、まず Bluetooth サービスを有効化 sudo systemctl enable bluetooth sudo systemctl start bluetooth # 近くの Bluetooth デバイスをスキャン bluetoothctl scan on # Bluetooth 発見を有効化 bluetoothctl discoverable on # Bluetooth MAC アドレスでペアリング bluetoothctl pair 12:34:56:78:90:AB # ペアリング済みの Bluetooth デバイスを確認 bluetoothctl paired-devices # Bluetooth デバイスに接続 bluetoothctl connect 12:34:56:78:90:AB # デバイスを信頼し、以降の接続を簡単にする bluetoothctl trust 12:34:56:78:90:AB # Bluetooth デバイスを切断 bluetoothctl disconnect 12:34:56:78:90:AB # Bluetooth ペアリングを解除 bluetoothctl remove 12:34:56:78:90:AB # デバイスの接続をブロック bluetoothctl block 12:34:56:78:90:AB ``` ### 12.8 起動時のタスク追加方法 システムにはカスタム起動タスクスクリプトが組み込まれており、パスは [/etc/custom_service/start_service.sh](../build-armbian/armbian-files/common-files/etc/custom_service/start_service.sh) です。個人のニーズに応じて、このスクリプトにカスタムタスクを追加できます。 ### 12.9 システム内のサービススクリプトの更新方法 `armbian-sync` コマンドを使用して、ローカルシステム内のすべてのサービススクリプトをワンクリックで最新版に更新できます。 `armbian-sync` の更新が失敗した場合、コマンドバージョンが古い可能性があります。以下の方法で手動更新できます: ```shell wget https://raw.githubusercontent.com/ophub/amlogic-s9xxx-armbian/main/build-armbian/armbian-files/common-files/usr/sbin/armbian-sync -O /usr/sbin/armbian-sync chmod +x /usr/sbin/armbian-sync armbian-sync ``` ### 12.10 eMMC 上の Android システムのパーティション情報の取得方法 Armbian システムを eMMC に書き込む際、まずデバイスの Android システムのパーティションテーブルを確認し、安全な領域にデータが書き込まれることを確認して、元のパーティションテーブルを破壊してシステムが起動できなくなることを防ぐ必要があります。安全でない領域に書き込んだ場合、起動できなくなったり、以下のようなエラーが発生する可能性があります:
image
#### 12.10.1 パーティション情報の取得 2022.11 以降に本リポジトリからリリースされた Armbian を使用している場合、以下のコマンドをコピー&ペーストして、完全なパーティション情報を含む URL を取得できます(デバイス自体のインターネット接続は不要です)。 ```shell ampart /dev/mmcblk2 --mode webreport 2>/dev/null ``` *ampart の webreport モードは 2023.02.03 にリリースされた v1.2 で導入されたものです。上記のコマンドで出力がない場合は、URL の直接出力をサポートしていない旧バージョンの可能性があります。代わりに以下のコマンドを使用してください:* ```shell echo "https://7ji.github.io/ampart-web-reporter/?dsnapshot=$(ampart /dev/mmcblk2 --mode dsnapshot 2>/dev/null | head -n 1)&esnapshot=$(ampart /dev/mmcblk2 --mode esnapshot 2>/dev/null | head -n 1)" ``` 生成される URL のフォーマットは以下のようになります: ```shell https://7ji.github.io/ampart-web-reporter/?esnapshot=bootloader:0:4194304:0%20reserved:37748736:67108864:0%20cache:113246208:754974720:2%20env:876609536:8388608:0%20logo:893386752:33554432:1%20recovery:935329792:33554432:1%20rsv:977272832:8388608:1%20tee:994050048:8388608:1%20crypt:1010827264:33554432:1%20misc:1052770304:33554432:1%20instaboot:1094713344:536870912:1%20boot:1639972864:33554432:1%20system:1681915904:1073741824:1%20params:2764046336:67108864:2%20bootfiles:2839543808:754974720:2%20data:3602907136:4131389440:4&dsnapshot=logo::33554432:1%20recovery::33554432:1%20rsv::8388608:1%20tee::8388608:1%20crypt::33554432:1%20misc::33554432:1%20instaboot::536870912:1%20boot::33554432:1%20system::1073741824:1%20cache::536870912:2%20params::67108864:2%20data::-1:4 ``` この URL をブラウザで開くと、フォーマットが整った DTB パーティション情報と eMMC パーティション情報を確認できます:
image image
#### 12.10.2 パーティション情報の共有 他の方にパーティション情報を共有する必要がある場合(本リポジトリへの新デバイスの報告やヘルプの依頼など)、スクリーンショットではなく URL を優先的に共有してください。URL が長すぎる場合は、無料の短縮 URL サービスを利用できます。 - 一方で、ウェブページ上のパーティション情報はアクセスのたびに動的に生成され、パーティションの書き込み可能マークやテーブル形式などが随時更新される可能性があります。 - 他方で、スクリーンショット内のパーティションパラメータは計算に使用するために便利にコピーできません。 また、パラメータを別途テーブルファイルに整理する必要はありません。ウェブページのテーブルレイアウトは、Excel や LibreOffice Calc に直接コピー&ペーストでインポートできるように特別に設計されています。 #### 12.10.3 パーティション情報の解読 DTB テーブルには、Android DTB 内の各デバイス**システム**が期待するパーティションレイアウトが記録されており、通常、サイズが自動填充の `data` パーティションで終わります。したがって、同じシステム(必然的に同じモデルを含む)のデバイスの DTB パーティションレイアウトは必ず同じです。デバイス上の実際のパーティションレイアウトは eMMC の容量によって異なりますが、常に DTB パーティションレイアウトによって決定されます(つまり、DTB パーティションレイアウト + eMMC の正確なサイズがわかれば、eMMC のパーティション状況を必ず推定できます。*上記の DTB パーティション情報と eMMC パーティション情報は同じデバイスからのものではありません。お気づきでしたか?*)。 eMMC テーブルはデバイス上の実際の eMMC パーティションレイアウトです。各行は1つのストレージ領域を表し、その領域はパーティションまたはパーティション間のギャップの場合があります(Amlogic の設計決定により、各パーティション間に少なくとも 8M のギャップがあり、将来の使用を想定していましたが、S905X4 に至っても使用されておらず、スペースの無駄になっています)。パーティションに対応する行は黒い文字で、オフセットとマスク列に値があります。ギャップに対応する行は灰色の文字で、オフセットとマスク列に値がなく、パーティション名は `gap` です。 eMMC テーブルでは、各ストレージ領域の最後の列が書き込み可能性を示します。緑色で `yes` はその領域に書き込み可能、赤色で `no` はその領域に絶対に書き込み不可、黄色でマークがある場合は特定の前提条件下で書き込み可能、または一部のみ書き込み可能を意味します。 上記の表を例にすると、`bootloader` パーティションに対応する `0+4M` (`0M~4M`) は絶対に書き込み不可、その後の `32M` のギャップ(`4M~36M`)は書き込み可能、`reserved` パーティションに対応する `36M+64M` (`36M~100M`) は絶対に書き込み不可、その後のギャップから `env` 前のギャップ(`100M~836M`)まで書き込み可能、`env` の 1M 以降(`837M から末尾まで`)は Android 起動ロゴが不要な場合はすべて書き込み可能です。したがって、eMMC 上のすべての書き込み可能範囲は: - 4M~36M - 100M~836M - 837M~末尾 Android 起動ロゴが必要な場合、追加で `logo` パーティションに対応する 852M + 32M (`852M~884M`) に書き込みできず、eMMC 上のすべての書き込み可能範囲は: - 4M~36M - 100M~836M - 837M~852M - 884M~末尾 #### 12.10.4 eMMC インストールへの使用 デバイスが `armbian-install` の使用時に `-a` パラメータ([ampart](https://github.com/7Ji/ampart) を使用して eMMC パーティションレイアウトを調整)が `yes`(デフォルト値)で失敗した場合、そのデバイスは最適なパーティションレイアウトを使用できません(つまり、DTB パーティション情報を `data` のみに調整し、そこから eMMC パーティション情報を生成し、残存するすべてのパーティションを前方に移動させ、117M 以降のスペースがすべて使用可能になります)。[armbian-install](../build-armbian/armbian-files/common-files/usr/sbin/armbian-install) 内の対応するパーティション情報を変更する必要があります。 このファイルでは、パーティションレイアウトを宣言する重要なパラメータが3つあります:`BLANK1`、`BOOT`、`BLANK2`。`BLANK1` は eMMC の先頭から数えて使用不可能なサイズ、`BOOT` は `BLANK1` の後にカーネルや DTB などのファイルを格納するパーティションサイズ(256M 以上を推奨)、`BLANK2` は `BOOT` の後の使用不可能なサイズを表します。その後ろのスペースはすべて `ROOT` パーティションの作成に使用され、システム内の `/boot` マウントポイント以外のデータを格納します。3つとも整数で、単位は MiB (1 MiB = 1024 KiB = 1024^2 Byte) です。 上記の `logo` パーティションが不要な場合を例にすると、すべての利用可能なスペースを最大限活用するため、`4M~36M` の領域は小さすぎて `BOOT` として使用できないため、`BLANK1` に含めます。`100M~836M` の領域は `BOOT` として十分なので、736M すべてを `BOOT` に割り当てます。その後の `836M~837M` の使用不可領域を `BLANK2` に含め、対応するパラメータ設定は以下の通りです(`s905x3` を例として、他の SoC は対応するコードブロックを変更してください): ```shell # Set partition size (Unit: MiB) elif [[ "${AMLOGIC_SOC}" == "s905x3" ]]; then BLANK1="100" BOOT="736" BLANK2="1" ``` ### 12.11 u-boot ファイルの作成方法 u-boot はシステム起動を誘導する重要なファイルです。Amlogic、Allwinner、Rockchip デバイスではソースコードの取得とコンパイルプロセスに若干の違いがあります。 #### 12.11.1 Amlogic デバイスの u-boot ファイルの作成方法 Amlogic シリーズのデバイスメーカーの多くはオープンソースではないため、まずデバイスから u-boot 関連ファイルを抽出してからコンパイルする必要があります。以下の方法は [unifreq](https://github.com/unifreq) が共有した制作チュートリアルに基づいています。 ##### 12.11.1.1 bootloader と dtb ファイルの抽出方法 抽出には HxD ソフトウェアが必要です。[公式ダウンロードリンク](https://mh-nexus.de/en/downloads.php?product=HxD20) または [バックアップダウンロードリンク](https://github.com/ophub/kernel/releases/download/tools/HxDSetup.2.5.0.0.zip) から取得してインストールしてください。 `cmd` パネルで以下のコマンドを順に実行して、関連ファイルを抽出しローカルにダウンロードします。 ```shell # adb ツールでデバイスに接続 adb connect 192.168.1.111 adb shell # bootloader のエクスポートコマンド dd if=/dev/block/bootloader of=/data/local/bootloader.bin # dtb のエクスポートコマンド cat /dev/dtb >/data/local/mybox.dtb # gpio のエクスポートコマンド cat /sys/kernel/debug/gpio >/data/local/mybox_gpio.txt # bootloader、dtb、gpio ファイルをローカル PC の C ドライブ直下の mybox フォルダにダウンロード adb pull /data/local/bootloader.bin C:\mybox adb pull /data/local/mybox.dtb C:\mybox adb pull /data/local/mybox_gpio.txt C:\mybox ``` ##### 12.11.1.2 acs.bin ファイルの作成方法 メインライン u-boot で最も重要なのは acs.bin ファイルで、メモリ初期化に使用されます。メーカー u-boot はシステム先頭の 4MB 領域にあります。先ほど取得した `bootloader.bin` から `acs.bin` ファイルを抽出します。 HxD ソフトウェアを開き、先ほどエクスポートした `bootloader.bin` ファイルを開きます。`右クリック - 範囲を選択`、開始位置 `F200`、長さ `1000`、`十六進数` を選択します。 image 選択した結果をコピーし、新しいファイルを作成、挿入式で貼り付け、警告を無視し、acs.bin として保存します。
image image image
bootloader がロックされている場合、この領域のコードは文字化けして表示され、使用できません。正常な場合、この領域には多数の `0` が含まれ、`cfg` が数回連続して出現し、`ddr` 関連の文字が混在します。このようなコードは有効な使用可能データです。 ##### 12.11.1.3 u-boot ファイルのコンパイル方法 u-boot の作成には https://github.com/unifreq/amlogic-boot-fip と https://github.com/unifreq/u-boot の2つのソースコードリポジトリが必要で、デバイスに必要な u-boot ファイルをコンパイルするために使用します。 amlogic-boot-fip ソースコードでは、各デバイスモデルで異なるのは acs.bin ファイルのみで、その他のファイルは共通です。 image 制作方法の詳細は https://github.com/unifreq/u-boot/tree/master/doc/board/amlogic の説明を参照し、対応するデバイスモデルを選択してコンパイルとテストを行ってください。 [unifreq](https://github.com/unifreq) の方法で u-boot を作成するには、デバイスの acs.bin、dts、config ファイルが必要です。Android システムからエクスポートした dts は直接 Armbian 形式に変換できないため、対応する dts ファイルを自分で作成する必要があります。デバイスの具体的なハードウェアの違い(スイッチ、LED、電源制御、TF カード、SDIO WiFi モジュールなど)に応じて、カーネルソースリポジトリ内の類似の [dts](https://github.com/unifreq/linux-5.15.y/tree/main/arch/arm64/boot/dts/amlogic) ファイルを参考に修正してください。 X96Max Plus の u-boot 作成を例に説明します: ```shell ~/make-uboot ├── amlogic-boot-fip │ ├── x96max-plus # 自分でディレクトリを作成 │ │ ├── asc.bin # 自分でソースファイルを作成 │ │ └── other-copy-files... # 他のディレクトリからファイルをコピー │ │ │ ├── other-source-directories... │ └── other-source-files... │ └── u-boot ├── configs │ └── x96max-plus_defconfig # 自分でソースファイルを作成 ├── arch │ └── arm │ └── dts │ ├── meson-sm1-x96-max-plus-u-boot.dtsi # 自分でソースファイルを作成 │ ├── meson-sm1-x96-max-plus.dts # 自分でソースファイルを作成 │ └── Makefile # 編集 ├── fip │ ├── u-boot.bin # 生成ファイル │ └── u-boot.bin.sd.bin # 生成ファイル ├── u-boot.bin # 生成ファイル │ ├── other-source-directories... └── other-source-files... ``` - [amlogic-boot-fip](https://github.com/unifreq/amlogic-boot-fip) ソースコードをダウンロード。ルートディレクトリに [x96max-plus](https://github.com/unifreq/amlogic-boot-fip/tree/master/x96max-plus) ディレクトリを作成し、自作の `asc.bin` ファイル以外は他のディレクトリからコピーできます。 - [u-boot](https://github.com/unifreq/u-boot) ソースコードをダウンロード。対応する [x96max-plus_defconfig](https://github.com/unifreq/u-boot/blob/master/configs/x96max-plus_defconfig) ファイルを作成して [configs](https://github.com/unifreq/u-boot/tree/master/configs) ディレクトリに配置。対応する [meson-sm1-x96-max-plus-u-boot.dtsi](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/meson-sm1-x96-max-plus-u-boot.dtsi) と [meson-sm1-x96-max-plus.dts](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/meson-sm1-x96-max-plus.dts) ファイルを作成して [arch/arm/dts](https://github.com/unifreq/u-boot/tree/master/arch/arm/dts) ディレクトリに配置し、このディレクトリ内の [Makefile](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/Makefile) ファイルを編集して `meson-sm1-x96-max-plus.dtb` ファイルのインデックスを追加します。 - u-boot ソースコードのルートディレクトリに入り、ドキュメント https://github.com/unifreq/u-boot/blob/master/doc/board/amlogic/x96max-plus.rst の手順に従って操作します。 最終的に2種類のファイルが生成されます:u-boot ルートディレクトリの `u-boot.bin` は `/boot` ディレクトリで使用する簡易版 u-boot(リポジトリの [overload](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/overload) ディレクトリに対応)。`fip` ディレクトリの `u-boot.bin` と `u-boot.bin.sd.bin` は `/usr/lib/u-boot/` ディレクトリで使用する完全版 u-boot ファイル(リポジトリの [bootloader](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader) ディレクトリに対応)で、完全版の2つのファイルは 512 バイトの差があり、大きい方のファイルはヘッダーに 512 バイトの 0 が埋められています。
image image
💡ヒント:eMMC への書き込みテスト前に、まず 12.3 節のブリック復旧方法をお読みください。ショートポイントの位置を確認し、メーカー純正の .img 形式の Android システムファイルを準備し、ショートフラッシュの手順を成功テストしてから、書き込みテストを行ってください。 #### 12.11.2 Rockchip デバイスの u-boot ファイルの作成方法 Rockchip デバイスの大部分のメーカーは u-boot ソースコードをオープンソース化しており、メーカーのソースコードリポジトリから取得してコンパイルできます。また、一部のオープンソース貢献者が便利な u-boot コンパイルスクリプトを共有しており、以下で実例を通じていくつかのコンパイル方法を紹介します。 ##### 12.11.2.1 Radxa の u-boot 作成スクリプトの使用方法 [Rock5b(rk3588)](https://wiki.radxa.com/Rock5/guide/build-u-boot-on-5b) のコンパイルを例に説明します。 ```shell # 01. 依存関係のインストール sudo apt-get update sudo apt-get install -y git device-tree-compiler libncurses5 libncurses5-dev build-essential libssl-dev mtools bc python dosfstools flex bison # 02. ソースコードのクローン mkdir ~/rk3588-sdk && cd ~/rk3588-sdk git clone -b stable-5.10-rock5 https://github.com/radxa/u-boot.git git clone -b master https://github.com/radxa/rkbin.git git clone -b debian https://github.com/radxa/build.git # ソースコードの説明: # ~/rk3588-sdk/build/:Radxa ヘルパースクリプトファイルと、U-Boot、Linux カーネル、ルートファイルシステムの構築に使用する設定ファイル。 # ~/rk3588-sdk/rkbin/:ビルド済みの Rockchip バイナリ(第1ステージローダーと ATF(Arm Trustzone ファームウェア)を含む)。 # ~/rk3588-sdk/u-boot/:OS(Linux や Android など)を起動するための第2ステージブートローダー。 # 03. u-boot のコンパイル(For ROCK 5B) cd ~/rk3588-sdk ./build/mk-uboot.sh rk3588-rock-5b # 04. ビルド成功後、~/rk3588-sdk/out/u-boot ディレクトリに配置されます ~/rk3588-sdk/out/u-boot ├── idbloader.img ├── rk3588_spl_loader_v1.08.111.bin ├── spi │ └── spi_image.img └── u-boot.itb ``` [radxa/build](https://github.com/radxa/build) ソースコードの `board_configs.sh` と `mk-uboot.sh` にオプションを追加することで、他のデバイスの u-boot ファイルをコンパイルできます。例えば [Beelink-IPC-R(rk3588)](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/415#issuecomment-1508234307) デバイスのコンパイル方法。 ##### 12.11.2.2 cm9vdA の u-boot 作成スクリプトの使用方法 cm9vdA のオープンソースプロジェクト [cm9vdA/build-linux](https://github.com/cm9vdA/build-linux) では、u-boot とカーネルのコンパイルスクリプトと使用方法が提供されています。以下は一部の Rockchip デバイスの u-boot コンパイルのプロセス記録を参考として抜粋したものです。 - Lenovo-Leez-P710(rk3399) デバイスの u-boot コンパイル:[Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1609#issuecomment-1681494735) - DLFR100(rk3399) デバイスの u-boot コンパイル:[Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1522#issuecomment-1622919423) - ZYSJ(rk3399) デバイスの u-boot コンパイル:[Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1380#issuecomment-1539325464) ### 12.12 メモリサイズの誤認識 メモリサイズが正しく認識されない場合(4G メモリが 1-2G として認識されるのは異常、3.7G として認識されるのは正常)、`/boot/UBOOT_OVERLOAD` ファイルを手動でコピーして試してみてください(注意:`コピー`であり`リネーム`ではありません。リネームするとインストールや更新操作時に起動できなくなります):USB で使用する場合は `/boot/u-boot.ext` として保存、eMMC で使用する場合は `/boot/u-boot.emmc` として保存します。 メモリ認識問題のトラブルシューティング以外では、u-boot ファイルを手動でコピーしないでください。誤った操作は起動不能やその他の問題を引き起こす可能性があります。 ### 12.13 dtb ファイルの逆コンパイル方法 一部の新しいデバイスは現在のサポートリストに含まれていない場合(またはハードウェアの違いがある場合)があり、dtb ファイルを逆コンパイルして関連パラメータを調整し、適合を試みることができます。 ```shell # 依存関係のインストール sudo apt-get update sudo apt-get install -y device-tree-compiler # 1. 逆コンパイルコマンド(dtb ファイルから dts ソースコードを生成) dtc -I dtb -O dts -o xxx.dts xxx.dtb # 2. コンパイルコマンド(dts からコンパイルして dtb ファイルを生成) dtc -I dts -O dtb -o xxx.dtb xxx.dts # 3. データを保存して再起動 sync && reboot # 4. [任意アクション] 必要に応じてテスト # 例えば 12.16 で紹介した問題の解決時に、再インストールしてテスト armbian-install ``` ### 12.14 cmdline 設定の変更方法 Amlogic デバイスは `/boot/uEnv.txt` ファイルで設定します。Rockchip と Allwinner デバイスは `/boot/armbianEnv.txt` ファイルで設定します(`extraargs` または `extraboardargs` パラメータに追加)。`/boot/extlinux/extlinux.conf` を使用するデバイスはそのファイルで設定します。変更のたびに再起動が必要です。 - 例えば `Home Assistant Supervisor` は `docker cgroup v1` のみをサポートしていますが、現在の docker はデフォルトで v2 バージョンをインストールします。v1 に切り替える場合は、cmdline に `systemd.unified_cgroup_hierarchy=0` パラメータを追加し、再起動すると `docker cgroup v1` に切り替わります。 - cmdline に `max_loop=128` 設定を追加することで、許可される loop マウント数を調整できます。 - cmdline に `usbcore.usbfs_memory_mb=1024` 設定を追加することで、USBFS メモリバッファをデフォルトの `16 mb` からより大きなサイズに永続的に変更できます(`cat /sys/module/usbcore/parameters/usbfs_memory_mb`)。USB での大容量ファイル転送能力を向上させます。 - cmdline に `usbcore.usb3_disable=1` 設定を追加することで、すべての USB 3.0 デバイスを無効にできます。 - cmdline に `extraargs=video=HDMI-A-1:1920x1080@60` 設定を追加することで、ビデオ表示モードを 1080p に強制できます。
image
image
### 12.15 新しいサポートデバイスの追加方法 デバイス用の Armbian システムを構築するには、`デバイス設定ファイル`、`システムファイル`、`u-boot ファイル`、`フロー制御ファイル` の4つの部分が必要です。具体的な追加方法は以下の通りです: #### 12.15.1 デバイス設定ファイルの追加 設定ファイル [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) に、デバイスのテスト結果に基づいて対応する設定情報を追加します。`BUILD` 値が `yes` のデバイスはデフォルトで構築されるデバイスで、対応する `BOARD` 値は`一意でなければなりません`。これらのデバイスはデフォルト構築の Armbian システムを直接使用できます。 デフォルト値が `no` のデバイスはデフォルトの構築に含まれておらず、使用する際は同じ `FAMILY` の Armbian システムをダウンロードする必要があります。`USB` に書き込んだ後、パソコンで `USB の boot パーティション` を開き、`/boot/uEnv.txt` ファイル内の `FDT dtb 名` を変更することで、リスト内の他のデバイスに対応させることができます。 #### 12.15.2 システムファイルの追加 共通ファイルは `build-armbian/armbian-files/common-files` ディレクトリに配置し、各プラットフォーム共通です。 プラットフォームファイルはそれぞれ `build-armbian/armbian-files/platform-files/` ディレクトリに配置します。[Amlogic](../build-armbian/armbian-files/platform-files/amlogic)、[Rockchip](../build-armbian/armbian-files/platform-files/rockchip)、[Allwinner](../build-armbian/armbian-files/platform-files/allwinner) はそれぞれプラットフォームファイルを共有します。`bootfs` ディレクトリには /boot パーティションファイルを格納し、`rootfs` ディレクトリには Armbian システムファイルを格納します。 個別のデバイスに特殊な設定ニーズがある場合、`build-armbian/armbian-files/different-files` ディレクトリに `BOARD` 名の独立ディレクトリを作成し、必要に応じて `bootfs` ディレクトリを作成して `/boot` パーティションファイルを追加するか、`rootfs` ディレクトリを作成してシステムファイルを追加します。ディレクトリ構造は Armbian システム内の実際のパスに準じ、新しいファイルの追加や共通ファイルおよびプラットフォームファイル内の同名ファイルの上書きに使用できます。 #### 12.15.3 u-boot ファイルの追加 `Amlogic` シリーズのデバイスは [bootloader](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader) ファイルと [u-boot](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/overload) ファイルを共有し、新しいファイルはそれぞれ対応するディレクトリに配置します。`bootloader` ファイルはシステム構築時に自動的に Armbian システムの `/usr/lib/u-boot` ディレクトリに追加され、`u-boot` ファイルは自動的に `/boot` ディレクトリに追加されます。 `Rockchip` と `Allwinner` シリーズのデバイスは、各デバイスに `BOARD` 名の独立した [u-boot](https://github.com/ophub/u-boot/tree/main/u-boot) ファイルディレクトリを追加し、対応するシリーズファイルをこのディレクトリに配置します。 Armbian イメージの構築時に、これらの u-boot ファイルは [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) の設定に基づいて、rebuild スクリプトにより対応する Armbian イメージファイルに書き込まれます。 標準の U-Boot ファイルが使用できるデバイスは、まず直接使用することをお勧めします。一部のデバイスは適切な U-Boot をコンパイルまたは取得できない場合がありますが、そのようなデバイスが Ubuntu などの Linux システムを正常に実行できる場合は、ブート関連の重要なパーティションを保持して Armbian または OpenWrt をインストールすることを試みることができます。通常、保持が必要な重要なパーティションには `bootloader`、`reserved`、`env` が含まれます。 これらのパーティションはバックアップした後、新しい Armbian または OpenWrt イメージを作成する際に対応する位置に書き戻すことができます。元のシステムのブートパーティションを含む作成済みイメージは、`dd` コマンドで eMMC に直接書き込むか、対応するシステムの内蔵ツールを使用してインストールできます。例えば Armbian の `armbian-install` コマンドや、OpenWrt の `晶晨宝盒` プラグインなどです。 現在この方法を採用しているデバイスには [oes(a311d)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2666)、[oes-plus(s922x)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3029)、[oec-turbo(rk3566)](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2736) があります。以下では `oes(a311d)` デバイスを例に具体的な操作手順を説明します。 ##### 12.15.3.1 パーティション情報レイアウトの確認 ```shell ampart /dev/mmcblk2 # 取得したパーティション情報は以下の通りです: # =================================================================================== # IO seek EPT: Seeking to 37748736 # EPT report: 20 partitions in the table: # =================================================================================== # ID| name | offset|( human)| size|( human)| masks # ----------------------------------------------------------------------------------- # 0: bootloader 0 ( 0.00B) 400000 ( 4.00M) 0 # (GAP) 2000000 ( 32.00M) # 1: reserved 2400000 ( 36.00M) 4000000 ( 64.00M) 0 # (GAP) 800000 ( 8.00M) # 2: cache 6c00000 ( 108.00M) 20000000 ( 512.00M) 2 # (GAP) 800000 ( 8.00M) # 3: env 27400000 ( 628.00M) 800000 ( 8.00M) 0 # (GAP) 800000 ( 8.00M) # ... other partitions ... # =================================================================================== ``` ##### 12.15.3.2 重要なパーティションのバックアップ ```shell dd if=/dev/mmcblk2 of=bootloader.bin bs=1M count=4 skip=0 dd if=/dev/mmcblk2 of=reserved.bin bs=1M count=8 skip=36 dd if=/dev/mmcblk2 of=env.bin bs=1M count=1 skip=628 ``` バックアップファイルは [u-boot](https://github.com/ophub/u-boot) リポジトリの対応するディレクトリ [u-boot/amlogic/bootloader/a311d-oes](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader/a311d-oes) に配置します。 reserved パーティションは 64MB ですが、8MB のみバックアップしていることに注意してください。理由は `oes(a311d)` デバイスでは `reserved` パーティションの最初の 8MB が重要なデータで、残りの 56MB は空白でバックアップ不要だからです。具体的な確認方法: ```shell # まず、reserved パーティションの完全な 64MB サイズのファイルをバックアップ: dd if=/dev/mmcblk2 of=reserved_64M.bin bs=1M count=64 skip=36 # 次に、バックアップした reserved_64M.bin ファイルの最初の 8MB を抽出: dd if=reserved_64M.bin of=reserved_first_8M.bin bs=1M count=8 # 十六進数の内容を確認: hexdump -C reserved_first_8M.bin | less # 返却結果の最後の数行の内容を確認: 0071ffd0 4c 5e a8 1f fc 5b 5b 98 ae ef b0 97 0c 3b e8 c2 |L^...[[......;..| 0071ffe0 c8 e0 b2 74 3d 67 d5 3d 24 7b 63 b7 c7 73 f5 d8 |...t=g.=${c..s..| 0071fff0 a1 b8 38 a7 57 d6 b4 b5 e8 1c ba c0 07 0f f5 79 |..8.W..........y| 00720000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00800000 ``` 出力結果を分析すると、非ゼロデータを含む最後の行のアドレスは `0071fff0` です。アドレス `00720000` 以降はすべて `00`(ゼロ)になっています。hexdump ツールは(`*`)を使用して繰り返し行を表示し、これは `00720000` から `00800000`(8MB の末尾)までがすべてゼロであることを意味します。有効データアドレス `0x00720000` を十進数に変換すると `7,471,104` バイト、つまり `7471104 / 1024 / 1024 = 7.125 MB` のサイズです。したがって切り上げて 8MB をバックアップすれば十分です。env パーティションも同様で、最初の 80KB のみが有効データで、残りは空白のため、1MB のみバックアップします。 ##### 12.15.3.3 特殊パーティション書き込みファイルの追加 具体的な実装の詳細については、ファイル [/etc/armbian-board-release.conf](https://github.com/ophub/amlogic-s9xxx-armbian/blob/main/build-armbian/armbian-files/different-files/a311d-oes/rootfs/etc/armbian-board-release.conf) で定義されている `write_board_bootloader` 関数を参照してください。この関数はイメージの再構築(rebuild)プロセス中に呼び出されます。また、この設定ファイルは強力なデバイスカスタマイズセンターでもあります。`skip_mb="700"` などのパラメータでイメージパーティションのレイアウトとサイズを精密に制御できるだけでなく、カスタムスクリプトを追加してカーネルやその他のシステムファイルの特殊処理を実現することもできます。特定デバイスに対するすべての高度なカスタマイズ操作はこのファイルに集中して統一管理され、設定が明確で効率的になります。 #### 12.15.4 フロー制御ファイルの追加 [yml ワークフロー制御ファイル](../.github/workflows/build-armbian-arm64-server-image.yml) の `armbian_board` に対応する `BOARD` オプションを追加し、GitHub Actions での使用をサポートさせます。 ### 12.16 eMMC への書き込み時の I/O エラーの解決方法 一部のデバイスは USB/SD/TF から Armbian を正常に起動できますが、eMMC に書き込む際に I/O 書き込みエラーが発生します。例えば [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/989) のケースでは、以下のようなエラーが報告されています: ```shell [ 284.338449] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.341544] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write [ 284.446972] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.450074] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write [ 284.497746] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.500871] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write ``` この場合、dtb の動作モード速度と周波数を調整してストレージの読み書きを安定させることができます。SDR モードでは周波数は速度の2倍、DDR モードでは周波数は速度と等しくなります。利用可能なモードは以下の通りです: ```shell sd-uhs-sdr12 sd-uhs-sdr25 sd-uhs-sdr50 sd-uhs-ddr50 sd-uhs-sdr104 max-frequency = <208000000>; ``` カーネルソースコードの [dts](https://github.com/unifreq/linux-5.15.y/tree/main/arch/arm64/boot/dts/amlogic) ファイル内のコードスニペットを例に: ```shell /* SD card */ &sd_emmc_b { status = "okay"; bus-width = <4>; cap-sd-highspeed; sd-uhs-sdr12; sd-uhs-sdr25; sd-uhs-sdr50; max-frequency = <100000000>; }; /* eMMC */ &sd_emmc_c { status = "okay"; bus-width = <8>; cap-mmc-highspeed; max-frequency = <100000000>; }; ``` 通常、`&sd_emmc_c` の周波数を `max-frequency = <200000000>;` から `max-frequency = <100000000>;` に下げれば解決します。効果がない場合は `50000000` にさらに下げてテストし、同時に `&sd_emmc_b` の設定で `USB/SD/TF` を調整するか、`sd-uhs-sdr` で速度制限することもできます。dts ファイルを修正して [コンパイル](https://github.com/ophub/amlogic-s9xxx-armbian/tree/main/compile-kernel) してテストファイルを生成するか、`12.13 節` の方法で既存の dtb ファイルを逆コンパイルして修正できます。dtb ファイルの逆コンパイル時は十六進数値を使用します。十進数の `200000000` に対応する十六進数は `0xbebc200`、十進数の `100000000` に対応する十六進数は `0x5f5e100`、十進数の `50000000` に対応する十六進数は `0x2faf080`、十進数の `25000000` に対応する十六進数は `0x17d7840` です。 ソフトウェア面の最適化の他に、[ハードウェアアップグレード](https://github.com/ophub/amlogic-s9xxx-armbian/issues/998) や [手動改造](https://www.right.com.cn/forum/thread-901586-1-1.html) で解決することもできます。 ### 12.17 Bullseye バージョンで音が出ない問題の解決方法 音の問題のエラーログ情報: ```shell Mar 29 15:47:18 armbian-ct2000 kernel: fe.dai-link-0: ASoC: dpcm_fe_dai_prepare() failed (-22) Mar 29 15:47:18 armbian-ct2000 kernel: fe.dai-link-0: ASoC: no backend DAIs enabled for fe.dai-link-0 ``` [Bullseye NO Sound](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1000) の方法を参照して設定してください。 ```shell curl -fsSOL https://github.com/ophub/kernel/releases/download/tools/bullseye_g12_sound-khadas-utils-4-2-any.tar.gz tar -xzf bullseye_g12_sound-khadas-utils-4-2-any.tar.gz -C / systemctl enable sound.service systemctl restart sound.service ``` Armbian を再起動してテストします。音がまだ出ない場合、デバイスが旧版の conf に対応するオーディオ出力パスを使用している可能性があります。/usr/bin/g12_sound.sh の `L137-L142` の新しい設定をコメントアウトし(この設定は主に G12B/S922X に適用され、旧版の G12A/S905X2 および G12A ベースの SM1/S905X3 の多くは互換性がありません)、`L130-L134` の旧設定のコメントを解除する必要があります。 ### 12.18 boot.scr ファイルのコンパイル方法 Armbian システムの `/boot` ディレクトリにある `boot.scr` はシステムブートファイルで、`boot.cmd` ソースファイルからコンパイルして生成されます。`boot.cmd` を修正した後、`mkimage` コマンドで再コンパイルすると新しい `boot.scr` が生成されます。 通常、これら2つのファイルを修正する必要はありませんが、調整が必要な場合は以下の方法を参照してください。 ```shell # 依存関係のインストール sudo apt-get update sudo apt-get install -y u-boot-tools # boot.cmd ファイルの編集 cd /boot copy /boot/boot.cmd /boot/boot.cmd.bak copy /boot/boot.scr /boot/boot.scr.bak nano boot.cmd # コンパイルコマンド mkimage -C none -A arm -T script -d boot.cmd boot.scr # 再起動してテスト sync reboot # 補足説明 # Amlogic デバイスでは、USB で使用するのは /boot/boot.scr ファイルで、eMMC に書き込む際は /boot/boot-emmc.scr ファイルが使用されます。 ``` ### 12.19 リモートデスクトップの有効化とデフォルトポートの変更方法 ソフトウェアセンター `armbian-software` で `201` を選択してデスクトップをインストールします。インストール中にリモートデスクトップを有効にするか尋ねられるので、`y` と入力して有効にします。リモートデスクトップのデフォルトポートは `3389` で、必要に応じてカスタムポートを設定できます: ```shell sudo nano /etc/xrdp/xrdp.ini # カスタムポートに変更(例:5000) port=5000 ``` ### 12.20 TCP 輻輳制御の最適化方法 異なる性能のデバイスに対して、最適な体験を得るためにネットワークスタック設定を差別化することをお勧めします。デバイスの実際の状況に応じて、設定ファイル `/etc/sysctl.conf` を編集し、以下の2行を変更してください: - ギガビットデバイス(高性能/モダンアーキテクチャ):`fq + bbr` の組み合わせを推奨し、スループットを最大化しパケットロスへの耐性を向上させます。 - 100Mbps デバイス(低性能/レガシーアーキテクチャ):`fq_codel + cubic` の組み合わせを推奨し、CPU 負荷を低減し低遅延の安定性を確保します。 ```shell # プラン A:ギガビットデバイス/高性能推奨 (Gigabit/High Performance) net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # プラン B:100Mbps デバイス/低性能推奨 (100M/Low Performance) # net.core.default_qdisc = fq_codel # net.ipv4.tcp_congestion_control = cubic ``` ================================================ FILE: documents/README.md ================================================ # Armbian Build and Usage Guide [View English description](README.md) | [查看中文说明](README.cn.md) | [日本語の説明を確認する](README.ja.md) GitHub Actions is a CI/CD service from Microsoft that provides high-performance virtual server environments for building, testing, packaging, and deploying projects. Public repositories can use it free of charge with no time limit, and each build can run for up to 6 hours — more than sufficient for compiling Armbian (typically completed within about 3 hours). This project is shared for educational and experience-exchange purposes. Please do not initiate any harmful network attacks or misuse GitHub Actions. # Table of Contents - [Armbian Build and Usage Guide](#armbian-build-and-usage-guide) - [Table of Contents](#table-of-contents) - [1. Register your own Github account](#1-register-your-own-github-account) - [2. Set up private variable GITHUB\_TOKEN etc](#2-set-up-private-variable-github_token-etc) - [3. Fork the repository and set Workflow permissions](#3-fork-the-repository-and-set-workflow-permissions) - [4. Customization instructions for personalized Armbian system files](#4-customization-instructions-for-personalized-armbian-system-files) - [5. Compile the system](#5-compile-the-system) - [5.1 Manual Compilation](#51-manual-compilation) - [5.2 Scheduled Compilation](#52-scheduled-compilation) - [5.3 Customizing Default System Configuration](#53-customizing-default-system-configuration) - [5.4 Expanding Github Actions Compilation Space Using Logical Volumes](#54-expanding-github-actions-compilation-space-using-logical-volumes) - [5.5 Build Armbian Docker image](#55-build-armbian-docker-image) - [6. Saving the System](#6-saving-the-system) - [7. Downloading the System](#7-downloading-the-system) - [8. Installing Armbian to EMMC](#8-installing-armbian-to-emmc) - [8.1 Installation Method for Amlogic Series](#81-installation-method-for-amlogic-series) - [8.2 Installation Method for Rockchip Series](#82-installation-method-for-rockchip-series) - [8.2.1 Installation Method for Radxa-Rock5B](#821-installation-method-for-radxa-rock5b) - [8.2.1.1 Install the System to MicroSD](#8211-install-the-system-to-microsd) - [8.2.1.2 Install the System to eMMC](#8212-install-the-system-to-emmc) - [8.2.1.3 Installation of the system on NVMe](#8213-installation-of-the-system-on-nvme) - [8.2.2 Installation method for FastRhino R66S](#822-installation-method-for-fastrhino-r66s) - [8.2.3 Installation method for FastRhino R68S](#823-installation-method-for-fastrhino-r68s) - [8.2.4 Installation method for Beikeyun](#824-installation-method-for-beikeyun) - [8.2.5 Installation method for Chainedbox-L1-Pro](#825-installation-method-for-chainedbox-l1-pro) - [8.2.6 Installation method for lckfb-tspi](#826-installation-method-for-lckfb-tspi) - [8.3 Allwinner Series Installation Method](#83-allwinner-series-installation-method) - [8.4 Installation Method for the Docker Version of Armbian](#84-installation-method-for-the-docker-version-of-armbian) - [8.4.1 Install Docker Runtime Environment](#841-install-docker-runtime-environment) - [8.4.2 Configure macvlan Network](#842-configure-macvlan-network) - [8.4.3 Run Armbian Docker Container](#843-run-armbian-docker-container) - [9. Compiling Armbian Kernel](#9-compiling-armbian-kernel) - [9.1 How to Add Custom Kernel Patches](#91-how-to-add-custom-kernel-patches) - [9.2 How to Make Kernel Patches](#92-how-to-make-kernel-patches) - [9.3 How to Customize Compilation of Driver Modules](#93-how-to-customize-compilation-of-driver-modules) - [10. Updating Armbian Kernel](#10-updating-armbian-kernel) - [11. Installing Common Software](#11-installing-common-software) - [12. Frequently Asked Questions](#12-frequently-asked-questions) - [12.1 dtb and u-boot Correspondence Table for Each Box](#121-dtb-and-u-boot-correspondence-table-for-each-box) - [12.2 Instructions for LED Screen Display Control](#122-instructions-for-led-screen-display-control) - [12.3 How to Restore the Original Android TV System](#123-how-to-restore-the-original-android-tv-system) - [12.3.1 Backup and Restore Using Armbian-ddbr](#1231-backup-and-restore-using-armbian-ddbr) - [12.3.2 Recovering using Amlogic Flashing Tool](#1232-recovering-using-amlogic-flashing-tool) - [12.4 Setting the box to boot from USB/TF/SD](#124-setting-the-box-to-boot-from-usbtfsd) - [12.4.1 Initial Installation of Armbian System](#1241-initial-installation-of-armbian-system) - [12.4.2 Reinstallation of Armbian System](#1242-reinstallation-of-armbian-system) - [12.5 Disable Infrared Receiver](#125-disable-infrared-receiver) - [12.6 Boot file selection](#126-boot-file-selection) - [12.7 Network Configuration](#127-network-configuration) - [12.7.1 Network Configuration Using Interfaces](#1271-network-configuration-using-interfaces) - [12.7.1.1 IP Address Assignment via DHCP](#12711-ip-address-assignment-via-dhcp) - [12.7.1.2 Manual Setup of Static IP Address](#12712-manual-setup-of-static-ip-address) - [12.7.1.3 Establish Interconnected Network Using OpenWrt in Docker](#12713-establish-interconnected-network-using-openwrt-in-docker) - [12.7.2 Network Management Using NetworkManager](#1272-network-management-using-networkmanager) - [12.7.2.1 Create a New Network Connection](#12721-create-a-new-network-connection) - [12.7.2.1.1 Get Network Interface Name](#127211-get-network-interface-name) - [12.7.2.1.2 Get Existing Network Connection Name](#127212-get-existing-network-connection-name) - [12.7.2.1.3 Create a Wired Network Connection](#127213-create-a-wired-network-connection) - [12.7.2.1.4 Creating a Wireless Network Connection](#127214-creating-a-wireless-network-connection) - [12.7.2.2 Modify WiFi SSID or PASSWD in Wireless Network Connection](#12722-modify-wifi-ssid-or-passwd-in-wireless-network-connection) - [12.7.2.3 Modify Network Address Allocation Method](#12723-modify-network-address-allocation-method) - [12.7.2.3.1 Static IP address - IPv4](#127231-static-ip-address---ipv4) - [12.7.2.3.2 DHCP Obtains Dynamic IP Address - IPv4 / IPv6](#127232-dhcp-obtains-dynamic-ip-address---ipv4--ipv6) - [12.7.2.4 Modify Network Connection MAC Address](#12724-modify-network-connection-mac-address) - [12.7.2.4.1 Method 1: Use the `nmcli` command to change the MAC address](#127241-method-1-use-the-nmcli-command-to-change-the-mac-address) - [12.7.2.4.2 Method 2: Modify the MAC address via a configuration file](#127242-method-2-modify-the-mac-address-via-a-configuration-file) - [12.7.2.5 How to Disable IPv6](#12725-how-to-disable-ipv6) - [12.7.3 How to Enable Wireless](#1273-how-to-enable-wireless) - [12.7.4 How to Enable Bluetooth](#1274-how-to-enable-bluetooth) - [12.8 How to Add Startup Tasks](#128-how-to-add-startup-tasks) - [12.9 How to Update Service Scripts in the System](#129-how-to-update-service-scripts-in-the-system) - [12.10 How to Get Android System Partition Information on eMMC](#1210-how-to-get-android-system-partition-information-on-emmc) - [12.10.1 Obtaining Partition Information](#12101-obtaining-partition-information) - [12.10.2 Sharing Partition Information](#12102-sharing-partition-information) - [12.10.3 Interpreting Partition Information](#12103-interpreting-partition-information) - [12.10.4 For eMMC Installation](#12104-for-emmc-installation) - [12.11 How to build the u-boot file](#1211-how-to-build-the-u-boot-file) - [12.11.1 How to build the u-boot file for Amlogic devices](#12111-how-to-build-the-u-boot-file-for-amlogic-devices) - [12.11.1.1 How to extract the bootloader and dtb files](#121111-how-to-extract-the-bootloader-and-dtb-files) - [12.11.1.2 How to create the acs.bin file](#121112-how-to-create-the-acsbin-file) - [12.11.1.3 How to build the u-boot file](#121113-how-to-build-the-u-boot-file) - [12.11.2 How to build the u-boot file for Rockchip devices](#12112-how-to-build-the-u-boot-file-for-rockchip-devices) - [12.11.2.1 How to use Radxa's u-boot building script](#121121-how-to-use-radxas-u-boot-building-script) - [12.11.2.2 How to use cm9vdA's u-boot building script](#121122-how-to-use-cm9vdas-u-boot-building-script) - [12.12 Error in Memory Size Recognition](#1212-error-in-memory-size-recognition) - [12.13 How to Decompile dtb Files](#1213-how-to-decompile-dtb-files) - [12.14 How to Modify cmdline Settings](#1214-how-to-modify-cmdline-settings) - [12.15 How to Add New Supported Devices](#1215-how-to-add-new-supported-devices) - [12.15.1 Add Device Configuration File](#12151-add-device-configuration-file) - [12.15.2 Add System Files](#12152-add-system-files) - [12.15.3 Add u-boot Files](#12153-add-u-boot-files) - [12.15.3.1 Check the Partition Layout](#121531-check-the-partition-layout) - [12.15.3.2 Back Up Key Partitions](#121532-back-up-key-partitions) - [12.15.3.3 Add a Special Partition Writing File](#121533-add-a-special-partition-writing-file) - [12.15.4 Add Process Control Files](#12154-add-process-control-files) - [12.16 How to Resolve the Issue of I/O Errors While Writing to eMMC](#1216-how-to-resolve-the-issue-of-io-errors-while-writing-to-emmc) - [12.17 How to Solve the Issue of No Sound in the Bullseye Version](#1217-how-to-solve-the-issue-of-no-sound-in-the-bullseye-version) - [12.18 How to build the boot.scr file](#1218-how-to-build-the-bootscr-file) - [12.19 How to Enable Remote Desktop and Modify the Default Port](#1219-how-to-enable-remote-desktop-and-modify-the-default-port) - [12.20 TCP Congestion Control Optimization Guide](#1220-tcp-congestion-control-optimization-guide) ## 1. Register your own Github account Register an account to proceed with system customization. Click the `Sign up` button in the upper right corner of github.com and follow the prompts to complete registration. ## 2. Set up private variable GITHUB_TOKEN etc According to the [GitHub Docs](https://docs.github.com/en/actions/security-guides/automatic-token-authentication), GitHub automatically creates a unique `GITHUB_TOKEN` secret at the start of every workflow job for use within the workflow. The `{{ secrets.GITHUB_TOKEN }}` can be used for authentication within the workflow job. When building an [Armbian Docker](../.github/workflows/build-armbian-arm64-docker-image.yml) image in Actions and pushing it to Docker Hub, you need to set two secrets: `DOCKERHUB_USERNAME` and `DOCKERHUB_PASSWORD`. On your repository's page, click Settings in the top right corner, then navigate to `Settings` > `Secrets and variables` > `Actions` > `Repository secrets` > `New repository secret`, add the following two secrets: - Secret name `DOCKERHUB_USERNAME`: The value is your username for logging into Docker Hub. - Secret name `DOCKERHUB_PASSWORD`: The value is your password for logging into Docker Hub. ## 3. Fork the repository and set Workflow permissions Fork the repository by opening https://github.com/ophub/amlogic-s9xxx-armbian and clicking the Fork button in the upper right to copy the repository to your account. Once the fork is complete, navigate to your copy. Then go to `Settings` > `Actions` > `General` > `Workflow permissions` in the left navigation bar and save. The illustration is as follows:
## 4. Customization instructions for personalized Armbian system files The system compilation process is controlled in the [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) file. Additional .yml files in the workflows directory handle other functions. The system is compiled using Armbian's current official source code. Refer to the official documentation for parameter details. ```yaml - name: Compile Armbian [ ${{ inputs.set_release }} ] id: compile if: ${{ steps.down.outputs.status }} == 'success' && !cancelled() run: | # Compile method and parameter description: https://docs.armbian.com/Developer-Guide_Build-Options cd build/ ./compile.sh RELEASE=${{ inputs.set_release }} BOARD=odroidn2 BRANCH=current BUILD_MINIMAL=no \ BUILD_ONLY=default HOST=armbian BUILD_DESKTOP=no EXPERT=yes KERNEL_CONFIGURE=no \ COMPRESS_OUTPUTIMAGE="sha" SHARE_LOG=yes echo "status=success" >> ${GITHUB_OUTPUT} ``` When building Armbian with `ophub`, the `armbian_files` parameter allows you to add or overwrite custom files in the [common-files](https://github.com/ophub/amlogic-s9xxx-armbian/tree/main/build-armbian/armbian-files/common-files) directory. The directory structure must strictly mirror the Armbian root filesystem to ensure files are correctly overlaid into the firmware (e.g., default configuration files should be placed under the `etc/default/` subdirectory). Example configuration: ```yaml - name: Rebuild Armbian uses: ophub/amlogic-s9xxx-armbian@main with: build_target: armbian armbian_path: build/output/images/*.img.gz armbian_files: files ... ``` ## 5. Compile the system The system can be compiled manually, on a schedule, or triggered by specific events. The following sections cover each method. ### 5.1 Manual Compilation In your repository's navigation bar, click the Actions button, then select Build armbian > Run workflow > Run workflow to start compilation. The process takes approximately 3 hours and is complete once all steps finish. The illustration is as follows:
### 5.2 Scheduled Compilation In the [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) file, use Cron to configure scheduled compilation. The five fields represent minutes (0–59) / hours (0–23) / day of month (1–31) / month (1–12) / day of week (0–6, Sunday–Saturday). Modify values as needed. The system uses UTC by default; convert to your local time zone accordingly. ```yaml schedule: - cron: '0 17 * * *' ``` ### 5.3 Customizing Default System Configuration The default system configuration information is recorded in the [model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) file, in which the `BOARD` name must be unique. Devices with `BUILD` set to `yes` are included in the default build and can be used directly. Devices set to `no` are not packaged by default. To use an unpackaged device, download the Armbian system with the same `FAMILY`, write it to `USB`, then open the USB boot partition on your computer and modify the `FDT dtb name` in `/boot/uEnv.txt` to match your device. For local compilation, use the `-b` parameter; for GitHub Actions, use the `armbian_board` parameter. `-b all` packages all devices with `BUILD` set to `yes`. Specifying a `BOARD` explicitly will package it regardless of its `BUILD` value. For example: `-b r68s_s905x3-tx3_s905l3a-cm311`. ### 5.4 Expanding Github Actions Compilation Space Using Logical Volumes GitHub Actions provides 84GB of compile space by default, with approximately 50GB available after accounting for the system and required packages. When compiling all firmware, this may be insufficient. Use logical volumes to expand the compile space to approximately 110GB. Refer to the [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) file and use the commands below to create a logical volume. Then use the logical volume path during compilation. ```yaml - name: Create simulated physical disk run: | mnt_size=$(expr $(df -h /mnt | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 1) root_size=$(expr $(df -h / | tail -1 | awk '{print $4}' | sed 's/[[:alpha:]]//g' | sed 's/\..*//') - 4) sudo truncate -s "${mnt_size}"G /mnt/mnt.img sudo truncate -s "${root_size}"G /root.img sudo losetup /dev/loop6 /mnt/mnt.img sudo losetup /dev/loop7 /root.img sudo pvcreate /dev/loop6 sudo pvcreate /dev/loop7 sudo vgcreate github /dev/loop6 /dev/loop7 sudo lvcreate -n runner -l 100%FREE github sudo mkfs.xfs /dev/github/runner sudo mkdir -p /builder sudo mount /dev/github/runner /builder sudo chown -R runner.runner /builder df -Th ``` ### 5.5 Build Armbian Docker image To create a [Docker](https://hub.docker.com/u/ophub) image of the Armbian system, refer to the [armbian_docker](../compile-kernel/tools/script/docker) build script. ## 6. Saving the System System storage is also configured in the [.github/workflows/build-armbian-arm64-server-image.yml](../.github/workflows/build-armbian-arm64-server-image.yml) file. The compiled system is automatically uploaded to GitHub Releases via script. ```yaml - name: Upload Armbian image to Release uses: ncipollo/release-action@main if: ${{ env.PACKAGED_STATUS }} == 'success' && !cancelled() with: tag: Armbian_${{ env.ARMBIAN_RELEASE }}_${{ env.PACKAGED_OUTPUTDATE }} artifacts: ${{ env.PACKAGED_OUTPUTPATH }}/* allowUpdates: true token: ${{ secrets.GITHUB_TOKEN }} body: | These are the Armbian OS image * OS information Default username: root Default password: 1234 Install command: armbian-install Update command: armbian-update ``` ## 7. Downloading the System Navigate to the Releases section on the repository homepage and select the system image matching your device model. The illustration is as follows:
## 8. Installing Armbian to EMMC Installation methods vary across Amlogic, Rockchip, and Allwinner platforms. Devices differ in storage options — some use external microSD cards, some have eMMC, and some support NVMe or other media. Each platform's installation method is described separately below. First, download the appropriate Armbian system image for your device from [Releases](https://github.com/ophub/amlogic-s9xxx-armbian/releases) and decompress it to .img format. Depending on your device, follow the corresponding installation method. After installation, connect the device to your `router` and allow `2 minutes` for it to boot. Then find the device's `IP` address (listed as Armbian) in your router's admin panel and connect via `SSH`. The default username is `root`, the default password is `1234`, and the default port is `22`.


### 8.1 Installation Method for Amlogic Series Log in to the Armbian system (default user: root, default password: 1234) → Enter the command: ```shell armbian-install ``` | Optional Parameter | Default Value | Options | Description | | ------------------ | ------------- | ------- | ------------------------------------ | | -m | no | yes/no | Use Mainline u-boot | | -a | yes | yes/no | Use [ampart](https://github.com/7Ji/ampart) partition table adjustment tool | | -l | no | yes/no | List. Display the entire device list | Example: `armbian-install -m yes -a no` ### 8.2 Installation Method for Rockchip Series Installation methods differ by device and are described individually below. #### 8.2.1 Installation Method for Radxa-Rock5B Radxa-Rock5B supports multiple storage media (microSD/eMMC/NVMe), each with a different installation method. Download the [rk3588_spl_loader_v1.08.111.bin and spi_image.img](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/rock5b) files. Download the [RKDevTool](https://github.com/ophub/kernel/releases/download/tools/Radxa_rock5b_RKDevTool_Release_v2.96__DriverAssitant_v5.1.1.tar.gz) tool and driver. Download [Rufus](https://rufus.ie/) or [balenaEtcher](https://www.balena.io/etcher/) for writing disk images. ##### 8.2.1.1 Install the System to MicroSD Use Rufus, balenaEtcher, or a similar tool to write the Armbian system image to a microSD card, then insert it into the device.

##### 8.2.1.2 Install the System to eMMC - Install via microSD card: Write the Armbian system image to a microSD card and boot the device from it. Upload the `armbian.img` file to the microSD card, then use `dd` to write it to eMMC: ```Shell dd if=armbian.img of=/dev/mmcblk1 bs=1M status=progress ``` - Install via USB-to-eMMC card reader: Connect the eMMC module to your computer, use Rufus or balenaEtcher to write the Armbian system image to eMMC, then insert the eMMC module into the device. - Install via Maskrom mode: Power off the development board. Hold the gold button, then connect a USB-A to Type-C cable between the ROCK 5B Type-C port and your PC. Release the gold button. Verify that a MASKROM device is detected. Right-click in the blank area of the list and load the `rock-5b-emmc.cfg` configuration file (the configuration file and RKDevTool are in the same directory). Set `rk3588_spl_loader_v1.08.111.bin` and `Armbian.img` as shown below and begin writing.



##### 8.2.1.3 Installation of the system on NVMe The ROCK-5B has an SPI flash memory on its motherboard. Installing the bootloader on this SPI flash memory can support other boot media (such as SATA, USB3, or NVMe) that are not directly supported by the SoC maskrom mode. To use NVMe, you must first write the SPI file. The method is as follows: Power off the development board and remove all bootable devices (MicroSD cards, eMMC modules, etc.). Press and hold the golden button, then connect a USB-A to Type-C cable between the ROCK-5B and your PC. Release the golden button. Verify that a MASKROM device is detected. Right-click in the list to load the configuration file from the resource folder (the configuration file and RKDevTool are in the same directory), select `rk3588_spl_loader_v1.08.111.bin` and `spi_image.img` files according to the figure below, and click write:



- Install via card reader: Insert the M.2 NVMe SSD into an M.2 NVMe-to-USB 3.0 card reader and connect it to your computer. Use Rufus or balenaEtcher to write the Armbian system image to the NVMe drive, then install it in the device. - Install via microSD card: Write the Armbian system image to a microSD card and boot the device from it. Upload the `armbian.img` file to the microSD card, then use `dd` to write it to NVMe: ```Shell dd if=armbian.img of=/dev/nvme0n1 bs=1M status=progress ``` #### 8.2.2 Installation method for FastRhino R66S Use Rufus or balenaEtcher to write the Armbian system image to a microSD card, then insert it into the device. #### 8.2.3 Installation method for FastRhino R68S - Download the [RKDevTool](https://github.com/ophub/kernel/releases/download/tools/FastRhino_r68s_RKDevTool_Release_v2.86___DriverAssitant_v5.1.1.tar.gz) tool and driver. Unzip, install the DriverAssistant driver, and open RKDevTool. - With R68s powered off, connect the USB male-to-male cable, press and hold the Recovery key, then plug in the 12V power supply. Release the Recovery key after two seconds — the flashing tool should `discover a LOADER device`. - Right-click in the blank area of the RKDevTool interface to add an item. - Set address to `0x00000000`, name to `armbian`, and path to the `armbian.img` system file. - Select the armbian entry, `deselect all other entries`, and click `execute` to write. - Note: If another system exists on eMMC, erase it first via Advanced Features before writing Armbian. If erasure fails, reflash the `MiniLoaderAll.bin` bootloader first, then enter `MASKROM` mode to write Armbian. MiniLoaderAll.bin settings: address `0xCCCCCCCC`, name `Loader`, path to the `MiniLoaderAll.bin` file in the Image directory of RKDevTool.



#### 8.2.4 Installation method for Beikeyun This method is based on [milton](https://www.cnblogs.com/milton/p/15391525.html)'s tutorial. Flashing requires entering Maskrom mode. Disconnect all connections, short the CLK and GND contacts (using the TTL GND or the GND near the small button), then connect via USB to your PC. A MASKROM device should be detected. The short-circuit point location is shown below:

Open RKDevTool and right-click to add an item. - Address `0xCCCCCCCC`, name `Boot`, path [select](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/beikeyun) `rk3328_loader_v1.14.249.bin`. - Address `0x00000000`, name `system`, path select the `Armbian.img` system to be flashed. - Check the "Force Write by Address" option, click "Execute," and wait for the progress to complete on the right-hand download panel. #### 8.2.5 Installation method for Chainedbox-L1-Pro This method is based on [cc747](https://post.smzdm.com/p/a4wkdo7l/)'s tutorial. Power off the Chainedbox-L1-Pro and unplug all cables. Connect a USB male-to-male cable between the USB 2.0 port on the Chainedbox-L1-Pro and your computer. Insert a paperclip into the Reset hole and hold it down, then plug in the power cord. Wait until `discovered a LOADER device` appears at the bottom of RKDevTool, then release the paperclip. Switch to `Advanced Features` and click `Enter Maskrom` until `Found a MASKROM device` appears. Right-click to add an item. - Address `0xCCCCCCCC`, name `Boot`, path [select](https://github.com/ophub/u-boot/tree/main/u-boot/rockchip/chainedbox) `rk3328_loader_v1.14.249.bin`. - Address `0x00000000`, name `system`, path select the `Armbian.img` system to be flashed. - Check the "Force Write by Address" option, click "Execute," and wait for the progress to complete on the right-hand download panel.

#### 8.2.6 Installation method for lckfb-tspi - Download the [RKDevTool](https://github.com/ophub/kernel/releases/download/tools/FastRhino_r68s_RKDevTool_Release_v2.86___DriverAssitant_v5.1.1.tar.gz) tool and driver. Unzip, install the DriverAssistant driver, and open RKDevTool. (Note: use version 2.86 instead of 2.92, as version 2.92 crashes during flashing.) - With the tspi powered off, press and hold the Recovery key, then insert the Type-C data cable. Release the Recovery key after RKDevTool displays `A LOADER device was found`. Right-click to add an item. - Address `0x00000000`, name `system`, path select the `Armbian.img` system to be flashed. - Click Execute and wait for the progress to complete. ### 8.3 Allwinner Series Installation Method Log in to the Armbian system (default user: root, default password: 1234) → Enter the command: ```shell armbian-install ``` ### 8.4 Installation Method for the Docker Version of Armbian You can use Docker versions of Armbian images on Ubuntu/Debian/Armbian systems. These images are hosted on [Docker Hub](https://hub.docker.com/r/ophub) and can be downloaded directly for use. Four Armbian Docker images with different base versions are provided: `armbian-trixie`, `armbian-bookworm`, `armbian-noble`, and `armbian-resolute`. Each version has both `arm64` and `amd64` builds, allowing you to choose the appropriate version based on your needs. Among them, armbian-trixie is based on Debian 13, armbian-bookworm is based on Debian 12, armbian-noble is based on Ubuntu 24.04, and armbian-resolute is based on Ubuntu 26.04. The arm64 version is suitable for devices with platform architectures such as Amlogic/Rockchip/Allwinner, while the amd64 version is suitable for computers and servers with x86_64 architecture. #### 8.4.1 Install Docker Runtime Environment ```shell curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER sudo newgrp docker ``` #### 8.4.2 Configure macvlan Network ```shell # Check if existing docker networks include a macvlan network docker network ls # If there is no macvlan network, create one # Modify the subnet, gateway, and interface name according to your actual network docker network create -d macvlan \ --subnet=10.1.1.0/24 \ --gateway=10.1.1.1 \ -o parent=eth0 \ macvlan ``` #### 8.4.3 Run Armbian Docker Container Here, the `armbian-trixie:arm64` image is used as an example to demonstrate how to run an Armbian container. ```shell # Run the Armbian container in detached mode # Modify the container name, IP address, image version, etc., according to your actual situation docker run -itd --name=armbian-trixie \ --privileged \ --network macvlan \ --ip 10.1.1.15 \ --hostname=armbian-trixie \ -e TZ=Asia/Shanghai \ --restart unless-stopped \ ophub/armbian-trixie:arm64 # View Armbian container logs docker logs -f armbian-trixie # Enter the Armbian container docker exec -it armbian-trixie bash # Exit the Armbian container exit # Stop and remove the Armbian container docker rm -f armbian-trixie ``` ## 9. Compiling Armbian Kernel Kernel compilation is supported on Ubuntu, Debian, and Armbian systems, both locally and via GitHub Actions. For details, refer to the [Kernel Compilation Instructions](../../compile-kernel). ### 9.1 How to Add Custom Kernel Patches When the kernel patch directory [tools/patch](../../compile-kernel/tools/patch) contains a common patch directory (`common-kernel-patches`) or a directory matching the kernel source repository name (for example, [linux-5.15.y](https://github.com/unifreq/linux-5.15.y)), use `-p true` to automatically apply kernel patches. The directory naming convention is as follows: ```shell ~/amlogic-s9xxx-armbian └── compile-kernel └── tools └── patch ├── common-kernel-patches # Fixed directory name: stores common kernel patches for all versions ├── linux-5.15.y # Named after the kernel source library: stores dedicated patches ├── linux-6.1.y ├── linux-5.10.y-rk35xx └── more kernel directory... ``` - For local kernel compilation, manually create the corresponding directory and add your custom kernel patches. - For GitHub Actions cloud compilation, use the `kernel_patch` parameter to specify the kernel patch directory in your repository. For example, see the usage in [compile-beta-kernel.yml](https://github.com/ophub/kernel/blob/main/.github/workflows/compile-beta-kernel.yml) in the [kernel](https://github.com/ophub/kernel) repository: ```yaml - name: Compile the kernel uses: ophub/amlogic-s9xxx-armbian@main with: build_target: kernel kernel_version: 5.15.1_6.1.1 kernel_auto: true kernel_patch: kernel-patch/beta auto_patch: true ``` When specifying a custom kernel patch via `kernel_patch`, follow the naming convention described above. ### 9.2 How to Make Kernel Patches - Obtained from repositories such as [Armbian](https://github.com/armbian/build) and [OpenWrt](https://github.com/openwrt/openwrt): for example, [armbian/patch/kernel](https://github.com/armbian/build/tree/main/patch/kernel/archive) and [openwrt/rockchip/patches-6.1](https://github.com/openwrt/openwrt/tree/main/target/linux/rockchip/patches-6.1), [lede/rockchip/patches-5.15](https://github.com/coolsnowwolf/lede/tree/master/target/linux/rockchip/patches-5.15) etc. Patches from these mainline kernel repositories can generally be used directly. - Obtained from GitHub commit URLs: Appending `.patch` to a commit URL generates the corresponding patch file. Before adding a custom kernel patch, compare it against the upstream kernel source repository [unifreq/linux-k.x.y](https://github.com/unifreq) to verify it has not already been applied and to avoid conflicts. Tested kernel patches are encouraged to be submitted to the kernel repositories maintained by unifreq. Your contributions help make Armbian and OpenWrt more stable and functional for everyone. ### 9.3 How to Customize Compilation of Driver Modules Some drivers are not yet included in the mainline Linux kernel but can be compiled as custom modules. Only drivers compatible with the mainline kernel can be compiled; Android-specific drivers are generally unsupported. For example: ```shell # Step 1: Update to the latest kernel # Due to incomplete header files in earlier versions, it is necessary to update to the latest kernel version. # The requirement for each kernel version is not lower than 5.10.222, 5.15.163, 6.1.100, 6.6.41. armbian-sync armbian-update -k 6.1 # Step 2: Install compilation tools mkdir -p /usr/local/toolchain cd /usr/local/toolchain # Download the compilation tools wget https://github.com/ophub/kernel/releases/download/dev/arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz # Extract tar -Jxf arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz # Install additional compilation dependencies (optional; you can manually install missing components based on errors). armbian-kernel -u # Step 3: Download and compile the driver # Download driver source code cd ~/ git clone https://github.com/jwrdegoede/rtl8189ES_linux cd rtl8189ES_linux # Set up the compilation environment gun_file="arm-gnu-toolchain-14.3.rel1-aarch64-aarch64-none-linux-gnu.tar.xz" toolchain_path="/usr/local/toolchain" toolchain_name="gcc" export CROSS_COMPILE="${toolchain_path}/${gun_file//.tar.xz/}/bin/aarch64-none-linux-gnu-" export CC="${CROSS_COMPILE}gcc" export LD="${CROSS_COMPILE}ld.bfd" export ARCH="arm64" export KSRC=/usr/lib/modules/$(uname -r)/build # Set the M variable according to the actual path of the source code export M="/root/rtl8189ES_linux" # Compile the driver make # Step 4: Install the driver sudo cp -f 8189es.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/ # Update module dependencies sudo depmod -a # Load the driver module sudo modprobe 8189es # Check if the driver is successfully loaded lsmod | grep 8189es # You should see the driver successfully loaded 8189es 1843200 0 cfg80211 917504 2 8189es,brcmfmac ``` The illustration is as follows:
image
image
image
## 10. Updating Armbian Kernel Log in to the Armbian system → Enter the command: ```shell # Run as root user (sudo -i) # If no parameter is specified, it will be updated to the latest version. armbian-update ``` | Optional Parameters | Default Value | Options | Description | | -------- | ------------ | ------------- | -------------------------------- | | -r | ophub/kernel | `/` | Set the repository to download the kernel from github.com | | -u | Automatic | stable/flippy/beta/rk3588/rk35xx/h6 | Set the suffix of the used kernel's [tags](https://github.com/ophub/kernel/releases) | | -k | Latest Version | Kernel Version | Set the [Kernel Version](https://github.com/ophub/kernel/releases/tag/kernel_stable) | | -b | yes | yes/no | Automatically backup the kernel currently in use when updating the kernel | | -d | deb | tar/deb | Set the preferred kernel package format. If unavailable, the script will automatically try the alternative. `deb` is recommended for compiling custom drivers. | | -m | no | yes/no | Use the mainline u-boot | | -s | None | None/DiskName | [SOS] Restore the system kernel in eMMC/NVMe/sdX and other disks | | -h | None | None | View the usage help | Example: `armbian-update -k 5.15 -u stable -d deb` The `-k` parameter accepts either an exact version number (e.g., `armbian-update -k 5.15.50`) or a version series (e.g., `armbian-update -k 5.15`), which automatically selects the latest version in that series. During kernel updates, the current kernel is automatically backed up to `/ddbr/backup`, retaining the three most recent versions. If a newly installed kernel is unstable, restore a backed-up kernel at any time: ```shell # Enter the backup kernel directory, such as 6.6.12 cd /ddbr/backup/6.6.12 # Execute the kernel update command, which will automatically install the kernel in the current directory armbian-update ``` [SOS]: If an incomplete update or other issue prevents the system from booting from eMMC/NVMe/sdX, boot Armbian from another disk (e.g., USB) with any kernel version, then run `armbian-update -s` to restore the kernel to eMMC/NVMe/sdX. Without a disk parameter, the kernel is restored from the USB device to eMMC/NVMe/sdX by default. For systems with multiple disks, specify the target disk name explicitly. Examples: ```shell # Restore the kernel in eMMC armbian-update -s mmcblk1 # Restore the kernel in NVMe armbian-update -s nvme0n1 # Restore the kernel in a removable storage device armbian-update -s sda # Disk names can be abbreviated as mmcblk1/nvme0n1/sda, etc., or use the complete name such as /dev/sda armbian-update -s /dev/sda # When the device has only one built-in storage (eMMC/NVMe/sdX), the disk name parameter can be omitted armbian-update -s ``` If network issues prevent downloading from github.com, manually download the kernel files, upload them to any directory on your Armbian system, navigate to that directory, and run `armbian-update` for local installation. The system automatically prioritizes local kernel files when a complete set is detected in the current directory. The kernel is available in `tar` and `deb` formats. Each requires 4 files: - The 4 required files for `tar` format updates are: `header-xxx.tar.gz`, `boot-xxx.tar.gz`, `dtb-xxx.tar.gz`, and `modules-xxx.tar.gz`. - The 4 required files for `deb` format updates are: `linux-image-xxx.deb`, `linux-dtb-xxx.deb`, `linux-headers-xxx.deb`, and `linux-libc-dev-xxx.deb`. - Additional kernel files are optional and do not affect the update process, as the system accurately identifies the required files. Any supported kernel version can be installed, e.g., switching from 6.6.12 to 5.15.50. Custom options set via `-r`/`-u`/`-b`/`-d` can be saved permanently in `/etc/ophub-release` to avoid re-entering them each time. The corresponding settings are: ```shell # Assign values to custom parameters -r : KERNEL_REPO='ophub/kernel' -u : KERNEL_TAGS='stable' -b : KERNEL_BACKUP='yes' -d : DOWNLOAD_TYPE='deb' ``` ## 11. Installing Common Software Log in to the Armbian system → Enter the command: ```shell armbian-software ``` Use `armbian-software -u` to update the local software center list. Based on community feedback in [Issue](https://github.com/ophub/amlogic-s9xxx-armbian/issues), commonly used [software](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf) is gradually integrated with one-click installation, update, and uninstallation support. This includes `docker images`, `desktop software`, `application services`, etc. See more [instructions](armbian_software.md). Use `armbian-apt` to select an appropriate software mirror for your region, improving download speeds. For example, select the `mirrors.tuna.tsinghua.edu.cn` source in China: ```shell armbian-apt [ STEPS ] Welcome to the Armbian source change script. [ INFO ] Please select a [ bookworm ] mirror site. ┌──────┬───────────────────┬────────────────────────────────┐ │ ID │ Country/Region │ Mirror Site │ ├──────┼───────────────────┼────────────────────────────────┤ │ 0 │ - │ Restore default source │ │ 1 │ China │ mirrors.tuna.tsinghua.edu.cn │ │ 2 │ China │ mirrors.bfsu.edu.cn │ │ 3 │ China │ mirrors.aliyun.com │ │ 4 │ Hongkong, China │ mirrors.xtom.hk │ │ 5 │ Taiwan, China │ opensource.nchc.org.tw │ ├──────┼───────────────────┼────────────────────────────────┤ │ 6 │ United States │ mirrors.ocf.berkeley.edu │ │ 7 │ United States │ mirrors.xtom.com │ │ 8 │ United States │ mirrors.mit.edu │ │ 9 │ Canada │ mirror.csclub.uwaterloo.ca │ │ 10 │ Canada │ muug.ca/mirror │ ├──────┼───────────────────┼────────────────────────────────┤ │ 11 │ Finland │ mirror.kumi.systems │ │ 12 │ Netherlands │ mirrors.xtom.nl │ │ 13 │ Germany │ mirrors.xtom.de │ │ 14 │ Russia │ mirror.yandex.ru │ │ 15 │ India │ in.mirror.coganng.com │ ├──────┼───────────────────┼────────────────────────────────┤ │ 16 │ Estonia │ mirrors.xtom.ee │ │ 17 │ Australia │ mirrors.xtom.au │ │ 18 │ South Korea │ mirror.yuki.net.uk │ │ 19 │ Singapore │ mirror.sg.gs │ │ 20 │ Japan │ mirrors.xtom.jp │ └──────┴───────────────────┴────────────────────────────────┘ [ OPTIONS ] Please Input ID: 1 [ INFO ] Your selected source ID is: [ 1 ] [ STEPS ] Start to change the source of the system: [ mirrors.tuna.tsinghua.edu.cn ] [ INFO ] The system release is: [ bookworm ] [ SUCCESS ] Change the source of the system successfully. ``` ## 12. Frequently Asked Questions This section covers common issues encountered when using Armbian. ### 12.1 dtb and u-boot Correspondence Table for Each Box The supported TV box list is located in the [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf) configuration file in the `Armbian` system. ### 12.2 Instructions for LED Screen Display Control Please refer to the [instructions](led_screen_display_control.md). ### 12.3 How to Restore the Original Android TV System Back up and restore the Android TV system using `armbian-ddbr`. Alternatively, flash the Android system to eMMC via USB cable. Android system images are available in [Tools](https://github.com/ophub/kernel/releases/tag/tools). #### 12.3.1 Backup and Restore Using Armbian-ddbr Before installing Armbian on a new device, back up the original Android TV system in case restoration is needed later. Boot Armbian from `TF/SD/USB`, run `armbian-ddbr`, and enter `b` when prompted to create a backup. The backup is saved to `/ddbr/BACKUP-arm-64-emmc.img.gz` — download and keep it in a safe location. To restore, upload the backup file to the same path on the `TF/SD/USB` device, run `armbian-ddbr`, and enter `r` when prompted. #### 12.3.2 Recovering using Amlogic Flashing Tool - If the device can still boot from USB after reinserting the power supply, simply reinstall. Retry multiple times if necessary. - If the screen remains black and the device cannot boot from USB, a short-circuit recovery is required. First restore the original Android system, then reinstall Armbian. Download and install the [amlogic_usb_burning_tool](https://github.com/ophub/kernel/releases/tag/tools) recovery tool. Prepare a [USB male-to-male cable](https://user-images.githubusercontent.com/68696949/159267576-74ad69a5-b6fc-489d-b1a6-0f8f8ff28634.png) and a [paperclip](https://user-images.githubusercontent.com/68696949/159267790-38cf4681-6827-4cb6-86b2-19c7f1943342.png). - Using x96max+ as an example, locate the [short-circuit point](https://user-images.githubusercontent.com/68696949/110590933-67785300-81b3-11eb-9860-986ef35dca7d.jpg) on the motherboard and download the [Android TV system package](https://github.com/ophub/kernel/releases/tag/tools). Android TV system images and short-circuit point diagrams for other common devices are also [available here](https://github.com/ophub/kernel/releases/tag/tools). ```shell Operating method: 1. Open USB Burning Tool: [ File → Import image ]: X96Max_Plus2_20191213-1457_ATV9_davietPDA_v1.5.img [ Select ]:Erase Flash [ Select ]:Erase bootloader Click on the [ Start ] button 2. Use the [ paperclip ] to short-circuit the [ two short-circuit points ] on the box's motherboard, and at the same time use the [ USB double male data cable ] to connect the [ box ] with the [ computer ]. 3. When you see the [ progress bar starts moving ], remove the paperclip, no longer short-circuit. 4. When you see [ progress bar at 100% ], the flashing is complete, the box has been restored to the Android TV system. Click on the [ Stop ] button, unplug the [ USB double male data cable ] between the [ box ] and [ computer ]. 5. If any of the above steps fail, try again until successful. If the progress bar does not move, you can try plugging in the power supply. Normally, you don't need power support for flashing, only the power supply from the USB double male can meet the requirements. ``` Once factory settings are restored, follow the same steps as the initial Armbian installation. ### 12.4 Setting the box to boot from USB/TF/SD Depending on your situation, use either the initial installation or reinstallation method. #### 12.4.1 Initial Installation of Armbian System - Insert the USB/TF/SD with the installed system into the box. - Enable developer mode: Settings → About device → Version number (e.g., X96max plus...), tap the version number 5 times rapidly until `You are now a developer` appears. - Enable USB debugging: System → Advanced options → Developer options → enable `USB debugging` and `ADB` debugging. - Install ADB: Download [adb](https://github.com/ophub/kernel/releases/tag/tools) and extract it. Copy `adb.exe`, `AdbWinApi.dll`, and `AdbWinUsbApi.dll` to `c:\windows\system32` and `c:\windows\syswow64`. Verify the installation by running `adb --version` in a command prompt. - Open a command prompt and run `adb connect 192.168.1.137` (replace with your device's IP, found in your router's admin panel). A successful connection displays `connected to 192.168.1.137:5555`. - Run `adb shell reboot update` — the device will reboot from the inserted USB/TF/SD. Access the system via its IP address in a browser or through SSH. #### 12.4.2 Reinstallation of Armbian System - In normal situations, simply insert the USB drive with Armbian and boot from it. USB takes boot priority over eMMC. - If the device does not boot from USB, rename the `boot.scr` file in the eMMC's `/boot` directory (e.g., to `boot.scr.bak`), then insert the USB drive and boot again. ### 12.5 Disable Infrared Receiver Infrared receiver support is enabled by default. If using the device as a server, disable the IR kernel module to prevent accidental shutdowns. To disable IR completely, add the following line: ```shell blacklist meson_ir ``` to `/etc/modprobe.d/blacklist.conf` and restart. ### 12.6 Boot file selection - Among known devices, only `T95(s905x)` / `T95Z-Plus(s912)` / `BesTV-R3300L(s905l-b)` and a few others require the `/bootfs/extlinux/extlinux.conf` file, which is included by default in the system. If other devices require it, write the system to USB, open the `boot` partition, and rename `/boot/extlinux/extlinux.conf.bak` by removing the `.bak` extension. When installing to eMMC, `armbian-install` automatically detects and creates the `extlinux.conf` file if needed. - All other devices boot using `/boot/uEnv.txt` only — do not modify the `extlinux.conf.bak` file. ### 12.7 Network Configuration #### 12.7.1 Network Configuration Using Interfaces The default content of the network configuration file `/etc/network/interfaces` is as follows: ```shell source /etc/network/interfaces.d/* # Network is managed by Network manager auto lo iface lo inet loopback ``` ##### 12.7.1.1 IP Address Assignment via DHCP ```shell source /etc/network/interfaces.d/* auto eth0 iface eth0 inet dhcp ``` ##### 12.7.1.2 Manual Setup of Static IP Address Adjust the IP, gateway, and DNS values to match your network configuration. ```shell source /etc/network/interfaces.d/* auto eth0 allow-hotplug eth0 iface eth0 inet static hwaddress ether 12:34:56:78:9A:DA address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1 ``` ##### 12.7.1.3 Establish Interconnected Network Using OpenWrt in Docker Modify the MAC address as needed. ```shell source /etc/network/interfaces.d/* allow-hotplug eth0 no-auto-down eth0 auto eth0 iface eth0 inet manual auto macvlan iface macvlan inet dhcp pre-up ip link add macvlan link eth0 type macvlan mode bridge post-down ip link del macvlan link eth0 type macvlan mode bridge auto lo iface lo inet loopback ``` #### 12.7.2 Network Management Using NetworkManager ##### 12.7.2.1 Create a New Network Connection Prerequisites for creating or modifying a network connection. ###### 12.7.2.1.1 Get Network Interface Name Check available network interfaces. ```shell nmcli device | grep -E "^[e].*|^[w].*|^[D].*|^[T].*" | awk '{printf "%-19s%-19s\n",$1,$2}' ``` The `DEVICE` column displays the network interface name, and the `TYPE` column displays the network interface type. `eth0` is the first Ethernet interface, `eth1` is the second, and so on. Wireless interfaces follow the same convention. ```shell DEVICE TYPE eth0 ethernet eth1 ethernet eth2 ethernet eth3 ethernet wlan0 wifi wlan1 wifi ``` ###### 12.7.2.1.2 Get Existing Network Connection Name List existing network connections on the device, both active and inactive. Avoid reusing existing connection names when creating new ones. ```shell nmcli connection show | grep -E ".*|^[N].*" | awk '{printf "%-19s%-19s\n", $1,$3}' ``` The `NAME` column displays the name of the existing network connection, and the `TYPE` column displays the network interface type. `ethernet` = wired, `wifi` = wireless, `bridge` = bridge ```shell NAME TYPE cnc ethernet lan ethernet lte ethernet tel ethernet docker0 bridge titanium wifi cpe wifi ``` ###### 12.7.2.1.3 Create a Wired Network Connection Create a new network connection on interface `eth0` with immediate activation (`Dynamic IP Address` - `IPv4 / IPv6`). ```shell # Set ENV MYCON=ether1 # New network connection name MYETH=eth0 # Network interface name = eth0 / eth1 / eht2 / eth3 IPV6AGM=stable-privacy # IPv6 address status mode = stable-privacy / eui64 # Add ETH nmcli connection add \ con-name $MYCON \ type ethernet \ ifname $MYETH \ autoconnect yes \ ipv6.addr-gen-mode $IPV6AGM nmcli connection up $MYCON ip -c -br address ``` Create a new network connection on interface `eth0` with immediate activation (`Static IP Address` - `IPv4`). ```shell # Set ENV MYCON=ether1 # Network connection name MYETH=eth0 # Network interface name = eth0 / eth1 / eht2 / eth3 IP=192.168.67.167/24 # HOST IP address, where 24 is the subnet mask corresponding to 255.255.255.0 GW=192.168.67.1 # Gateway DNS=119.29.29.29,223.5.5.5 # DNS server address # Chg CON nmcli connection add \ con-name $MYCON \ type ethernet \ ifname $MYETH \ autoconnect yes \ ipv4.method manual \ ipv4.addresses $IP \ ipv4.gateway $GW \ ipv4.dns $DNS nmcli connection up $MYCON ip -c -br address ``` ###### 12.7.2.1.4 Creating a Wireless Network Connection Create a network connection on the `wlan0` interface with immediate activation (`Dynamic IP address` - `IPv4 / IPv6`). ```shell # Set ENV MYCON=ssid # Name of the new network connection, it is recommended to use WiFi SSID to specify the connection name MYSSID=ssid # WiFi SSID, case sensitive MYPSWD=passwd # WiFi password MYWSKM=wpa-psk # Security selection WPA-WPA2 = wpa-psk or WPA3 = sae (see which encryption method is in the wireless router or AP) MYWLAN=wlan0 # Network interface name = wlan0 / wlan1 IPV6AGM=stable-privacy # IPv6 address status mode = stable-privacy / eui64 # Add WLAN nmcli connection add \ con-name $MYCON \ type wifi \ ifname $MYWLAN \ autoconnect yes \ ipv6.addr-gen-mode $IPV6AGM \ wifi.ssid $MYSSID \ wifi-sec.key-mgmt $MYWSKM \ wifi-sec.psk $MYPSWD nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.2 Modify WiFi SSID or PASSWD in Wireless Network Connection Update the `WiFi SSID or password` in the wireless network connection `ssid` with immediate activation. ```shell # Set ENV MYCON=ssid # Wireless network connection name MYSSID=ssid # WiFi SSID, case sensitive MYPSWD=passwd # WiFi password MYWSKM=wpa-psk # Security selection WPA-WPA2 = wpa-psk or WPA3 = sae # Add WLAN nmcli connection modify $MYCON \ wifi.ssid $MYSSID \ wifi-sec.key-mgmt $MYWSKM \ wifi-sec.psk $MYPSWD nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.3 Modify Network Address Allocation Method ###### 12.7.2.3.1 Static IP address - IPv4 Change the IP allocation method to `Static IP address` for network connection `ether1` with immediate activation. *Applicable to both wired and wireless connections ```shell # Set ENV MYCON=ether1 # Network connection name IP=192.168.67.167/24 # HOST IP address, where 24 is the subnet mask corresponding to 255.255.255.0 GW=192.168.67.1 # Gateway DNS=119.29.29.29,223.5.5.5 # DNS server address # Chg CON nmcli connection modify $MYCON \ ipv4.method manual \ ipv4.addresses $IP \ ipv4.gateway $GW \ ipv4.dns $DNS nmcli connection up $MYCON ip -c -br address ``` ###### 12.7.2.3.2 DHCP Obtains Dynamic IP Address - IPv4 / IPv6 Change the IP allocation method to `DHCP` for network connection `ether1` with immediate activation. *Applicable to both wired and wireless connections ```shell # Set ENV MYCON=ether1 # Network connection name # Chg CON nmcli connection modify $MYCON \ ipv4.method auto \ ipv6.method auto nmcli connection up $MYCON ip -c -br address ``` ##### 12.7.2.4 Modify Network Connection MAC Address Change the MAC address on a network connection to resolve MAC address conflicts. ###### 12.7.2.4.1 Method 1: Use the `nmcli` command to change the MAC address ```shell # Use the `nmcli connection show` command to view the network interface name nmcli connection show # The returned result contains the network interface name, such as 'Wired connection 1' NAME UUID TYPE DEVICE Wired connection 1 24d63dc7-c46f-3bf1-912f-1c33eb94338b ethernet eth0 lo 35ca24e5-bdc0-4658-8ac8-435ee22e07f3 loopback lo Wired connection 2 59660b21-b460-30e0-8cb3-89b886556955 ethernet -- # Set ENV MYCON='Wired connection 1' # Network connection name, note to match the network interface type MYTYPE='802-3-ethernet' # Network interface type = Wired network card / Wireless network card # = 802-3-ethernet / 802-11-wireless MYMAC='12:34:56:78:9A:BC' # Set new MAC address # Chg CON nmcli connection modify "${MYCON}" ${MYTYPE}.cloned-mac-address ${MYMAC} nmcli connection up "${MYCON}" ip -c a show "${MYCON}" ``` * Modifying certain network parameters may temporarily disconnect and reconnect the network. * Depending on the hardware and software environment, changes take `1–15` seconds to apply. If changes do not take effect within this period, check your hardware and software configuration. ###### 12.7.2.4.2 Method 2: Modify the MAC address via a configuration file Create a MAC address override configuration file. ```shell sudo mkdir -p /etc/systemd/network/ sudo nano /etc/systemd/network/10-mac-override.link ``` Add the following content: ```shell [Match] # Specify the network interface name whose MAC address needs to be changed OriginalName=eth0 [Link] # Set a valid MAC address MACAddress=02:55:66:77:88:99 ``` Changes take effect after reboot. ##### 12.7.2.5 How to Disable IPv6 Use `nmcli` to disable `IPv6` from the command line. Please refer to [disable-ipv6](https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/using-networkmanager-to-disable-ipv6-for-a-specific-connection_configuring-and-managing-networking) for the source. Step 1: View the network connection list: ```shell NAME UUID TYPE DEVICE Wired connection 1 8a7e0151-9c66-4e6f-89ee-65bb2d64d366 ethernet eth0 ... ``` Step 2: Set the connection's ipv6.method parameter to disabled: ```shell nmcli connection modify "Wired connection 1" ipv6.method "disabled" ``` Step 3: Reconnect to the network: ```shell nmcli connection up "Wired connection 1" ``` Step 4: Verify the connection status. If no inet6 entry appears, IPv6 is disabled: ```shell ip address show eth0 ``` Step 5: Confirm that `/proc/sys/net/ipv6/conf/eth0/disable_ipv6` contains `1`: ```shell # cat /proc/sys/net/ipv6/conf/eth0/disable_ipv6 1 ``` Alternatively, disable IPv6 system-wide by adding the following to `/etc/sysctl.conf`: ```shell # Disable IPv6 by default net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 ``` #### 12.7.3 How to Enable Wireless Some devices support wireless networking. Enable it as follows: ```shell # Install management tool sudo apt-get install network-manager # Check network devices sudo nmcli dev # Enable wireless sudo nmcli r wifi on # Scan wireless sudo nmcli dev wifi # Connect to wireless sudo nmcli dev wifi connect "wifi name" password "wifi password" # Display the saved network connection list sudo nmcli connection show # Disconnect sudo nmcli connection down "wifi name" # Forget the connection and cancel automatic connection sudo nmcli connection delete "wifi name" ```
image
#### 12.7.4 How to Enable Bluetooth Some devices support Bluetooth. Enable it as follows: ```shell # Install Bluetooth support armbian-config >> Network >> BT: Install Bluetooth support # Reboot the system reboot ``` After rebooting, verify the Bluetooth driver is functioning. Desktop environments can connect Bluetooth devices via the menu. Terminal-based configuration is also available. ```shell dmesg | grep Bluetooth ```
image
image
```shell # Connect Bluetooth device armbian-config >> Network >> BT: Discover and connect Bluetooth devices ``` Bluetooth can also be managed via terminal commands: ```shell # Check the Bluetooth service running status sudo systemctl status bluetooth # If not started, start the Bluetooth service first sudo systemctl enable bluetooth sudo systemctl start bluetooth # Scan nearby Bluetooth devices bluetoothctl scan on # Enable Bluetooth discovery bluetoothctl discoverable on # Pair the Bluetooth MAC address bluetoothctl pair 12:34:56:78:90:AB # Check the paired Bluetooth devices blluetoothctl paired-devices # Connect to the Bluetooth device bluetoothctl connect 12:34:56:78:90:AB # Trust the device for easy connection next time bluetoothctl trust 12:34:56:78:90:AB # Disconnect the Bluetooth device bluetoothctl disconnect 12:34:56:78:90:AB # Unpair the Bluetooth device bluetoothctl remove 12:34:56:78:90:AB # Block the connected device bluetoothctl block 12:34:56:78:90:AB ``` ### 12.8 How to Add Startup Tasks A startup task script is included in the system. In Armbian, the path is [/etc/custom_service/start_service.sh](../build-armbian/armbian-files/common-files/etc/custom_service/start_service.sh). Add your custom startup tasks to this script as needed. ### 12.9 How to Update Service Scripts in the System Run `armbian-sync` to update all local service scripts to the latest version. If `armbian-sync` fails, the installed version may be outdated. Update it manually: ```shell wget https://raw.githubusercontent.com/ophub/amlogic-s9xxx-armbian/main/build-armbian/armbian-files/common-files/usr/sbin/armbian-sync -O /usr/sbin/armbian-sync chmod +x /usr/sbin/armbian-sync armbian-sync ``` ### 12.10 How to Get Android System Partition Information on eMMC Before writing Armbian to eMMC, confirm the device's Android partition table to ensure data is written to safe areas. Damaging the partition table may prevent the system from booting. Writing to unsafe areas can cause boot failures or errors like the one shown below:
image
#### 12.10.1 Obtaining Partition Information For Armbian versions released from this repository after November 2022, run the following command to generate a URL containing complete partition information (no internet connection required on the device): ```shell ampart /dev/mmcblk2 --mode webreport 2>/dev/null ``` *The webreport mode was introduced in ampart v1.2 (released 2023.02.03). If the above command produces no output, your version may be older. Use this alternative command instead:* ```shell echo "https://7ji.github.io/ampart-web-reporter/?dsnapshot=$(ampart /dev/mmcblk2 --mode dsnapshot 2>/dev/null | head -n 1)&esnapshot=$(ampart /dev/mmcblk2 --mode esnapshot 2>/dev/null | head -n 1)" ``` The generated URL will look similar to this: ```shell https://7ji.github.io/ampart-web-reporter/?esnapshot=bootloader:0:4194304:0%20reserved:37748736:67108864:0%20cache:113246208:754974720:2%20env:876609536:8388608:0%20logo:893386752:33554432:1%20recovery:935329792:33554432:1%20rsv:977272832:8388608:1%20tee:994050048:8388608:1%20crypt:1010827264:33554432:1%20misc:1052770304:33554432:1%20instaboot:1094713344:536870912:1%20boot:1639972864:33554432:1%20system:1681915904:1073741824:1%20params:2764046336:67108864:2%20bootfiles:2839543808:754974720:2%20data:3602907136:4131389440:4&dsnapshot=logo::33554432:1%20recovery::33554432:1%20rsv::8388608:1%20tee::8388608:1%20crypt::33554432:1%20misc::33554432:1%20instaboot::536870912:1%20boot::33554432:1%20system::1073741824:1%20cache::536870912:2%20params::67108864:2%20data::-1:4 ``` Open this URL in a browser to view the DTB and eMMC partition information:
image image
#### 12.10.2 Sharing Partition Information When sharing partition information (e.g., reporting a new device or seeking help), share the URL rather than a screenshot. Use a URL shortener if the link is too long. - The partition information on the webpage is dynamically generated on each visit, so annotations and table formatting may be updated over time. - Additionally, partition parameters cannot be easily copied from screenshots for analysis. The webpage's table layout is designed for easy copy-paste into Excel or LibreOffice Calc, eliminating the need to manually organize parameters. #### 12.10.3 Interpreting Partition Information The DTB table records the desired partition layout defined in the Android DTB. This layout typically ends with a `data` partition that fills the remaining space, so devices with the same system (and model) share identical DTB layouts. The actual partition layout may vary due to different eMMC capacities, but is always derived from the DTB partition layout (i.e., given the DTB layout and exact eMMC size, the eMMC partition layout can be determined. *Did you notice that the DTB and eMMC partition examples above come from different devices?*). The eMMC table shows the actual partition layout on the device. Each row represents a storage area — either a partition or an inter-partition gap (Amlogic reserves at least 8MB between partitions, originally intended for other purposes but unused even in the latest S905X4, effectively wasting space). Partition rows appear in black with offset and mask values. Gap rows appear in grey with no offset or mask values and are labeled `gap`. The last column indicates write safety: green/`yes` = writable, red/`no` = non-writable, yellow with a label = conditionally or partially writable. Using the above table as an example, the `0+4M` (`0M~4M`) area of the `bootloader` partition is non-writable, the `32M` gap (`4M~36M`) after it is writable, the `36M+64M` (`36M~100M`) `reserved` partition is non-writable, and the gap from there to the gap before `env` (`100M~836M`) is fully writable. From 1M after `env` (`837M to the end`), the area is writable if the Android boot logo is not needed. The writable ranges on eMMC are: - 4M~36M - 100M~836M - 837M~end If the Android boot logo is needed, the 852M + 32M (`852M~884M`) `logo` partition is additionally non-writable, reducing the writable ranges to: - 4M~36M - 100M~836M - 837M~852M - 884M~end #### 12.10.4 For eMMC Installation If your device fails when using `armbian-install` and the `-a` parameter (use [ampart](https://github.com/7Ji/ampart) to adjust the eMMC partition layout) is `yes` (default value), then your box cannot use the optimal layout (that is, adjust the DTB partition information to only have `data`, then generate eMMC partition information from this, and then move all remaining partitions forward. In this way, the space from 117M onwards can be used). You need to modify the corresponding partition information in [armbian-install](../build-armbian/armbian-files/common-files/usr/sbin/armbian-install). In this file, the key parameters for declaring the partition layout are three: `BLANK1`, `BOOT`, `BLANK2`. Among them, `BLANK1` represents the unusable size starting from the beginning of eMMC; `BOOT` represents the size of the partition created after `BLANK1` for storing the kernel, DTB, etc., preferably not less than 256M, `BLANK2` represents the unusable size after `BOOT`. The space after this will be used to create the `ROOT` partition to store all the data outside the `/boot` mount point in the system. All three should be integers, and the unit is MiB (1 MiB = 1024 KiB = 1024^2 Byte) In the case discussed in the previous paragraph where the `logo` partition is not needed, we naturally hope to use all the usable space, but the area of `4M~36M` is too small to be used as `BOOT`, so it can only be counted in the unusable `BLANK1`. The area of `100M~836M` is more than enough to be used as `BOOT`, so this 736M can be allocated to `BOOT` entirely. After this, there is an unusable area of `836M~837M`, which is given to `BLANK2`, so the parameters to be used should be as follows (only `s905x3` is used as an example in the following text, if your SoC is other, you need to modify other corresponding code blocks): ```shell # Set partition size (Unit: MiB) elif [[ "${AMLOGIC_SOC}" == "s905x3" ]]; then BLANK1="100" BOOT="736" BLANK2="1" ``` ### 12.11 How to build the u-boot file The u-boot file is a crucial component for system startup. The process of obtaining source code and the compilation workflow varies slightly across Amlogic, Allwinner, and Rockchip platforms. #### 12.11.1 How to build the u-boot file for Amlogic devices Since most Amlogic device manufacturers keep their source code closed, u-boot related files must be extracted from the device before compilation. The method presented here is derived from the tutorial shared by [unifreq](https://github.com/unifreq). ##### 12.11.1.1 How to extract the bootloader and dtb files Extraction requires the HxD software. Download it from the [official site](https://mh-nexus.de/en/downloads.php?product=HxD20) or the [backup link](https://github.com/ophub/kernel/releases/download/tools/HxDSetup.2.5.0.0.zip). Run the following commands in the `cmd` panel to extract the relevant files and download them to your local computer. ```shell # Use adb tool to enter the box adb connect 192.168.1.111 adb shell # Export bootloader command dd if=/dev/block/bootloader of=/data/local/bootloader.bin # Export dtb command cat /dev/dtb >/data/local/mybox.dtb # Export gpio command cat /sys/kernel/debug/gpio >/data/local/mybox_gpio.txt # Download the bootloader, dtb, and gpio files to the root directory of the C drive on your local computer in the mybox folder adb pull /data/local/bootloader.bin C:\mybox adb pull /data/local/mybox.dtb C:\mybox adb pull /data/local/mybox_gpio.txt C:\mybox ``` ##### 12.11.1.2 How to create the acs.bin file The most important part of the mainline u-boot is the acs.bin, which initializes memory. The original factory u-boot is located at the beginning of the system at the 4MB position. Use the `bootloader.bin` file obtained earlier to extract the `acs.bin` file. Open the HxD software, open the exported `bootloader.bin` file, `Right click - Select range`, start position `F200`, length `1000`, select `hexadecimal`. image Copy the selected result, then create a new file, paste in insert mode, ignore the warning, and save it as the acs.bin file.
image image image
If the bootloader is locked, the code in this area is garbled and useless. Normally, there should be many `0`s as in the picture above, `cfg` will appear several times in succession, and `ddr` related words will appear in the middle. This normal code can be used. ##### 12.11.1.3 How to build the u-boot file Building u-boot requires the source repositories https://github.com/unifreq/amlogic-boot-fip and https://github.com/unifreq/u-boot to compile two u-boot files for your device. Within the amlogic-boot-fip source code, the only file that varies by device model is acs.bin, all other files are universal. image For build instructions, see the device-specific documentation at https://github.com/unifreq/u-boot/tree/master/doc/board/amlogic. Building u-boot using [unifreq](https://github.com/unifreq)'s method requires the device's acs.bin, dts, and config files. The dts exported from the Android system cannot be directly converted to Armbian format, so a corresponding dts file must be written manually. Based on your device's specific hardware differences (switches, LEDs, power control, TF card, SDIO wifi module, etc.), modify and create a [dts](https://github.com/unifreq/linux-5.15.y/tree/main/arch/arm64/boot/dts/amlogic) file from similar ones in the kernel source repository. For example, building u-boot for X96Max Plus: ```shell ~/make-uboot ├── amlogic-boot-fip │ ├── x96max-plus # Create directory yourself │ │ ├── asc.bin # Self-made source file │ │ └── other-copy-files... # Copy files from other directories │ │ │ ├── other-source-directories... │ └── other-source-files... │ └── u-boot ├── configs │ └── x96max-plus_defconfig # Self-made source file ├── arch │ └── arm │ └── dts │ ├── meson-sm1-x96-max-plus-u-boot.dtsi # Self-made source file │ ├── meson-sm1-x96-max-plus.dts # Self-made source file │ └── Makefile # Edit ├── fip │ ├── u-boot.bin # Generated file │ └── u-boot.bin.sd.bin # Generated file ├── u-boot.bin # Generated file │ ├── other-source-directories... └── other-source-files... ``` - Download the [amlogic-boot-fip](https://github.com/unifreq/amlogic-boot-fip) source code. In the root directory, create a [x96max-plus](https://github.com/unifreq/amlogic-boot-fip/tree/master/x96max-plus) directory. Other than the `asc.bin` file that you created, all other files can be copied from other directories. - Download the [u-boot](https://github.com/unifreq/u-boot) source code. Create a corresponding [x96max-plus_defconfig](https://github.com/unifreq/u-boot/blob/master/configs/x96max-plus_defconfig) file and put it into the [configs](https://github.com/unifreq/u-boot/tree/master/configs) directory. Create the corresponding [meson-sm1-x96-max-plus-u-boot.dtsi](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/meson-sm1-x96-max-plus-u-boot.dtsi) and [meson-sm1-x96-max-plus.dts](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/meson-sm1-x96-max-plus.dts) files and put them in the [arch/arm/dts](https://github.com/unifreq/u-boot/tree/master/arch/arm/dts) directory, then edit the [Makefile](https://github.com/unifreq/u-boot/blob/master/arch/arm/dts/Makefile) in this directory to add the `meson-sm1-x96-max-plus.dtb` file index. - In the root directory of the u-boot source code, follow the steps in the document https://github.com/unifreq/u-boot/blob/master/doc/board/amlogic/x96max-plus.rst. Two types of files are generated: the `u-boot.bin` in the u-boot root directory is an incomplete u-boot for the `/boot` directory (corresponds to the [overload](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/overload) directory); the `u-boot.bin` and `u-boot.bin.sd.bin` in the `fip` directory are complete u-boot files for `/usr/lib/u-boot/` (corresponds to the [bootloader](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader) directory). The two complete versions differ by 512 bytes — the larger one has 512 bytes of zeros prepended.
image image
💡 Tip: Before writing to eMMC for testing, review section 12.3 for recovery methods. Ensure you know the short-circuit point location, have the original .img format Android system file, and have verified the short-circuit flashing process. Master all recovery methods before proceeding. #### 12.11.2 How to build the u-boot file for Rockchip devices Since most Rockchip device manufacturers have open-sourced their u-boot code, the relevant source code can be obtained directly from their repositories. Additionally, some open-source contributors have shared user-friendly u-boot compilation scripts. Below are several examples illustrating different compilation methods. ##### 12.11.2.1 How to use Radxa's u-boot building script Taking compiling [Rock5b(rk3588)](https://wiki.radxa.com/Rock5/guide/build-u-boot-on-5b) as an example. ```shell # 01.Install the necessary build dependencies sudo apt-get update sudo apt-get install -y git device-tree-compiler libncurses5 libncurses5-dev build-essential libssl-dev mtools bc python dosfstools flex bison # 02.Set up your workspace and get the source code from the Radxa Git repositories mkdir ~/rk3588-sdk && cd ~/rk3588-sdk git clone -b stable-5.10-rock5 https://github.com/radxa/u-boot.git git clone -b master https://github.com/radxa/rkbin.git git clone -b debian https://github.com/radxa/build.git # Explanation of the source code: # ~/rk3588-sdk/build/: Radxa helper script files and configuration files for building U-Boot, Linux kernel and rootfs. # ~/rk3588-sdk/rkbin/: Pre-built Rockchip binaries, including first stage loader and ATF (Arm Trustzone Firmware) # ~/rk3588-sdk/u-boot/: Second stage bootloader used to start the OS (e.g. Linux or Android) # 03.Build u-boot (For ROCK 5B) cd ~/rk3588-sdk ./build/mk-uboot.sh rk3588-rock-5b # 04.After a successful build, the ~/rk3588-sdk/out/u-boot directory will be populated ~/rk3588-sdk/out/u-boot ├── idbloader.img ├── rk3588_spl_loader_v1.08.111.bin ├── spi │ └── spi_image.img └── u-boot.itb ``` By adding more options in `board_configs.sh` and `mk-uboot.sh` within the [radxa/build](https://github.com/radxa/build) source code, u-boot files for other devices can also be compiled. For example, see the instructions for compiling the [Beelink-IPC-R(rk3588)](https://github.com/ophub/amlogic-s9xxx-openwrt/issues/415#issuecomment-1508234307) device. ##### 12.11.2.2 How to use cm9vdA's u-boot building script cm9vdA provides scripts and instructions for compiling u-boot and the kernel in his open-source project [cm9vdA/build-linux](https://github.com/cm9vdA/build-linux). The following are documented compilation processes for various Rockchip devices: - Build u-boot for Lenovo-Leez-P710 (rk3399) device: [Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1609#issuecomment-1681494735) - Build u-boot for DLFR100 (rk3399) device: [Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1522#issuecomment-1622919423) - Build u-boot for ZYSJ (rk3399) device: [Link](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1380#issuecomment-1539325464) ### 12.12 Error in Memory Size Recognition If the memory size is recognized incorrectly (4GB recognized as 1–2GB is abnormal; 3.7GB is normal), try manually copying a `/boot/UBOOT_OVERLOAD` file (note: "copy", not "rename" — renaming will prevent the system from booting after installation and updates). When used from `USB`, save it as `/boot/u-boot.ext`; when used from `eMMC`, save it as `/boot/u-boot.emmc`. Do not manually copy the u-boot file for any other purpose. Incorrect u-boot files will cause boot failures and various other issues. ### 12.13 How to Decompile dtb Files Some new devices are not currently supported (or have hardware variants). Try adjusting related parameters by decompiling the dtb file. ```shell # Install dependencies sudo apt-get update sudo apt-get install -y device-tree-compiler # 1. Decompilation command (generate dts source code using dtb file) dtc -I dtb -O dts -o xxx.dts xxx.dtb # 2. Compilation command (generate dtb file using dts) dtc -I dts -O dtb -o xxx.dtb xxx.dts # 3. Save data and reboot sync && reboot # 4. [Optional action] Perform testing based on requirements # e.g., reinstall for testing when addressing the issue mentioned in 12.16 armbian-install ``` ### 12.14 How to Modify cmdline Settings In Amlogic devices, add/modify/delete settings in `/boot/uEnv.txt`. In Rockchip and Allwinner devices, configure in `/boot/armbianEnv.txt` (via the `extraargs` or `extraboardargs` parameters). Devices using `/boot/extlinux/extlinux.conf` configure in that file. A reboot is required after each change. - For instance, `Home Assistant Supervisor` only supports `docker cgroup v1`, while the default Docker installation uses v2. To switch to v1, add `systemd.unified_cgroup_hierarchy=0` to cmdline and reboot. - Adding `max_loop=128` to cmdline adjusts the maximum number of loop mounts. - Adding `usbcore.usbfs_memory_mb=1024` to cmdline increases the USBFS memory buffer from the default `16 mb` (`cat /sys/module/usbcore/parameters/usbfs_memory_mb`), improving large USB file transfers. - Adding `usbcore.usb3_disable=1` to cmdline disables all USB 3.0 devices. - Adding `extraargs=video=HDMI-A-1:1920x1080@60` to cmdline forces the display to 1080p.
image
image
### 12.15 How to Add New Supported Devices Building an Armbian system for a device requires a `device configuration file`, `system files`, `u-boot files`, and `process control files`. The methods for adding each are described below: #### 12.15.1 Add Device Configuration File In the configuration file [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf), add device configuration based on its test support status. Devices with `BUILD` set to `yes` are built by default; the corresponding `BOARD` value `must be unique`. These devices can use the default Armbian system directly. Devices set to `no` are not packaged by default. To use them, download the Armbian system with the same `FAMILY`, write it to `USB`, open the USB boot partition on your computer, and modify the `FDT dtb name` in `/boot/uEnv.txt` to match your device. #### 12.15.2 Add System Files Common files are placed in `build-armbian/armbian-files/common-files`, shared across all platforms. Platform-specific files are placed in `build-armbian/armbian-files/platform-files/`: [Amlogic](../build-armbian/armbian-files/platform-files/amlogic), [Rockchip](../build-armbian/armbian-files/platform-files/rockchip), and [Allwinner](../build-armbian/armbian-files/platform-files/allwinner). The `bootfs` directory contains /boot partition files, and the `rootfs` directory contains Armbian system files. For devices with special configuration requirements, add an independent directory named after the `BOARD` in `build-armbian/armbian-files/different-files`. Create `bootfs` and `rootfs` subdirectories as needed to add files under the system's `/boot` partition or other system paths. All folder names correspond to actual paths in the Armbian system. These files can add new files or override files from common and platform directories. #### 12.15.3 Add u-boot Files `Amlogic` series devices, share [bootloader](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader) files and [u-boot](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/overload) files. If there are new files, put them in the corresponding directory. The `bootloader` files will automatically be added to the Armbian system's `/usr/lib/u-boot` directory during system construction, and `u-boot` files will be automatically added to the `/boot` directory. `Rockchip` and `Allwinner` series devices, add an independent [u-boot](https://github.com/ophub/u-boot/tree/main/u-boot) file directory named after `BOARD` for each device, and the corresponding series files are placed in this directory. During the Armbian image construction, these u-boot files will be written into the corresponding Armbian image files by the rebuild script according to the configuration in [/etc/model_database.conf](../build-armbian/armbian-files/common-files/etc/model_database.conf). For devices that can use standard U-Boot files, using them directly is strongly recommended. However, some devices may lack a suitable U-Boot. If such a device can already run other Linux systems like Ubuntu, you can try preserving key boot-related partitions to install Armbian or OpenWrt. The critical partitions that typically need preservation include `bootloader`, `reserved`, and `env`. These partitions can be backed up and written back to their corresponding locations when creating a new Armbian or OpenWrt image. The resulting image, containing the original system's boot partitions, can be written to eMMC directly via the `dd` command or through the built-in installation tools (e.g., Armbian's `armbian-install` or OpenWrt's `Amlogic Service` plugin). Currently, devices using this method include [oes(a311d)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/2666), [oes-plus(s922x)](https://github.com/ophub/amlogic-s9xxx-armbian/issues/3029), and [oec-turbo(rk3566)](https://github.com/ophub/amlogic-s9xxx-armbian/pull/2736). The following uses the `oes(a311d)` device as an example to detail the procedure. ##### 12.15.3.1 Check the Partition Layout ```shell ampart /dev/mmcblk2 # The partition information obtained is as follows: # =================================================================================== # IO seek EPT: Seeking to 37748736 # EPT report: 20 partitions in the table: # =================================================================================== # ID| name | offset|( human)| size|( human)| masks # ----------------------------------------------------------------------------------- # 0: bootloader 0 ( 0.00B) 400000 ( 4.00M) 0 # (GAP) 2000000 ( 32.00M) # 1: reserved 2400000 ( 36.00M) 4000000 ( 64.00M) 0 # (GAP) 800000 ( 8.00M) # 2: cache 6c00000 ( 108.00M) 20000000 ( 512.00M) 2 # (GAP) 800000 ( 8.00M) # 3: env 27400000 ( 628.00M) 800000 ( 8.00M) 0 # (GAP) 800000 ( 8.00M) # ... other partitions ... # =================================================================================== ``` ##### 12.15.3.2 Back Up Key Partitions ```shell dd if=/dev/mmcblk2 of=bootloader.bin bs=1M count=4 skip=0 dd if=/dev/mmcblk2 of=reserved.bin bs=1M count=8 skip=36 dd if=/dev/mmcblk2 of=env.bin bs=1M count=1 skip=628 ``` Place the backed-up files in the corresponding directory of the [u-boot](https://github.com/ophub/u-boot) repository: [u-boot/amlogic/bootloader/a311d-oes](https://github.com/ophub/u-boot/tree/main/u-boot/amlogic/bootloader/a311d-oes). You might have noticed that the reserved partition is 64MB in size, yet only 8MB was backed up. On the oes(a311d) device, only the first 8MB contains critical data; the remaining 56MB is empty. Here is how to verify this: ```shell # First, back up the complete 64MB file of the reserved partition: dd if=/dev/mmcblk2 of=reserved_64M.bin bs=1M count=64 skip=36 # Then, extract the first 8MB from the backed-up file reserved_64M.bin: dd if=reserved_64M.bin of=reserved_first_8M.bin bs=1M count=8 # Next, check the hexadecimal contents: hexdump -C reserved_first_8M.bin | less # Now, examine the last few lines of the output: 0071ffd0 4c 5e a8 1f fc 5b 5b 98 ae ef b0 97 0c 3b e8 c2 |L^...[[......;..| 0071ffe0 c8 e0 b2 74 3d 67 d5 3d 24 7b 63 b7 c7 73 f5 d8 |...t=g.=${c..s..| 0071fff0 a1 b8 38 a7 57 d6 b4 b5 e8 1c ba c0 07 0f f5 79 |..8.W..........y| 00720000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00800000 ``` Analyzing the output, the address of the last line containing non-zero data is `0071fff0`. Starting from address `00720000`, all content is `00` (zero). The hexdump utility uses an asterisk (`*`) to indicate repeated lines, meaning everything from `00720000` to the end of the file at `00800000` (the 8MB mark) is zero. Converting `0x00720000` to decimal gives 7,471,104 bytes (7.125 MB). Therefore, rounding up to 8MB for the backup is sufficient. Similarly, only the first 80KB of the env partition contains valid data, so 1MB is adequate. ##### 12.15.3.3 Add a Special Partition Writing File For implementation details, refer to the `write_board_bootloader` function in [/etc/armbian-board-release.conf](https://github.com/ophub/amlogic-s9xxx-armbian/blob/main/build-armbian/armbian-files/different-files/a311d-oes/rootfs/etc/armbian-board-release.conf). This function is called during the image rebuild process. This configuration file also serves as a powerful device customization hub — it allows precise control over image partition layout and size via parameters like `skip_mb="700"`, and supports custom scripts for kernel or system file operations. All advanced, device-specific customizations are centrally managed in this file. #### 12.15.4 Add Process Control Files Add the corresponding `BOARD` option to `armbian_board` in the [yml workflow control file](../.github/workflows/build-armbian-arm64-server-image.yml), which supports use in `Actions` on github.com. ### 12.16 How to Resolve the Issue of I/O Errors While Writing to eMMC Some devices can boot Armbian normally from USB/SD/TF but report I/O write errors when writing to eMMC, such as the case in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues/989): ```shell [ 284.338449] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.341544] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write [ 284.446972] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.450074] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write [ 284.497746] I/O error, dev mmcblk2, sector 0 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 2 [ 284.500871] Buffer I/O error on dev mmcblk2, logical block 0, lost async page write ``` In such cases, adjust the working mode speed and frequency of the dtb to stabilize storage read/write support. In SDR mode, the frequency is twice the speed; in DDR mode, the frequency equals the speed. For example: ```shell sd-uhs-sdr12 sd-uhs-sdr25 sd-uhs-sdr50 sd-uhs-ddr50 sd-uhs-sdr104 max-frequency = <208000000>; ``` Take the code snippet in the [dts](https://github.com/unifreq/linux-5.15.y/tree/main/arch/arm64/boot/dts/amlogic) file of the kernel source code as an example: ```shell /* SD card */ &sd_emmc_b { status = "okay"; bus-width = <4>; cap-sd-highspeed; sd-uhs-sdr12; sd-uhs-sdr25; sd-uhs-sdr50; max-frequency = <100000000>; }; /* eMMC */ &sd_emmc_c { status = "okay"; bus-width = <8>; cap-mmc-highspeed; max-frequency = <100000000>; }; ``` Generally, reducing the frequency of `&sd_emmc_c` from `max-frequency = <200000000>;` to `max-frequency = <100000000>;` resolves the issue. If not, try `50000000`. Adjust `&sd_emmc_b` for `USB/SD/TF` settings, and use `sd-uhs-sdr` to limit speed. Modify the dts file and [compile](https://github.com/ophub/amlogic-s9xxx-armbian/tree/main/compile-kernel) to get a test file, or use the decompilation method in `Section 12.13` to modify an existing dtb file. When modifying decompiled dtb files, use hexadecimal values: decimal `200000000` = hex `0xbebc200`, `100000000` = `0x5f5e100`, `50000000` = `0x2faf080`, `25000000` = `0x17d7840`. In addition to software-layer solutions, this issue can also be resolved through [hardware upgrades](https://github.com/ophub/amlogic-s9xxx-armbian/issues/998) or [physical modifications](https://www.right.com.cn/forum/thread-901586-1-1.html). ### 12.17 How to Solve the Issue of No Sound in the Bullseye Version Error log information for the sound issue: ```shell Mar 29 15:47:18 armbian-ct2000 kernel: fe.dai-link-0: ASoC: dpcm_fe_dai_prepare() failed (-22) Mar 29 15:47:18 armbian-ct2000 kernel: fe.dai-link-0: ASoC: no backend DAIs enabled for fe.dai-link-0 ``` Please refer to the method in [Bullseye NO Sound](https://github.com/ophub/amlogic-s9xxx-armbian/issues/1000) for settings. ```shell curl -fsSOL https://github.com/ophub/kernel/releases/download/tools/bullseye_g12_sound-khadas-utils-4-2-any.tar.gz tar -xzf bullseye_g12_sound-khadas-utils-4-2-any.tar.gz -C / systemctl enable sound.service systemctl restart sound.service ``` Restart Armbian for testing. If the sound still doesn't work, your device may be using an older audio output configuration. Comment out the new configuration at `L137-L142` in /usr/bin/g12_sound.sh (primarily for G12B / S922X; the older G12A/S905X2 and most SM1/S905X3 based on G12A cannot use it), and uncomment the old configuration at `L130-L134`. ### 12.18 How to build the boot.scr file In the Armbian system, the `boot.scr` file in `/boot` is the compiled boot script. `boot.scr` is generated from the `boot.cmd` source file. Modify `boot.cmd` to make changes, then compile it into `boot.scr` using the mkimage command. Normally, these files do not need modification. If adjustments are necessary, follow the steps below. ```shell # Install dependencies sudo apt-get update sudo apt-get install -y u-boot-tools # Edit the boot.cmd file cd /boot copy /boot/boot.cmd /boot/boot.cmd.bak copy /boot/boot.scr /boot/boot.scr.bak nano boot.cmd # Compile the boot.scr file mkimage -C none -A arm -T script -d boot.cmd boot.scr # Restart to test sync reboot # Additional Explanation # For Amlogic devices, the file used in USB is /boot/boot.scr, while the file used for writing to eMMC is /boot/boot-emmc.scr. ``` ### 12.19 How to Enable Remote Desktop and Modify the Default Port In the software center `armbian-software`, selecting `201` installs a desktop environment. During installation, you will be prompted to enable remote desktop — enter `y` to enable. The default remote desktop port is `3389`. To use a custom port: ```shell sudo nano /etc/xrdp/xrdp.ini # Change to a custom port, for example 5000 port=5000 ``` ### 12.20 TCP Congestion Control Optimization Guide Different network stack configurations are recommended based on device performance to ensure the best user experience. Please configure your device according to its hardware capabilities by editing `/etc/sysctl.conf` and modifying (or adding) the following lines: - Gigabit Devices (High Performance/Modern Arch): The `fq + bbr` combination is recommended to maximize throughput and improve packet loss resilience. - 100Mbps Devices (Low Performance/Legacy Arch): The `fq_codel + cubic` combination is suggested to minimize CPU load and maintain low-latency stability. ```shell # Option A: Recommended for Gigabit/High Performance Devices net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # Option B: Recommended for 100Mbps/Low Performance Devices # net.core.default_qdisc = fq_codel # net.ipv4.tcp_congestion_control = cubic ``` ================================================ FILE: documents/armbian_software.md ================================================ # Armbian Software Center [View English description](#armbian-software-center) | [查看中文说明](#armbian-软件中心) | [日本語の説明を確認する](#armbian-ソフトウェアセンター) Based on user feedback and requests in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues), commonly used [software](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf) has been gradually integrated to provide one-click install/update/uninstall operations. This includes `Docker images`, `desktop software`, `application services`, and more. ## Software Introduction | ID | SoftwareName | Home | DockerHub:Port | Software introduction | | --- | --------------------- | --------------------- | ---- | ------------------------------------------------- | | 101 | Docker | [Home](https://www.docker.com/) | [Docker](https://docs.docker.com/engine/install/) | Docker is an open platform for developing, shipping, and running applications. | | 102 | Portainer | [Home](https://www.portainer.io/) | [Docker](https://hub.docker.com/r/portainer/portainer-ce) :9443 | The most popular container management platform in the world. | | 103 | Yacht | [Home](https://yacht.sh/) | [Docker](https://hub.docker.com/r/selfhostedpro/yacht) :8001 | A container management UI with a focus on templates and 1-click deployments. | | 104 | Transmission | [Home](https://transmissionbt.com/) | [Docker](https://github.com/linuxserver/docker-transmission) :9091 | Transmission is a cross-platform BitTorrent client. | | 105 | qBittorrent | [Home](https://www.qbittorrent.org/) | [Docker](https://hub.docker.com/r/linuxserver/qbittorrent) :8080 | qBittorrent is a BitTorrent client. | | 106 | NextCloud | [Home](https://nextcloud.com/) | [Docker](https://hub.docker.com/r/arm64v8/nextcloud) :8088 | Nextcloud offers an on-premise Universal File Access and sync platform with powerful collaboration capabilities and desktop, mobile and web interfaces. | | 107 | Jellyfin | [Home](https://jellyfin.org/) | [Docker](https://hub.docker.com/r/linuxserver/jellyfin) :8096 | Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. | | 108 | HomeAssistant | [Home](https://www.home-assistant.io/) | [Docker](https://hub.docker.com/r/linuxserver/homeassistant) :8123 | Home Assistant integrates with over a thousand different devices and services, Has powerful automation features. | | 109 | Kodbox | [Home](https://kodcloud.com/) | [Docker](https://hub.docker.com/r/kodcloud/kodbox) :8081 | Private cloud online document management solution. | | 110 | CouchPotato | [Home](https://couchpota.to/) | [Docker](https://hub.docker.com/r/linuxserver/couchpotato) :5050 | Couchpotato is an automatic NZB and torrent downloader, Automatically find movies you want to watch. | | 111 | Sonarr | [Home](https://sonarr.tv/) | [Docker](https://hub.docker.com/r/linuxserver/sonarr) :8989 | Sonarr is a PVR for Usenet and BitTorrent users. | | 112 | Radarr | [Home](https://radarr.video/) | [Docker](https://hub.docker.com/r/linuxserver/radarr) :7878 | Radarr is a movie collection manager for Usenet and BitTorrent users. | | 113 | Syncthing | [Home](https://syncthing.net/) | [Docker](https://hub.docker.com/r/linuxserver/syncthing) :8384 | Syncthing is a continuous file synchronization program. | | 114 | FileBrowser | [Home](https://filebrowser.org/) | [Docker](https://hub.docker.com/r/filebrowser/filebrowser) :8002 | File Browser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. | | 115 | Heimdall | [Home](https://heimdall.site/) | [Docker](https://hub.docker.com/r/linuxserver/heimdall) :8003 | Heimdall is a way to organise all those links to your most used web sites and web applications in a simple way. | | 116 | Node-RED | [Home](https://nodered.org/) | [Docker](https://nodered.org/docs/getting-started/docker) :1880 | Node-RED is a programming tool. It provides a browser-based editor that makes it easy to wire together flows using the wide range of nodes in the palette that can be deployed to its runtime in a single-click. | | 117 | Mosquitto | [Home](https://www.mosquitto.org/) | [Docker](https://hub.docker.com/r/arm64v8/eclipse-mosquitto) :1883 | The MQTT protocol provides a lightweight method of carrying out messaging using a publish/subscribe model. Eclipse Mosquitto is an open source implementation of a server for versions 5, 3.1.1, and 3.1 of the MQTT protocol. | | 118 | OpenWrt | [Home](https://www.openwrt.org/) | [Docker](https://hub.docker.com/r/ophub/openwrt-armv8) :80 | The OpenWrt Project is a Linux operating system targeting embedded devices, it has more than 3000+ standardized application packages and a very rich third-party plug-in support. | | 119 | Netdata | [Home](https://learn.netdata.cloud/) | [Docker](https://hub.docker.com/r/netdata/netdata) :19999 | Netdata is distributed, real-time, performance and health monitoring for systems and applications. | | 120 | XunLei | [Home](https://github.com/cnk3x/xunlei) | [Docker](https://hub.docker.com/r/cnk3x/xunlei) :2345 | The Thunder remote download service program extracted from the Thunder Synology suite. | | 121 | Docker-Headless | [Home](https://github.com/infrastlabs/docker-headless) | [Docker](https://hub.docker.com/r/infrastlabs/docker-headless) :10081 | Remote Desktop with Audio/Locale/IBus Support. Multi Desktop (Gnome, Plasma, Mate, Xfce, Cinnamon) | | 122 | Navidrome | [Home](https://www.navidrome.org/) | [Docker](https://hub.docker.com/r/deluan/navidrome) :4533 | Navidrome is a self-hosted, open source music server and streamer. It gives you freedom to listen to your music collection from any browser or mobile device. | | 123 | Openlist | [Home](https://www.oplist.org/) | [Docker](https://hub.docker.com/r/openlistteam/openlist) :5244 | A file list program that supports multiple storage, powered by Gin and Solidjs. | | 124 | QingLong | [Home](https://github.com/whyour/qinglong) | [Docker](https://hub.docker.com/r/whyour/qinglong) :5700 | A timed task management panel that supports typescript, javaScript, python3, and shell. | | 125 | ChatGPT-Next-Web | [Home](https://github.com/Yidadaa/ChatGPT-Next-Web) | [Docker](https://hub.docker.com/r/yidadaa/chatgpt-next-web) :3000 | A well-designed cross-platform ChatGPT UI (Web / PWA / Linux / Win / MacOS). | | 126 | N8N | [Home](https://n8n.io/) | [Docker](https://hub.docker.com/r/n8nio/n8n) :5678 | n8n is a workflow automation platform that gives technical teams the flexibility of code with the speed of no-code. With 400+ integrations, native AI capabilities, and a fair-code license, n8n lets you build powerful automations while maintaining full control over your data and deployments. | | 201 | Desktop:GNOME | [Home](https://www.gnome.org/) | - | GNOME provides a focused desktop working environment that helps you get things done. `Desktop` can be connected to a monitor for use, or they can be used with [remote desktop](https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/remote-desktop-clients) software. | | 202 | Firefox | [Home](https://www.mozilla.org/) | - | An excellent web browser. | | 203 | VLC | [Home](https://www.videolan.org/) | - | VLC is a free, open source, cross-platform multimedia player and framework that can play most multimedia files. | | 204 | MPV | [Home](https://mpv.io/) | - | A free, open source, and cross-platform media player. | | 205 | GIMP | [Home](https://www.gimp.org/) | - | GIMP is a cross-platform image editor. | | 206 | Krita | [Home](https://krita.org/) | - | Krita is a professional FREE and open source painting program. | | 207 | LibreOffice | [Home](https://www.libreoffice.org/) | - | LibreOffice is a free and powerful office suite, Its clean interface and feature-rich tools help you unleash your creativity and enhance your productivity. | | 208 | Shotcut | [Home](https://shotcut.org/) | - | Shotcut is a free, open source, cross-platform video editor. | | 209 | Kdenlive | [Home](https://kdenlive.org/) | - | Kdenlive is Free and Open Source Video Editor. | | 210 | Thunderbird | [Home](https://www.thunderbird.net/) | - | Thunderbird makes email better for you, bringing together speed, privacy and the latest technologies. | | 211 | Evolution | [Home](https://github.com/GNOME/evolution) | - | Evolution is a personal information management application that provides integrated mail, calendaring and address book functionality. | | 212 | Gwenview | [Home](https://apps.kde.org/gwenview/) | - | Gwenview is a fast and easy to use image viewer by KDE, ideal for browsing and displaying a collection of images. | | 213 | Eog | [Home](https://gitlab.gnome.org/GNOME/eog) | - | Eye of GNOME(eog) is a image viewer program. It is meant to be a fast and functional image viewer. | | 214 | VisualStudioCode | [Home](https://code.visualstudio.com/) | - | Visual Studio Code is a lightweight but powerful source code editor. | | 215 | Gedit | [Home](https://github.com/GNOME/gedit) | - | Gedit is a full-featured text editor for the GNOME desktop environment. You can use it to prepare simple notes and documents, or you can use some of its advanced features, making it your own software development environment. | | 216 | Flameshot | [Home](https://flameshot.org/) | - | Powerful, yet simple to use open-source screenshot software. | | 301 | Frps | [Home](https://gofrp.org/) | - | A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. | | 302 | Frpc | [Home](https://gofrp.org/) | - | Frp is a high-performance reverse proxy application focusing on intranet penetration, supporting TCP, UDP, HTTP, HTTPS and other protocols. | | 303 | NPS | [Home](https://ehang-io.github.io/nps) | - | NPS is a lightweight, high-performance, powerful intranet penetration proxy server, with a powerful web management terminal. | | 304 | NPC | [Home](https://ehang-io.github.io/nps) | - | NPCs are clients of NPS. | | 305 | Plex | [Home](https://www.plex.tv/) | - | From personal media on your own server, to free and on-demand Movies & Shows, live TV, podcasts, and web shows, to streaming music, you can enjoy it all in one app, on any device. | | 306 | Emby-Server | [Home](https://emby.media/) | - | Sync your personal media to the cloud for easy backup, archiving, and converting. Store your content in multiple resolutions to enable direct streaming from any device. | | 307 | KVM | [Home](https://virt-manager.org/) | - | KVM (for Kernel-Based Virtual Machines) is a complete virtualization solution for Linux with virtualization extensions. The virt-manager application is a desktop user interface for managing virtual machines through libvirt. It primarily targets KVM VMs, but also manages Xen and LXC (linux containers). KVM virtual machine can install [OpenWrt](https://github.com/unifreq/openwrt_packit), Debian, Ubuntu, OpenSUSE, ArchLinux, Centos, Gentoo, KyLin, UOS, etc. | | 308 | PVE | [Home](https://github.com/pimox/pimox7) | https://IP:8006 | Proxmox Virtual Environment is an open source server virtualization management solution based on QEMU/KVM and LXC. You can manage virtual machines, containers, highly available clusters, storage and networks with an integrated, easy-to-use web interface or via CLI. | | 309 | CasaOS | [Home](https://github.com/IceWhaleTech/CasaOS) | http://IP | CasaOS is a simple, easy-to-use, elegant open-source Personal Cloud system. | | 310 | ArozOS | [Home](https://github.com/tobychui/arozos) | http://IP:8080 | ArozOS is a web-based desktop operating system suitable for low-power platforms. It features file/disk management, network statistics, a web server, and more. | ## Software Center Usage Guide Log in to the Armbian system and enter the command: ```shell armbian-software ``` A list of integrated software with shortcut management options will appear, for example: ```shell root@armbian:~# armbian-software [ STEPS ] Start selecting software [ Current system: debian/bullseye ]... ---------------------------------------------------------- ID NAME STATE MANAGE ---------------------------------------------------------- 102 Portainer installed update/remove 202 Firefox installed update/remove 302 Frpc not-installed install ... ---------------------------------------------------------- [ OPTIONS ] Please Input Software ID: ``` - `Uninstalled software`: Status shows `not-installed`. Enter the software `ID` to install. - `Installed software`: Status shows `installed`. Enter the software `ID` and follow the prompts to `update` or `remove`. ## Software Center Development Guide The software center scripts and commands are stored in the [/usr/share/ophub/armbian-software](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software) directory. Use `armbian-software -u` to sync and download this directory to the local system, updating the software center list. Files prefixed with numbers are `one-click installation scripts` for the corresponding software. [software-command.sh](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-command.sh) is the `unified command file` for installing/updating/removing software. [software-list.conf](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf) is the software list configuration file, described as follows: ```yaml # 1.ID 2.Software Name 3.AuthMethod@Package 4.Execute Selection 5.Supported Release 102 :Portainer :docker@portainer :command-docker.sh :all 202 :Firefox :dpkg@firefox :command-desktop.sh :all 302 :Frpc :which@frpc :302-frpc.sh :all 308 :PVE :dpkg@pve-manager :command-service.sh :bullseye@bookworm ... ``` - `ID`: The software's `unique serial number`. - `Software Name`: The `software name` (must be fewer than 40 characters). - `AuthMethod@Package`: The `verification method` for checking installation status and the corresponding `software package`, separated by `@`. - For Docker container images, use the `docker` method. Example: `docker@portainer` checks whether the `portainer` image is installed. - For packages installed via `apt`, use the `dpkg` method. Example: `dpkg@firefox` checks whether the `firefox` package is installed. - When executable files exist in system command directories (bin, sbin), use `which` to check for the binary. Example: `which@frpc` verifies the `frpc` service installation. - When no executable files exist in system command directories, use `find` to check for a specific path. Example: `find@/root/arozos` checks whether the `ArozOS` system is installed. - `Execute Selection`: Specifies whether the software uses a `unified command file` or an `independent script` for management. - For `simple` operations, commands are grouped by software category in `command-docker.sh / command-desktop.sh / command-service.sh` files, named by software serial number. For example, `portainer` (ID `102`) has its operations in `software_203()`. - For `complex` operations with lengthy instructions, independent script files are used. For example, the `frpc` installation script is named `302-frpc.sh`, prefixed with its serial number. - `Supported Release`: Specifies the supported Armbian `system version codenames`. Use `all` to indicate support for all versions. For partial support, list the version codenames separated by `@`. Contributions of additional software are welcome. Feel free to submit requests in [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues). # Armbian 软件中心 根据用户在 [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues) 中的反馈需求,已逐步整合常用[软件](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf),实现一键安装/更新/卸载等快捷操作。包括 `Docker 镜像`、`桌面软件`、`应用服务` 等。 ## 软件介绍 | ID | 软件名称 | Home | DockerHub:Port | 软件介绍 | | --- | --------------------- | --------------------- | ---- | ------------------------------------------------- | | 101 | Docker | [Home](https://www.docker.com/) | [Docker](https://docs.docker.com/engine/install/) | Docker 是一个用于开发、发布和运行应用程序的开放平台。 | | 102 | Portainer | [Home](https://www.portainer.io/) | [Docker](https://hub.docker.com/r/portainer/portainer-ce) :9443 | 全球最受欢迎的容器管理平台。 | | 103 | Yacht | [Home](https://yacht.sh/) | [Docker](https://hub.docker.com/r/selfhostedpro/yacht) :8001 | 容器管理 UI,侧重于模板和一键式部署。 | | 104 | Transmission | [Home](https://transmissionbt.com/) | [Docker](https://github.com/linuxserver/docker-transmission) :9091 | Transmission 是一个跨平台的 BitTorrent 客户端。 | | 105 | qBittorrent | [Home](https://www.qbittorrent.org/) | [Docker](https://hub.docker.com/r/linuxserver/qbittorrent) :8080 | qBittorrent 是一个 BitTorrent 客户端。 | | 106 | NextCloud | [Home](https://nextcloud.com/) | [Docker](https://hub.docker.com/r/arm64v8/nextcloud) :8088 | Nextcloud 提供了一个本地通用文件访问和同步平台,具有强大的协作功能以及桌面,移动和 Web 界面。 | | 107 | Jellyfin | [Home](https://jellyfin.org/) | [Docker](https://hub.docker.com/r/linuxserver/jellyfin) :8096 | Jellyfin 是一个自由软件媒体系统,让你控制管理和流媒体你的媒体。 | | 108 | HomeAssistant | [Home](https://www.home-assistant.io/) | [Docker](https://hub.docker.com/r/linuxserver/homeassistant) :8123 | Home Assistant 集成了一千多种不同的设备和服务,具有强大的自动化功能。 | | 109 | Kodbox | [Home](https://kodcloud.com/) | [Docker](https://hub.docker.com/r/kodcloud/kodbox) :8081 | 私有云在线文档管理解决方案。 | | 110 | CouchPotato | [Home](https://couchpota.to/) | [Docker](https://hub.docker.com/r/linuxserver/couchpotato) :5050 | Couchpotato 是一个自动 NZB 和 torrent 下载器,自动查找要观看的电影。 | | 111 | Sonarr | [Home](https://sonarr.tv/) | [Docker](https://hub.docker.com/r/linuxserver/sonarr) :8989 | Sonarr 是 Usenet 和 BitTorrent 用户的个人视频录像机。 | | 112 | Radarr | [Home](https://radarr.video/) | [Docker](https://hub.docker.com/r/linuxserver/radarr) :7878 | Radarr 是 Usenet 和 BitTorrent 用户的电影收藏管理器。 | | 113 | Syncthing | [Home](https://syncthing.net/) | [Docker](https://hub.docker.com/r/linuxserver/syncthing) :8384 | Syncthing 是一个连续的文件同步程序。 | | 114 | FileBrowser | [Home](https://filebrowser.org/) | [Docker](https://hub.docker.com/r/filebrowser/filebrowser) :8002 | File Browser 在指定目录中提供文件管理界面,可用于上传,删除,预览,重命名和编辑文件。 | | 115 | Heimdall | [Home](https://heimdall.site/) | [Docker](https://hub.docker.com/r/linuxserver/heimdall) :8003 | Heimdall 是一种以简单的方式组织所有这些链接到您最常用的网站和 Web 应用程序的方法。 | | 116 | Node-RED | [Home](https://nodered.org/) | [Docker](https://nodered.org/docs/getting-started/docker) :1880 | Node-RED 是一种编程工具。它提供了一个基于浏览器的编辑器,使得使用调色板中的各种节点轻松地将流连接在一起,只需单击一下即可部署运行。 | | 117 | Mosquitto | [Home](https://www.mosquitto.org/) | [Docker](https://hub.docker.com/r/arm64v8/eclipse-mosquitto) :1883 | MQTT 协议提供了一种使用发布/订阅模型执行消息传递的轻量级方法。Eclipse Mosquitto 是 MQTT 协议版本 5、3.1.1 和 3.1 的服务器的开源实现。 | | 118 | OpenWrt | [Home](https://www.openwrt.org/) | [Docker](https://hub.docker.com/r/ophub/openwrt-armv8) :80 | OpenWrt 项目是一个针对嵌入式设备的 Linux 操作系统,它拥有超过 3000+ 个标准化应用软件包和非常丰富的第三方插件支持。 | | 119 | Netdata | [Home](https://learn.netdata.cloud/) | [Docker](https://hub.docker.com/r/netdata/netdata) :19999 | Netdata 是针对系统和应用程序的分布式实时性能和运行状况监控。 | | 120 | XunLei | [Home](https://github.com/cnk3x/xunlei) | [Docker](https://hub.docker.com/r/cnk3x/xunlei) :2345 | 从迅雷群晖套件中提取出来的迅雷远程下载服务程序。 | | 121 | Docker-Headless | [Home](https://github.com/infrastlabs/docker-headless) | [Docker](https://hub.docker.com/r/infrastlabs/docker-headless) :10081 | 具有音频/区域设置/IBus 支持的远程桌面。 支持多桌面(Gnome、Plasma、Mate、Xfce、Cinnamon) | | 122 | Navidrome | [Home](https://www.navidrome.org/) | [Docker](https://hub.docker.com/r/deluan/navidrome) :4533 | Navidrome 是一个自托管的开源音乐服务器和流媒体。 它使您可以自由地从任何浏览器或移动设备收听音乐收藏。 | | 123 | Openlist | [Home](https://www.oplist.org/) | [Docker](https://hub.docker.com/r/openlistteam/openlist) :5244 | 一个支持多种存储的文件列表程序,使用 Gin 和 Solidjs。 | | 124 | QingLong | [Home](https://github.com/whyour/qinglong) | [Docker](https://hub.docker.com/r/whyour/qinglong) :5700 | 支持 python3、javaScript、shell、typescript 的定时任务管理面板。 | | 125 | ChatGPT-Next-Web | [Home](https://github.com/Yidadaa/ChatGPT-Next-Web) | [Docker](https://hub.docker.com/r/yidadaa/chatgpt-next-web) :3000 | 一键免费部署你的跨平台私人 ChatGPT 应用。 | | 126 | N8N | [Home](https://n8n.io/) | [Docker](https://hub.docker.com/r/n8nio/n8n) :5678 | n8n 是一个工作流自动化平台,为技术团队提供了无代码的高效开发速度。它内置了超过 400 种集成、原生的 AI 能力,并采用公平代码许可,让你在构建强大自动化流程的同时,仍然能完全掌控自己的数据和部署。 | | 201 | Desktop:GNOME | [Home](https://www.gnome.org/) | - | GNOME 提供了一个专注的桌面工作环境,可帮助您完成工作。`桌面`可以连接显示器使用,也可以使用[远程桌面](https://learn.microsoft.com/zh-cn/windows-server/remote/remote-desktop-services/clients/remote-desktop-clients)软件连接使用。 | | 202 | Firefox | [Home](https://www.mozilla.org/) | - | 一款优秀的网页浏览器。 | | 203 | VLC | [Home](https://www.videolan.org/) | - | VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件。 | | 204 | MPV | [Home](https://mpv.io/) | - | 一个免费的、开源的、跨平台的媒体播放器。 | | 205 | GIMP | [Home](https://www.gimp.org/) | - | GIMP 是一个跨平台的图像编辑器。 | | 206 | Krita | [Home](https://krita.org/) | - | Krita 是一个专业的免费和开源绘画程序。 | | 207 | LibreOffice | [Home](https://www.libreoffice.org/) | - | LibreOffice 是一个免费且功能强大的办公套件,其简洁的界面和功能丰富的工具可帮助您释放创造力并提高生产力。 | | 208 | Shotcut | [Home](https://shotcut.org/) | - | Shotcut 是一个免费的,开源的,跨平台的视频编辑器。 | | 209 | Kdenlive | [Home](https://kdenlive.org/) | - | Kdenlive 是一个免费和开源视频编辑器。 | | 210 | Thunderbird | [Home](https://www.thunderbird.net/) | - | Thunderbird 将速度、隐私和最新技术结合在一起,让您更好地利用电子邮件。 | | 211 | Evolution | [Home](https://github.com/GNOME/evolution) | - | Evolution 是一个个人信息管理应用程序,提供集成的邮件、日历和地址簿功能。 | | 212 | Gwenview | [Home](https://apps.kde.org/gwenview/) | - | Gwenview 是 KDE 出品的一款轻便易用的图像查看器,是浏览、显示多张图像时的理想工具。 | | 213 | Eog | [Home](https://gitlab.gnome.org/GNOME/eog) | - | Eye of GNOME(eog)一个图像查看器程序。它旨在成为一个快速且功能强大的图像查看器。 | | 214 | VisualStudioCode | [Home](https://code.visualstudio.com/) | - | Visual Studio Code 是一个轻量级但功能强大的源代码编辑器。 | | 215 | Gedit | [Home](https://github.com/GNOME/gedit) | - | Gedit 是一个用于 GNOME 桌面环境的全功能文本编辑器。您可以使用它来准备简单的笔记和文档,也可以使用它的一些高级功能,使其成为您自己的软件开发环境。 | | 216 | Flameshot | [Home](https://flameshot.org/) | - | 功能强大,但易于使用的开源屏幕截图软件。 | | 301 | Frps | [Home](https://gofrp.org/) | - | Frp 是一种快速反向代理,可帮助您将 NAT 或防火墙后面的本地服务器暴露给互联网。 | | 302 | Frpc | [Home](https://gofrp.org/) | - | Frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。 | | 303 | NPS | [Home](https://ehang-io.github.io/nps) | - | NPS 服务端。一款轻量级、高性能、功能强大的内网渗透代理服务器,具有强大的 Web 管理终端。 | | 304 | NPC | [Home](https://ehang-io.github.io/nps) | - | NPC 是 NPS 的客户端。 | | 305 | Plex | [Home](https://www.plex.tv/) | - | 从您自己服务器上的个人媒体,到免费和点播的电影和节目,直播电视,播客和网络节目,再到流媒体音乐,您可以在任何设备上的一个应用程序中享受所有这些内容。 | | 306 | Emby-Server | [Home](https://emby.media/) | - | 将您的个人媒体同步到云,以便轻松备份、存档和转换。以多种分辨率存储您的内容,以便从任何设备直接流式传输。 | | 307 | KVM | [Home](https://virt-manager.org/) | - | KVM(用于基于内核的虚拟机)是包含虚拟化扩展适用于 Linux 的完整虚拟化解决方案。virt-manager 应用程序是一个桌面用户界面,用于通过 libvirt 管理虚拟机。它主要针对 KVM VM,但也管理 Xen 和 LXC(Linux 容器)。KVM 虚拟机可以安装 [OpenWrt](https://github.com/unifreq/openwrt_packit)、Debian、Ubuntu、OpenSUSE、ArchLinux、Centos、Gentoo、KyLin、UOS 等等。 | | 308 | PVE | [Home](https://github.com/pimox/pimox7) | https://IP:8006 | Proxmox 虚拟环境是一个基于 QEMU/KVM 和 LXC 的开源服务器虚拟化管理解决方案。您可以使用集成的、易于使用的 web 界面或通过 CLI 管理虚拟机、容器、高可用集群、存储和网络。 | | 309 | CasaOS | [Home](https://github.com/IceWhaleTech/CasaOS) | http://IP | CasaOS 是一个简单、易于使用、优雅的开源个人云系统。 | | 310 | ArozOS | [Home](https://github.com/tobychui/arozos) | http://IP:8080 | ArozOS 是一个适用于低功耗平台的 Web 桌面操作系统。有文件/磁盘管理,网络统计,WEB服务器等功能。 | ## 软件中心使用说明 登录 Armbian 系统后输入以下命令: ```shell armbian-software ``` 将显示当前已整合的软件快捷管理列表,例如: ```shell root@armbian:~# armbian-software [ STEPS ] Start selecting software [ Current system: debian/bullseye ]... ---------------------------------------------------------- ID NAME STATE MANAGE ---------------------------------------------------------- 102 Portainer installed update/remove 202 Firefox installed update/remove 302 Frpc not-installed install ... ---------------------------------------------------------- [ OPTIONS ] Please Input Software ID: ``` - `未安装的软件`:状态显示为 `not-installed`,输入软件对应的 `ID` 即可安装。 - `已安装的软件`:状态显示为 `installed`,输入软件对应的 `ID`,根据提示选择更新或删除。 ## 软件中心开发说明 软件中心的脚本和命令集中存放在 [/usr/share/ophub/armbian-software](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software) 目录下。使用 `armbian-software -u` 命令可同步下载此目录至本地,更新本地软件中心列表。其中以数字开头的文件是对应软件的`一键安装脚本`。[software-command.sh](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-command.sh) 是用于安装/更新/删除操作的`统一指令文件`。[software-list.conf](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf) 是软件列表配置文件,说明如下: ```yaml # 1.ID 2.Software Name 3.AuthMethod@Package 4.Execute Selection 5.Supported Release 102 :Portainer :docker@portainer :command-docker.sh :all 202 :Firefox :dpkg@firefox :command-desktop.sh :all 302 :Frpc :which@frpc :302-frpc.sh :all 308 :PVE :dpkg@pve-manager :command-service.sh :bullseye@bookworm ... ``` - `ID`: 软件的`唯一序号`。 - `Software Name`:`软件名称`(名称长度需小于 40 个字符)。 - `AuthMethod@Package`:软件安装状态的`检查方法`与对应的`软件包`,以 `@` 符号分隔。 - 通过 `docker` 容器安装的镜像,采用 `docker` 方式检查。例如:检查 `portainer` 镜像是否安装,使用 `docker@portainer`。 - 通过 `apt` 方式安装的软件包,采用 `dpkg` 方式检查。例如:检查 `firefox` 是否安装,使用 `dpkg@firefox`。 - 在系统命令目录 (bin, sbin) 存在可执行文件时,采用 `which` 方式检查。例如:检查 `frpc` 服务是否安装,使用 `which@frpc`。 - 在系统命令目录无可执行文件时,采用 `find` 方式检查指定路径是否存在。例如:检查 `arozos` 系统是否安装,使用 `find@/root/arozos`。 - `Execute Selection`:设置软件使用`统一指令文件`或`独立脚本`进行管理。 - 对于操作命令`较为精简`的软件,按分类集中写在 `command-docker.sh / command-desktop.sh / command-service.sh` 文件中,以软件序号命名。例如 `portainer`(序号 `102`)的操作写在 `software_203()` 中。 - 对于操作`较为复杂、指令内容较长`的软件,采用独立脚本文件管理。例如 `frpc` 的安装脚本以序号开头,命名为 `302-frpc.sh`。 - `Supported Release`:设置支持的 Armbian `系统版本代号`。全部版本都支持时使用 `all` 表示。仅支持部分版本时,填写版本代号,多个代号之间使用 `@` 符号连接。 欢迎大家补充更多软件。欢迎在 [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues) 中提交支持需求。 # Armbian ソフトウェアセンター ユーザーからの [Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues) でのフィードバックやリクエストに基づき、よく使われる[ソフトウェア](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf)を順次統合し、ワンクリックでのインストール/更新/アンインストールなどの操作を実現しています。`Docker イメージ`、`デスクトップソフトウェア`、`アプリケーションサービス`などが含まれます。 ## ソフトウェア紹介 | ID | ソフトウェア名 | Home | DockerHub:Port | ソフトウェア紹介 | | --- | --------------------- | --------------------- | ---- | ------------------------------------------------- | | 101 | Docker | [Home](https://www.docker.com/) | [Docker](https://docs.docker.com/engine/install/) | Docker はアプリケーションの開発、配布、実行のためのオープンプラットフォームです。 | | 102 | Portainer | [Home](https://www.portainer.io/) | [Docker](https://hub.docker.com/r/portainer/portainer-ce) :9443 | 世界で最も人気のあるコンテナ管理プラットフォームです。 | | 103 | Yacht | [Home](https://yacht.sh/) | [Docker](https://hub.docker.com/r/selfhostedpro/yacht) :8001 | テンプレートとワンクリックデプロイに重点を置いたコンテナ管理 UI です。 | | 104 | Transmission | [Home](https://transmissionbt.com/) | [Docker](https://github.com/linuxserver/docker-transmission) :9091 | Transmission はクロスプラットフォームの BitTorrent クライアントです。 | | 105 | qBittorrent | [Home](https://www.qbittorrent.org/) | [Docker](https://hub.docker.com/r/linuxserver/qbittorrent) :8080 | qBittorrent は BitTorrent クライアントです。 | | 106 | NextCloud | [Home](https://nextcloud.com/) | [Docker](https://hub.docker.com/r/arm64v8/nextcloud) :8088 | Nextcloud はオンプレミスのユニバーサルファイルアクセスと同期プラットフォームを提供し、強力なコラボレーション機能とデスクトップ、モバイル、Web インターフェースを備えています。 | | 107 | Jellyfin | [Home](https://jellyfin.org/) | [Docker](https://hub.docker.com/r/linuxserver/jellyfin) :8096 | Jellyfin はフリーソフトウェアのメディアシステムで、メディアの管理とストリーミングを制御できます。 | | 108 | HomeAssistant | [Home](https://www.home-assistant.io/) | [Docker](https://hub.docker.com/r/linuxserver/homeassistant) :8123 | Home Assistant は1000以上の異なるデバイスやサービスと統合し、強力な自動化機能を備えています。 | | 109 | Kodbox | [Home](https://kodcloud.com/) | [Docker](https://hub.docker.com/r/kodcloud/kodbox) :8081 | プライベートクラウドのオンラインドキュメント管理ソリューションです。 | | 110 | CouchPotato | [Home](https://couchpota.to/) | [Docker](https://hub.docker.com/r/linuxserver/couchpotato) :5050 | CouchPotato は自動 NZB および torrent ダウンローダーで、観たい映画を自動的に検索します。 | | 111 | Sonarr | [Home](https://sonarr.tv/) | [Docker](https://hub.docker.com/r/linuxserver/sonarr) :8989 | Sonarr は Usenet および BitTorrent ユーザー向けの個人用ビデオレコーダーです。 | | 112 | Radarr | [Home](https://radarr.video/) | [Docker](https://hub.docker.com/r/linuxserver/radarr) :7878 | Radarr は Usenet および BitTorrent ユーザー向けの映画コレクションマネージャーです。 | | 113 | Syncthing | [Home](https://syncthing.net/) | [Docker](https://hub.docker.com/r/linuxserver/syncthing) :8384 | Syncthing は継続的なファイル同期プログラムです。 | | 114 | FileBrowser | [Home](https://filebrowser.org/) | [Docker](https://hub.docker.com/r/filebrowser/filebrowser) :8002 | File Browser は指定ディレクトリ内でファイル管理インターフェースを提供し、ファイルのアップロード、削除、プレビュー、リネーム、編集が可能です。 | | 115 | Heimdall | [Home](https://heimdall.site/) | [Docker](https://hub.docker.com/r/linuxserver/heimdall) :8003 | Heimdall は、よく使うウェブサイトやウェブアプリケーションへのリンクをシンプルに整理する方法です。 | | 116 | Node-RED | [Home](https://nodered.org/) | [Docker](https://nodered.org/docs/getting-started/docker) :1880 | Node-RED はプログラミングツールです。ブラウザベースのエディターを提供し、パレット内の多様なノードを使ってフローを簡単に連結し、ワンクリックでデプロイ・実行できます。 | | 117 | Mosquitto | [Home](https://www.mosquitto.org/) | [Docker](https://hub.docker.com/r/arm64v8/eclipse-mosquitto) :1883 | MQTT プロトコルはパブリッシュ/サブスクライブモデルによる軽量なメッセージングを提供します。Eclipse Mosquitto は MQTT プロトコルバージョン 5、3.1.1、3.1 のサーバーのオープンソース実装です。 | | 118 | OpenWrt | [Home](https://www.openwrt.org/) | [Docker](https://hub.docker.com/r/ophub/openwrt-armv8) :80 | OpenWrt プロジェクトは組み込みデバイス向けの Linux オペレーティングシステムで、3000以上の標準化アプリケーションパッケージと非常に豊富なサードパーティプラグインをサポートしています。 | | 119 | Netdata | [Home](https://learn.netdata.cloud/) | [Docker](https://hub.docker.com/r/netdata/netdata) :19999 | Netdata はシステムとアプリケーションのための分散型リアルタイムパフォーマンス・ヘルスモニタリングツールです。 | | 120 | XunLei | [Home](https://github.com/cnk3x/xunlei) | [Docker](https://hub.docker.com/r/cnk3x/xunlei) :2345 | 迅雷 Synology スイートから抽出されたリモートダウンロードサービスプログラムです。 | | 121 | Docker-Headless | [Home](https://github.com/infrastlabs/docker-headless) | [Docker](https://hub.docker.com/r/infrastlabs/docker-headless) :10081 | オーディオ/ロケール/IBus サポート付きのリモートデスクトップ。マルチデスクトップ(Gnome、Plasma、Mate、Xfce、Cinnamon)対応。 | | 122 | Navidrome | [Home](https://www.navidrome.org/) | [Docker](https://hub.docker.com/r/deluan/navidrome) :4533 | Navidrome はセルフホスト型のオープンソース音楽サーバーおよびストリーマーです。任意のブラウザやモバイルデバイスから音楽コレクションを自由に楽しめます。 | | 123 | Openlist | [Home](https://www.oplist.org/) | [Docker](https://hub.docker.com/r/openlistteam/openlist) :5244 | 複数のストレージに対応するファイルリストプログラムで、Gin と Solidjs を使用しています。 | | 124 | QingLong | [Home](https://github.com/whyour/qinglong) | [Docker](https://hub.docker.com/r/whyour/qinglong) :5700 | python3、javaScript、shell、typescript をサポートするスケジュールタスク管理パネルです。 | | 125 | ChatGPT-Next-Web | [Home](https://github.com/Yidadaa/ChatGPT-Next-Web) | [Docker](https://hub.docker.com/r/yidadaa/chatgpt-next-web) :3000 | ワンクリックで無料デプロイできるクロスプラットフォーム対応のプライベート ChatGPT アプリケーションです。 | | 126 | N8N | [Home](https://n8n.io/) | [Docker](https://hub.docker.com/r/n8nio/n8n) :5678 | n8n はワークフロー自動化プラットフォームで、技術チームにノーコードの高効率な開発速度を提供します。400以上の統合、ネイティブ AI 機能を内蔵し、フェアコードライセンスを採用。強力な自動化フローを構築しながら、データとデプロイメントを完全に制御できます。 | | 201 | Desktop:GNOME | [Home](https://www.gnome.org/) | - | GNOME は集中型のデスクトップ作業環境を提供し、作業の完了を支援します。`デスクトップ`はモニターに接続して使用でき、[リモートデスクトップ](https://learn.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/clients/remote-desktop-clients)ソフトウェアを使用して接続することもできます。 | | 202 | Firefox | [Home](https://www.mozilla.org/) | - | 優れたウェブブラウザです。 | | 203 | VLC | [Home](https://www.videolan.org/) | - | VLC は無料でオープンソースのクロスプラットフォームマルチメディアプレーヤー兼フレームワークで、ほとんどのマルチメディアファイルを再生できます。 | | 204 | MPV | [Home](https://mpv.io/) | - | 無料でオープンソースのクロスプラットフォーム対応メディアプレーヤーです。 | | 205 | GIMP | [Home](https://www.gimp.org/) | - | GIMP はクロスプラットフォームの画像エディターです。 | | 206 | Krita | [Home](https://krita.org/) | - | Krita はプロフェッショナルな無料オープンソースのペインティングプログラムです。 | | 207 | LibreOffice | [Home](https://www.libreoffice.org/) | - | LibreOffice は無料で強力なオフィススイートです。洗練されたインターフェースと豊富な機能で、創造性を発揮し生産性を向上させます。 | | 208 | Shotcut | [Home](https://shotcut.org/) | - | Shotcut は無料でオープンソースのクロスプラットフォーム動画エディターです。 | | 209 | Kdenlive | [Home](https://kdenlive.org/) | - | Kdenlive は無料でオープンソースの動画エディターです。 | | 210 | Thunderbird | [Home](https://www.thunderbird.net/) | - | Thunderbird は速度、プライバシー、最新技術を組み合わせて、より良いメール体験を提供します。 | | 211 | Evolution | [Home](https://github.com/GNOME/evolution) | - | Evolution は統合されたメール、カレンダー、アドレス帳機能を提供する個人情報管理アプリケーションです。 | | 212 | Gwenview | [Home](https://apps.kde.org/gwenview/) | - | Gwenview は KDE 製の軽量で使いやすい画像ビューアーで、画像コレクションの閲覧・表示に最適です。 | | 213 | Eog | [Home](https://gitlab.gnome.org/GNOME/eog) | - | Eye of GNOME(eog)は画像ビューアープログラムです。高速かつ機能的な画像ビューアーを目指しています。 | | 214 | VisualStudioCode | [Home](https://code.visualstudio.com/) | - | Visual Studio Code は軽量ながら強力なソースコードエディターです。 | | 215 | Gedit | [Home](https://github.com/GNOME/gedit) | - | Gedit は GNOME デスクトップ環境向けのフル機能テキストエディターです。簡単なメモやドキュメントの作成に使用でき、高度な機能を活用して独自のソフトウェア開発環境としても使用できます。 | | 216 | Flameshot | [Home](https://flameshot.org/) | - | 強力でありながら使いやすいオープンソースのスクリーンショットソフトウェアです。 | | 301 | Frps | [Home](https://gofrp.org/) | - | Frp は高速なリバースプロキシで、NAT やファイアウォールの背後にあるローカルサーバーをインターネットに公開できます。 | | 302 | Frpc | [Home](https://gofrp.org/) | - | Frp はイントラネットペネトレーションに特化した高性能リバースプロキシアプリケーションで、TCP、UDP、HTTP、HTTPS などのプロトコルをサポートしています。 | | 303 | NPS | [Home](https://ehang-io.github.io/nps) | - | NPS サーバー側。軽量で高性能、強力なイントラネットペネトレーションプロキシサーバーで、強力な Web 管理端末を備えています。 | | 304 | NPC | [Home](https://ehang-io.github.io/nps) | - | NPC は NPS のクライアントです。 | | 305 | Plex | [Home](https://www.plex.tv/) | - | 自分のサーバー上の個人メディアから、無料やオンデマンドの映画・番組、ライブ TV、ポッドキャスト、ウェブ番組、ストリーミング音楽まで、あらゆるデバイスの1つのアプリですべて楽しめます。 | | 306 | Emby-Server | [Home](https://emby.media/) | - | 個人メディアをクラウドに同期して、簡単にバックアップ、アーカイブ、変換できます。コンテンツを複数の解像度で保存し、あらゆるデバイスからの直接ストリーミングを実現します。 | | 307 | KVM | [Home](https://virt-manager.org/) | - | KVM(カーネルベースの仮想マシン)は、仮想化拡張機能を含む Linux 向けの完全な仮想化ソリューションです。virt-manager は libvirt を介して仮想マシンを管理するデスクトップユーザーインターフェースです。主に KVM VM を対象としていますが、Xen と LXC(Linux コンテナ)も管理できます。KVM 仮想マシンには [OpenWrt](https://github.com/unifreq/openwrt_packit)、Debian、Ubuntu、OpenSUSE、ArchLinux、Centos、Gentoo、KyLin、UOS などをインストールできます。 | | 308 | PVE | [Home](https://github.com/pimox/pimox7) | https://IP:8006 | Proxmox 仮想環境は QEMU/KVM と LXC に基づくオープンソースのサーバー仮想化管理ソリューションです。統合されたウェブインターフェースまたは CLI で仮想マシン、コンテナ、高可用性クラスター、ストレージ、ネットワークを管理できます。 | | 309 | CasaOS | [Home](https://github.com/IceWhaleTech/CasaOS) | http://IP | CasaOS はシンプルで使いやすく、エレガントなオープンソースのパーソナルクラウドシステムです。 | | 310 | ArozOS | [Home](https://github.com/tobychui/arozos) | http://IP:8080 | ArozOS は低消費電力プラットフォームに適した Web ベースのデスクトップオペレーティングシステムです。ファイル/ディスク管理、ネットワーク統計、Web サーバーなどの機能を備えています。 | ## ソフトウェアセンター使用方法 Armbian システムにログインし、以下のコマンドを入力します: ```shell armbian-software ``` 統合済みソフトウェアのショートカット管理リストが表示されます。例: ```shell root@armbian:~# armbian-software [ STEPS ] Start selecting software [ Current system: debian/bullseye ]... ---------------------------------------------------------- ID NAME STATE MANAGE ---------------------------------------------------------- 102 Portainer installed update/remove 202 Firefox installed update/remove 302 Frpc not-installed install ... ---------------------------------------------------------- [ OPTIONS ] Please Input Software ID: ``` - `未インストールのソフトウェア`:ステータスが `not-installed` と表示されます。ソフトウェアの `ID` を入力するとインストールされます。 - `インストール済みのソフトウェア`:ステータスが `installed` と表示されます。ソフトウェアの `ID` を入力し、プロンプトに従って更新または削除を選択します。 ## ソフトウェアセンター開発ガイド ソフトウェアセンターのスクリプトとコマンドは [/usr/share/ophub/armbian-software](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software) ディレクトリに集中して保存されています。`armbian-software -u` コマンドでこのディレクトリをローカルに同期ダウンロードし、ソフトウェアセンターリストを更新できます。数字で始まるファイルは対応するソフトウェアの`ワンクリックインストールスクリプト`です。[software-command.sh](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-command.sh) はインストール/更新/削除操作のための`統一コマンドファイル`です。[software-list.conf](../build-armbian/armbian-files/common-files/usr/share/ophub/armbian-software/software-list.conf) はソフトウェアリスト設定ファイルで、説明は以下の通りです: ```yaml # 1.ID 2.Software Name 3.AuthMethod@Package 4.Execute Selection 5.Supported Release 102 :Portainer :docker@portainer :command-docker.sh :all 202 :Firefox :dpkg@firefox :command-desktop.sh :all 302 :Frpc :which@frpc :302-frpc.sh :all 308 :PVE :dpkg@pve-manager :command-service.sh :bullseye@bookworm ... ``` - `ID`:ソフトウェアの`一意のシリアル番号`。 - `Software Name`:`ソフトウェア名`(名前の長さは40文字未満である必要があります)。 - `AuthMethod@Package`:ソフトウェアのインストール状態の`検査方法`と対応する`ソフトウェアパッケージ`で、`@` 記号で区切ります。 - `docker` コンテナ経由でインストールされたイメージは `docker` 方式で検査します。例:`portainer` イメージがインストールされているか確認する場合、`docker@portainer` を使用します。 - `apt` 経由でインストールされたパッケージは `dpkg` 方式で検査します。例:`firefox` がインストールされているか確認する場合、`dpkg@firefox` を使用します。 - システムのコマンドディレクトリ (bin, sbin) に実行ファイルが存在する場合、`which` 方式で検査します。例:`frpc` サービスがインストールされているか確認する場合、`which@frpc` を使用します。 - システムのコマンドディレクトリに実行ファイルがない場合、`find` 方式で指定パスの存在を検査します。例:`arozos` システムがインストールされているか確認する場合、`find@/root/arozos` を使用します。 - `Execute Selection`:ソフトウェアが`統一コマンドファイル`または`独立スクリプト`で管理されるかを設定します。 - `比較的シンプルな`操作のソフトウェアは、カテゴリ別に `command-docker.sh / command-desktop.sh / command-service.sh` ファイルに集約し、ソフトウェアシリアル番号で命名します。例えば `portainer`(シリアル番号 `102`)の操作は `software_203()` に記述されています。 - `比較的複雑で、コマンド内容が長い`ソフトウェアは、独立したスクリプトファイルで管理します。例えば `frpc` のインストールスクリプトはシリアル番号を先頭に付けて `302-frpc.sh` と命名します。 - `Supported Release`:サポートされる Armbian `システムバージョンコードネーム`を設定します。すべてのバージョンをサポートする場合は `all` を使用します。一部のバージョンのみサポートする場合は、バージョンコードネームを記入し、複数のコードネームは `@` 記号で連結します。 より多くのソフトウェアの追加を歓迎します。[Issues](https://github.com/ophub/amlogic-s9xxx-armbian/issues) でサポートリクエストを提出してください。 ================================================ FILE: documents/led_screen_display_control.md ================================================ # LED Screen Display Control Instructions [View English description](#led-screen-display-control-instructions) | [查看中文说明](#led-屏显示控制说明) | [日本語の説明を確認する](#led-スクリーン表示制御の説明) - The configuration files are located in the [/usr/share/openvfd](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd) directory of the `Armbian/OpenWrt` system. The `Armbian` command file is at [/usr/sbin/armbian-openvfd](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/sbin/armbian-openvfd), and the `OpenWrt` command file is at [/usr/sbin/openwrt-openvfd](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/make-openwrt/openwrt-files/common-files/usr/sbin/openwrt-openvfd). If these files are not present in your system, upload them manually and assign execution permissions: `chmod +x /usr/share/openvfd/vfdservice /usr/sbin/*-openvfd`. - Update the system kernel to the latest version. For the `Armbian` system, use the `armbian-sync` command. For the `OpenWrt` system, navigate to `System Menu` → `Amlogic Service` → `Online Download Update`. - The following devices have been tested: `x96max.conf`, `x96maxplus.conf`, `h96max-x3.conf`, `hk1-x3.conf`, `hk1box.conf`, `tx3.conf`, `x96air.conf`, and `x88pro-x3.conf`. Configurations for other devices can be adapted from [arthur-liberman/vfd-configurations](https://github.com/arthur-liberman/vfd-configurations) and [LibreELEC/linux_openvfd](https://github.com/LibreELEC/linux_openvfd/tree/master/conf). Note: the second field value in configuration entries from these sources must be decremented by `1`. For example: ```yaml vfd_gpio_clk='0,69,0' vfd_gpio_dat='0,70,0' ``` Modify to: ```yaml vfd_gpio_clk='0,68,0' vfd_gpio_dat='0,69,0' ``` - Taking the configuration of [x96maxplus](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/x96maxplus.conf) as an example: If the order of the displayed time text is incorrect, you can adjust the order of numbers in `vfd_chars='4,0,1,2,3'` to `vfd_chars='1,2,3,4,0'` for testing. If the time is displayed upside down, you can adjust the `first value 0x02` in `vfd_display_type='0x02,0x00,0x01,0x00'` to `0x01` for testing. The content displayed can be adjusted according to the specific situation of your device in `functions='usb apps setup sd hdmi cvbs'`. - Rename the configuration file to `diy.conf` and upload it to the `/usr/share/openvfd/conf` directory, then enter the command `armbian-openvfd 99` for testing. - The command `armbian-openvfd 0` disables the LED display and clears associated system processes. Before testing each new configuration, always run this disable command first, then execute `armbian-openvfd 99` to test the modified configuration. - Some devices may display a boot message before Linux starts (e.g., showing `BOOT`). To clear this message, first run `armbian-openvfd 0` to stop existing services, then run `armbian-openvfd ` to take control of the LED display. To disable the display entirely, run `armbian-openvfd 0` again. - Once the display is working correctly, add it to the boot startup tasks. Replace `15` in the following commands with your device's `BoxID`: ```yaml # Execute the following command in the terminal to enable the openvfd service sed -i 's|^#*openvfd_enable=.*|openvfd_enable="yes"|g' /etc/custom_service/start_service.sh sed -i 's|^#*openvfd_boxid=.*|openvfd_boxid="15"|g' /etc/custom_service/start_service.sh # Some devices require restarting the OpenVFD service to clear 'BOOT' and related messages sed -i 's|^#*openvfd_restart=.*|openvfd_restart="yes"|g' /etc/custom_service/start_service.sh ``` - Everyone is welcome to test and share their device configuration files (diy.conf) to benefit the community. | BoxName | `BoxID` | Armbian Command | OpenWrt Command | Function | | ---------- | ------- | --------------------- | ----------------------- | ----------- | | x96max | 11 | armbian-openvfd 11 | openwrt-openvfd 11 | Enable LED | | x96maxplus | 12 | armbian-openvfd 12 | openwrt-openvfd 12 | Enable LED | | x96air | 13 | armbian-openvfd 13 | openwrt-openvfd 13 | Enable LED | | h96max-x3 | 14 | armbian-openvfd 14 | openwrt-openvfd 14 | Enable LED | | hk1-x3 | 15 | armbian-openvfd 15 | openwrt-openvfd 15 | Enable LED | | hk1box | 16 | armbian-openvfd 16 | openwrt-openvfd 16 | Enable LED | | tx3 | 17 | armbian-openvfd 17 | openwrt-openvfd 17 | Enable LED | | tx3-mini | 18 | armbian-openvfd 18 | openwrt-openvfd 18 | Enable LED | | t95 | 19 | armbian-openvfd 19 | openwrt-openvfd 19 | Enable LED | | t95z-plus | 20 | armbian-openvfd 20 | openwrt-openvfd 20 | Enable LED | | tx9-pro | 21 | armbian-openvfd 21 | openwrt-openvfd 21 | Enable LED | | x92 | 22 | armbian-openvfd 22 | openwrt-openvfd 22 | Enable LED | | whale | 23 | armbian-openvfd 23 | openwrt-openvfd 23 | Enable LED | | x88pro-x3 | 24 | armbian-openvfd 24 | openwrt-openvfd 24 | Enable LED | | diy | 99 | armbian-openvfd 99 | openwrt-openvfd 99 | Enable LED | | - | 0 | armbian-openvfd 0 | openwrt-openvfd 0 | Disable LED | | - | -u | armbian-openvfd -u | openwrt-openvfd -u | Update Conf | # LED 屏显示控制说明 - 配置文件位于 `Armbian/OpenWrt` 系统的 [/usr/share/openvfd](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd) 目录下。`Armbian` 系统的命令文件位于 [/usr/sbin/armbian-openvfd](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/sbin/armbian-openvfd),`OpenWrt` 系统的命令文件位于 [/usr/sbin/openwrt-openvfd](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/make-openwrt/openwrt-files/common-files/usr/sbin/openwrt-openvfd)。若当前系统中缺少这些文件,可手动上传并赋予执行权限:`chmod +x /usr/share/openvfd/vfdservice /usr/sbin/*-openvfd`。 - 将系统内核升级至最新版本。`Armbian` 系统使用 `armbian-sync` 命令升级;`OpenWrt` 系统通过 `系统菜单` → `晶晨宝盒` → `在线下载更新` 进行升级。 - 目前已测试的设备配置包括 `x96max.conf`、`x96maxplus.conf`、`h96max-x3.conf`、`hk1-x3.conf`、`hk1box.conf`、`tx3.conf`、`x96air.conf` 和 `x88pro-x3.conf` 等。其他设备的配置可参考 [arthur-liberman/vfd-configurations](https://github.com/arthur-liberman/vfd-configurations) 和 [LibreELEC/linux_openvfd](https://github.com/LibreELEC/linux_openvfd/tree/master/conf) 进行修改。注意:需将这两个网站配置文件中对应字段的第二个值减 `1` 后使用,例如: ```yaml vfd_gpio_clk='0,69,0' vfd_gpio_dat='0,70,0' ``` 修改为: ```yaml vfd_gpio_clk='0,68,0' vfd_gpio_dat='0,69,0' ``` - 以 [x96maxplus](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/x96maxplus.conf) 的配置为例:如果显示的时间文字顺序不正确,可以调整 `vfd_chars='4,0,1,2,3'` 的数字顺序为 `vfd_chars='1,2,3,4,0'` 等进行测试。如果时间是翻转显示,可以调整 `vfd_display_type='0x02,0x00,0x01,0x00'` 中的 `第一个值 0x02` 为 `0x01` 等进行测试。显示的内容可根据自己的设备支持的具体情况调整 `functions='usb apps setup sd hdmi cvbs'` 中的值。 - 将配置文件命名为 `diy.conf` 并上传至 `/usr/share/openvfd/conf` 目录下,输入命令 `armbian-openvfd 99` 进行测试。 - 通过命令 `armbian-openvfd 0` 可禁用 LED 显示并清除相关系统进程。每次测试新配置前,请先执行此禁用命令,再执行 `armbian-openvfd 99` 进行配置测试。 - 部分设备可能在 Linux 启动前显示开机信息(例如显示 `BOOT`)。要清除此信息,请先执行 `armbian-openvfd 0` 停止现有服务,然后执行 `armbian-openvfd ` 接管 LED 显示。若要禁用显示屏,再次执行 `armbian-openvfd 0` 即可。 - 屏幕显示正常后,可将其添加到开机自启动任务。将以下命令中的 `15` 替换为你的设备编号: ```yaml # 在终端执行以下命令启用 openvfd 服务 sed -i 's|^#*openvfd_enable=.*|openvfd_enable="yes"|g' /etc/custom_service/start_service.sh sed -i 's|^#*openvfd_boxid=.*|openvfd_boxid="15"|g' /etc/custom_service/start_service.sh # 有些设备需要重启 OpenVFD 服务以清除 'BOOT' 等相关信息 sed -i 's|^#*openvfd_restart=.*|openvfd_restart="yes"|g' /etc/custom_service/start_service.sh ``` - 欢迎大家测试后分享自己设备的配置文件(diy.conf),让更多人受益。 | 盒子名称 | `盒子编号` | Armbian 使用命令 | OpenWrt 使用命令 | 功能 | | ---------- | -------- | --------------------- | ----------------------- | ------- | | x96max | 11 | armbian-openvfd 11 | openwrt-openvfd 11 | 启用 LED | | x96maxplus | 12 | armbian-openvfd 12 | openwrt-openvfd 12 | 启用 LED | | x96air | 13 | armbian-openvfd 13 | openwrt-openvfd 13 | 启用 LED | | h96max-x3 | 14 | armbian-openvfd 14 | openwrt-openvfd 14 | 启用 LED | | hk1-x3 | 15 | armbian-openvfd 15 | openwrt-openvfd 15 | 启用 LED | | hk1box | 16 | armbian-openvfd 16 | openwrt-openvfd 16 | 启用 LED | | tx3 | 17 | armbian-openvfd 17 | openwrt-openvfd 17 | 启用 LED | | tx3-mini | 18 | armbian-openvfd 18 | openwrt-openvfd 18 | 启用 LED | | t95 | 19 | armbian-openvfd 19 | openwrt-openvfd 19 | 启用 LED | | t95z-plus | 20 | armbian-openvfd 20 | openwrt-openvfd 20 | 启用 LED | | tx9-pro | 21 | armbian-openvfd 21 | openwrt-openvfd 21 | 启用 LED | | x92 | 22 | armbian-openvfd 22 | openwrt-openvfd 22 | 启用 LED | | whale | 23 | armbian-openvfd 23 | openwrt-openvfd 23 | 启用 LED | | x88pro-x3 | 24 | armbian-openvfd 24 | openwrt-openvfd 24 | 启用 LED | | diy | 99 | armbian-openvfd 99 | openwrt-openvfd 99 | 启用 LED | | - | 0 | armbian-openvfd 0 | openwrt-openvfd 0 | 禁用 LED | | - | -u | armbian-openvfd -u | openwrt-openvfd -u | 更新配置 | # LED スクリーン表示制御の説明 - 設定ファイルは `Armbian/OpenWrt` システムの [/usr/share/openvfd](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd) ディレクトリにあります。`Armbian` システムのコマンドファイルは [/usr/sbin/armbian-openvfd](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/sbin/armbian-openvfd) に、`OpenWrt` システムのコマンドファイルは [/usr/sbin/openwrt-openvfd](https://github.com/ophub/amlogic-s9xxx-openwrt/blob/main/make-openwrt/openwrt-files/common-files/usr/sbin/openwrt-openvfd) にあります。現在のシステムにこれらのファイルがない場合は、手動でアップロードして実行権限を付与してください:`chmod +x /usr/share/openvfd/vfdservice /usr/sbin/*-openvfd`。 - システムカーネルを最新バージョンにアップグレードしてください。`Armbian` システムは `armbian-sync` コマンドでアップグレードします。`OpenWrt` システムは `システムメニュー` → `晶晨宝盒` → `オンラインダウンロード更新` からアップグレードします。 - 現在テスト済みのデバイス設定には `x96max.conf`、`x96maxplus.conf`、`h96max-x3.conf`、`hk1-x3.conf`、`hk1box.conf`、`tx3.conf`、`x96air.conf`、`x88pro-x3.conf` などがあります。その他のデバイスの設定は [arthur-liberman/vfd-configurations](https://github.com/arthur-liberman/vfd-configurations) と [LibreELEC/linux_openvfd](https://github.com/LibreELEC/linux_openvfd/tree/master/conf) を参考に修正できます。注意:これら2つのサイトの設定ファイルの対応フィールドの2番目の値を `1` 減らしてから使用する必要があります。例: ```yaml vfd_gpio_clk='0,69,0' vfd_gpio_dat='0,70,0' ``` 以下に修正: ```yaml vfd_gpio_clk='0,68,0' vfd_gpio_dat='0,69,0' ``` - [x96maxplus](../build-armbian/armbian-files/platform-files/amlogic/rootfs/usr/share/openvfd/conf/x96maxplus.conf) の設定を例に説明します:表示される時刻テキストの順序が正しくない場合、`vfd_chars='4,0,1,2,3'` の数字の順序を `vfd_chars='1,2,3,4,0'` などに調整してテストできます。時刻が反転表示される場合、`vfd_display_type='0x02,0x00,0x01,0x00'` の `最初の値 0x02` を `0x01` などに調整してテストできます。表示内容はデバイスでサポートされている具体的な状況に応じて `functions='usb apps setup sd hdmi cvbs'` の値を調整できます。 - 設定ファイルを `diy.conf` にリネームして `/usr/share/openvfd/conf` ディレクトリにアップロードし、コマンド `armbian-openvfd 99` を入力してテストします。 - コマンド `armbian-openvfd 0` で LED 表示を無効にし、関連するシステムプロセスをクリアできます。新しい設定をテストする前に、まずこの無効化コマンドを実行し、その後 `armbian-openvfd 99` を実行して設定をテストしてください。 - 一部のデバイスは Linux 起動前に起動メッセージを表示する場合があります(例:`BOOT` と表示)。このメッセージをクリアするには、まず `armbian-openvfd 0` を実行して既存のサービスを停止し、次に `armbian-openvfd ` を実行して LED 表示を制御します。表示を完全に無効にするには、再度 `armbian-openvfd 0` を実行してください。 - スクリーン表示が正常に動作した後、起動時の自動開始タスクに追加できます。以下のコマンドの `15` をお使いのデバイスの番号に置き換えてください: ```yaml # ターミナルで以下のコマンドを実行して openvfd サービスを有効にする sed -i 's|^#*openvfd_enable=.*|openvfd_enable="yes"|g' /etc/custom_service/start_service.sh sed -i 's|^#*openvfd_boxid=.*|openvfd_boxid="15"|g' /etc/custom_service/start_service.sh # 一部のデバイスでは 'BOOT' などの関連メッセージをクリアするために OpenVFD サービスの再起動が必要です sed -i 's|^#*openvfd_restart=.*|openvfd_restart="yes"|g' /etc/custom_service/start_service.sh ``` - テスト後にご自身のデバイスの設定ファイル(diy.conf)を共有していただくことを歓迎します。より多くの方の参考になります。 | デバイス名 | `デバイス番号` | Armbian コマンド | OpenWrt コマンド | 機能 | | ---------- | ----------- | --------------------- | ----------------------- | -------- | | x96max | 11 | armbian-openvfd 11 | openwrt-openvfd 11 | LED 有効 | | x96maxplus | 12 | armbian-openvfd 12 | openwrt-openvfd 12 | LED 有効 | | x96air | 13 | armbian-openvfd 13 | openwrt-openvfd 13 | LED 有効 | | h96max-x3 | 14 | armbian-openvfd 14 | openwrt-openvfd 14 | LED 有効 | | hk1-x3 | 15 | armbian-openvfd 15 | openwrt-openvfd 15 | LED 有効 | | hk1box | 16 | armbian-openvfd 16 | openwrt-openvfd 16 | LED 有効 | | tx3 | 17 | armbian-openvfd 17 | openwrt-openvfd 17 | LED 有効 | | tx3-mini | 18 | armbian-openvfd 18 | openwrt-openvfd 18 | LED 有効 | | t95 | 19 | armbian-openvfd 19 | openwrt-openvfd 19 | LED 有効 | | t95z-plus | 20 | armbian-openvfd 20 | openwrt-openvfd 20 | LED 有効 | | tx9-pro | 21 | armbian-openvfd 21 | openwrt-openvfd 21 | LED 有効 | | x92 | 22 | armbian-openvfd 22 | openwrt-openvfd 22 | LED 有効 | | whale | 23 | armbian-openvfd 23 | openwrt-openvfd 23 | LED 有効 | | x88pro-x3 | 24 | armbian-openvfd 24 | openwrt-openvfd 24 | LED 有効 | | diy | 99 | armbian-openvfd 99 | openwrt-openvfd 99 | LED 有効 | | - | 0 | armbian-openvfd 0 | openwrt-openvfd 0 | LED 無効 | | - | -u | armbian-openvfd -u | openwrt-openvfd -u | 設定更新 | ================================================ FILE: rebuild ================================================ #!/bin/bash #================================================================================================ # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Run on x86_64 Ubuntu-22.04 to rebuild Armbian images. # Copyright (C) 2021~ https://www.armbian.com # Copyright (C) 2021~ https://github.com/unifreq # Copyright (C) 2021~ https://github.com/ophub/amlogic-s9xxx-armbian/blob/main/CONTRIBUTORS.md # Copyright (C) 2021~ https://github.com/ophub/amlogic-s9xxx-armbian # # Command: sudo ./rebuild # Command optional parameters please refer to the source code repository # #======================================== Functions list ======================================== # # error_msg : Output error message and exit # process_msg : Output process step message # mount_try : Mount the image file with retry # get_textoffset : Get kernel TEXT_OFFSET # # init_var : Initialize all variables # check_data : Validate the configuration data # find_armbian : Find Armbian file (build/output/images/*.img) # git_pull_dir : Download files from a git repository # download_depends : Download the dependency files # query_kernel : Query the latest kernel version # check_kernel : Verify kernel file integrity via sha256sum # download_kernel : Download the kernel files # # confirm_version : Confirm version and board configuration # extract_armbian : Extract Armbian image files # make_image : Create a new Armbian image # copy_files : Copy the Armbian files to the image # replace_kernel : Replace kernel files in the image # refactor_bootfs : Refactor bootfs partition files # refactor_rootfs : Refactor rootfs partition files # clean_tmp : Clear temporary files # # loop_rebuild : Loop to rebuild Armbian for all boards # #================================ Set make environment variables ================================ # # Related file storage path current_path="${PWD}" armbian_outputpath="${current_path}/build/output/images" armbian_rebuild_file="${armbian_outputpath}/*-trunk_*.img" build_path="${current_path}/build-armbian" kernel_path="${build_path}/kernel" uboot_path="${build_path}/u-boot" common_files="${build_path}/armbian-files/common-files" platform_files="${build_path}/armbian-files/platform-files" different_files="${build_path}/armbian-files/different-files" model_conf="${common_files}/etc/model_database.conf" firmware_path="${common_files}/usr/lib/firmware" tmp_dir="${current_path}/build/tmp_dir" tmp_outpath="${tmp_dir}/tmp_out" tmp_armbian="${tmp_dir}/tmp_armbian" tmp_build="${tmp_dir}/tmp_build" tmp_aml_image="${tmp_dir}/tmp_aml_image" # System operation environment arch_info="$(uname -m)" host_release="$(cat /etc/os-release | grep '^VERSION_CODENAME=.*' | cut -d'=' -f2)" # Get armbian ${VERSION_CODENAME}: such as [ resolute ] os_release_file="etc/os-release" # Set banner's ${BOARD_NAME}: such as [ s905x3 ] armbian_release_file="etc/armbian-release" # Add personalized settings for special devices, such as [ s922x-oes-plus ] board_release_file="etc/armbian-board-release.conf" # Add custom armbian information ophub_release_file="etc/ophub-release" # U-BOOT files download repository uboot_repo="https://github.com/ophub/u-boot" # Firmware files download repository firmware_repo="https://github.com/ophub/firmware" # Set the kernel download repository from github.com kernel_repo="https://github.com/ophub/kernel" # Set the tags(kernel_xxx) of the default kernel that can be replaced via the [ -u ] parameter default_tags="stable" kernel_usage="" # Set the list of kernels used by default(Selectable version) stable_kernel=("6.12.y" "6.18.y") flippy_kernel=(${stable_kernel[@]}) beta_kernel=(${stable_kernel[@]}) rk3588_kernel=("6.1.y") rk35xx_kernel=("6.1.y") h6_kernel=("6.6.y") specific_6xy=("6.1.y" "6.6.y" "6.12.y" "6.18.y") specific_5xy=("5.10.y" "5.15.y") # Set to automatically use the latest kernel auto_kernel="true" # Initialize the kernel array declare -A tags_list # Initialize the build device build_board="all" # Set Armbian size (Unit: MiB, boot_mb >= 256, root_mb >= 2048) boot_mb="512" root_mb="3000" # Set ROOTFS partition file system type, options: [ ext4 / btrfs ] rootfs_type="ext4" # Set Armbian OS type (server / desktop) os_type="server" # Set Armbian builder signature builder_name="" # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" NOTE="[\033[93m NOTE \033[0m]" WARNING="[\033[93m WARNING \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #================================================================================================ error_msg() { echo -e " [💔] ${1}" exit 1 } process_msg() { echo -e " [🌿] ${1}" } mount_try() { # Check mount parameters m_type="${1}" m_dev="${2}" m_target="${3}" [[ -n "${m_type}" && -n "${m_dev}" && -n "${m_target}" ]] || { error_msg "Mount parameter is missing: [ ${m_type}, ${m_dev}, ${m_target} ]" } t="1" max_try="10" while [[ "${t}" -le "${max_try}" ]]; do # Mount according to the image partition format if [[ "${m_type}" == "btrfs" ]]; then mount -t ${m_type} -o discard,compress=zstd:6 ${m_dev} ${m_target} 2>/dev/null else mount -t ${m_type} -o discard ${m_dev} ${m_target} 2>/dev/null fi # Mount failed and continue trying if [[ "${?}" -eq 0 ]]; then break else sync && sleep 3 umount -f ${m_target} 2>/dev/null ((t++)) fi done [[ "${t}" -gt "${max_try}" ]] && error_msg "[ ${t} ] attempts to mount failed." } get_textoffset() { vmlinuz_name="${1}" need_overload="yes" # With TEXT_OFFSET patch is [ 0108 ], without TEXT_OFFSET patch is [ 0000 ] and need to ues [ UBOOT_OVERLOAD ] file. [[ "$(hexdump -n 15 -x "${vmlinuz_name}" 2>/dev/null | head -n 1 | awk '{print $7}')" == "0108" ]] && need_overload="no" } init_var() { echo -e "${STEPS} Initializing variables..." # If it is followed by [ : ], it means that the option requires a parameter value local options="b:r:u:k:a:t:s:n:" parsed_args=$(getopt -o "${options}" -- "${@}") [[ ${?} -ne 0 ]] && error_msg "Parameter parsing failed." eval set -- "${parsed_args}" while true; do case "${1}" in -b | --Board) if [[ -n "${2}" ]]; then build_board="${2// /}" shift 2 else error_msg "Invalid -b parameter [ ${2} ]!" fi ;; -r | --kernelRepository) if [[ -n "${2}" ]]; then kernel_repo="${2}" shift 2 else error_msg "Invalid -r parameter [ ${2} ]!" fi ;; -u | --kernelUsage) if [[ -n "${2}" ]]; then kernel_usage="${2//kernel_/}" shift 2 else error_msg "Invalid -u parameter [ ${2} ]!" fi ;; -k | --Kernel) if [[ -n "${2}" ]]; then oldIFS="${IFS}" IFS="_" stable_kernel=(${2}) flippy_kernel=(${2}) beta_kernel=(${2}) specific_kernel=(${2}) IFS="${oldIFS}" shift 2 else error_msg "Invalid -k parameter [ ${2} ]!" fi ;; -a | --Autokernel) if [[ -n "${2}" ]]; then auto_kernel="${2}" shift 2 else error_msg "Invalid -a parameter [ ${2} ]!" fi ;; -t | --rootfsType) if [[ -n "${2}" ]]; then rootfs_type="${2}" shift 2 else error_msg "Invalid -t parameter [ ${2} ]!" fi ;; -s | --Size) if [[ -n "${2}" ]]; then img_mb="${2}" shift 2 else error_msg "Invalid -s parameter [ ${2} ]!" fi ;; -n | --BuilderName) if [[ -n "${2}" ]]; then builder_name="${2// /}" shift 2 else error_msg "Invalid -n parameter [ ${2} ]!" fi ;; --) shift break ;; *) [[ -n "${1}" ]] && error_msg "Invalid option [ ${1} ]!" break ;; esac done # Set the image size, such as [ -s 512/2560 ] or [ -s 2560 ] [[ -n "${img_mb}" ]] && { if [[ "${img_mb}" =~ / ]]; then boot_mb="${img_mb%%/*}" root_mb="${img_mb##*/}" else root_mb="${img_mb}" fi } } check_data() { # Columns of ${model_conf}: # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION # 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD [[ -f "${model_conf}" ]] || error_msg "Missing model config file: [ ${model_conf} ]" # Get a list of build devices if [[ "${build_board}" =~ ^(all|first50|range50_100|range100_150|last20)$ ]]; then board_list=":(yes)" build_armbian=($( cat ${model_conf} | sed -e 's/NA//g' -e 's/NULL//g' -e 's/[ ][ ]*//g' | grep -E "^[^#].*:yes$" | awk -F':' '{print $14}' | sort -u | xargs )) else board_list=":($(echo ${build_board} | sed -e 's/_/\|/g')):(yes|no)" build_armbian=($(echo ${build_board} | sed -e 's/_/ /g')) fi [[ "${#build_armbian[@]}" -eq 0 ]] && error_msg "The [ BOARD ] is missing, stop building." # Select the first 50 boards [[ "${build_board}" == "first50" ]] && { build_armbian=("${build_armbian[@]:0:50}") board_list=":($(echo ${build_armbian[@]} | sed -e 's/ /\|/g')):(yes|no)" } # Select the boards from 51st to 100th [[ "${build_board}" == "range50_100" ]] && { build_armbian=("${build_armbian[@]:50:50}") board_list=":($(echo ${build_armbian[@]} | sed -e 's/ /\|/g')):(yes|no)" } # Select the boards from 101st to 150th [[ "${build_board}" == "range100_150" ]] && { build_armbian=("${build_armbian[@]:100:50}") board_list=":($(echo ${build_armbian[@]} | sed -e 's/ /\|/g')):(yes|no)" } # Select the last 20 boards [[ "${build_board}" == "last20" ]] && { build_armbian=("${build_armbian[@]: -20}") board_list=":($(echo ${build_armbian[@]} | sed -e 's/ /\|/g')):(yes|no)" } # Get the kernel array kernel_from=($( cat ${model_conf} | sed -e 's/NA//g' -e 's/NULL//g' -e 's/[ ][ ]*//g' | grep -E "^[^#].*${board_list}$" | awk -F':' '{print $9}' | sort -u | xargs )) [[ "${#kernel_from[@]}" -eq 0 ]] && error_msg "Missing [ KERNEL_TAGS ] settings, stop building." # Replace custom kernel tags [[ -n "${kernel_usage}" ]] && { for ((i = 0; i < ${#kernel_from[@]}; i++)); do if [[ ${kernel_from[${i}]} == "${default_tags}/"* ]]; then kernel_from[${i}]="${kernel_from[${i}]//${default_tags}/${kernel_usage}}" fi done } # Convert the kernel_from to the kernel array for item in "${kernel_from[@]}"; do # Split the key and value IFS='/' read -r key value <<<"${item}" # Check if the value is "all". if [[ "${value}" == "all" ]]; then # If the value is "all", assign the value of ${key}_kernel. such as [ stable_kernel, rk3588_kernel, etc. ] eval "value=\"\${${key}_kernel[@]}\"" elif [[ "${value}" =~ ^[1-9]+ ]]; then if [[ "${value}" == "5.x.y" ]]; then value="${specific_5xy[@]}" elif [[ "${value}" == "6.x.y" ]]; then value="${specific_6xy[@]}" else IFS='_' read -ra value <<<"${value}" value="${value[@]}" fi fi # If auto_kernel is false, use the value from -k parameter if [[ ! "${auto_kernel}" =~ ^(true|yes)$ ]]; then if [[ "${#specific_kernel[@]}" -eq 0 ]]; then error_msg "Plase use the -k parameter to specify the kernel version." else value="${specific_kernel[@]}" fi fi # Merge the same key values if [[ -n "${tags_list[${key}]}" ]]; then tags_list[${key}]+=" ${value}" else tags_list[${key}]="${value}" fi done # Convert the tags_list array to the kernel array (remove duplicates) for key in "${!tags_list[@]}"; do # Convert the space-separated string to an array and remove duplicates read -ra unique_values <<<"$(echo "${tags_list[${key}]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')" # Assign the unique values back to the tags_list tags_list[${key}]="${unique_values[@]}" done # Check the kernel tags list [[ "${#tags_list[@]}" -eq 0 ]] && error_msg "The [ tags_list ] is missing, stop building." echo -e "${INFO} The kernel tags list: [ ${!tags_list[@]} ]" # Convert kernel repository address to api format [[ "${kernel_repo}" =~ ^https: ]] && kernel_repo="$(echo ${kernel_repo} | awk -F'/' '{print $4"/"$5}')" kernel_api="https://github.com/${kernel_repo}" } find_armbian() { cd ${current_path} echo -e "${STEPS} Searching for Armbian file..." # Get armbian release and version armbian_rebuild_name="$(ls ${armbian_rebuild_file} 2>/dev/null | head -n 1 | awk -F "/" '{print $NF}')" [[ -n "${armbian_rebuild_name}" ]] || error_msg "The armbian original file does not exist: [ ${armbian_rebuild_file} ]" # Find armbian version info: such as [ 22.02.0 ] armbian_rebuild_version="$(echo ${armbian_rebuild_name} | grep -oE '[2-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}' | head -n 1)" [[ -n "${armbian_rebuild_version}" ]] || { armbian_rebuild_version="22.02.02" echo -e "${WARNING} Missing armbian version info!" } echo -e "${INFO} Armbian rebuild file: [ ${armbian_rebuild_name} ], Version: [ ${armbian_rebuild_version} ]" } git_pull_dir() { cd ${current_path} # Check git_pull_dir parameters git_repo="${1}" git_branch="${2}" git_dir="${3}" git_path="${4}" [[ -n "${git_repo}" && -n "${git_branch}" && -n "${git_dir}" && -n "${git_path}" ]] || { error_msg "git_pull_dir parameter is missing: [ ${git_repo}, ${git_branch}, ${git_dir}, ${git_path} ]" } # Clone the repository to the temporary directory. If it fails, wait 1 minute and try again, try 10 times. git_tmp_path="$(mktemp -d)" for i in {1..10}; do git clone --quiet --single-branch --depth=1 --branch=${git_branch} ${git_repo} ${git_tmp_path} [[ "${?}" -eq 0 ]] && break || sleep 60 done [[ "${?}" -eq 0 ]] || error_msg "Failed to clone the [ ${git_repo} ] repository." # Copy the files to the storage directory mkdir -p ${git_path} cp -af --no-preserve=ownership ${git_tmp_path}/${git_dir}/. ${git_path} [[ "${?}" -eq 0 ]] || error_msg "Failed to move the [ ${git_dir} ] files to the [ ${git_path} ] directory." # Delete temporary files rm -rf ${git_tmp_path} 2>/dev/null } download_depends() { echo -e "${STEPS} Downloading dependency files..." # Download Armbian u-boot files uboot_num="$(find "${uboot_path}/rockchip" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)" [[ -n "${uboot_num}" && "${uboot_num}" -le "5" ]] && { git_pull_dir ${uboot_repo} main u-boot ${uboot_path} [[ "${?}" -eq 0 ]] && echo -e "${INFO} u-boot download completed." || error_msg "u-boot download failed." } || echo -e "${INFO} u-boot files exist, skip downloading." # Download Armbian firmware files firmware_num="$(find "${firmware_path}" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)" [[ -n "${firmware_num}" && "${firmware_num}" -le "5" ]] && { git_pull_dir ${firmware_repo} main firmware ${firmware_path} [[ "${?}" -eq 0 ]] && echo -e "${INFO} firmware download completed." || error_msg "firmware download failed." } || echo -e "${INFO} firmware files exist, skip downloading." } query_kernel() { echo -e "${STEPS} Querying the latest kernel version..." # Check the version on the kernel repository x="1" for key in "${!tags_list[@]}"; do { # Query the name of the latest kernel version tmp_arr_kernels=() down_kernel_list=(${tags_list[${key}]}) i=1 for kernel_var in "${down_kernel_list[@]}"; do echo -e "${INFO} (${x}.${i}) Auto query the latest kernel version for [ ${key} - ${kernel_var} ]" # Identify the kernel and , such as [ 6.1 ] kernel_verpatch="$(echo ${kernel_var} | awk -F '.' '{print $1"."$2}')" # Query the latest kernel version latest_version="$( curl -fsSL \ ${kernel_api}/releases/expanded_assets/kernel_${key} | grep -oP "${kernel_verpatch}\.[0-9]+(?=\.tar\.gz)" | sort -urV | head -n 1 )" if [[ "${?}" -eq 0 && -n "${latest_version}" ]]; then tmp_arr_kernels[${i}]="${latest_version}" else tmp_arr_kernels[${i}]="${kernel_var}" fi echo -e "${INFO} (${x}.${i}) [ ${key} - ${tmp_arr_kernels[$i]} ] is latest kernel. \n" ((i++)) done # Assign the latest kernel version to the array tags_list[${key}]="${tmp_arr_kernels[@]}" ((x++)) } done } check_kernel() { [[ -n "${1}" ]] && check_path="${1}" || error_msg "Invalid kernel path to check." check_files=($(cat "${check_path}/sha256sums" | awk '{print $2}')) for cf in "${check_files[@]}"; do { # Check if file exists [[ -s "${check_path}/${cf}" ]] || error_msg "The [ ${cf} ] file is missing." # Check if the file sha256sum is correct tmp_sha256sum="$(sha256sum "${check_path}/${cf}" | awk '{print $1}')" tmp_checkcode="$(cat ${check_path}/sha256sums | grep ${cf} | awk '{print $1}')" [[ "${tmp_sha256sum}" == "${tmp_checkcode}" ]] || error_msg "[ ${cf} ]: sha256sum verification failed." } done echo -e "${INFO} All [ ${#check_files[@]} ] kernel files are sha256sum checked to be complete.\n" } download_kernel() { cd ${current_path} echo -e "${STEPS} Downloading kernel files..." x="1" for key in "${!tags_list[@]}"; do { down_kernel_list=(${tags_list[${key}]}) # Download the kernel to the storage directory i="1" for kernel_var in "${down_kernel_list[@]}"; do if [[ ! -d "${kernel_path}/${key}/${kernel_var}" ]]; then kernel_down_from="https://github.com/${kernel_repo}/releases/download/kernel_${key}/${kernel_var}.tar.gz" echo -e "${INFO} (${x}.${i}) [ ${key} - ${kernel_var} ] Kernel download from [ ${kernel_down_from} ]" # Download the kernel files. If the download fails, try again 10 times. [[ -d "${kernel_path}/${key}" ]] || mkdir -p ${kernel_path}/${key} for t in {1..10}; do curl -fsSL "${kernel_down_from}" -o "${kernel_path}/${key}/${kernel_var}.tar.gz" [[ "${?}" -eq 0 ]] && break || sleep 60 done [[ "${?}" -eq 0 ]] || error_msg "Failed to download the kernel files from the server." # Decompress the kernel files tar -mxzf "${kernel_path}/${key}/${kernel_var}.tar.gz" -C "${kernel_path}/${key}" [[ "${?}" -eq 0 ]] || error_msg "[ ${kernel_var} ] kernel decompression failed." else echo -e "${INFO} (${x}.${i}) [ ${key} - ${kernel_var} ] Kernel is in the local directory." fi # If the kernel contains the sha256sums file, check the files integrity [[ -f "${kernel_path}/${key}/${kernel_var}/sha256sums" ]] && check_kernel "${kernel_path}/${key}/${kernel_var}" ((i++)) done # Delete downloaded kernel temporary files rm -f ${kernel_path}/${key}/*.tar.gz sync ((x++)) } done } confirm_version() { cd ${current_path} # Columns of ${model_conf}: # 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UBOOT_OVERLOAD 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.DESCRIPTION # 9.KERNEL_TAGS 10.PLATFORM 11.FAMILY 12.BOOT_CONF 13.CONTRIBUTORS 14.BOARD 15.BUILD # Column 5, called in Amlogic, in Rockchip, Not used in Allwinner. # Find [ the first ] configuration information with [ the same BOARD name ] and [ BUILD as yes ] in the ${model_conf} file. board_conf="$( cat ${model_conf} | sed -e 's/NA//g' -e 's/NULL//g' -e 's/[ ][ ]*//g' | grep -E "^[^#].*:${board}:(yes|no)$" | head -n 1 )" [[ -n "${board_conf}" ]] || error_msg "[ ${board} ] config is missing!" # Get device settings options MODEL_ID="$(echo ${board_conf} | awk -F':' '{print $1}')" MODEL_NAME="$(echo ${board_conf} | awk -F':' '{print $2}')" SOC="$(echo ${board_conf} | awk -F':' '{print $3}')" FDTFILE="$(echo ${board_conf} | awk -F':' '{print $4}')" UBOOT_OVERLOAD="$(echo ${board_conf} | awk -F':' '{print $5}')" TRUST_IMG="${UBOOT_OVERLOAD}" MAINLINE_UBOOT="$(echo ${board_conf} | awk -F':' '{print $6}')" BOOTLOADER_IMG="$(echo ${board_conf} | awk -F':' '{print $7}')" KERNEL_TAGS="$(echo ${board_conf} | awk -F':' '{print $9}')" PLATFORM="$(echo ${board_conf} | awk -F':' '{print $10}')" FAMILY="$(echo ${board_conf} | awk -F':' '{print $11}')" BOOT_CONF="$(echo ${board_conf} | awk -F':' '{print $12}')" CONTRIBUTORS="$(echo ${board_conf} | awk -F':' '{print $13}')" # Check whether the key parameters are correct [[ -n "${PLATFORM}" ]] || error_msg "Invalid PLATFORM parameter: [ ${PLATFORM} ]" # Set supported platform name support_platform=("amlogic" "rockchip" "allwinner") [[ -n "$(echo "${support_platform[@]}" | grep -w "${PLATFORM}")" ]] || error_msg "[ ${PLATFORM} ] not supported." # Add u-boot files record information [[ -n "${MAINLINE_UBOOT}" ]] && RECORD_MAINLINE_UBOOT="/usr/lib/u-boot/${MAINLINE_UBOOT}" || RECORD_MAINLINE_UBOOT="" [[ -n "${BOOTLOADER_IMG}" ]] && RECORD_BOOTLOADER_IMG="/usr/lib/u-boot/${BOOTLOADER_IMG}" || RECORD_BOOTLOADER_IMG="" [[ -n "${TRUST_IMG}" ]] && RECORD_TRUST_IMG="/usr/lib/u-boot/${TRUST_IMG}" || RECORD_TRUST_IMG="" # Get the kernel tags and version conf_kernel_tags="${KERNEL_TAGS%%/*}" conf_kernel_list="${KERNEL_TAGS##*/}" # Replace the default kernel tags with the custom kernel tags [[ -n "${kernel_usage}" && "${conf_kernel_tags}" == "${default_tags}" ]] && conf_kernel_tags="${kernel_usage}" # Check the kernel tags and version [[ -z "${conf_kernel_tags}" ]] && error_msg "The [ ${KERNEL_TAGS} ] is missing tags part." [[ -z "${conf_kernel_list}" ]] && error_msg "The [ ${KERNEL_TAGS} ] is missing list part." # Find the kernel list defined in the model database model_kernel=() if [[ "${conf_kernel_list}" == "all" ]]; then eval "model_kernel=(\"\${${conf_kernel_tags}_kernel[@]}\")" model_kernel=($(echo "${model_kernel[@]}" | xargs -n1 | sed -E 's/^([0-9]+\.[0-9]+)(\.[a-z0-9]+)?$/\1.[0-9]+/')) else # Convert the string into an array, using "_" as the delimiter IFS='_' read -ra conf_kernel_list <<<"${conf_kernel_list}" model_kernel=($(echo "${conf_kernel_list[@]}" | xargs -n1 | sed -E 's/^([0-9]+\.[0-9]+)(\.[a-z0-9]+)?$/\1.[0-9]+/')) fi # Check the kernel list [[ "${#model_kernel[@]}" -eq 0 ]] && error_msg "The kernel list is empty for [ ${board} ]" # Find the kernel version that matches the custom version build_kernel=() latest_kernel=(${tags_list[${conf_kernel_tags}]}) for ck in "${model_kernel[@]}"; do for lk in "${latest_kernel[@]}"; do [[ "${lk}" =~ ^${ck}$ ]] && build_kernel+=("${lk}") done done # Check the kernel version [[ "${#build_kernel[@]}" -eq 0 ]] && error_msg "The kernel list is invalid for [ ${board} ]" } extract_armbian() { process_msg "(1/7) Extract armbian files." cd ${current_path} rm -rf ${tmp_dir} mkdir -p ${tmp_outpath} ${tmp_armbian} ${tmp_build} ${tmp_aml_image} armbian_image_file="${tmp_aml_image}/armbian_${board}_${kernel}.img" rm -f ${armbian_image_file} cp -f "${armbian_outputpath}/${armbian_rebuild_name}" "${armbian_image_file}" loop_old="$(losetup -P -f --show "${armbian_image_file}")" [[ -n "${loop_old}" ]] || error_msg "losetup ${armbian_image_file} failed." # Mount rootfs partition [[ -b "${loop_old}p2" ]] && mount_dev="${loop_old}p2" || mount_dev="${loop_old}p1" mount_try ext4 ${mount_dev} ${tmp_armbian} cd ${tmp_armbian} # Find ID in ${os_release_file}: such as [ubuntu/debian] release_codeid="$(cat ${os_release_file} | grep -oE "^ID=.*" | cut -d"=" -f2)" [[ -z "${release_codeid}" ]] && error_msg "The [ ${os_release_file}: ID ] is invalid." # Find VERSION_CODENAME in ${os_release_file}: such as [resolute] release_codename="$(cat ${os_release_file} | grep -oE "^VERSION_CODENAME=.*" | cut -d"=" -f2)" [[ -z "${release_codename}" ]] && error_msg "The [ ${os_release_file}: VERSION_CODENAME ] is invalid." # Delete all files of /boot partition and replace it later rm -rf boot/* # Delete the kernel files and replace it later rm -rf usr/lib/modules/* # Delete the symbolic link files and relink it later rm -rf bin lib sbin var/lock var/run # Delete unused and duplicate scripts rm -f root/install* root/fstab.template rm -f usr/bin/armbian-install usr/sbin/armbian-install rm -f usr/sbin/ddbr usr/bin/ddbr } make_image() { process_msg "(2/7) Make new armbian image." cd ${current_path} # Set Armbian image file parameters [[ "${PLATFORM}" == "amlogic" ]] && { skip_mb="4" partition_table_type="msdos" bootfs_type="fat32" } [[ "${PLATFORM}" == "rockchip" ]] && { skip_mb="16" partition_table_type="gpt" bootfs_type="ext4" } [[ "${PLATFORM}" == "allwinner" ]] && { skip_mb="16" partition_table_type="msdos" bootfs_type="fat32" } # Special procedures for flashing specific boards # Reset default parameters write_board_file="no" adjust_kernel_files="no" # Check the personalization settings of this board board_release="${different_files}/${board}/rootfs/${board_release_file}" [[ -f "${board_release}" ]] && source ${board_release} # echo -e "${INFO} The [ ${board} ] Armbian image partition status: [ skip:${skip_mb} / boot:${boot_mb} / rootfs:${root_mb} ] MiB." # Set Armian file name armbian_filename="Armbian_${armbian_rebuild_version}_${PLATFORM}_${board}_${release_codename}_${kernel}_${os_type}_$(date +"%Y.%m.%d").img" build_image_file="${tmp_outpath}/${armbian_filename}" rm -f ${build_image_file} IMG_SIZE="$((skip_mb + boot_mb + root_mb))" truncate -s ${IMG_SIZE}M ${build_image_file} >/dev/null 2>&1 parted -s ${build_image_file} mklabel ${partition_table_type} 2>/dev/null parted -s ${build_image_file} mkpart primary ${bootfs_type} $((skip_mb))MiB $((skip_mb + boot_mb - 1))MiB 2>/dev/null parted -s ${build_image_file} mkpart primary ${rootfs_type} $((skip_mb + boot_mb))MiB 100% 2>/dev/null loop_new="$(losetup -P -f --show "${build_image_file}")" [[ -n "${loop_new}" ]] || error_msg "losetup ${build_image_file} failed." # Confirm BOOT_UUID BOOT_UUID="$(cat /proc/sys/kernel/random/uuid)" [[ -z "${BOOT_UUID}" ]] && BOOT_UUID="$(uuidgen)" [[ -z "${BOOT_UUID}" ]] && error_msg "The uuidgen is invalid, cannot continue." # Confirm ROOTFS_UUID ROOTFS_UUID="$(cat /proc/sys/kernel/random/uuid)" [[ -z "${ROOTFS_UUID}" ]] && ROOTFS_UUID="$(uuidgen)" [[ -z "${ROOTFS_UUID}" ]] && error_msg "The uuidgen is invalid, cannot continue." # Format bootfs partition if [[ "${bootfs_type}" == "fat32" ]]; then mkfs.vfat -F 32 -n "BOOT" ${loop_new}p1 >/dev/null 2>&1 else mkfs.ext4 -F -q -U ${BOOT_UUID} -L "BOOT" -b 4k -m 0 ${loop_new}p1 >/dev/null 2>&1 fi # Format rootfs partition if [[ "${rootfs_type}" == "btrfs" ]]; then mkfs.btrfs -f -U ${ROOTFS_UUID} -L "ROOTFS" -m single ${loop_new}p2 >/dev/null 2>&1 else mkfs.ext4 -F -q -U ${ROOTFS_UUID} -L "ROOTFS" -b 4k -m 0 ${loop_new}p2 >/dev/null 2>&1 fi # Write the specific bootloader for [ Amlogic ] boxes [[ "${PLATFORM}" == "amlogic" ]] && { bootloader_path="${uboot_path}/${PLATFORM}/bootloader" if [[ -n "${MAINLINE_UBOOT}" && -f "${bootloader_path}/${MAINLINE_UBOOT}" ]]; then dd if="${bootloader_path}/${MAINLINE_UBOOT}" of="${loop_new}" conv=fsync bs=1 count=444 2>/dev/null dd if="${bootloader_path}/${MAINLINE_UBOOT}" of="${loop_new}" conv=fsync bs=512 skip=1 seek=1 2>/dev/null #echo -e "${INFO} 01. For [ ${board} ] write bootloader: ${MAINLINE_UBOOT}" elif [[ -n "${BOOTLOADER_IMG}" && -f "${bootloader_path}/${BOOTLOADER_IMG}" ]]; then dd if="${bootloader_path}/${BOOTLOADER_IMG}" of="${loop_new}" conv=fsync bs=1 count=444 2>/dev/null dd if="${bootloader_path}/${BOOTLOADER_IMG}" of="${loop_new}" conv=fsync bs=512 skip=1 seek=1 2>/dev/null #echo -e "${INFO} 02. For [ ${board} ] write bootloader: ${BOOTLOADER_IMG}" fi } # Write the specific bootloader for [ Rockchip ] boxes [[ "${PLATFORM}" == "rockchip" ]] && { bootloader_path="${uboot_path}/${PLATFORM}/${board}" if [[ -n "${BOOTLOADER_IMG}" && -f "${bootloader_path}/${BOOTLOADER_IMG}" ]] && [[ -n "${MAINLINE_UBOOT}" && -f "${bootloader_path}/${MAINLINE_UBOOT}" ]] && [[ -n "${TRUST_IMG}" && -f "${bootloader_path}/${TRUST_IMG}" ]]; then dd if="${bootloader_path}/${BOOTLOADER_IMG}" of="${loop_new}" conv=fsync,notrunc bs=512 seek=64 2>/dev/null dd if="${bootloader_path}/${MAINLINE_UBOOT}" of="${loop_new}" conv=fsync,notrunc bs=512 seek=16384 2>/dev/null dd if="${bootloader_path}/${TRUST_IMG}" of="${loop_new}" conv=fsync,notrunc bs=512 seek=24576 2>/dev/null #echo -e "${INFO} 01. For [ ${board} ] write bootloader: ${TRUST_IMG}" elif [[ -n "${BOOTLOADER_IMG}" && -f "${bootloader_path}/${BOOTLOADER_IMG}" ]] && [[ -n "${MAINLINE_UBOOT}" && -f "${bootloader_path}/${MAINLINE_UBOOT}" ]]; then dd if="${bootloader_path}/${BOOTLOADER_IMG}" of="${loop_new}" conv=fsync,notrunc bs=512 seek=64 2>/dev/null dd if="${bootloader_path}/${MAINLINE_UBOOT}" of="${loop_new}" conv=fsync,notrunc bs=512 seek=16384 2>/dev/null #echo -e "${INFO} 02. For [ ${board} ] write bootloader: ${MAINLINE_UBOOT}" elif [[ "${BOOTLOADER_IMG}" == "u-boot-rockchip.bin" && -f "${bootloader_path}/${BOOTLOADER_IMG}" ]]; then dd if="${bootloader_path}/${BOOTLOADER_IMG}" of="${loop_new}" conv=fsync,notrunc bs=512 seek=64 2>/dev/null #echo -e "${INFO} 03. For [ ${board} ] write bootloader: ${BOOTLOADER_IMG}" elif [[ -n "${BOOTLOADER_IMG}" && -f "${bootloader_path}/${BOOTLOADER_IMG}" ]]; then dd if="${bootloader_path}/${BOOTLOADER_IMG}" of="${loop_new}" conv=fsync,notrunc bs=512 skip=64 seek=64 2>/dev/null #echo -e "${INFO} 04. For [ ${board} ] write bootloader: ${BOOTLOADER_IMG}" fi } # Write the specific bootloader for [ Allwinner ] boxes [[ "${PLATFORM}" == "allwinner" ]] && { bootloader_path="${uboot_path}/${PLATFORM}/${board}" if [[ -n "${BOOTLOADER_IMG}" && -f "${bootloader_path}/${BOOTLOADER_IMG}" ]] && [[ -n "${MAINLINE_UBOOT}" && -f "${bootloader_path}/${MAINLINE_UBOOT}" ]]; then dd if="${bootloader_path}/${BOOTLOADER_IMG}" of="${loop_new}" conv=fsync,notrunc bs=8k seek=1 2>/dev/null dd if="${bootloader_path}/${MAINLINE_UBOOT}" of="${loop_new}" conv=fsync,notrunc bs=8k seek=5 2>/dev/null #echo -e "${INFO} 01. For [ ${board} ] write bootloader: ${MAINLINE_UBOOT}" elif [[ -n "${BOOTLOADER_IMG}" && -f "${bootloader_path}/${BOOTLOADER_IMG}" ]]; then dd if=/dev/zero of="${loop_new}" bs=1k count=1023 seek=1 status=noxfer 2>/dev/null dd if="${bootloader_path}/${BOOTLOADER_IMG}" of="${loop_new}" conv=fsync,notrunc bs=8k seek=1 2>/dev/null #echo -e "${INFO} 02. For [ ${board} ] write bootloader: ${BOOTLOADER_IMG}" fi } # Special procedures for flashing specific boards [[ "${write_board_file}" == "yes" ]] && write_board_bootloader } copy_files() { process_msg "(3/7) Copy the Armbian files." cd ${current_path} # Create a dual-partition general directory tag_bootfs="${tmp_build}/bootfs" tag_rootfs="${tmp_build}/rootfs" mkdir -p ${tag_bootfs} ${tag_rootfs} chown root:root ${tag_bootfs} ${tag_rootfs} # Mount bootfs if [[ "${bootfs_type}" == "fat32" ]]; then mount_try vfat ${loop_new}p1 ${tag_bootfs} else mount_try ext4 ${loop_new}p1 ${tag_bootfs} fi # Mount rootfs if [[ "${rootfs_type}" == "btrfs" ]]; then mount_try btrfs ${loop_new}p2 ${tag_rootfs} else mount_try ext4 ${loop_new}p2 ${tag_rootfs} fi # Copy the full Armbian image cp -af ${tmp_armbian}/. ${tag_rootfs} # Copy the common files [[ -d "${common_files}" ]] && cp -af --no-preserve=ownership ${common_files}/. ${tag_rootfs} # Copy the platform files platform_bootfs="${platform_files}/${PLATFORM}/bootfs" platform_rootfs="${platform_files}/${PLATFORM}/rootfs" [[ -d "${platform_bootfs}" ]] && cp -rf ${platform_bootfs}/. ${tag_bootfs} [[ -d "${platform_rootfs}" ]] && cp -af --no-preserve=ownership ${platform_rootfs}/. ${tag_rootfs} # Copy the different files different_bootfs="${different_files}/${board}/bootfs" different_rootfs="${different_files}/${board}/rootfs" [[ -d "${different_bootfs}" ]] && cp -rf ${different_bootfs}/. ${tag_bootfs} [[ -d "${different_rootfs}" ]] && cp -af --no-preserve=ownership ${different_rootfs}/. ${tag_rootfs} # Copy the bootloader files [[ -d "${tag_rootfs}/usr/lib/u-boot" ]] || mkdir -p ${tag_rootfs}/usr/lib/u-boot rm -rf ${tag_rootfs}/usr/lib/u-boot/* [[ -d "${bootloader_path}" ]] && cp -af --no-preserve=ownership ${bootloader_path}/. ${tag_rootfs}/usr/lib/u-boot # Copy the overload files [[ "${PLATFORM}" == "amlogic" ]] && cp -rf ${uboot_path}/${PLATFORM}/overload/. ${tag_bootfs} # Remove the .git directories rm -rf $(find ${tmp_build} -type d -name '.git') } replace_kernel() { process_msg "(4/7) Replace kernel files." cd ${current_path} # Determine custom kernel filename kernel_boot="$(ls ${kernel_path}/${conf_kernel_tags}/${kernel}/boot-${kernel}*.tar.gz 2>/dev/null | head -n 1)" # Extract kernel name: boot-6.12.69-ophub.tar.gz -> 6.12.69-ophub kernel_name="${kernel_boot##*/}" && kernel_name="${kernel_name:5:-7}" [[ -n "${kernel_name}" ]] || error_msg "Missing kernel files for [ ${kernel} ]" # Extract kernel signature: 6.12.69-ophub -> ophub kernel_signature="${kernel_name#*-}" [[ -n "${kernel_signature}" ]] || error_msg "Missing kernel signature: [ ${kernel_name} ]" # Determine the kernel dtb, modules and header files based on the kernel name kernel_dtb="${kernel_path}/${conf_kernel_tags}/${kernel}/dtb-${PLATFORM}-${kernel_name}.tar.gz" kernel_modules="${kernel_path}/${conf_kernel_tags}/${kernel}/modules-${kernel_name}.tar.gz" kernel_header="${kernel_path}/${conf_kernel_tags}/${kernel}/header-${kernel_name}.tar.gz" [[ -s "${kernel_boot}" && -s "${kernel_dtb}" && -s "${kernel_modules}" && -s "${kernel_header}" ]] || error_msg "The 4 kernel missing." # 01. For /boot five files tar -mxzf ${kernel_boot} -C ${tag_bootfs} [[ "${PLATFORM}" == "allwinner" ]] && (cd ${tag_bootfs} && cp -f uInitrd-${kernel_name} uInitrd && cp -f vmlinuz-${kernel_name} Image) [[ "${PLATFORM}" == "amlogic" ]] && (cd ${tag_bootfs} && cp -f uInitrd-${kernel_name} uInitrd && cp -f vmlinuz-${kernel_name} zImage) [[ "${PLATFORM}" == "rockchip" ]] && (cd ${tag_bootfs} && ln -sf uInitrd-${kernel_name} uInitrd && ln -sf vmlinuz-${kernel_name} Image) [[ "$(ls ${tag_bootfs}/*${kernel_name} -l 2>/dev/null | grep "^-" | wc -l)" -ge "2" ]] || error_msg "The /boot files is missing." [[ "${PLATFORM}" == "amlogic" ]] && get_textoffset "${tag_bootfs}/zImage" # 02. For /boot/dtb/${PLATFORM}/* [[ -d "${tag_bootfs}/dtb/${PLATFORM}" ]] || mkdir -p ${tag_bootfs}/dtb/${PLATFORM} tar -mxzf ${kernel_dtb} -C ${tag_bootfs}/dtb/${PLATFORM} [[ "${PLATFORM}" == "rockchip" ]] && ln -sf dtb ${tag_bootfs}/dtb-${kernel_name} [[ "$(ls ${tag_bootfs}/dtb/${PLATFORM} -l 2>/dev/null | grep "^-" | wc -l)" -ge "2" ]] || error_msg "/boot/dtb/${PLATFORM} files is missing." # 03. For /usr/src/linux-headers-${kernel_name} header_path="linux-headers-${kernel_name}" rm -rf ${tag_rootfs}/usr/src/linux-headers-* 2>/dev/null && mkdir -p "${tag_rootfs}/usr/src/${header_path}" tar -mxzf ${kernel_header} -C ${tag_rootfs}/usr/src/${header_path} [[ -d "${tag_rootfs}/usr/src/${header_path}/include" ]] || error_msg "/usr/src/${header_path}/include folder is missing." # 04. For /usr/lib/modules/${kernel_name} tar -mxzf ${kernel_modules} -C ${tag_rootfs}/usr/lib/modules (cd ${tag_rootfs}/usr/lib/modules/${kernel_name}/ && rm -f build source 2>/dev/null && ln -sf /usr/src/${header_path} build) [[ "$(ls ${tag_rootfs}/usr/lib/modules/${kernel_name} -l 2>/dev/null | grep "^d" | wc -l)" -eq "1" ]] || error_msg "/usr/lib/modules kernel folder is missing." # Special procedures for flashing specific boards [[ "${adjust_kernel_files}" == "yes" ]] && adjust_kernel_files_cmd } refactor_bootfs() { process_msg "(5/7) Refactor bootfs files." cd ${tag_bootfs} # Process Amlogic series boot partition files [[ "${PLATFORM}" == "amlogic" && "${need_overload}" == "yes" ]] && { if [[ -n "${UBOOT_OVERLOAD}" && -f "${UBOOT_OVERLOAD}" ]]; then cp -f ${UBOOT_OVERLOAD} u-boot.ext chmod +x u-boot.ext elif [[ -z "${UBOOT_OVERLOAD}" || ! -f "${UBOOT_OVERLOAD}" ]]; then error_msg "${board} Board does not support using ${kernel} kernel, missing u-boot." fi } # Set configuration file mount parameters if [[ "${rootfs_type}" == "btrfs" ]]; then # For uEnv.txt uenv_rootdev="UUID=${ROOTFS_UUID} rootflags=compress=zstd:6 rw rootwait rootfstype=btrfs" # For armbianEnv.txt armbianenv_rootdev="UUID=${ROOTFS_UUID}" armbianenv_rootflags="compress=zstd:6" else # For uEnv.txt uenv_rootdev="UUID=${ROOTFS_UUID} rootflags=data=writeback rw rootwait rootfstype=ext4" # For armbianEnv.txt armbianenv_rootdev="UUID=${ROOTFS_UUID}" armbianenv_rootflags="rw,errors=remount-ro" fi # Edit the uEnv.txt uenv_conf_file="uEnv.txt" [[ -f "${uenv_conf_file}" ]] && { sed -i "s|LABEL=ROOTFS|${uenv_rootdev}|g" ${uenv_conf_file} sed -i "s|meson.*.dtb|${FDTFILE}|g" ${uenv_conf_file} sed -i "s|sun.*.dtb|${FDTFILE}|g" ${uenv_conf_file} sed -i "s|rk.*.dtb|${FDTFILE}|g" ${uenv_conf_file} } # Add an alternate file (/boot/extlinux/extlinux.conf) boot_extlinux_file="extlinux/extlinux.conf.bak" rename_extlinux_file="extlinux/extlinux.conf" [[ -f "${boot_extlinux_file}" ]] && { sed -i "s|LABEL=ROOTFS|${uenv_rootdev}|g" ${boot_extlinux_file} sed -i "s|meson.*.dtb|${FDTFILE}|g" ${boot_extlinux_file} sed -i "s|sun.*.dtb|${FDTFILE}|g" ${boot_extlinux_file} sed -i "s|rk.*.dtb|${FDTFILE}|g" ${boot_extlinux_file} # If needed, such as t95z(s905x), rename delete .bak [[ "${BOOT_CONF}" == "extlinux.conf" ]] && mv -f ${boot_extlinux_file} ${rename_extlinux_file} } # Edit the armbianEnv.txt armbianenv_conf_file="armbianEnv.txt" [[ -f "${armbianenv_conf_file}" ]] && { sed -i "s|\(fdtfile=.*\/\)[^/]*$|\1${FDTFILE}|g" ${armbianenv_conf_file} sed -i "s|^rootfstype=.*|rootfstype=${rootfs_type}|g" ${armbianenv_conf_file} sed -i "s|^rootdev=.*|rootdev=${armbianenv_rootdev}|g" ${armbianenv_conf_file} sed -i "s|^rootflags=.*|rootflags=${armbianenv_rootflags}|g" ${armbianenv_conf_file} sed -i "s|^overlay_prefix=.*|overlay_prefix=${FAMILY}|g" ${armbianenv_conf_file} } # Check device configuration files [[ -f "${uenv_conf_file}" || -f "${rename_extlinux_file}" || -f "${armbianenv_conf_file}" ]] || error_msg "Missing [ /boot/*Env.txt ]" } refactor_rootfs() { process_msg "(6/7) Refactor rootfs files." cd ${tag_rootfs} # Remove the scripts contained in [ armbian-bsp-cli-odroidn2 ] that will cause the system to fail to start # [ dpkg -c armbian-bsp-cli-odroidn2_23.02.2_arm64.deb ] : https://paste.armbian.com/aloxuvokol # Move usr/share/armbian to armbian.bak. [ dpkg -S boot.cmd ] : [ armbian-bsp-cli-odroidn2: /usr/share/armbian/boot.cmd ] [[ -d "usr/share/armbian" ]] && mv -f usr/share/armbian usr/share/armbian.bak # Move usr/lib/nand-sata-install to bak-nand-sata-install [ Useless bootloader and u-boot ] [[ -d "usr/lib/nand-sata-install" ]] && mv -f usr/lib/nand-sata-install usr/lib/bak-nand-sata-install # Remove invalid install file [[ "${PLATFORM}" == "rockchip" && -f "usr/sbin/armbian-install" ]] && rm -f usr/sbin/armbian-install # Disable update_initramfs initramfs_conf="etc/initramfs-tools/update-initramfs.conf" [[ -f "${initramfs_conf}" ]] && { [[ -n "$(cat ${initramfs_conf} | grep -oE "^update_initramfs=")" ]] || error_msg "Missing [ update_initramfs ]" sed -i "s|^update_initramfs=.*|update_initramfs=no|g" ${initramfs_conf} } # Delete related files rm -f etc/apt/sources.list.save rm -f var/lib/dpkg/info/linux-image* rm -rf usr/share/doc/linux-image-* rm -rf usr/lib/linux-image-* # Remove motd-news related services rm -f usr/lib/systemd/system/motd-news.timer rm -f usr/lib/systemd/system/motd-news.service rm -f var/lib/systemd/deb-systemd-helper-enabled/timers.target.wants/motd-news.timer rm -f var/lib/systemd/deb-systemd-helper-enabled/motd-news.timer.dsh-also rm -f etc/systemd/system/timers.target.wants/motd-news.timer rm -f etc/update-motd.d/50-motd-news # Rebuild symbolic link files (ln -sf ${target} ${symbolic_link_file}) ln -sf usr/bin bin ln -sf usr/lib lib ln -sf usr/sbin sbin ln -sf /run/lock var/lock ln -sf /run var/run ln -sf /usr/share/zoneinfo/Asia/Shanghai etc/localtime ln -sf armbian-ddbr usr/sbin/ddbr # Fix common releases permissions [[ -d "var/tmp" ]] && chmod 777 var/tmp [[ -d "var/cache/man" ]] && chown man:root var/cache/man -R [[ -d "var/cache/man" ]] && chmod g+s var/cache/man -R [[ -f "etc/sudoers" ]] && chown root:root etc/sudoers [[ -f "etc/sudoers" ]] && chmod 440 etc/sudoers [[ -f "usr/bin/sudo" ]] && chown root:root usr/bin/sudo [[ -f "usr/bin/sudo" ]] && chmod 4755 usr/bin/sudo # Fix focal permissions [[ -f "usr/lib/sudo/sudoers.so" ]] && chown 0 usr/lib/sudo/sudoers.so [[ -f "usr/lib/sudo/sudoers.so" ]] && chmod 644 usr/lib/sudo/sudoers.so [[ -f "usr/lib/policykit-1/polkit-agent-helper-1" ]] && chmod 4755 usr/lib/policykit-1/polkit-agent-helper-1 # Fix jammy permissions [[ -f "usr/libexec/sudo/sudoers.so" ]] && chown 0 usr/libexec/sudo/sudoers.so [[ -f "usr/libexec/sudo/sudoers.so" ]] && chmod 644 usr/libexec/sudo/sudoers.so [[ -f "usr/libexec/polkit-agent-helper-1" ]] && chmod 4755 usr/libexec/polkit-agent-helper-1 # Edit the etc/fstab [[ -f "etc/fstab" ]] || error_msg "The etc/fstab File does not exist." # Set different types of mount parameters if [[ "${rootfs_type}" == "btrfs" ]]; then fstab_string="defaults,noatime,compress=zstd:6" else fstab_string="defaults,noatime,nodiratime,commit=600,errors=remount-ro" fi # Update mount settings sed -i "s|^LABEL=ROOTFS.*|UUID=${ROOTFS_UUID} / ${rootfs_type} ${fstab_string} 0 1|g" etc/fstab [[ "${bootfs_type}" == "ext4" ]] && { sed -i "s|^LABEL=BOOT.*|UUID=${BOOT_UUID} /boot ext4 defaults 0 2|g" etc/fstab } # Update release information [[ -f "${armbian_release_file}" ]] && { # Shorten release version number sed -i "s|^VERSION=.*|VERSION=\"${armbian_rebuild_version}\"|g" ${armbian_release_file} sed -i "s|^REVISION=.*|REVISION=\"${armbian_rebuild_version}\"|g" ${armbian_release_file} # Custom banner name sed -i "s|^BOARD=.*|BOARD=\"${board}\"|g" ${armbian_release_file} sed -i "s|^BOARD_NAME=.*|BOARD_NAME=\"${board}\"|g" ${armbian_release_file} sed -i "s|^BOARDFAMILY=.*|BOARDFAMILY=\"${FAMILY}\"|g" ${armbian_release_file} # Use custom type to remove [ No end-user support ] prompt in [ /etc/update-motd.d/10-armbian-header ] sed -i "s|^BOOT_SOC=.*|BOOT_SOC=\"${SOC}\"|g" ${armbian_release_file} sed -i "s|^IMAGE_TYPE=.*|IMAGE_TYPE=rebuild|g" ${armbian_release_file} sed -i "s|^BOARD_TYPE=.*|BOARD_TYPE=diy|g" ${armbian_release_file} sed -i "s|^VENDOR=.*|VENDOR=\"Armbian OS\"|g" ${armbian_release_file} # Disable the update of the boot script sed -i "s|^FORCE_BOOTSCRIPT_UPDATE=.*|FORCE_BOOTSCRIPT_UPDATE=\"no\"|g" ${armbian_release_file} sed -i "s|^BOOTSCRIPT_FORCE_UPDATE=.*|FORCE_BOOTSCRIPT_UPDATE=\"no\"|g" ${armbian_release_file} # Disable the update of the u-boot sed -i "s|^FORCE_UBOOT_UPDATE=.*|FORCE_UBOOT_UPDATE=\"no\"|g" ${armbian_release_file} } # Add custom startup script custom_startup_script="etc/custom_service/start_service.sh" [[ -x "${custom_startup_script}" && -f "etc/rc.local" ]] && { sed -i '/^exit 0/i\bash /etc/custom_service/start_service.sh &' etc/rc.local } # Enable ssh service ssh_config="etc/ssh/sshd_config" [[ -f "${ssh_config}" ]] && { sed -i "s|^#*Port .*|Port 22|g" ${ssh_config} sed -i "s|^#*PermitRootLogin .*|PermitRootLogin yes|g" ${ssh_config} sed -i "s|^#*PasswordAuthentication .*|PasswordAuthentication yes|g" ${ssh_config} } # Adjust the default timeout for service start/stop system_conf="etc/systemd/system.conf" [[ -f "${system_conf}" ]] && { sed -i "s|^#*DefaultTimeoutStartSec.*|DefaultTimeoutStartSec=10s|g" ${system_conf} sed -i "s|^#*DefaultTimeoutStopSec.*|DefaultTimeoutStopSec=10s|g" ${system_conf} } # Add custom sysctl configuration file [[ -d "etc/sysctl.d" && -f "etc/sysctl.conf" ]] && { ln -sf ../sysctl.conf etc/sysctl.d/99-sysctl.conf } # Disable tips of the day for [ /etc/update-motd.d/35-armbian-tips ] motd_tips="etc/default/armbian-motd" [[ -f "${motd_tips}" ]] && sed -i 's|^MOTD_DISABLE=.*|MOTD_DISABLE="tips"|g' ${motd_tips} quotes_cron="etc/cron.daily/armbian-quotes" [[ -f "${quotes_cron}" ]] && sed -i "s|^curl |#curl |g" ${quotes_cron} # Add custom disabled alias extension load modules custom_blacklist="etc/modprobe.d/blacklist.conf" [[ -f "${custom_blacklist}" ]] || echo -e "# This file lists the disabled alias extension load modules." >${custom_blacklist} [[ "${FDTFILE}" == "meson-sm1-skyworth-lb2004-a4091.dtb" ]] && { echo -e "\n# For Tencent Aurora 3Pro (s905x3-b) box." >>${custom_blacklist} echo -e "blacklist btmtksdio" >>${custom_blacklist} } # Make the .bashrc take effect, Default shell settings file: /etc/default/useradd echo '[[ "${SHELL}" == *bash && -f "${HOME}/.bashrc" ]] && . ${HOME}/.bashrc' >>etc/profile # Renaming/disabling related files mv -f etc/udev/rules.d/hdmi.rules etc/udev/rules.d/hdmi.rules.bak 2>/dev/null # Disable motd scripts [[ -d "etc/update-motd.d" ]] && { chmod -x etc/update-motd.d/* chmod +x etc/update-motd.d/{10-*,20-*,30-*} } # Disable IP information display ip_info_file="etc/update-motd.d/20-ip-info" [[ -f "${ip_info_file}" ]] && { sed -i '/^get_wan.*_address/s/{.*/{ true; }/' ${ip_info_file} sed -i '/if.*ipv6s.*||.*wan6/,/fi/s/^/#/' ${ip_info_file} } # Explicitly disable resizing for Amlogic device [ /usr/lib/armbian/armbian-resize-filesystem ], use armbian-tf settings echo "yes" >root/.no_rootfs_resize # Reduce network latency [ A start job is running for raise network interfaces (5 mins 1 sec) ] network_service="usr/lib/systemd/system/networking.service" [[ -f "${network_service}" ]] && sed -i "s|^#*TimeoutStartSec=.*|TimeoutStartSec=10sec|g" ${network_service} # Add tasks that need to be executed on initial startup armbian_firstrun="usr/lib/armbian/armbian-firstrun" [[ -f "${armbian_firstrun}" ]] && sed -i '/\/etc\/armbian-release/i\[[ -x "/usr/sbin/armbian-fix" ]] && . /usr/sbin/armbian-fix' ${armbian_firstrun} # Improve systemd startup speed, avoid timeout waiting armbian_firstlogin="usr/lib/armbian/armbian-firstlogin" [[ -f "${armbian_firstlogin}" ]] && sed -i "s#.*systemctl is-system-running.*# timeout 120s systemctl is-system-running --wait > /dev/null 2>\&1 || true#g" "${armbian_firstlogin}" # Fix abnormal CPU temperature temp_file="usr/lib/armbian/armbian-allwinner-battery" [[ -f "${temp_file}" ]] && { insert_line="$(cat ${temp_file} | grep -n 'CPU_TEMP_OFFSET' | awk -F':' '{print $1}')" [[ -n "${insert_line}" ]] && { sed -i "${insert_line}i\ [[ \"\$(echo \${board_temp} | awk -F'.' '{print \$1}' | wc -c)\" -gt \"3\" ]] && board_temp=\${board_temp:0:2}" ${temp_file} } } # Get random macaddr mac_hexchars="0123456789ABCDEF" mac_end=$(for i in {1..6}; do echo -n ${mac_hexchars:$((${RANDOM} % 16)):1}; done | sed -e 's/\(..\)/:\1/g') random_macaddr="9E:61${mac_end}" # Optimize wifi/bluetooth module [[ -d "usr/lib/firmware/brcm" ]] && ( cd usr/lib/firmware/brcm/ && rm -f ../*.hcd # gtking/gtking pro is bcm4356 wifi/bluetooth, wifi5 module AP6356S sed -e "s/macaddr=.*/macaddr=${random_macaddr}:00/" "brcmfmac4356-sdio.txt" >"brcmfmac4356-sdio.azw,gtking.txt" # gtking/gtking pro is bcm4356 wifi/bluetooth, wifi6 module AP6275S sed -e "s/macaddr=.*/macaddr=${random_macaddr}:01/" "brcmfmac4375-sdio.txt" >"brcmfmac4375-sdio.azw,gtking.txt" # MXQ Pro+ is AP6330(bcm4330) wifi/bluetooth sed -e "s/macaddr=.*/macaddr=${random_macaddr}:02/" "brcmfmac4330-sdio.txt" >"brcmfmac4330-sdio.crocon,mxq-pro-plus.txt" # HK1 Box & H96 Max X3 is bcm54339 wifi/bluetooth sed -e "s/macaddr=.*/macaddr=${random_macaddr}:03/" "brcmfmac4339-sdio.ZP.txt" >"brcmfmac4339-sdio.amlogic,sm1.txt" # new ugoos x3 is brm43456 sed -e "s/macaddr=.*/macaddr=${random_macaddr}:04/" "brcmfmac43456-sdio.txt" >"brcmfmac43456-sdio.amlogic,sm1.txt" # x96max plus v5.1 (ip1001m phy) adopts am7256 (brcm4354) sed -e "s/macaddr=.*/macaddr=${random_macaddr}:05/" "brcmfmac4354-sdio.txt" >"brcmfmac4354-sdio.amlogic,sm1.txt" # panther x2 AP6212A sed -e "s/macaddr=.*/macaddr=${random_macaddr}:06/" "brcmfmac43430-sdio.txt" >"brcmfmac43430-sdio.panther,x2.txt" # ct2000 s922x is brm4359 sed -i "s/macaddr=.*/macaddr=${random_macaddr}:07/" "brcmfmac4359-sdio.ali,ct2000.txt" ) # Add custom Armbian information echo "PLATFORM='${PLATFORM}'" >>${ophub_release_file} echo "VERSION_CODEID='${release_codeid}'" >>${ophub_release_file} echo "VERSION_CODENAME='${release_codename}'" >>${ophub_release_file} echo "MODEL_ID='${MODEL_ID}'" >>${ophub_release_file} echo "MODEL_NAME='${MODEL_NAME}'" >>${ophub_release_file} echo "SOC='${SOC}'" >>${ophub_release_file} echo "FDTFILE='${FDTFILE}'" >>${ophub_release_file} echo "FAMILY='${FAMILY}'" >>${ophub_release_file} echo "BOARD='${board}'" >>${ophub_release_file} echo "KERNEL_REPO='${kernel_repo}'" >>${ophub_release_file} echo "KERNEL_TAGS='${conf_kernel_tags}'" >>${ophub_release_file} echo "KERNEL_VERSION='${kernel}'" >>${ophub_release_file} echo "KERNEL_SIGNATURE='${kernel_signature}'" >>${ophub_release_file} echo "DOWNLOAD_TYPE='deb'" >>${ophub_release_file} echo "KERNEL_BACKUP='yes'" >>${ophub_release_file} echo "BOOT_CONF='${BOOT_CONF}'" >>${ophub_release_file} echo "ROOTFS_TYPE='${rootfs_type}'" >>${ophub_release_file} echo "DISK_TYPE='usb'" >>${ophub_release_file} echo "AMPART_STATUS='no'" >>${ophub_release_file} echo "MLUBOOT_STATUS='no'" >>${ophub_release_file} echo "MAINLINE_UBOOT='${RECORD_MAINLINE_UBOOT}'" >>${ophub_release_file} echo "BOOTLOADER_IMG='${RECORD_BOOTLOADER_IMG}'" >>${ophub_release_file} if [[ "${PLATFORM}" == "rockchip" ]]; then echo "TRUST_IMG='${RECORD_TRUST_IMG}'" >>${ophub_release_file} elif [[ "${PLATFORM}" == "amlogic" ]]; then echo "UBOOT_OVERLOAD='${UBOOT_OVERLOAD}'" >>${ophub_release_file} fi echo "BUILD_REPOSITORY='github.com/armbian/build'" >>${ophub_release_file} echo "REBUILD_REPOSITORY='github.com/ophub/amlogic-s9xxx-armbian'" >>${ophub_release_file} echo "CONTRIBUTORS='${CONTRIBUTORS}'" >>${ophub_release_file} echo "BUILDER_NAME='${builder_name}'" >>${ophub_release_file} echo "PACKAGED_DATE='$(date +%Y-%m-%d)'" >>${ophub_release_file} sync && sleep 3 } clean_tmp() { process_msg "(7/7) Clear temporary files." cd ${current_path} umount -f ${tmp_armbian} 2>/dev/null losetup -d ${loop_old} 2>/dev/null fstrim ${tag_bootfs} 2>/dev/null fstrim ${tag_rootfs} 2>/dev/null umount -f ${tag_bootfs} 2>/dev/null umount -f ${tag_rootfs} 2>/dev/null losetup -d ${loop_new} 2>/dev/null cd ${tmp_outpath} # Compress Armbian image file pigz -qf ${armbian_filename} || gzip -qf ${armbian_filename} # Move Armbian files to the output directory mv -f ${armbian_filename}* -t ${armbian_outputpath} cd ${current_path} rm -rf ${tmp_dir} && sync } loop_rebuild() { cd ${current_path} echo -e "${STEPS} Building Armbian images..." j="1" for b in "${build_armbian[@]}"; do { # Set specific configuration for building Armbian system board="${b}" confirm_version i="1" for k in "${build_kernel[@]}"; do { # Set the kernel version kernel="${k}" # Check disk space size echo -ne "(${j}.${i}) Building Armbian [\033[92m ${board} - ${conf_kernel_tags}/${kernel} \033[0m]. " now_remaining_space="$(df -Tk ${armbian_outputpath} | tail -n1 | awk '{print $5}' | echo $(($(xargs) / 1024 / 1024)))" if [[ "${now_remaining_space}" -le "6" ]]; then echo -e "${WARNING} Remaining space is less than 6 GiB. Skipping this build." break else echo "Remaining space: ${now_remaining_space} GiB." fi # Execute the following functions in sequence extract_armbian make_image copy_files replace_kernel refactor_bootfs refactor_rootfs clean_tmp echo -e "(${j}.${i}) Armbian built successfully. \n" ((i++)) } done ((j++)) } done } # Show welcome message echo -e "${STEPS} Welcome to the Armbian Rebuild Tool!" echo -e "${INFO} Server running on Ubuntu: [ Release: ${host_release} / Host: ${arch_info} ] \n" # Check script permission [[ "$(id -u)" == 0 ]] || error_msg "Please run this script as root: [ sudo ./${0} ]" # Initialize variables init_var "${@}" check_data # Find rebuild files find_armbian # Download the dependency files download_depends # Query the latest kernel version [[ "${auto_kernel}" =~ ^(true|yes)$ ]] && query_kernel # Download the kernel files download_kernel # Show rebuild settings echo -e "${INFO} [ ${#build_armbian[@]} ] lists of Armbian board: [ $(echo ${build_armbian[@]} | xargs) ]" echo -e "${INFO} ROOTFS type: [ ${rootfs_type} ]" echo -e "${INFO} Kernel Repo: [ ${kernel_repo} ], Kernel Usage: [ ${kernel_usage} ] \n" # Show server start information echo -e "${INFO} Server space usage before starting to compile: \n$(df -hT ${armbian_outputpath}) \n" # Loop to rebuild armbian loop_rebuild # Show server end information echo -e "${STEPS} Server space usage after compilation: \n$(df -hT ${armbian_outputpath}) \n" echo -e "${SUCCESS} All processes completed successfully." ================================================ FILE: recompile ================================================ #!/bin/bash #============================================================================================== # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of the Rebuild Armbian # https://github.com/ophub/amlogic-s9xxx-armbian # # Description: Compile the kernel using an Armbian Docker container # Copyright (C) 2021~ https://www.kernel.org # Copyright (C) 2021~ https://github.com/unifreq # Copyright (C) 2021~ https://github.com/ophub/amlogic-s9xxx-armbian # # Command: sudo ./recompile # Command optional parameters please refer to the source code repository # #======================================= Functions list ======================================= # # error_msg : Output error message and exit # # init_var : Initialize all variables # install_docker_engine : Install Docker engine if not present # launch_docker_container : Launch the Armbian Docker container # configure_and_compile : Configure the Docker environment and compile the kernel # #=============================== Set make environment variables =============================== # # Set config and patch paths current_path="${PWD}" config_path="${current_path}/compile-kernel/tools/config" kernel_patch_path="${current_path}/compile-kernel/tools/patch" # Set Docker host mount directory and image docker_hostpath="${PWD}" docker_image="ophub/armbian-trixie:arm64" docker_container="armbian-ophub" docker_script="/usr/sbin/armbian-kernel" # Get host architecture and release info arch_info="$(uname -m)" host_id="$(cat /etc/os-release 2>/dev/null | grep '^ID=.*' | cut -d'=' -f2)" host_release="$(cat /etc/os-release 2>/dev/null | grep '^VERSION_CODENAME=.*' | cut -d'=' -f2)" # Set font color STEPS="[\033[95m STEPS \033[0m]" INFO="[\033[94m INFO \033[0m]" SUCCESS="[\033[92m SUCCESS \033[0m]" WARNING="[\033[93m WARNING \033[0m]" ERROR="[\033[91m ERROR \033[0m]" # #============================================================================================== error_msg() { echo -e "${ERROR} ${1}" exit 1 } init_var() { echo -e "${STEPS} Initializing variables..." # If it is followed by [ : ], it means that the option requires a parameter value local options="k:a:n:m:p:r:t:c:d:s:z:l:f:h:i:" parsed_args=$(getopt -o "${options}" -- "${@}") [[ ${?} -ne 0 ]] && error_msg "Parameter parsing failed." eval set -- "${parsed_args}" while true; do case "${1}" in -h | --DockerHostpath) docker_hostpath="${2}" shift 2 ;; -i | --DockerImage) docker_image="${2}" shift 2 ;; # Ignore parameters used by the Armbian Docker container -k | -a | -n | -m | -p | -r | -t | -c | -d | -s | -z | -l | -f) shift 2 ;; --) shift break ;; *) [[ -n "${1}" ]] && error_msg "Invalid option [ ${1} ]!" break ;; esac done } install_docker_engine() { echo -e "${STEPS} Installing Docker engine..." curl -fsSL https://get.docker.com | sh usermod -aG docker ${USER} newgrp docker } launch_docker_container() { echo -e "${STEPS} Launching the Armbian Docker container..." # Check if the Armbian Docker container is running if [[ "$(docker ps -q -f name=${docker_container})" ]]; then echo -e "${INFO} The docker container [ ${docker_container} ] is running." else # Remove the stopped Armbian Docker container [[ "$(docker ps -aq -f status=exited -f name=${docker_container})" ]] && { echo -e "${INFO} Removing the stopped Docker container [ ${docker_container} ]..." docker rm -f ${docker_container} >/dev/null 2>&1 } # Enable QEMU emulation for multi-architecture builds echo -e "${INFO} Enable QEMU emulation for multi-architecture builds..." docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 2>/dev/null || true # Set Docker mount paths echo -e "${INFO} Setting up Docker host mount paths..." compile_path="${docker_hostpath}/compile-kernel" ccache_path="${docker_hostpath}/ccache" [[ -d "${compile_path}" ]] || mkdir -p ${compile_path} [[ -d "${ccache_path}" ]] || mkdir -p ${ccache_path} # Pull the Armbian Docker image echo -e "${INFO} Pulling the Docker image: [ ${docker_image} ]..." docker run -d --privileged \ --name ${docker_container} \ -v ${compile_path}:/opt/kernel/compile-kernel \ -v ${ccache_path}:/root/.ccache \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -e CCACHE_DIR=/root/.ccache \ --restart=always \ ${docker_image} fi } configure_and_compile() { echo -e "${STEPS} Configuring the Docker environment and compiling the kernel..." echo -e "${INFO} Synchronizing server time." ntpdate ntp.ubuntu.com 0.pool.ntp.org || true echo -e "${INFO} Restarting Docker container..." docker restart ${docker_container} >/dev/null && sleep 5 echo -e "${INFO} Syncing scripts in Docker container..." docker exec -i "${docker_container}" bash "${docker_script}" -u echo -e "${INFO} Injecting custom configs into Docker container..." [[ -d "${config_path}" ]] && docker cp ${config_path}/. "${docker_container}":/opt/kernel/compile-kernel/tools/config/ docker exec -i "${docker_container}" ls -Alh /opt/kernel/compile-kernel/tools/config/ || true echo -e "${INFO} Injecting custom patches into Docker container..." [[ -d "${kernel_patch_path}" ]] && docker cp ${kernel_patch_path}/. "${docker_container}":/opt/kernel/compile-kernel/tools/patch/ docker exec -i "${docker_container}" ls -Alh /opt/kernel/compile-kernel/tools/patch/ || true echo -e "${INFO} Compiling the kernel inside the Docker container..." docker exec -i "${docker_container}" bash "${docker_script}" "${@}" } # Show welcome message echo -e "${STEPS} Welcome to the Kernel Compilation Tool!" echo -e "${INFO} The host environment [ ${host_id}: ${host_release} / ${arch_info} ]" # Check script permission [[ "$(id -u)" == "0" ]] || error_msg "Please run this script as root: [ sudo ./${0} ]" # Initialize variables init_var "${@}" # Install Docker engine if it is not installed [[ -x "$(command -v docker)" ]] || install_docker_engine # Launch the Armbian Docker container launch_docker_container # Configure the Docker environment and compile the kernel configure_and_compile "${@}" # Show server end information echo -e "${STEPS} Host space usage after compilation: \n$(df -hT ${docker_hostpath}) \n" echo -e "${SUCCESS} All processes completed successfully."