├── .gitignore ├── .pictures ├── choose_part.png ├── choose_server_desktop.png └── run_build.gif ├── README.md ├── VERSION ├── board ├── walnutpi-1b │ ├── board.conf │ ├── boot.cmd │ ├── config.txt │ ├── debian12 │ │ ├── apt-base │ │ ├── apt-desktop │ │ ├── pip │ │ ├── wpi-base │ │ └── wpi-desktop │ ├── debian12_burn │ │ ├── apt-base │ │ ├── apt-del │ │ └── wpi-base │ ├── ubuntu22 │ │ ├── apt-base │ │ ├── apt-desktop │ │ ├── pip │ │ ├── wpi-base │ │ └── wpi-desktop │ └── ubuntu24 │ │ ├── apt-base │ │ ├── apt-desktop │ │ ├── pip │ │ ├── wpi-base │ │ └── wpi-desktop └── walnutpi-2b │ ├── board.conf │ ├── boot │ ├── bl31.bin │ ├── scp.bin │ └── splash.bin │ ├── config.txt │ ├── debian12 │ ├── apt-base │ ├── apt-desktop │ ├── pip │ ├── wpi-base │ └── wpi-desktop │ ├── debian12_burn │ ├── apt-base │ ├── apt-del │ └── wpi-base │ └── ubuntu24 │ ├── apt-base │ ├── apt-desktop │ ├── pip │ ├── wpi-base │ └── wpi-desktop ├── build.sh ├── docker-build.sh ├── dockerfile ├── scripts ├── build_bootloader.sh ├── build_image.sh ├── build_kernel.sh ├── build_rootfs.sh ├── common.sh ├── menu.sh ├── option.sh └── path.sh └── update-info /.gitignore: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE! Don't add files that are generated in specific 3 | # subdirectories here. Add them in the ".gitignore" file 4 | # in that subdirectory instead. 5 | # 6 | # NOTE! Please use 'git ls-files -i --exclude-standard' 7 | # command after changing this file, to see if there are 8 | # any tracked files which get ignored after the change. 9 | # 10 | # Normal rules 11 | # 12 | 13 | *.bak 14 | *.swp 15 | *.tar.gz 16 | *.o.cmd 17 | *.gz.cmd 18 | 19 | 20 | .config 21 | .config.old 22 | .tmp 23 | .vscode 24 | output 25 | 26 | toolchains/libexec/ 27 | 28 | *.changes 29 | *.buildinfo 30 | 31 | external/cache/.gpg 32 | external/cache/hash 33 | external/cache/rootfs 34 | source/ 35 | walnut1b.img 36 | toolchain/ 37 | *.log 38 | debug*/ 39 | boot.scr 40 | 41 | -------------------------------------------------------------------------------- /.pictures/choose_part.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/walnutpi/walnutpi-build/db385166ce136ceef110ea3eae43c65521e7a9a4/.pictures/choose_part.png -------------------------------------------------------------------------------- /.pictures/choose_server_desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/walnutpi/walnutpi-build/db385166ce136ceef110ea3eae43c65521e7a9a4/.pictures/choose_server_desktop.png -------------------------------------------------------------------------------- /.pictures/run_build.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/walnutpi/walnutpi-build/db385166ce136ceef110ea3eae43c65521e7a9a4/.pictures/run_build.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | walnutpi-build 2 | ====== 3 | 为核桃派编译系统镜像。有问题可以加qq群`677173708` 4 | - 需要在ubuntu22.04上运行 5 | - toolchain会在运行时从清华源下载 6 | - 运行时要从github下载东西,请确保网络畅通 7 | 8 | 本项目在`2023-10-23`的`v1.2版本`之后,进行了一次大改,将所有配置脚本都做成独立deb包存放到另一个项目 -> [walnutpi-debs](https://github.com/walnutpi/walnutpi-debs) ,在运行本项目进行构建时,会从我们假设的apt服务器那边下载这些配置包 9 | 10 | 11 | 0. 运行本脚本前先安装好两个软件 12 | ``` 13 | sudo apt install whiptail bc 14 | ``` 15 | 16 | 1. clone 17 | ------ 18 | ``` 19 | git clone -b main --depth 1 https://github.com/walnutpi/walnutpi-build.git 20 | ``` 21 | 22 | 2. run 23 | ------ 24 | ``` 25 | sudo ./build.sh 26 | ``` 27 | 28 | 在命令行出来的界面里,按`Esc`退出,`上下方向键`选择,按`回车`确认 29 | ![run_build.sh](.pictures/run_build.gif) 30 | 31 | 第一个页面是选择板子,按回车确认,目前支持 32 | - walnutpi-1b 33 | 34 | ------ 35 | ![choose](.pictures/choose_part.png) 36 | - Full OS image: 自动构建完整镜像。生成一个`IMG_xxx.img镜像`文件输出到output目录 37 | - generate boot.bin: 仅编译boot部分(uboot),并在output目录下生成bin文件 38 | - generate Kernel .deb: 仅编译linux项目,并在output目录下生成一些.deb文件 39 | - generate Rootfs files: 构建一个可用的rootfs,生成相关文件到.tmp文件夹下 40 | - pack the tmp Rootfs files: 将 .tmp 下对应的rootfs文件夹压缩成一个`rootfs_xxx.tar`输出到output目录 41 | - pack the output files as an image 将output目录下的boot.bin 内核相关deb rootfs.tar 打包成一个镜像输出到output目录下 42 | 43 | ------ 44 | ![choose](.pictures/choose_server_desktop.png) 45 | - server: 无桌面,启动快,基本功能都可以玩。 46 | - desktop: 在server版本基础上安装了xfce4桌面,预装了用于编程办公的桌面应用,玩法更多。 47 | 48 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 2.3 -------------------------------------------------------------------------------- /board/walnutpi-1b/board.conf: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | BOARD_NAME="WalnutPi-1b" 3 | BOARD_MODEL="walnutpi-1b" 4 | CHIP_ARCH="arm64" 5 | 6 | # 使用指定下载的gcc 7 | # TOOLCHAIN_DOWN_URL="https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz" 8 | # TOOLCHAIN_FILE_NAME="gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu" 9 | # CROSS_COMPILE="aarch64-none-linux-gnu-" 10 | 11 | # 使用本机自带的gcc,不存在则现场apt安装 12 | TOOLCHAIN_NAME_IN_APT="gcc-aarch64-linux-gnu" 13 | CROSS_COMPILE="aarch64-linux-gnu-" 14 | 15 | BOOTLOADER_NAME="u-boot" 16 | 17 | ATF_GIT="https://github.com/ARM-software/arm-trusted-firmware.git" 18 | ATF_PLAT="sun50i_h616" 19 | ATF_BRANCH="lts-v2.10.2" 20 | 21 | UBOOT_GIT="https://github.com/walnutpi/u-boot.git" 22 | UBOOT_BRANCH="v2024.01" 23 | UBOOT_CONFIG="walnutpi_1b_defconfig" 24 | UBOOT_BIN_NAME="u-boot-sunxi-with-spl.bin" 25 | 26 | LINUX_GIT="https://github.com/walnutpi/linux.git" 27 | LINUX_BRANCH="6.1.31" 28 | LINUX_CONFIG="walnutpi1b_defconfig" 29 | MODULES_ENABLE="sprdwl_ng sprdbt_tty" 30 | FIRMWARE_GIT="https://github.com/walnutpi/firmware.git" 31 | -------------------------------------------------------------------------------- /board/walnutpi-1b/boot.cmd: -------------------------------------------------------------------------------- 1 | # DO NOT EDIT THIS FILE 2 | 3 | if mmc dev 1; then 4 | mmc dev 0 5 | gpio clear 71 6 | else 7 | gpio clear 77 8 | fi 9 | 10 | # default values 11 | setenv load_addr "0x45000000" 12 | setenv overlay_error "false" 13 | setenv rootdev "/dev/mmcblk1p2" 14 | setenv rootfstype "ext4" 15 | setenv console "both" 16 | setenv docker_optimizations "on" 17 | setenv bootlogo "false" 18 | 19 | # Print boot source 20 | itest.b *0x10028 == 0x00 && echo "U-boot loaded from SD" 21 | itest.b *0x10028 == 0x02 && echo "U-boot loaded from eMMC or secondary SD" 22 | itest.b *0x10028 == 0x03 && echo "U-boot loaded from SPI" 23 | 24 | echo "Boot script loaded from ${devtype}" 25 | 26 | if test -e ${devtype} ${devnum} ${prefix}config.txt; then 27 | load ${devtype} ${devnum} ${load_addr} ${prefix}config.txt 28 | env import -t ${load_addr} ${filesize} 29 | fi 30 | if test "${display_bootinfo}" = "enable"; then setenv consoleargs_diplay "console=tty0"; fi 31 | 32 | if test "${console_uart}" = "uart0"; then setenv consoleargs "console=ttyS0,115200"; fi 33 | if test "${console_uart}" = "uart1"; then setenv consoleargs "console=ttyS1,115200"; fi 34 | if test "${console_uart}" = "uart2"; then setenv consoleargs "console=ttyS2,115200"; fi 35 | if test "${console_uart}" = "uart3"; then setenv consoleargs "console=ttyS3,115200"; fi 36 | if test "${console_uart}" = "uart4"; then setenv consoleargs "console=ttyS4,115200"; fi 37 | if test "${console_uart}" = "null"; then setenv consoleargs "console=/dev/null"; fi 38 | 39 | if test "${bootlogo}" = "true"; then 40 | setenv consoleargs "splash plymouth.ignore-serial-consoles ${consoleargs}" 41 | else 42 | setenv consoleargs "splash=verbose ${consoleargs}" 43 | fi 44 | 45 | # get PARTUUID of first partition on SD/eMMC it was loaded from 46 | # mmc 0 is always mapped to device u-boot (2016.09+) was loaded from 47 | if test "${devtype}" = "mmc"; then part uuid mmc 0:1 partuuid; fi 48 | 49 | setenv bootargs "root=${rootdev} rootwait rw rootfstype=${rootfstype} net.ifnames=0 ${consoleargs} ${consoleargs_diplay}, consoleblank=0 loglevel=${printk_level} ubootpart=${partuuid} usb-storage.quirks=${usbstoragequirks} ${extraargs} ${extraboardargs}" 50 | 51 | if test "${docker_optimizations}" = "on"; then setenv bootargs "${bootargs} cgroup_enable=memory swapaccount=1"; fi 52 | 53 | if mmc dev 1; then 54 | echo "board has emmc" 55 | mmc dev 0 56 | load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}${fdtfile_emmc}.dtb 57 | else 58 | echo "board not emmc" 59 | load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}${fdtfile}.dtb 60 | fi 61 | 62 | 63 | fdt addr ${fdt_addr_r} 64 | fdt resize 65536 65 | for overlay_file in ${overlays}; do 66 | if load ${devtype} ${devnum} ${load_addr} ${prefix}overlays/${overlay_prefix}-${overlay_file}.dtbo; then 67 | echo "Applying kernel provided DT overlay ${overlay_prefix}-${overlay_file}.dtbo" 68 | fdt apply ${load_addr} || setenv overlay_error "true" 69 | fi 70 | done 71 | for overlay_file in ${user_overlays}; do 72 | if load ${devtype} ${devnum} ${load_addr} ${prefix}overlay-user/${overlay_file}.dtbo; then 73 | echo "Applying user provided DT overlay ${overlay_file}.dtbo" 74 | fdt apply ${load_addr} || setenv overlay_error "true" 75 | fi 76 | done 77 | if test "${overlay_error}" = "true"; then 78 | echo "Error applying DT overlays, restoring original DT" 79 | load ${devtype} ${devnum} ${fdt_addr_r} ${prefix}${fdtfile}.dtb 80 | else 81 | if load ${devtype} ${devnum} ${load_addr} ${prefix}overlays/${overlay_prefix}-fixup.scr; then 82 | echo "Applying kernel provided DT fixup script (${overlay_prefix}-fixup.scr)" 83 | source ${load_addr} 84 | fi 85 | if test -e ${devtype} ${devnum} ${prefix}fixup.scr; then 86 | load ${devtype} ${devnum} ${load_addr} ${prefix}fixup.scr 87 | echo "Applying user provided fixup script (fixup.scr)" 88 | source ${load_addr} 89 | fi 90 | fi 91 | 92 | load ${devtype} ${devnum} ${kernel_addr_r} ${prefix}Image 93 | 94 | if test ${bootlogo} = true; then 95 | if test -e ${devtype} ${devnum} ${prefix}uInitrd; then 96 | load ${devtype} ${devnum} ${ramdisk_addr_r} ${prefix}uInitrd 97 | booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} 98 | else 99 | booti ${kernel_addr_r} - ${fdt_addr_r} 100 | fi 101 | else 102 | booti ${kernel_addr_r} - ${fdt_addr_r} 103 | fi 104 | 105 | 106 | # Recompile with: 107 | # mkimage -C none -A arm -T script -d boot.cmd boot.scr -------------------------------------------------------------------------------- /board/walnutpi-1b/config.txt: -------------------------------------------------------------------------------- 1 | version=1.1 2 | 3 | ## config screen 4 | screen=hdmi 5 | 6 | 7 | bootlogo=false 8 | overlay_prefix=sun50i-h616 9 | fdtfile=sun50i-h616-walnutpi-1b 10 | fdtfile_emmc=sun50i-h616-walnutpi-1b-emmc 11 | 12 | ## enable the console with screen 13 | console_display=enable 14 | console_uart=uart0 15 | 16 | ## show the bootinfo to the screen 17 | display_bootinfo=enable 18 | 19 | 20 | ## loglevel 21 | printk_level=3 22 | 23 | ## Specify HDMI output resolution (eg. extraargs=video=HDMI-A-1:800x480-24@60) 24 | #extraargs=video=HDMI-A-1:1024x600-24@60 25 | 26 | 27 | #spi : spidev0_0 spidev1_0 spidev1_1 spidev1_2 28 | #i2c : i2c1 i2c2 i2c4 29 | #uart : uart2 uart4 30 | overlays=spi1 i2c1 i2c2 uart2 31 | 32 | 33 | #------------------------------------------------# 34 | rootfstype=ext4 35 | -------------------------------------------------------------------------------- /board/walnutpi-1b/debian12/apt-base: -------------------------------------------------------------------------------- 1 | 2 | libc6-dev 3 | bison 4 | flex 5 | libssl-dev 6 | 7 | network-manager 8 | net-tools 9 | iw 10 | wireless-tools 11 | ir-keytable 12 | evtest 13 | rfkill 14 | bluez 15 | ntp 16 | ntpdate 17 | 18 | ssh 19 | sudo 20 | bash-completion 21 | systemd-timesyncd 22 | parted 23 | wget 24 | curl 25 | fdisk 26 | tree 27 | btop 28 | bc 29 | 30 | fbterm 31 | locales 32 | fonts-wqy-zenhei 33 | 34 | vim 35 | gcc 36 | git 37 | make 38 | python3 39 | python3-pip 40 | python-dev-is-python3 41 | python3-pyqt5* 42 | 43 | i2c-tools 44 | usbutils 45 | 46 | toilet 47 | nfs-common 48 | fbset 49 | libts-bin 50 | alsa-utils 51 | 52 | 53 | u-boot-tools 54 | initramfs-tools 55 | device-tree-compiler 56 | 57 | dbus-x11 58 | xorg 59 | xserver-xorg-input-evdev 60 | xinput-calibrator 61 | xserver-xorg-input-synaptics 62 | xfwm4 63 | lightdm 64 | 65 | plymouth-themes -------------------------------------------------------------------------------- /board/walnutpi-1b/debian12/apt-desktop: -------------------------------------------------------------------------------- 1 | 2 | xfce4 3 | xfce4-notifyd 4 | xfce4-screenshooter 5 | xfce4-terminal 6 | xfce4-power-manager 7 | xfce4-pulseaudio-plugin 8 | xfce4-taskmanager 9 | x11vnc 10 | 11 | menulibre 12 | dmz-cursor-theme 13 | blueman 14 | network-manager-gnome 15 | 16 | mousepad 17 | thonny 18 | geany 19 | ristretto 20 | vlc 21 | galculator 22 | 23 | chromium 24 | chromium-driver 25 | chromium-l10n 26 | 27 | fcitx 28 | fcitx-googlepinyin 29 | 30 | libreoffice 31 | libreoffice-l10n-zh-cn 32 | 33 | qttools5-dev-tools 34 | 35 | -------------------------------------------------------------------------------- /board/walnutpi-1b/debian12/pip: -------------------------------------------------------------------------------- 1 | jedi 2 | numpy 3 | paho-mqtt==1.6.1 4 | pyinstaller -------------------------------------------------------------------------------- /board/walnutpi-1b/debian12/wpi-base: -------------------------------------------------------------------------------- 1 | wpi-user 2 | wpi-host-name 3 | wpi-welcome-info 4 | wpi-lightdm 5 | walnutpi-lib 6 | 7 | conf-h616-audio 8 | conf-qtenv 9 | enable-ssh-root 10 | disable-wifi-random 11 | 12 | set-emmc 13 | set-device 14 | set-language 15 | set-lcd 16 | pyuic 17 | # python3-sudo 18 | 19 | bluez 20 | hcitools 21 | initramfs-tools-hook 22 | plymouth-themes-walnutpi 23 | 24 | service-disable-fbcon 25 | service-h616-mac-detect 26 | service-resize-part 27 | service-aw859-bluetooth 28 | service-boot-script 29 | service-h616-conf-thermal-trip 30 | service-w1b-dis-mmc2 31 | 32 | map-device 33 | -------------------------------------------------------------------------------- /board/walnutpi-1b/debian12/wpi-desktop: -------------------------------------------------------------------------------- 1 | wpi-xfce4 2 | 3 | wpi-chromium 4 | conf-google-pinyin 5 | 6 | 7 | realvnc-vnc-viewer 8 | set-vnc 9 | 10 | walnutpi1b-desktop -------------------------------------------------------------------------------- /board/walnutpi-1b/debian12_burn/apt-base: -------------------------------------------------------------------------------- 1 | 2 | libc6-dev 3 | bison 4 | flex 5 | libssl-dev 6 | 7 | network-manager 8 | net-tools 9 | # iw 10 | # wireless-tools 11 | # ir-keytable 12 | # evtest 13 | # rfkill 14 | # bluez 15 | # ntp 16 | # ntpdate 17 | 18 | ssh 19 | sudo 20 | bash-completion 21 | systemd-timesyncd 22 | parted 23 | wget 24 | curl 25 | # fdisk 26 | # tree 27 | # btop 28 | bc 29 | 30 | # fbterm 31 | # locales 32 | # fonts-wqy-zenhei 33 | 34 | # vim 35 | gcc 36 | # git 37 | make 38 | python3 39 | python3-pip 40 | python-dev-is-python3 41 | # python3-pyqt5* 42 | 43 | # i2c-tools 44 | # usbutils 45 | 46 | # toilet 47 | # nfs-common 48 | # fbset 49 | # libts-bin 50 | # alsa-utils 51 | # mtd-utils 52 | # pciutils 53 | # dosfstools 54 | 55 | u-boot-tools 56 | initramfs-tools 57 | device-tree-compiler 58 | 59 | # dbus-x11 60 | # xorg 61 | # xserver-xorg-input-evdev 62 | # xinput-calibrator 63 | # xserver-xorg-input-synaptics 64 | # xfwm4 65 | # lightdm 66 | 67 | # # plymouth-themes 68 | 69 | libfreetype6-dev -------------------------------------------------------------------------------- /board/walnutpi-1b/debian12_burn/apt-del: -------------------------------------------------------------------------------- 1 | # 在构建镜像时需要使用,但构建完卸载掉以缩小镜像体积 2 | python3 3 | python3-pip 4 | python-dev-is-python3 -------------------------------------------------------------------------------- /board/walnutpi-1b/debian12_burn/wpi-base: -------------------------------------------------------------------------------- 1 | wpi-user 2 | wpi-host-name 3 | wpi-welcome-info 4 | # wpi-lightdm 5 | gpioc 6 | # blinka 7 | 8 | 9 | # conf-qtenv 10 | enable-ssh-root 11 | # disable-wifi-random 12 | 13 | set-emmc 14 | set-device 15 | set-language 16 | set-lcd 17 | # set-flash 18 | # set-nvme 19 | # pyuic 20 | # # python3-sudo 21 | 22 | # bluez 23 | # hcitools 24 | # initramfs-tools-hook 25 | # plymouth-themes-walnutpi 26 | 27 | service-disable-fbcon 28 | # service-resize-part 29 | # service-aw869-bluetooth 30 | service-boot-script 31 | # service-aw-eth-mac 32 | 33 | # map-device 34 | 35 | emmc-burner -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu22/apt-base: -------------------------------------------------------------------------------- 1 | 2 | libc6-dev 3 | bison 4 | flex 5 | libssl-dev 6 | 7 | network-manager 8 | net-tools 9 | iw 10 | wireless-tools 11 | ir-keytable 12 | evtest 13 | rfkill 14 | bluez 15 | ntp 16 | ntpdate 17 | 18 | ssh 19 | sudo 20 | bash-completion 21 | systemd-timesyncd 22 | parted 23 | wget 24 | curl 25 | fdisk 26 | tree 27 | btop 28 | bc 29 | 30 | fbterm 31 | locales 32 | fonts-wqy-zenhei 33 | 34 | vim 35 | gcc 36 | git 37 | make 38 | python3 39 | python3-pip 40 | python-dev-is-python3 41 | python3-pyqt5* 42 | 43 | i2c-tools 44 | usbutils 45 | 46 | toilet 47 | nfs-common 48 | fbset 49 | libts-bin 50 | alsa-utils 51 | 52 | 53 | u-boot-tools 54 | initramfs-tools 55 | device-tree-compiler 56 | 57 | # dbus-x11 58 | # xorg 59 | # xserver-xorg-input-evdev 60 | # xinput-calibrator 61 | # xserver-xorg-input-synaptics 62 | # xfwm4 63 | # lightdm 64 | 65 | netplan.io 66 | inetutils-ping 67 | plymouth-themes 68 | 69 | language-pack-zh-hans 70 | -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu22/apt-desktop: -------------------------------------------------------------------------------- 1 | ubuntu-desktop 2 | language-pack-gnome-zh-hans 3 | -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu22/pip: -------------------------------------------------------------------------------- 1 | jedi 2 | numpy 3 | paho-mqtt==1.6.1 4 | pyinstaller -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu22/wpi-base: -------------------------------------------------------------------------------- 1 | wpi-user 2 | wpi-host-name 3 | wpi-welcome-info 4 | # wpi-lightdm 5 | walnutpi-lib 6 | conf-h616-audio 7 | conf-h616-eth0 8 | conf-qtenv 9 | enable-ssh-root 10 | disable-wifi-random 11 | 12 | set-emmc 13 | set-device 14 | set-language 15 | set-lcd 16 | pyuic 17 | # python3-sudo 18 | 19 | bluez 20 | hcitools 21 | initramfs-tools-hook 22 | plymouth-themes-walnutpi 23 | 24 | service-disable-fbcon 25 | service-h616-mac-detect 26 | service-resize-part 27 | service-aw859-bluetooth 28 | service-h616-conf-thermal-trip 29 | service-w1b-dis-mmc2 30 | 31 | fix-ubuntu-networkd-wait 32 | map-device -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu22/wpi-desktop: -------------------------------------------------------------------------------- 1 | # wpi-xfce4 2 | conf-ubuntu-autologin 3 | 4 | # wpi-chromium 5 | # conf-google-pinyin 6 | 7 | # realvnc-vnc-viewer 8 | # set-vnc 9 | 10 | # walnutpi1b-desktop -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu24/apt-base: -------------------------------------------------------------------------------- 1 | 2 | libc6-dev 3 | bison 4 | flex 5 | libssl-dev 6 | 7 | network-manager 8 | net-tools 9 | iw 10 | wireless-tools 11 | ir-keytable 12 | evtest 13 | rfkill 14 | bluez 15 | ntp 16 | ntpdate 17 | 18 | ssh 19 | sudo 20 | bash-completion 21 | systemd-timesyncd 22 | parted 23 | wget 24 | curl 25 | fdisk 26 | tree 27 | btop 28 | bc 29 | 30 | fbterm 31 | locales 32 | fonts-wqy-zenhei 33 | 34 | vim 35 | gcc 36 | git 37 | make 38 | python3 39 | python3-pip 40 | python-dev-is-python3 41 | python3-pyqt5* 42 | 43 | i2c-tools 44 | usbutils 45 | 46 | toilet 47 | nfs-common 48 | fbset 49 | libts-bin 50 | alsa-utils 51 | 52 | 53 | u-boot-tools 54 | initramfs-tools 55 | device-tree-compiler 56 | 57 | # dbus-x11 58 | # xorg 59 | # xserver-xorg-input-evdev 60 | # xinput-calibrator 61 | # xserver-xorg-input-synaptics 62 | # xfwm4 63 | 64 | netplan.io 65 | inetutils-ping 66 | plymouth-themes 67 | 68 | language-pack-zh-hans 69 | -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu24/apt-desktop: -------------------------------------------------------------------------------- 1 | ubuntu-desktop 2 | language-pack-gnome-zh-hans 3 | lightdm 4 | -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu24/pip: -------------------------------------------------------------------------------- 1 | jedi 2 | numpy 3 | paho-mqtt==1.6.1 4 | pyinstaller -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu24/wpi-base: -------------------------------------------------------------------------------- 1 | wpi-user 2 | wpi-host-name 3 | wpi-welcome-info 4 | # wpi-lightdm 5 | # walnutpi-lib 6 | conf-h616-audio 7 | conf-h616-eth0 8 | conf-qtenv 9 | enable-ssh-root 10 | disable-wifi-random 11 | 12 | set-emmc 13 | set-device 14 | set-language 15 | set-lcd 16 | pyuic 17 | # python3-sudo 18 | 19 | bluez 20 | hcitools 21 | initramfs-tools-hook 22 | plymouth-themes-walnutpi 23 | 24 | service-disable-fbcon 25 | service-h616-mac-detect 26 | service-resize-part 27 | service-aw859-bluetooth 28 | service-h616-conf-thermal-trip 29 | service-w1b-dis-mmc2 30 | 31 | fix-ubuntu-networkd-wait 32 | map-device -------------------------------------------------------------------------------- /board/walnutpi-1b/ubuntu24/wpi-desktop: -------------------------------------------------------------------------------- 1 | # wpi-xfce4 2 | conf-ubuntu-autologin 3 | 4 | # wpi-chromium 5 | # conf-google-pinyin 6 | 7 | # realvnc-vnc-viewer 8 | # set-vnc 9 | 10 | # walnutpi1b-desktop -------------------------------------------------------------------------------- /board/walnutpi-2b/board.conf: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | BOARD_NAME="WalnutPi-2b" 3 | BOARD_MODEL="walnutpi-2b" 4 | CHIP_ARCH="arm64" 5 | 6 | # 使用指定下载的gcc 7 | # TOOLCHAIN_DOWN_URL="https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz" 8 | # TOOLCHAIN_FILE_NAME="gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu" 9 | # CROSS_COMPILE="aarch64-none-linux-gnu-" 10 | 11 | # 使用本机自带的gcc,不存在则现场apt安装 12 | TOOLCHAIN_NAME_IN_APT="gcc-aarch64-linux-gnu" 13 | CROSS_COMPILE="aarch64-linux-gnu-" 14 | 15 | BOOTLOADER_NAME="syterkit" 16 | 17 | SYTERKIT_GIT="https://github.com/walnutpi/SyterKit.git" 18 | SYTERKIT_BRANCH="main" 19 | SYTERKIT_BOARD_FILE="walnutpi-2b.cmake" 20 | SYTERKIT_OUT_BIN="board/walnutpi-2b/extlinux_boot/extlinux_boot_bin_card.bin" 21 | 22 | 23 | # ATF_GIT="https://github.com/ARM-software/arm-trusted-firmware.git" 24 | # ATF_PLAT="sun50i_h616" 25 | # ATF_BRANCH="lts-v2.10.2" 26 | 27 | # UBOOT_GIT="https://github.com/walnutpi/u-boot.git" 28 | # UBOOT_BRANCH="v2024.01" 29 | # UBOOT_CONFIG="walnutpi_1b_defconfig" 30 | # UBOOT_BIN_NAME="u-boot-sunxi-with-spl.bin" 31 | 32 | LINUX_GIT="https://github.com/walnutpi/linux.git" 33 | LINUX_BRANCH="5.15.147" 34 | LINUX_CONFIG="walnutpi2b_defconfig" 35 | MODULES_ENABLE="aic8800_bsp aic8800_btlpm aic8800_fdrv " 36 | FIRMWARE_GIT="https://github.com/walnutpi/firmware.git" 37 | -------------------------------------------------------------------------------- /board/walnutpi-2b/boot/bl31.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/walnutpi/walnutpi-build/db385166ce136ceef110ea3eae43c65521e7a9a4/board/walnutpi-2b/boot/bl31.bin -------------------------------------------------------------------------------- /board/walnutpi-2b/boot/scp.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/walnutpi/walnutpi-build/db385166ce136ceef110ea3eae43c65521e7a9a4/board/walnutpi-2b/boot/scp.bin -------------------------------------------------------------------------------- /board/walnutpi-2b/boot/splash.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/walnutpi/walnutpi-build/db385166ce136ceef110ea3eae43c65521e7a9a4/board/walnutpi-2b/boot/splash.bin -------------------------------------------------------------------------------- /board/walnutpi-2b/config.txt: -------------------------------------------------------------------------------- 1 | version=1.2 2 | 3 | ## config screen 4 | screen=hdmi 5 | 6 | fdtfile=sun55i-t527-walnutpi-2b 7 | 8 | ## enable the console with screen 9 | console_display=enable 10 | console_uart=uart0 11 | 12 | ## show the bootinfo to the screen 13 | display_bootinfo=enable 14 | 15 | ## force hdmi fb hotplug 16 | hdmi_force_hotplug=1 17 | 18 | ## loglevel 19 | printk_level=3 20 | 21 | overlay_prefix=sun55i-t527 22 | 23 | # 开机后运行set-device指令管理overlays 24 | overlays= i2c1 i2c2 uart2 spidev1_0 spidev1_1 25 | 26 | 27 | #------------------------------------------------# 28 | rootfstype=ext4 29 | -------------------------------------------------------------------------------- /board/walnutpi-2b/debian12/apt-base: -------------------------------------------------------------------------------- 1 | 2 | libc6-dev 3 | bison 4 | flex 5 | libssl-dev 6 | 7 | network-manager 8 | net-tools 9 | iw 10 | wireless-tools 11 | ir-keytable 12 | evtest 13 | rfkill 14 | bluez 15 | ntp 16 | ntpdate 17 | 18 | ssh 19 | sudo 20 | bash-completion 21 | systemd-timesyncd 22 | parted 23 | wget 24 | curl 25 | fdisk 26 | tree 27 | btop 28 | bc 29 | 30 | fbterm 31 | locales 32 | fonts-wqy-zenhei 33 | 34 | vim 35 | gcc 36 | git 37 | make 38 | python3 39 | python3-pip 40 | python-dev-is-python3 41 | python3-pyqt5* 42 | 43 | i2c-tools 44 | usbutils 45 | 46 | toilet 47 | nfs-common 48 | fbset 49 | libts-bin 50 | alsa-utils 51 | mtd-utils 52 | pciutils 53 | dosfstools 54 | 55 | u-boot-tools 56 | initramfs-tools 57 | device-tree-compiler 58 | 59 | dbus-x11 60 | xorg 61 | xserver-xorg-input-evdev 62 | xinput-calibrator 63 | xserver-xorg-input-synaptics 64 | xfwm4 65 | lightdm 66 | 67 | # plymouth-themes -------------------------------------------------------------------------------- /board/walnutpi-2b/debian12/apt-desktop: -------------------------------------------------------------------------------- 1 | 2 | xfce4 3 | xfce4-notifyd 4 | xfce4-screenshooter 5 | xfce4-terminal 6 | xfce4-power-manager 7 | xfce4-pulseaudio-plugin 8 | xfce4-taskmanager 9 | x11vnc 10 | 11 | menulibre 12 | dmz-cursor-theme 13 | blueman 14 | network-manager-gnome 15 | 16 | mousepad 17 | thonny 18 | geany 19 | ristretto 20 | vlc 21 | galculator 22 | 23 | chromium 24 | chromium-driver 25 | chromium-l10n 26 | 27 | fcitx 28 | fcitx-googlepinyin 29 | 30 | libreoffice 31 | libreoffice-l10n-zh-cn 32 | 33 | qttools5-dev-tools 34 | 35 | -------------------------------------------------------------------------------- /board/walnutpi-2b/debian12/pip: -------------------------------------------------------------------------------- 1 | jedi 2 | numpy 3 | paho-mqtt==1.6.1 4 | pyinstaller -------------------------------------------------------------------------------- /board/walnutpi-2b/debian12/wpi-base: -------------------------------------------------------------------------------- 1 | wpi-user 2 | wpi-host-name 3 | wpi-welcome-info 4 | wpi-lightdm 5 | 6 | walnutpi.npu 7 | walnutpi.lib 8 | 9 | gpioc 10 | blinka 11 | 12 | 13 | conf-t527-audio 14 | conf-qtenv 15 | enable-ssh-root 16 | disable-wifi-random 17 | conf-iptables-as-legacy 18 | 19 | set-emmc 20 | set-device 21 | set-language 22 | set-lcd 23 | set-flash 24 | set-nvme 25 | pyuic 26 | # python3-sudo 27 | 28 | bluez 29 | hcitools 30 | initramfs-tools-hook 31 | plymouth-themes-walnutpi 32 | 33 | service-disable-fbcon 34 | service-resize-part 35 | service-aw869-bluetooth 36 | service-boot-script 37 | service-w2b-dis-eth-led 38 | 39 | map-device -------------------------------------------------------------------------------- /board/walnutpi-2b/debian12/wpi-desktop: -------------------------------------------------------------------------------- 1 | wpi-xfce4 2 | service-restart-lightdm 3 | 4 | wpi-chromium 5 | conf-google-pinyin 6 | 7 | 8 | # realvnc-vnc-viewer 9 | set-vnc 10 | -------------------------------------------------------------------------------- /board/walnutpi-2b/debian12_burn/apt-base: -------------------------------------------------------------------------------- 1 | 2 | libc6-dev 3 | bison 4 | flex 5 | libssl-dev 6 | 7 | network-manager 8 | net-tools 9 | # iw 10 | # wireless-tools 11 | # ir-keytable 12 | # evtest 13 | # rfkill 14 | # bluez 15 | # ntp 16 | # ntpdate 17 | 18 | ssh 19 | sudo 20 | bash-completion 21 | systemd-timesyncd 22 | parted 23 | wget 24 | curl 25 | # fdisk 26 | # tree 27 | # btop 28 | bc 29 | 30 | # fbterm 31 | # locales 32 | # fonts-wqy-zenhei 33 | 34 | # vim 35 | gcc 36 | # git 37 | make 38 | python3 39 | python3-pip 40 | python-dev-is-python3 41 | # python3-pyqt5* 42 | 43 | # i2c-tools 44 | # usbutils 45 | 46 | # toilet 47 | # nfs-common 48 | # fbset 49 | # libts-bin 50 | # alsa-utils 51 | # mtd-utils 52 | # pciutils 53 | # dosfstools 54 | 55 | u-boot-tools 56 | initramfs-tools 57 | device-tree-compiler 58 | 59 | # dbus-x11 60 | # xorg 61 | # xserver-xorg-input-evdev 62 | # xinput-calibrator 63 | # xserver-xorg-input-synaptics 64 | # xfwm4 65 | # lightdm 66 | 67 | # # plymouth-themes 68 | 69 | libfreetype6-dev -------------------------------------------------------------------------------- /board/walnutpi-2b/debian12_burn/apt-del: -------------------------------------------------------------------------------- 1 | # 在构建镜像时需要使用,但构建完卸载掉以缩小镜像体积 2 | python3 3 | python3-pip 4 | python-dev-is-python3 -------------------------------------------------------------------------------- /board/walnutpi-2b/debian12_burn/wpi-base: -------------------------------------------------------------------------------- 1 | wpi-user 2 | wpi-host-name 3 | wpi-welcome-info 4 | # wpi-lightdm 5 | gpioc 6 | # blinka 7 | 8 | 9 | conf-t527-audio 10 | # conf-qtenv 11 | enable-ssh-root 12 | # disable-wifi-random 13 | conf-iptables-as-legacy 14 | 15 | set-emmc 16 | set-device 17 | set-language 18 | set-lcd 19 | # set-flash 20 | # set-nvme 21 | # pyuic 22 | # # python3-sudo 23 | 24 | # bluez 25 | # hcitools 26 | # initramfs-tools-hook 27 | # plymouth-themes-walnutpi 28 | 29 | service-disable-fbcon 30 | # service-resize-part 31 | # service-aw869-bluetooth 32 | service-boot-script 33 | # service-aw-eth-mac 34 | 35 | # map-device 36 | 37 | emmc-burner -------------------------------------------------------------------------------- /board/walnutpi-2b/ubuntu24/apt-base: -------------------------------------------------------------------------------- 1 | 2 | libc6-dev 3 | bison 4 | flex 5 | libssl-dev 6 | 7 | network-manager 8 | net-tools 9 | iw 10 | wireless-tools 11 | ir-keytable 12 | evtest 13 | rfkill 14 | bluez 15 | ntp 16 | ntpdate 17 | 18 | ssh 19 | sudo 20 | bash-completion 21 | systemd-timesyncd 22 | parted 23 | wget 24 | curl 25 | fdisk 26 | tree 27 | btop 28 | bc 29 | 30 | fbterm 31 | locales 32 | fonts-wqy-zenhei 33 | 34 | vim 35 | gcc 36 | git 37 | make 38 | python3 39 | python3-pip 40 | python-dev-is-python3 41 | # python3-pyqt5* 42 | 43 | i2c-tools 44 | usbutils 45 | 46 | toilet 47 | nfs-common 48 | fbset 49 | libts-bin 50 | alsa-utils 51 | mtd-utils 52 | pciutils 53 | dosfstools 54 | 55 | u-boot-tools 56 | initramfs-tools 57 | device-tree-compiler 58 | 59 | # dbus-x11 60 | # xorg 61 | # xserver-xorg-input-evdev 62 | # xinput-calibrator 63 | # xserver-xorg-input-synaptics 64 | # xfwm4 65 | # lightdm 66 | 67 | netplan.io 68 | inetutils-ping 69 | plymouth-themes 70 | 71 | language-pack-zh-hans -------------------------------------------------------------------------------- /board/walnutpi-2b/ubuntu24/apt-desktop: -------------------------------------------------------------------------------- 1 | ubuntu-desktop 2 | lightdm 3 | language-pack-gnome-zh-hans 4 | -------------------------------------------------------------------------------- /board/walnutpi-2b/ubuntu24/pip: -------------------------------------------------------------------------------- 1 | jedi 2 | numpy 3 | paho-mqtt==1.6.1 4 | pyinstaller -------------------------------------------------------------------------------- /board/walnutpi-2b/ubuntu24/wpi-base: -------------------------------------------------------------------------------- 1 | wpi-user 2 | wpi-host-name 3 | wpi-welcome-info 4 | # wpi-lightdm 5 | gpioc 6 | blinka 7 | # walnutpi-lib 8 | conf-t527-audio 9 | conf-w2-eth 10 | conf-qtenv 11 | enable-ssh-root 12 | disable-wifi-random 13 | 14 | set-emmc 15 | set-device 16 | set-language 17 | set-lcd 18 | set-flash 19 | set-nvme 20 | pyuic 21 | # python3-sudo 22 | 23 | bluez 24 | hcitools 25 | initramfs-tools-hook 26 | plymouth-themes-walnutpi 27 | 28 | service-disable-fbcon 29 | service-resize-part 30 | service-aw869-bluetooth 31 | 32 | 33 | fix-ubuntu-networkd-wait 34 | map-device -------------------------------------------------------------------------------- /board/walnutpi-2b/ubuntu24/wpi-desktop: -------------------------------------------------------------------------------- 1 | conf-ubuntu-autologin 2 | wpi-lightdm 3 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | PATH_PROJECT_DIR="$(dirname "$(realpath "${BASH_SOURCE[0]}")")" 3 | PATH_SCRIPT="${PATH_PROJECT_DIR}/scripts" 4 | source "${PATH_SCRIPT}/common.sh" 5 | source "${PATH_SCRIPT}/option.sh" 6 | source "${PATH_SCRIPT}/menu.sh" 7 | source "${PATH_SCRIPT}/path.sh" 8 | 9 | source "${PATH_SCRIPT}/build_bootloader.sh" 10 | source "${PATH_SCRIPT}/build_kernel.sh" 11 | source "${PATH_SCRIPT}/build_rootfs.sh" 12 | source "${PATH_SCRIPT}/build_image.sh" 13 | 14 | reload_env() { 15 | source "${PATH_SCRIPT}/path.sh" 16 | } 17 | 18 | 19 | ENTER_board_name=$OPT_user_no_choose 20 | ENTER_build_parts=$OPT_user_no_choose 21 | ENTER_boot_rebuild_flag=$OPT_user_no_choose 22 | ENTER_kernel_rebuild_flag=$OPT_user_no_choose 23 | ENTER_os_ver=$OPT_user_no_choose 24 | ENTER_rootfs_type=$OPT_user_no_choose 25 | ENTER_img_file=$OPT_user_no_choose 26 | 27 | START_DATE=$(date) 28 | LOG_START_TIME=$(date +%m-%d_%H:%M) 29 | 30 | 31 | 32 | BUILD_ARGS=$@ 33 | para_desc () { 34 | echo -e " -b : choose board" 35 | for dir in $(ls -d $PATH_board/*/ 2>/dev/null); do 36 | local dirname=$(basename "$dir") 37 | echo -e "\t-b $dirname" 38 | done 39 | echo "" 40 | echo -e " -p : choose which part to compile" 41 | echo -e "\t-p $OPT_part_image" 42 | echo -e "\t-p $OPT_part_pack_emmc_burn -f [file name]" 43 | echo -e "\t-p $OPT_part_bootloader" 44 | echo -e "\t-p $OPT_part_kernel" 45 | echo -e "\t-p $OPT_part_rootfs" 46 | echo -e "\t-p $OPT_part_pack_rootfs" 47 | echo -e "\t-p $OPT_part_pack_image" 48 | echo "" 49 | echo -e " -v : choose the rootfs version" 50 | echo -e "\t-v $OPT_os_debian12" 51 | echo -e "\t-v $OPT_os_ubuntu22" 52 | echo -e "\t-v $OPT_os_ubuntu24" 53 | echo "" 54 | echo -e " -t : choose the rootfs type" 55 | echo -e "\t-t $OPT_rootfs_server" 56 | echo -e "\t-t $OPT_rootfs_desktop" 57 | echo "" 58 | echo -e " $OPT_skip_boot : Skip compilation boot when compiling an image" 59 | echo -e " $OPT_skip_kernel : Skip compilation kernel when compiling an image" 60 | } 61 | 62 | while [ "x$#" != "x0" ]; 63 | do 64 | if [ "x$1" == "x" ]; then 65 | shift 66 | elif [ "x$1" == "x-h" ] || [ "x$1" == "x-help" ]; then 67 | para_desc 68 | exit 69 | 70 | elif [ "x$1" == "x-b" ]; then 71 | ENTER_board_name="${PATH_board}/$2" 72 | shift 73 | shift 74 | 75 | elif [ "x$1" == "x-p" ]; then 76 | if [ $ENTER_boot_rebuild_flag == $OPT_user_no_choose ];then ENTER_boot_rebuild_flag="$OPT_YES"; fi 77 | if [ $ENTER_kernel_rebuild_flag == $OPT_user_no_choose ];then ENTER_kernel_rebuild_flag="$OPT_YES"; fi 78 | ENTER_build_parts="$2" 79 | shift 80 | shift 81 | 82 | elif [ "x$1" == "x-f" ]; then 83 | ENTER_img_file="$2" 84 | shift 85 | shift 86 | 87 | elif [ "x$1" == "x-v" ]; then 88 | ENTER_os_ver="$2" 89 | shift 90 | shift 91 | 92 | elif [ "x$1" == "x-t" ]; then 93 | ENTER_rootfs_type="$2" 94 | shift 95 | shift 96 | 97 | elif [ "x$1" == "x$OPT_skip_boot" ]; then 98 | ENTER_boot_rebuild_flag=$OPT_NO 99 | shift 100 | 101 | elif [ "x$1" == "x$OPT_skip_kernel" ]; then 102 | ENTER_kernel_rebuild_flag=$OPT_NO 103 | shift 104 | 105 | else 106 | para_desc 107 | exit 108 | 109 | fi 110 | done 111 | 112 | # 获取用户输入 113 | reload_env 114 | if [ $ENTER_board_name == $OPT_user_no_choose ]; then 115 | ENTER_board_name=$(MENU_choose_board $PATH_board) 116 | [[ -z ${ENTER_board_name} ]] && exit 117 | fi 118 | 119 | if [ $ENTER_build_parts == $OPT_user_no_choose ]; then 120 | ENTER_build_parts=$(MENU_choose_parts) 121 | [[ -z ${ENTER_build_parts} ]] && exit 122 | fi 123 | 124 | case "$ENTER_build_parts" in 125 | "$OPT_part_pack_rootfs" | "$OPT_part_pack_image" | "$OPT_part_rootfs" | "$OPT_part_image") 126 | if [ $ENTER_os_ver == $OPT_user_no_choose ]; then 127 | ENTER_os_ver=$(MENU_choose_os) 128 | [[ -z ${ENTER_os_ver} ]] && exit 129 | fi 130 | if [ $ENTER_rootfs_type == $OPT_user_no_choose ]; then 131 | ENTER_rootfs_type=$(MENU_choose_rootfs_type) 132 | [[ -z ${ENTER_rootfs_type} ]] && exit 133 | fi 134 | ;; 135 | "$OPT_part_emmc_burn_rootfs") 136 | ENTER_os_ver=$OPT_os_debian12_burn 137 | ENTER_rootfs_type=$OPT_rootfs_server 138 | ;; 139 | "$OPT_part_pack_emmc_burn") 140 | ENTER_os_ver=$OPT_os_debian12_burn 141 | ENTER_rootfs_type=$OPT_rootfs_server 142 | 143 | if [ $ENTER_img_file == $OPT_user_no_choose ]; then 144 | ENTER_img_file=$(MENU_choose_img_file) 145 | [[ -z ${ENTER_img_file} ]] && exit 146 | fi 147 | ;; 148 | esac 149 | source $ENTER_board_name/board.conf 150 | PATH_OUTPUT_BOARD=${PATH_OUTPUT}/${ENTER_board_name##*/} 151 | echo "PATH_OUTPUT_BOARD=${PATH_OUTPUT_BOARD}" 152 | create_dir $PATH_OUTPUT_BOARD 153 | reload_env 154 | 155 | if [ "$ENTER_build_parts" == "$OPT_part_image" ] || [ "$ENTER_build_parts" == "$OPT_part_emmc_burn_rootfs" ] ; then 156 | if [ -d ${OUTDIR_boot_package} ]; then 157 | echo "ENTER_boot_rebuild_flag=$ENTER_boot_rebuild_flag" 158 | if [ "$ENTER_boot_rebuild_flag" == $OPT_user_no_choose ]; then 159 | ENTER_boot_rebuild_flag=$(MENU_sikp_boot) 160 | [[ -z ${ENTER_boot_rebuild_flag} ]] && exit 161 | fi 162 | fi 163 | if [ -d ${OUTDIR_kernel_package} ]; then 164 | if [ "$ENTER_kernel_rebuild_flag" == $OPT_user_no_choose ]; then 165 | ENTER_kernel_rebuild_flag=$(MENU_sikp_kernel) 166 | [[ -z ${ENTER_kernel_rebuild_flag} ]] && exit 167 | fi 168 | fi 169 | fi 170 | 171 | 172 | if [ ! -d ${FLAG_DIR_NO_FIRST} ]; then 173 | apt update 174 | exit_if_last_error 175 | apt install -y gcc-arm-none-eabi cmake debian-archive-keyring qemu-user-static curl debootstrap kpartx git bison flex swig libssl-dev device-tree-compiler u-boot-tools make python3 python3-dev parted dosfstools 176 | exit_if_last_error 177 | mkdir -p ${FLAG_DIR_NO_FIRST} 178 | fi 179 | 180 | if [ ! -z $TOOLCHAIN_DOWN_URL ];then 181 | 182 | USE_CROSS_COMPILE="${PATH_TOOLCHAIN}/${TOOLCHAIN_FILE_NAME}/bin/${CROSS_COMPILE}" 183 | if [ ! -f "${USE_CROSS_COMPILE}gcc" ] ; then 184 | wget -P ${PATH_TOOLCHAIN} $TOOLCHAIN_DOWN_URL 185 | run_status "unzip toolchain" tar -xvf ${PATH_TOOLCHAIN}/${TOOLCHAIN_FILE_NAME}.tar.xz -C $PATH_TOOLCHAIN 186 | fi 187 | else 188 | if [ ! -f /usr/bin/${CROSS_COMPILE}gcc ]; then 189 | apt install ${TOOLCHAIN_NAME_IN_APT} 190 | fi 191 | USE_CROSS_COMPILE="${CROSS_COMPILE}" 192 | 193 | fi 194 | 195 | 196 | # exec 3>&1 4>&2 197 | # exec > >(tee -a ${LOG_FILE}) 2>&1 198 | reload_env 199 | case "$ENTER_build_parts" in 200 | "$OPT_part_bootloader" ) 201 | build_bootloader 202 | ;; 203 | "$OPT_part_kernel") 204 | build_kernel 205 | ;; 206 | "$OPT_part_rootfs") 207 | generate_tmp_rootfs 208 | ;; 209 | "$OPT_part_pack_rootfs") 210 | pack_rootfs 211 | ;; 212 | "$OPT_part_pack_image") 213 | build_image 214 | ;; 215 | "$OPT_part_image") 216 | if [ ${ENTER_boot_rebuild_flag} == "$OPT_user_no_choose" ] || [ ${ENTER_boot_rebuild_flag} == "$OPT_YES" ] ; then 217 | build_bootloader 218 | fi 219 | if [ ${ENTER_kernel_rebuild_flag} == "$OPT_user_no_choose" ] || [ ${ENTER_kernel_rebuild_flag} == "$OPT_YES" ] ; then 220 | build_kernel 221 | fi 222 | generate_tmp_rootfs 223 | pack_rootfs 224 | build_image 225 | ;; 226 | "$OPT_part_emmc_burn_rootfs") 227 | if [ ${ENTER_boot_rebuild_flag} == "$OPT_user_no_choose" ] || [ ${ENTER_boot_rebuild_flag} == "$OPT_YES" ] ; then 228 | build_bootloader 229 | fi 230 | if [ ${ENTER_kernel_rebuild_flag} == "$OPT_user_no_choose" ] || [ ${ENTER_kernel_rebuild_flag} == "$OPT_YES" ] ; then 231 | build_kernel 232 | fi 233 | generate_tmp_rootfs 234 | ;; 235 | "$OPT_part_pack_emmc_burn") 236 | add_emmc_burn_file $PATH_OUTPUT/${ENTER_img_file} 237 | pack_rootfs 238 | IMAGE_FLAG_NO_SCREEN_DISPLAY=$OPT_YES 239 | IMAGE_FLAG_DISK_RAED_ONLY=$OPT_YES 240 | build_image "eMMC_burner-$(basename "${ENTER_img_file}" .img)" 241 | ;; 242 | esac 243 | 244 | # exec 1>&3 2>&4 245 | # exec 3>&- 4>&- 246 | 247 | cd $PATH_LOG 248 | # sed -i 's/\x1b\[[0-9;]*m//g' ${PATH_LOG}/*.log 249 | 250 | 251 | echo -e "开始时间\t${START_DATE}" 252 | echo -e "结束时间\t$(date)" -------------------------------------------------------------------------------- /docker-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DOCKER_IMAGE_NAME=walnutpi-build:1.0 4 | CONTAINER_NAME="walnutpi-build-$(date +%s)" 5 | RUN_COMMOND="./build.sh $@" 6 | 7 | echo_red() { 8 | echo -e -n "\r\033[31m$1\033[0m" 9 | } 10 | echo_green() { 11 | echo -e -n "\r\033[32m$1\033[0m" 12 | } 13 | echo_blue() { 14 | echo -e -n "\r\033[36m$1\033[0m" 15 | } 16 | 17 | echo_green "[创建镜像] \t" 18 | if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${DOCKER_IMAGE_NAME}$"; then 19 | echo "'$DOCKER_IMAGE_NAME' 已存在" 20 | else 21 | echo "'$DOCKER_IMAGE_NAME' 不存在,开始构建..." 22 | docker build -t $DOCKER_IMAGE_NAME . 23 | fi 24 | 25 | echo_green "[运行]\t" 26 | echo "$RUN_COMMOND" 27 | 28 | # --privileged 使用特权模式,为了使用chroot 29 | docker run --name "$CONTAINER_NAME" \ 30 | --privileged \ 31 | --network host \ 32 | -v /etc/hosts:/etc/hosts:ro \ 33 | -v /etc/resolv.conf:/etc/resolv.conf:ro \ 34 | -v /etc/localtime:/etc/localtime:ro \ 35 | -v "$(pwd):$(pwd)" \ 36 | -w "$(pwd)" \ 37 | -it --rm "$DOCKER_IMAGE_NAME" bash -c "$RUN_COMMOND" -------------------------------------------------------------------------------- /dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM ubuntu:24.04 3 | 4 | # 以无交互的方式安装软件 5 | ENV DEBIAN_FRONTEND=noninteractive 6 | 7 | RUN apt-get update && \ 8 | apt-get install -y \ 9 | gcc-aarch64-linux-gnu \ 10 | gcc-arm-none-eabi \ 11 | cmake \ 12 | debian-archive-keyring \ 13 | curl \ 14 | whiptail \ 15 | bc \ 16 | qemu-user-static \ 17 | debootstrap \ 18 | kpartx \ 19 | git \ 20 | bison \ 21 | flex \ 22 | swig \ 23 | libssl-dev \ 24 | device-tree-compiler \ 25 | u-boot-tools \ 26 | make \ 27 | python3 \ 28 | python3-dev \ 29 | python3-pip \ 30 | sudo \ 31 | libpam-runtime \ 32 | dosfstools \ 33 | parted \ 34 | build-essential \ 35 | xz-utils && \ 36 | apt-get clean && rm -rf /var/lib/apt/lists/* 37 | 38 | # 创建用户 pi 密码为 pi 39 | RUN useradd -m -s /bin/bash pi && \ 40 | echo "pi:pi" | chpasswd 41 | 42 | # pi 用户运行sudo不需要输入密码 43 | RUN mkdir -p /etc/sudoers.d 44 | RUN echo "pi ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/pi && \ 45 | chmod 0440 /etc/sudoers.d/pi 46 | 47 | # 以解除 pip 安装的限制 48 | RUN LIB_DIR="${TMP_rootfs_build}/usr/lib" && \ 49 | FILE_NAME="EXTERNALLY-MANAGED" && \ 50 | find $LIB_DIR -type f -name "$FILE_NAME" -delete 51 | 52 | RUN pip3 install setuptools 53 | -------------------------------------------------------------------------------- /scripts/build_bootloader.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | 5 | 6 | compile_atf() { 7 | cd $PATH_SOURCE 8 | echo $ATF_GIT 9 | git clone $ATF_GIT 10 | dirname="${PATH_SOURCE}/$(basename "$ATF_GIT" .git)" 11 | cd $dirname 12 | git checkout $ATF_BRANCH 13 | run_as_user make PLAT=$ATF_PLAT DEBUG=1 bl31 CROSS_COMPILE=$USE_CROSS_COMPILE 14 | exit_if_last_error 15 | } 16 | 17 | compile_uboot() { 18 | if [ -n "$ATF_GIT" ]; then 19 | compile_atf 20 | fi 21 | cd $PATH_SOURCE 22 | 23 | dirname="${PATH_SOURCE}/$(basename "$UBOOT_GIT" .git)-$UBOOT_BRANCH" 24 | clone_branch $UBOOT_GIT $UBOOT_BRANCH $dirname 25 | cd $dirname 26 | 27 | run_as_user make $UBOOT_CONFIG 28 | run_as_user make BL31=../arm-trusted-firmware/build/$ATF_PLAT/debug/bl31.bin \ 29 | CROSS_COMPILE=$USE_CROSS_COMPILE 30 | exit_if_last_error 31 | cp $UBOOT_BIN_NAME $OUTFILE_boot_bin 32 | 33 | } 34 | compile_syterkit() { 35 | cd $PATH_SOURCE 36 | local dirname="${PATH_SOURCE}/$(basename "$SYTERKIT_GIT" .git)-$SYTERKIT_BRANCH" 37 | clone_branch $SYTERKIT_GIT $SYTERKIT_BRANCH $dirname 38 | cd $dirname 39 | local workspace_name="build" 40 | create_dir $workspace_name 41 | cd $workspace_name 42 | run_as_user cmake -DCMAKE_BOARD_FILE=$SYTERKIT_BOARD_FILE .. 43 | exit_if_last_error 44 | run_as_user make 45 | exit_if_last_error 46 | cp $SYTERKIT_OUT_BIN $OUTFILE_boot_bin 47 | 48 | } 49 | get_config_txt_version() { 50 | source ${ENTER_board_name}/config.txt 51 | echo "$version" 52 | } 53 | 54 | # 填写control文件,生成deb包到输出路径 55 | _pack_as_boot_deb(){ 56 | local path_package=$1 57 | local part_name=$2 58 | local package_desc=$3 59 | 60 | local package_name="$part_name-${BOARD_NAME}-${SYTERKIT_BRANCH}${UBOOT_BRANCH}" 61 | control_file=$path_package/DEBIAN/control 62 | 63 | if [ ! -d $path_package/DEBIAN ];then 64 | mkdir -p $path_package/DEBIAN 65 | fi 66 | 67 | 68 | source ${ENTER_board_name}/config.txt 69 | deb_version="$version" 70 | 71 | cd $path_package 72 | size=$(du -sk --exclude=DEBIAN . | cut -f1) 73 | 74 | 75 | cat << EOF > $control_file 76 | Package: ${package_name} 77 | Description: ${package_desc} 78 | Maintainer: walnutpi-build 79 | Version: ${deb_version} 80 | Section: free 81 | Priority: optional 82 | Installed-Size: ${size} 83 | Architecture: ${CHIP_ARCH} 84 | EOF 85 | DEB_PACKAGE_NAME="${package_name}_${deb_version}_${CHIP_ARCH}.deb" 86 | run_status "创建deb包 ${DEB_PACKAGE_NAME} " dpkg -b "$path_package" "${OUTDIR_boot_package}/${DEB_PACKAGE_NAME}" 87 | 88 | } 89 | 90 | pack_config_txt() { 91 | local path_tmp_package_configtxt="${PATH_TMP}/boot-configtxt-$(basename ${ENTER_board_name})" 92 | if [ -d $path_tmp_package_configtxt ]; then 93 | rm -r $path_tmp_package_configtxt 94 | fi 95 | create_dir $path_tmp_package_configtxt 96 | local path_board_tmp_boot="/tmp-boot/boot-configtxt" 97 | local path_tmp_boot=${path_tmp_package_configtxt}${path_board_tmp_boot} 98 | create_dir $path_tmp_boot 99 | cp ${ENTER_board_name}/config.txt $path_tmp_boot 100 | _gen_postinst_cp_file $path_tmp_package_configtxt $path_board_tmp_boot /boot/ 101 | 102 | 103 | postinst_file=$path_tmp_package_configtxt/DEBIAN/postinst 104 | if [ ! -d $path_tmp_package_configtxt/DEBIAN ];then 105 | mkdir $path_tmp_package_configtxt/DEBIAN 106 | fi 107 | cat << EOF > $postinst_file 108 | #!/bin/sh 109 | case "\$1" in 110 | configure) 111 | old_version="\$2" 112 | new_version="\$3" 113 | echo "Updating from version $old_version to version $new_version" 114 | 115 | cp -r $path_board_tmp_boot/* /boot/ 116 | set-device 117 | 118 | BLOCK_DEVICE=\$(findmnt "/" -o SOURCE -n) 119 | ROOTFS_PARTUUID=\$(blkid -s PARTUUID -o value \$BLOCK_DEVICE) 120 | if [ -z "\$ROOTFS_PARTUUID" ]; then 121 | echo "无法解析出uuid" 122 | exit 123 | fi 124 | echo "rootdev=PARTUUID=\${ROOTFS_PARTUUID}" | sudo tee -a /boot/config.txt 125 | 126 | ;; 127 | abort-upgrade|abort-remove|abort-deconfigure) 128 | # 回滚操作 129 | ;; 130 | 131 | esac 132 | exit 0 133 | EOF 134 | 135 | 136 | _pack_as_boot_deb $path_tmp_package_configtxt "configtxt" "config.txt for boot" 137 | } 138 | 139 | pack_boot_bin() { 140 | local path_tmp_package_configtxt="${PATH_TMP}/boot-bin-$(basename ${ENTER_board_name})" 141 | if [ -d $path_tmp_package_configtxt ]; then 142 | rm -r $path_tmp_package_configtxt 143 | fi 144 | create_dir $path_tmp_package_configtxt 145 | local path_board_tmp_boot="/tmp-boot/boot" 146 | local path_tmp_boot=${path_tmp_package_configtxt}${path_board_tmp_boot} 147 | create_dir $path_tmp_boot 148 | 149 | 150 | cp_file_if_exsit ${ENTER_board_name}/boot.cmd $path_tmp_boot 151 | cp_file_if_exsit ${ENTER_board_name}/boot.scr $path_tmp_boot 152 | cp_file_if_exsit ${OUTFILE_boot_bin} $path_tmp_boot 153 | # 装入本项目保存的bin文件 154 | if [ -d $PATH_save_boot_files ]; then 155 | cp -r $PATH_save_boot_files/* $path_tmp_boot 156 | fi 157 | 158 | postinst_file=$path_tmp_package_configtxt/DEBIAN/postinst 159 | mkdir $path_tmp_package_configtxt/DEBIAN 160 | cat << EOF > $postinst_file 161 | #!/bin/sh 162 | case "\$1" in 163 | configure) 164 | old_version="\$2" 165 | new_version="\$3" 166 | echo "Updating from version $old_version to version $new_version" 167 | cp -r $path_board_tmp_boot/* /boot/ 168 | 169 | BLOCK_DEVICE=\$(findmnt "/boot" -o SOURCE -n) 170 | echo "BLOCK_DEVICE=\$BLOCK_DEVICE" 171 | BASE_DEVICE=\$(echo "\$BLOCK_DEVICE" | sed -E 's/p[0-9]+\$//') 172 | if [ -z "\$BASE_DEVICE" ]; then 173 | echo "无法解析出块设备路径" 174 | exit 175 | fi 176 | dd_command="dd if=/boot/boot.bin of=\$BASE_DEVICE bs=1K seek=8 conv=notrunc" 177 | echo "\$dd_command" 178 | eval \$dd_command 179 | ;; 180 | abort-upgrade|abort-remove|abort-deconfigure) 181 | # 回滚操作 182 | ;; 183 | *) 184 | exit 1 185 | ;; 186 | esac 187 | 188 | exit 0 189 | EOF 190 | chmod 755 $postinst_file 191 | 192 | _pack_as_boot_deb $path_tmp_package_configtxt "bootbin" "the boot bin" 193 | } 194 | 195 | build_bootloader() 196 | { 197 | if [ -d $OUTDIR_boot_package ]; then 198 | rm -r $OUTDIR_boot_package 199 | fi 200 | create_dir $OUTDIR_boot_package 201 | if [ -n "$UBOOT_CONFIG" ];then 202 | compile_uboot 203 | fi 204 | if [ -n "$SYTERKIT_BOARD_FILE" ];then 205 | compile_syterkit 206 | fi 207 | pack_config_txt 208 | pack_boot_bin 209 | } 210 | -------------------------------------------------------------------------------- /scripts/build_image.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | IMAGE_FLAG_NO_SCREEN_DISPLAY=$OPT_NO 4 | IMAGE_FLAG_DISK_RAED_ONLY=$OPT_NO 5 | 6 | 7 | PART1_SIZE=150 8 | PART2_SIZE=0 9 | 10 | 11 | exit_if_file_no_exsit() { 12 | if [ ! -f "$1" ]; then 13 | echo $1 "no exist" 14 | exit 1 15 | fi 16 | } 17 | 18 | # 检查所需文件是不是都生成了 19 | check_resource() { 20 | if [ ! -d "$OUTDIR_boot_package" ]; then 21 | echo $OUTDIR_boot_package "no exist" 22 | exit 23 | fi 24 | if [ ! -d "$OUTDIR_kernel_package" ]; then 25 | echo $OUTDIR_kernel_package "no exist" 26 | exit 27 | fi 28 | if [ ! -f "$OUTFILE_rootfs_tar" ]; then 29 | echo $OUTFILE_rootfs_tar "no exist" 30 | exit 31 | fi 32 | } 33 | 34 | 35 | 36 | build_image() { 37 | # 如果$1不为空 38 | NEW_IMG_FILE_NAME=$1 39 | 40 | cleanup() { 41 | local LOOP_DEVICE=$1 42 | echo "Cleaning up..." 43 | cd $PATH_PROJECT_DIR 44 | unmount_point "$TMP_mount_disk2/boot" 45 | unmount_point "$TMP_IMG_DISK2" 46 | unmount_point "$TMP_mount_disk1" 47 | unmount_point "$TMP_mount_disk2" 48 | 49 | if [ ! -z "$LOOP_DEVICE" ]; then 50 | if losetup -l > /dev/null 2>&1; then 51 | while losetup -l | grep -q "$LOOP_DEVICE"; do 52 | echo "Releasing loop device $LOOP_DEVICE" 53 | kpartx -dv "$LOOP_DEVICE" 54 | losetup -d "$LOOP_DEVICE" 55 | sleep 1 56 | done 57 | fi 58 | fi 59 | } 60 | 61 | trap 'cleanup "$LOOP_DEVICE"; exit' SIGINT 62 | check_resource 63 | if [ -d $TMP_IMG_DISK2 ]; then 64 | rm -r $TMP_IMG_DISK2 65 | fi 66 | if [ -d $TMP_mount_disk1 ]; then 67 | rm -r $TMP_mount_disk1 68 | fi 69 | if [ -d $TMP_mount_disk2 ]; then 70 | rm -r $TMP_mount_disk2 71 | fi 72 | mkdir -p $TMP_IMG_DISK2 73 | mkdir -p $TMP_IMG_DISK2/boot 74 | mkdir -p $TMP_mount_disk1 75 | mkdir -p $TMP_mount_disk2 76 | 77 | cd ${PATH_SOURCE}/wpi-update 78 | echo -n "$BOARD_MODEL" > /tmp/walnutpi-board_model 79 | VERSION_APT=$(echo $(./wpi-update -s | tail -n 1 )) 80 | reload_env 81 | if [ -f "$OUT_IMG_FILE" ]; then 82 | rm ${OUT_IMG_FILE} 83 | fi 84 | # 创建img文件 85 | if [ -f "$TMP_IMG_DISK1" ];then 86 | rm ${TMP_IMG_DISK1} 87 | fi 88 | run_status "create part1 file" dd if=/dev/zero of=$TMP_IMG_DISK1 bs=1M count=$PART1_SIZE 89 | 90 | # 格式化文件TMP_IMG_DISK1为fat32,并挂载到路径 ${TMP_IMG_DISK2}/boot 91 | run_status "format part1 file" mkfs.fat -F 32 -n "boot" $TMP_IMG_DISK1 92 | run_status "mount part1 file" mount -o loop $TMP_IMG_DISK1 ${TMP_IMG_DISK2}/boot 93 | 94 | 95 | run_status "add rootfs" tar xf $OUTFILE_rootfs_tar -C $TMP_IMG_DISK2 -I 'xz -T0' 96 | 97 | # 安装boot相关的deb包 98 | cp ${OUTDIR_boot_package}/*.deb ${TMP_IMG_DISK2}/opt/ 99 | cd ${TMP_IMG_DISK2}/opt/ 100 | deb_packages=(*.deb) 101 | total=${#deb_packages[@]} 102 | for (( i=0; i<$total; i++ )); do 103 | deb_package=${deb_packages[$i]} 104 | run_status "boot package [$((i+1))/${total}] : ${deb_package} " chroot ${TMP_IMG_DISK2} /bin/bash -c "dpkg -i /opt/${deb_package}" 105 | rm ${TMP_IMG_DISK2}/opt/${deb_package} 106 | done 107 | 108 | # 安装kernel产生的的deb包,先安装生成时间早的 109 | cd ${OUTDIR_kernel_package}/ 110 | deb_packages=($(ls -t *.deb | tac)) 111 | cp ${OUTDIR_kernel_package}/*.deb ${TMP_IMG_DISK2}/opt/ 112 | cd ${TMP_IMG_DISK2}/opt/ 113 | total=${#deb_packages[@]} 114 | for (( i=0; i<$total; i++ )); do 115 | deb_package=${deb_packages[$i]} 116 | run_status "kernel package [$((i+1))/${total}] : ${deb_package} " chroot ${TMP_IMG_DISK2} /bin/bash -c "dpkg -i /opt/${deb_package}" 117 | rm ${TMP_IMG_DISK2}/opt/${deb_package} 118 | done 119 | 120 | run_status "run set-lcd hdmi install " chroot ${TMP_IMG_DISK2} /bin/bash -c "set-lcd hdmi install" 121 | if [ -f ${FILE_apt_del} ]; then 122 | mapfile -t packages < <(grep -vE '^#|^$' ${FILE_apt_del}) 123 | total=${#packages[@]} 124 | for (( i=0; i<${total}; i++ )); do 125 | package=${packages[$i]} 126 | run_status "apt remove [$((i+1))/${total}] : $package " chroot $TMP_IMG_DISK2 /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::='--force-overwrite' remove -y ${package}" 127 | done 128 | fi 129 | 130 | # 如果是ubuntu24,则禁用gdm3改为lightdm 131 | if [ "$ENTER_os_ver" == "$OPT_os_ubuntu24" ];then 132 | if [[ "${ENTER_rootfs_type}" == "desktop" ]]; then 133 | echo "切换lightdm为默认桌面环境" 134 | run_status "remove gdm3 " chroot ${TMP_IMG_DISK2} /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::='--force-overwrite' remove -y gdm3" 135 | chroot $TMP_IMG_DISK2 /bin/bash -c "dpkg-reconfigure lightdm" 136 | fi 137 | fi 138 | 139 | local ROOTFS_SIZE=$(du -sm $TMP_IMG_DISK2 | cut -f1) 140 | local PART2_SIZE=$(echo "scale=0; ($ROOTFS_SIZE * 1.024 + 10)/1" | bc) 141 | 142 | echo "PART1_SIZE=${PART1_SIZE}MB" 143 | echo "PART2_SIZE=${PART2_SIZE}MB" 144 | 145 | # 创建img文件 146 | IMG_SIZE=$((PART1_SIZE + PART2_SIZE + 2 )) 147 | run_status "create img file: $OUT_IMG_FILE $IMG_SIZE MB" dd if=/dev/zero of=$OUT_IMG_FILE bs=1M count=$IMG_SIZE 148 | 149 | # 创建分区 150 | echo "创建分区" 151 | parted $OUT_IMG_FILE --script mklabel msdos 152 | parted $OUT_IMG_FILE --script mkpart primary fat32 1M $((PART1_SIZE + 1))M 153 | parted $OUT_IMG_FILE --script mkpart primary ext4 $((PART1_SIZE + 1))M 100% 154 | parted $OUT_IMG_FILE set 1 boot on 155 | 156 | LOOP_DEVICE=$(sudo losetup -f) 157 | 158 | losetup $LOOP_DEVICE $OUT_IMG_FILE 159 | kpartx -av $LOOP_DEVICE 160 | 161 | # 挂载镜像文件 162 | MAPPER_DEVICE=$(echo $LOOP_DEVICE | sed 's/\/dev\///' | sed 's/\//p/') 163 | MAPPER_DEVICE1="/dev/mapper/${MAPPER_DEVICE}p1" 164 | MAPPER_DEVICE2="/dev/mapper/${MAPPER_DEVICE}p2" 165 | echo "MAPPER_DEVICE=${MAPPER_DEVICE}" 166 | 167 | # echo "开始格式化" 168 | run_status "format part 1" mkfs.vfat $MAPPER_DEVICE1 169 | run_status "format part 2" mkfs.ext4 $MAPPER_DEVICE2 170 | 171 | 172 | BOOT_UUID=$(blkid -s UUID -o value $MAPPER_DEVICE1) 173 | BOOT_PARTUUID=$(blkid -s PARTUUID -o value $MAPPER_DEVICE1) 174 | ROOTFS_UUID=$(blkid -s UUID -o value $MAPPER_DEVICE2) 175 | ROOTFS_PARTUUID=$(blkid -s PARTUUID -o value $MAPPER_DEVICE2) 176 | 177 | # 挂载两个分区 178 | mount $MAPPER_DEVICE1 $TMP_mount_disk1 179 | mount $MAPPER_DEVICE2 $TMP_mount_disk2 180 | if [ ! -d $TMP_mount_disk2/boot ]; then 181 | mkdir -p $TMP_mount_disk2/boot 182 | fi 183 | mount $MAPPER_DEVICE1 $TMP_mount_disk2/boot 184 | 185 | # 导入文件 186 | run_status "add $BOOTLOADER_NAME" dd if=$OUTFILE_boot_bin of=$OUT_IMG_FILE bs=1K seek=8 conv=notrunc 187 | # 使用tar将 TMP_IMG_DISK2 路径下的文件全部原封不动的导到TMP_mount_disk2下 188 | echo "move the rootfs files into the image" 189 | tar -cf - -C "$TMP_IMG_DISK2" . | tar -xf - -C "$TMP_mount_disk2" 190 | # run_status "add rootfs" tar -cf - -C "$TMP_IMG_DISK2" . | tar -xf - -C "$TMP_mount_disk2" 191 | 192 | # 写入uuid 193 | echo "rootdev=PARTUUID=${ROOTFS_PARTUUID}" | sudo tee -a ${TMP_mount_disk1}/config.txt 194 | if [ $IMAGE_FLAG_NO_SCREEN_DISPLAY == $OPT_NO ];then 195 | echo "PARTUUID=${ROOTFS_PARTUUID} / ext4 defaults,acl,noatime,commit=600,errors=remount-ro 0 1" | sudo tee -a ${TMP_mount_disk2}/etc/fstab 196 | else 197 | echo "PARTUUID=${ROOTFS_PARTUUID} / ext4 ro,defaults,acl,noatime,commit=600,errors=remount-ro 0 1" | sudo tee -a ${TMP_mount_disk2}/etc/fstab 198 | 199 | fi 200 | echo "PARTUUID=${BOOT_PARTUUID} /boot vfat defaults 0 0" | sudo tee -a ${TMP_mount_disk2}/etc/fstab 201 | 202 | if [ $IMAGE_FLAG_NO_SCREEN_DISPLAY != $OPT_NO ];then 203 | 204 | config_file="${TMP_mount_disk1}/config.txt" 205 | run_status "config.txt : console_display=disable" sed -i 's/console_display=enable/console_display=disable/g' "$config_file" 206 | run_status "config.txt : display_bootinfo=disable" sed -i 's/display_bootinfo=enable/display_bootinfo=disable/g' "$config_file" 207 | fi 208 | 209 | SOURCE_kernel="${PATH_SOURCE}/$(basename "$LINUX_GIT" .git)-$LINUX_BRANCH" 210 | kernel_version=$(get_linux_version $SOURCE_kernel) 211 | # run_status_no_retry "generate initramfs" chroot $TMP_mount_disk2 /bin/bash -c "DEBIAN_FRONTEND=noninteractive update-initramfs -uv -k $kernel_version" 212 | echo ""generate initramfs"" 213 | run_as_silent chroot $TMP_mount_disk2 /bin/bash -c "DEBIAN_FRONTEND=noninteractive update-initramfs -uv -k $kernel_version" 214 | 215 | trap - SIGINT EXIT 216 | cleanup "$LOOP_DEVICE" 217 | 218 | current_hour=$(date +"%H") 219 | current_minute=$(date +"%M") 220 | formatted_hour=$(printf "%02d" "$current_hour") 221 | formatted_minute=$(printf "%02d" "$current_minute") 222 | 223 | if [ -z "$NEW_IMG_FILE_NAME" ]; then 224 | NEW_IMG_FILE_NAME="${OUT_IMG_FILE}--${formatted_hour}_${formatted_minute}.img" 225 | else 226 | NEW_IMG_FILE_NAME="${PATH_OUTPUT}/${NEW_IMG_FILE_NAME}--${formatted_hour}_${formatted_minute}.img" 227 | fi 228 | mv $OUT_IMG_FILE $NEW_IMG_FILE_NAME 229 | 230 | echo -e "\noutputfile:\n\n\t\033[32m$(du -h ${NEW_IMG_FILE_NAME})\033[0m\n\n" 231 | 232 | } 233 | 234 | -------------------------------------------------------------------------------- /scripts/build_kernel.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PACKAGE_IMAGE_NAME=linux-image-${BOARD_MODEL}-${LINUX_BRANCH} 4 | DEB_IMAGE_NAME=${PACKAGE_IMAGE_NAME}_1.0.0_all.deb 5 | 6 | 7 | 8 | # 获取linux版本号,如5.15.147 6.1.9 9 | get_linux_version() { 10 | # $1 是传入的 Linux 源码项目的位置 11 | local src_dir=$1 12 | 13 | if [[ ! -d "$src_dir" ]]; then 14 | echo "目录不存在: $src_dir" 15 | return 1 16 | fi 17 | 18 | local makefile="$src_dir/Makefile" 19 | if [[ ! -f "$makefile" ]]; then 20 | echo "在目录中找不到 Makefile: $src_dir" 21 | return 1 22 | fi 23 | 24 | local version=$(grep -E '^VERSION = ' $makefile | cut -d ' ' -f 3) 25 | local patchlevel=$(grep -E '^PATCHLEVEL = ' $makefile | cut -d ' ' -f 3) 26 | local sublevel=$(grep -E '^SUBLEVEL = ' $makefile | cut -d ' ' -f 3) 27 | local extraversion=$(grep -E '^EXTRAVERSION = ' $makefile | cut -d ' ' -f 3) 28 | echo "$version.$patchlevel.$sublevel$extraversion" 29 | } 30 | 31 | 32 | 33 | is_enabled() { 34 | grep -q "^$1=y" include/config/auto.conf 35 | } 36 | 37 | 38 | 39 | 40 | compile_kernel() { 41 | 42 | cd $SOURCE_kernel 43 | if [ ! -f .scmversion ]; then 44 | run_as_user touch .scmversion 45 | fi 46 | 47 | 48 | thread_count=$(grep -c ^processor /proc/cpuinfo) 49 | run_as_user make $LINUX_CONFIG CROSS_COMPILE=$USE_CROSS_COMPILE ARCH=${CHIP_ARCH} 50 | run_as_user make -j$thread_count CROSS_COMPILE=$USE_CROSS_COMPILE ARCH=${CHIP_ARCH} 51 | 52 | exit_if_last_error 53 | 54 | echo "kernel compile success" 55 | } 56 | 57 | 58 | 59 | _gen_tmp_package_dir(){ 60 | local name=$1 61 | local TMP_KERNEL_DEB="${PATH_TMP}/${name}-${LINUX_CONFIG}_${LINUX_BRANCH}" 62 | if [[ -d $TMP_KERNEL_DEB ]]; then 63 | rm -r $TMP_KERNEL_DEB 64 | fi 65 | echo $TMP_KERNEL_DEB 66 | } 67 | 68 | # 填写control文件,生成deb包到输出路径 69 | _pack_as_kernel_deb(){ 70 | local path_package=$1 71 | local part_name=$2 72 | local package_desc=$3 73 | 74 | local package_name="$part_name-${BOARD_NAME}-${LINUX_BRANCH}" 75 | control_file=$path_package/DEBIAN/control 76 | 77 | if [ ! -d $path_package/DEBIAN ];then 78 | mkdir -p $path_package/DEBIAN 79 | fi 80 | 81 | # 从本build项目第一次提交时间起,linux项目共发生了几次提交,将提交数作为deb包的版本号 82 | cd $PATH_PROJECT_DIR 83 | git config --global --add safe.directory $PATH_PROJECT_DIR 84 | build_commit_time=$(git log --reverse --pretty=format:"%ad" --date=format:'%Y-%m-%d' | head -n 1) 85 | cd $SOURCE_kernel 86 | git_log=$(git log --since="$build_commit_time" --oneline) 87 | commit_count=$(echo "$git_log" | wc -l) 88 | deb_version="1.$commit_count.0" 89 | 90 | cd $path_package 91 | size=$(du -sk --exclude=DEBIAN . | cut -f1) 92 | 93 | 94 | cat << EOF > $control_file 95 | Package: ${package_name} 96 | Description: ${package_desc} 97 | Maintainer: walnutpi-build 98 | Version: ${deb_version} 99 | Section: free 100 | Priority: optional 101 | Installed-Size: ${size} 102 | Architecture: ${CHIP_ARCH} 103 | EOF 104 | DEB_IMAGE_NAME="${package_name}_${deb_version}_${CHIP_ARCH}.deb" 105 | run_status "创建deb包 ${DEB_IMAGE_NAME} " dpkg -b "$path_package" "${OUTDIR_kernel_package}/${DEB_IMAGE_NAME}" 106 | 107 | } 108 | 109 | pack_kernel_Image() { 110 | part_name="kernel-image" 111 | local TMP_KERNEL_DEB=$(_gen_tmp_package_dir $part_name) 112 | 113 | local path_board_tmp_boot="/tmp-boot/Image" 114 | local path_tmp_boot=${TMP_KERNEL_DEB}${path_board_tmp_boot} 115 | create_dir $path_tmp_boot 116 | 117 | cp ${SOURCE_kernel}/.config $path_tmp_boot/config-$(get_linux_version ./) 118 | cd $SOURCE_kernel 119 | run_status "export Image" cp ${SOURCE_kernel}/arch/${CHIP_ARCH}/boot/Image $path_tmp_boot 120 | 121 | _gen_postinst_cp_file $TMP_KERNEL_DEB $path_board_tmp_boot /boot/ 122 | _pack_as_kernel_deb $TMP_KERNEL_DEB $part_name "linux kernel image file" 123 | 124 | } 125 | pack_kernel_dtb() { 126 | part_name="kernel-dtb" 127 | local TMP_KERNEL_DEB=$(_gen_tmp_package_dir $part_name) 128 | 129 | local path_board_tmp_boot="/tmp-boot/dtb" 130 | local path_tmp_boot=${TMP_KERNEL_DEB}${path_board_tmp_boot} 131 | create_dir $path_tmp_boot 132 | 133 | cd $SOURCE_kernel 134 | run_status "export device-tree" make dtbs_install INSTALL_DTBS_PATH="$path_tmp_boot" ARCH=${CHIP_ARCH} 135 | 136 | # 设备树导出后,会产生一个类似allwinner/.dtb的路径,把里面的dtb提取到外面 137 | folder_name=$(ls -d $path_tmp_boot/*/ | head -n 1) 138 | cp -r $folder_name* $path_tmp_boot 139 | rm -r $folder_name 140 | 141 | _gen_postinst_cp_file $TMP_KERNEL_DEB $path_board_tmp_boot /boot/ 142 | echo "set-device" >> $TMP_KERNEL_DEB/DEBIAN/postinst 143 | echo "echo \"ok\"" >> $TMP_KERNEL_DEB/DEBIAN/postinst 144 | _pack_as_kernel_deb $TMP_KERNEL_DEB $part_name "linux kernel dtb files" 145 | } 146 | 147 | 148 | pack_kernel_modules() { 149 | part_name="kernel-modules" 150 | local TMP_KERNEL_DEB=$(_gen_tmp_package_dir $part_name) 151 | 152 | cd $SOURCE_kernel 153 | run_status "export modules" make modules_install INSTALL_MOD_PATH="$TMP_KERNEL_DEB" ARCH=${CHIP_ARCH} 154 | 155 | for dir in $TMP_KERNEL_DEB/lib/modules/*/ 156 | do 157 | # 这个build文件夹指向源码绝对位置,要删掉 158 | if [ -d "${dir}build" ]; then 159 | rm -rf "${dir}build" 160 | fi 161 | # 这个source文件夹指向源码绝对位置,要删掉 162 | if [ -d "${dir}source" ]; then 163 | rm -rf "${dir}source" 164 | fi 165 | done 166 | local postinst_file="$TMP_KERNEL_DEB/DEBIAN/postinst" 167 | if [ ! -d $TMP_KERNEL_DEB/DEBIAN ];then 168 | mkdir $TMP_KERNEL_DEB/DEBIAN 169 | fi 170 | cat << EOF > $postinst_file 171 | #!/bin/sh 172 | case "\$1" in 173 | configure) 174 | echo "update modules" 175 | depmod 176 | ;; 177 | abort-upgrade|abort-remove|abort-deconfigure) 178 | # 回滚操作 179 | ;; 180 | 181 | esac 182 | exit 0 183 | EOF 184 | chmod 755 $postinst_file 185 | 186 | _pack_as_kernel_deb $TMP_KERNEL_DEB $part_name "linux kernel modules" 187 | 188 | } 189 | 190 | # 进入linux项目源码路径下调用 191 | # 调用前运行先clean 192 | # 将linux-headers相关文件生成到参数1指定路径 193 | generate_kernel_headers() { 194 | local tmpdir=$1 195 | local arch=$2 196 | local version=$(get_linux_version ./) 197 | 198 | local destdir=$tmpdir/usr/src/linux-headers-$version 199 | create_dir $destdir 200 | if [ -d debian ];then 201 | rm -rf debian 202 | fi 203 | create_dir debian 204 | 205 | configobj=CONFIG_OBJTOOL 206 | 207 | # Collect source files 208 | ( 209 | find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl -o -name \*.mk 210 | find arch/*/include include scripts -type f -o -type l 211 | find security/*/include -type f 212 | find arch/$arch -name module.lds -o -name Kbuild.platforms -o -name Platform 213 | find $(find arch/$arch -name include -o -name scripts -o -name tools -type d) -type f 214 | ) > debian/hdrsrcfiles 215 | 216 | { 217 | # This affects arch/x86 218 | if is_enabled $configobj; then 219 | # echo tools/objtool/objtool 220 | find tools/objtool -type f -executable 221 | fi 222 | 223 | find arch/$arch/include Module.symvers include scripts -type f 224 | 225 | if is_enabled CONFIG_GCC_PLUGINS; then 226 | find scripts/gcc-plugins -name \*.so -o -name gcc-common.h 227 | fi 228 | find tools/ -name "*e_byteshift.h" 229 | } > debian/hdrobjfiles 230 | 231 | 232 | # 检测以scrpt开头的文件,删除那些被写进.gitignore的 233 | process_file() { 234 | local input_file="$1" 235 | local temp_file=$(mktemp) 236 | 237 | while IFS= read -r line; do 238 | if [[ $line == scripts* ]]; then 239 | if ! git check-ignore -q "$line"; then 240 | echo "$line" >> "$temp_file" 241 | fi 242 | else 243 | echo "$line" >> "$temp_file" 244 | fi 245 | done < "$input_file" 246 | 247 | cat "$temp_file" > "$input_file" 248 | } 249 | 250 | process_file debian/hdrsrcfiles 251 | process_file debian/hdrobjfiles 252 | echo "scripts/module.lds" >> debian/hdrsrcfiles 253 | 254 | tar -c -f - -C ./ -T debian/hdrsrcfiles | tar -xf - -C $destdir 255 | tar -c -f - -T debian/hdrobjfiles | tar -xf - -C $destdir 256 | 257 | # copy .config manually to be where it's expected to be 258 | create_dir $tmpdir/DEBIAN 259 | [[ ! -f $tmpdir/DEBIAN/postinst ]] && touch $tmpdir/DEBIAN/postinst 260 | relseas_file="/etc/WalnutPi-release" 261 | 262 | cat << EOF > $tmpdir/DEBIAN/postinst 263 | #!/bin/bash 264 | cd /usr/src/linux-headers-$version 265 | 266 | echo "Compiling headers - please wait ..." 267 | yes "" | make ARCH=$arch clean 268 | NCPU=\$(grep -c 'processor' /proc/cpuinfo) 269 | find -type f -exec touch {} + 270 | yes "" | make ARCH=$arch oldconfig 271 | make -j\$NCPU ARCH=$arch -s scripts 272 | make -j\$NCPU ARCH=$arch -s M=scripts/mod/ 273 | echo "Compiling end" 274 | 275 | function replace_or_append() { 276 | local file_path="$relseas_file" 277 | local search_string="\$1" 278 | local replace_string="\$2" 279 | 280 | if grep -q "^\$search_string" "\$file_path"; then 281 | sed -i "/^\$search_string/c\\\\\$replace_string" "\$file_path" 282 | else 283 | echo "\$replace_string" >> "\$file_path" 284 | fi 285 | } 286 | replace_or_append "kernel_git" "kernel_git=$LINUX_GIT" 287 | replace_or_append "kernel_branch" "kernel_branch=$LINUX_BRANCH" 288 | replace_or_append "kernel_config" "kernel_config=$LINUX_CONFIG" 289 | replace_or_append "toolchain" "toolchain=$TOOLCHAIN_FILE_NAME$TOOLCHAIN_NAME_IN_APT" 290 | 291 | update-initramfs -uv -k $version 292 | 293 | EOF 294 | chmod +x $tmpdir/DEBIAN/postinst 295 | 296 | cat << EOF > $tmpdir/DEBIAN/postrm 297 | #!/bin/bash 298 | if [ "$1" = "remove" ] ; then 299 | if [ -d /usr/src/linux-headers-$version ]; then 300 | rm -r /usr/src/linux-headers-$version 301 | fi 302 | fi 303 | EOF 304 | chmod +x $tmpdir/DEBIAN/postrm 305 | 306 | # cat << EOF > $tmpdir/DEBIAN/preinst 307 | # #!/bin/bash 308 | # if [ -d /usr/src/linux-headers-$version ]; then 309 | # echo "remove old linux-headers" 310 | # rm -r /usr/src/linux-headers-$version 311 | # fi 312 | # exit 0 313 | # EOF 314 | # chmod +x $tmpdir/DEBIAN/preinst 315 | 316 | cp .config $destdir/.config 317 | create_dir $tmpdir/lib/modules/$version 318 | ln -s /usr/src/linux-headers-$version $tmpdir/lib/modules/$version/build 319 | 320 | 321 | } 322 | pack_kernel_headers() { 323 | part_name="kernel-headers" 324 | 325 | local TMP_KERNEL_DEB=$(_gen_tmp_package_dir $part_name) 326 | 327 | SOURCE_kernel_CLEAN="${SOURCE_kernel}-clean" 328 | if [ -d $SOURCE_kernel_CLEAN ]; then 329 | rm -r $SOURCE_kernel_CLEAN 330 | fi 331 | run_status "copy kernel" run_as_user cp -r $SOURCE_kernel $SOURCE_kernel_CLEAN 332 | 333 | cd $SOURCE_kernel_CLEAN 334 | run_status "make the kernel clean" run_as_user make clean CROSS_COMPILE=$USE_CROSS_COMPILE ARCH=${CHIP_ARCH} 335 | 336 | cd $SOURCE_kernel_CLEAN 337 | local version=$(get_linux_version ./) 338 | local destdir=$TMP_KERNEL_DEB/usr/src/linux-headers-$version 339 | create_dir $destdir 340 | create_dir debian 341 | 342 | cd $SOURCE_kernel_CLEAN 343 | make clean CROSS_COMPILE=$USE_CROSS_COMPILE ARCH=${CHIP_ARCH} 344 | generate_kernel_headers $TMP_KERNEL_DEB $CHIP_ARCH 345 | 346 | _pack_as_kernel_deb $TMP_KERNEL_DEB $part_name "linux kernel header files" 347 | 348 | } 349 | 350 | build_kernel() { 351 | cd $PATH_SOURCE 352 | clone_branch $LINUX_GIT $LINUX_BRANCH $SOURCE_kernel 353 | git config --global --add safe.directory $SOURCE_kernel 354 | 355 | compile_kernel 356 | if [ -d $OUTDIR_kernel_package ]; then 357 | rm -r $OUTDIR_kernel_package 358 | fi 359 | create_dir $OUTDIR_kernel_package 360 | 361 | pack_kernel_Image 362 | pack_kernel_dtb 363 | pack_kernel_modules 364 | pack_kernel_headers 365 | 366 | } -------------------------------------------------------------------------------- /scripts/build_rootfs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | APT_SOURCES_WALNUTPI="deb [trusted=yes] http://apt.walnutpi.com/debian/ bookworm main" 5 | APT_DOMAIN="apt.walnutpi.com" 6 | DEBIAN_BASE_URL="http://mirrors.tuna.tsinghua.edu.cn/debian/" 7 | UBUNTU22_BASE_URL="https://mirror.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/22.04/release/ubuntu-base-22.04.4-base-arm64.tar.gz" 8 | UBUNTU24_BASE_URL="https://mirror.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/24.04/release/ubuntu-base-24.04.2-base-arm64.tar.gz" 9 | 10 | download_ubuntu_base() { 11 | local base_url=$1 12 | local tmp_file_name=$2 13 | local tmp_dir=$3 14 | wget $base_url -O $tmp_file_name 15 | run_status "unzip rootfs" tar -xvf $tmp_file_name -C $TMP_rootfs_build 16 | 17 | # base默认没写dns服务器 18 | local FILE="${TMP_rootfs_build}/etc/resolv.conf" 19 | local LINE="nameserver 8.8.8.8" 20 | grep -qF -- "$LINE" "$FILE" || echo "$LINE" >> "$FILE" 21 | } 22 | 23 | download_debian_base() { 24 | local base_url=$1 25 | local debian_name=$2 26 | local tmp_dir=$3 27 | 28 | debootstrap --foreign --verbose --arch=${CHIP_ARCH} bookworm ${tmp_dir} $base_url 29 | exit_if_last_error 30 | 31 | # 完成rootfs的初始化 32 | cd ${tmp_dir} 33 | mount_chroot $tmp_dir 34 | LC_ALL=C LANGUAGE=C LANG=C chroot ${tmp_dir} /debootstrap/debootstrap --second-stage –verbose 35 | exit_if_last_error 36 | run_slient_when_successfuly chroot $tmp_dir /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get clean" 37 | umount_chroot $tmp_dir 38 | } 39 | 40 | generate_tmp_rootfs() { 41 | cleanup() { 42 | echo "Cleaning up..." 43 | if [[ -d $TMP_rootfs_build ]]; then 44 | run_status "umount $TMP_rootfs_build" umount_chroot $TMP_rootfs_build 45 | fi 46 | exit 1 47 | } 48 | trap cleanup SIGINT 49 | # set -e 50 | if [[ -d $TMP_rootfs_build ]]; then 51 | run_as_silent umount_chroot $TMP_rootfs_build 52 | rm -r ${TMP_rootfs_build} 53 | fi 54 | mkdir ${TMP_rootfs_build} 55 | 56 | echo -e "\n\n------\t build rootfs \t------" 57 | 58 | # 为节省编译时间,第一次编译时会构建一个基本rootfs,并安装base的软件,后续不再从头构建,直接从压缩包中解压出rootfs 59 | if [[ -f $FILE_base_rootfs ]]; then 60 | run_status "unzip last rootfs" tar -xvf $FILE_base_rootfs -C $TMP_rootfs_build 61 | else 62 | 63 | run_as_silent mkdir ${TMP_rootfs_build} -p 64 | case "${ENTER_os_ver}" in 65 | "${OPT_os_debian12}" | "$OPT_os_debian12_burn") 66 | download_debian_base $DEBIAN_BASE_URL "bookworm" $TMP_rootfs_build 67 | ;; 68 | 69 | "${OPT_os_ubuntu22}" ) 70 | download_ubuntu_base $UBUNTU22_BASE_URL $FILE_base_rootfs $TMP_rootfs_build 71 | ;; 72 | 73 | "${OPT_os_ubuntu24}" ) 74 | download_ubuntu_base $UBUNTU24_BASE_URL $FILE_base_rootfs $TMP_rootfs_build 75 | ;; 76 | 77 | esac 78 | cp /usr/bin/qemu-aarch64-static ${TMP_rootfs_build}/usr/bin/ 79 | chmod +x ${TMP_rootfs_build}/usr/bin/qemu-aarch64-static 80 | 81 | cd $TMP_rootfs_build 82 | tar -czf $FILE_base_rootfs ./ 83 | 84 | 85 | fi 86 | 87 | # 用这个文件作为安装过的软件的列表,在重复构建时节省时间 88 | if [[ ! -f $PLACE_sf_list ]]; then 89 | touch $PLACE_sf_list 90 | fi 91 | 92 | 93 | # apt安装通用软件 94 | # cd $TMP_rootfs_build 95 | mount_chroot $TMP_rootfs_build 96 | 97 | run_status "apt update" chroot ${TMP_rootfs_build} /bin/bash -c "apt-get update" 98 | 99 | # 获取要本脚本的软件安装列表 100 | mapfile -t packages_build < <(grep -vE '^#|^$' ${FILE_apt_base}) 101 | if [[ ${ENTER_rootfs_type} == "desktop" ]]; then 102 | mapfile -t desktop_packages < <(grep -vE '^#|^$' ${FILE_apt_desktop}) 103 | packages_build=("${packages_build[@]}" "${desktop_packages[@]}") 104 | fi 105 | 106 | # 获取rootfs内的软件安装列表 107 | mapfile -t packages_rootfs < <(grep -vE '^#|^$' ${PLACE_sf_list}) 108 | # echo ${packages_build[@]} 109 | packages_install=() 110 | packages_remove=() 111 | # 找出需要安装的包 112 | for pkg in "${packages_build[@]}"; do 113 | if ! [[ " ${packages_rootfs[@]} " =~ " ${pkg} " ]]; then 114 | packages_install+=("$pkg") 115 | fi 116 | done 117 | # 找出需要移除的包 118 | for pkg in "${packages_rootfs[@]}"; do 119 | if ! [[ " ${packages_build[@]} " =~ " ${pkg} " ]]; then 120 | packages_remove+=("$pkg") 121 | fi 122 | done 123 | 124 | # 安装packages_install中的包,卸载packages_remove中的包 125 | total=${#packages_install[@]} 126 | for (( i=0; i<${total}; i++ )); do 127 | package=${packages_install[$i]} 128 | run_status "apt install [$((i+1))/${total}] : $package " chroot $TMP_rootfs_build /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get install -y ${package}" 129 | done 130 | total=${#packages_remove[@]} 131 | for (( i=0; i<${total}; i++ )); do 132 | package=${packages_remove[$i]} 133 | run_status "apt remove [$((i+1))/${total}] : $package " chroot $TMP_rootfs_build /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get remove -y ${package}" 134 | done 135 | run_slient_when_successfuly chroot $TMP_rootfs_build /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get clean" 136 | 137 | # 将安装过的软件名称,都写进文件内 138 | if [[ -f $PLACE_sf_list ]]; then 139 | rm $PLACE_sf_list 140 | fi 141 | touch $PLACE_sf_list 142 | for package in "${packages_build[@]}"; do 143 | echo "$package" >> $PLACE_sf_list 144 | done 145 | 146 | umount_chroot $TMP_rootfs_build 147 | # 如果本次对保存的rootfs的apt软件有增删,则重设压缩包 148 | if [ ${#packages_install[@]} -gt 0 ] || [ ${#packages_remove[@]} -gt 0 ]; then 149 | rm -r $FILE_base_rootfs 150 | cd ${TMP_rootfs_build} 151 | run_status "create the tar to save now rootfs" tar -czf $FILE_base_rootfs ./ 152 | fi 153 | 154 | cd ${PATH_SOURCE} 155 | run_status "download wpi-update" clone_url "https://github.com/walnutpi/wpi-update.git" 156 | cd ${PATH_SOURCE}/wpi-update 157 | # run_status "get wpi-update version" 158 | touch /tmp/walnutpi-board_model 159 | touch ${TMP_rootfs_build}/tmp/walnutpi-board_model 160 | echo -n "$BOARD_MODEL" > /tmp/walnutpi-board_model 161 | echo -n "$BOARD_MODEL" > ${TMP_rootfs_build}/tmp/walnutpi-board_model 162 | VERSION_APT=$(echo $(./wpi-update -s | tail -n 1 )) 163 | 164 | # 创建release文件 165 | relseas_file="${TMP_rootfs_build}/etc/WalnutPi-release" 166 | touch $relseas_file 167 | echo "version=${VERSION_APT}" >> $relseas_file 168 | echo "date=$(date "+%Y-%m-%d %H:%M")" >> $relseas_file 169 | echo "os_type=${ENTER_rootfs_type}" >> $relseas_file 170 | echo "" >> $relseas_file 171 | 172 | # echo "kernel_git=$LINUX_GIT" >> $relseas_file 173 | # echo "kernel_version=$LINUX_BRANCH" >> $relseas_file 174 | # echo "kernel_config=$LINUX_CONFIG" >> $relseas_file 175 | # echo "toolchain=$TOOLCHAIN_FILE_NAME" >> $relseas_file 176 | 177 | cat $relseas_file 178 | 179 | 180 | # pip 安装指定软件 181 | LIB_DIR="${TMP_rootfs_build}/usr/lib" 182 | FILE_NAME="EXTERNALLY-MANAGED" 183 | find $LIB_DIR -type f -name "$FILE_NAME" -delete 184 | 185 | if [ -f $FILE_pip_list ]; then 186 | mapfile -t packages < <(grep -vE '^#|^$' ${FILE_pip_list}) 187 | total=${#packages[@]} 188 | for (( i=0; i<${total}; i++ )); do 189 | package=${packages[$i]} 190 | # echo "pip3 [$((i+1))/${total}] : $package" 191 | run_status "pip3 [$((i+1))/${total}] : $package" chroot $TMP_rootfs_build /bin/bash -c "DEBIAN_FRONTEND=noninteractive pip3 --no-cache-dir install ${package}" 192 | done 193 | fi 194 | 195 | 196 | 197 | # firmware 198 | cd ${PATH_SOURCE} 199 | firm_dir=$(basename "${FIRMWARE_GIT}" .git) 200 | 201 | if [ -n "${FIRMWARE_GIT}" ]; then 202 | if [[ ! -d "firmware" ]]; then 203 | run_status "download firmware" git clone "${FIRMWARE_GIT}" 204 | fi 205 | FIRMWARE_PATH="${TMP_rootfs_build}/lib/firmware" 206 | if [ ! -d $FIRMWARE_PATH ]; then 207 | mkdir -p $FIRMWARE_PATH 208 | fi 209 | cp -r ${firm_dir}/* $FIRMWARE_PATH 210 | fi 211 | 212 | # 若主机通过hosts文件修改了apt域名指向,则在rootfs内也做相同的修改 213 | if grep -q "$APT_DOMAIN" /etc/hosts; then 214 | LINE=$(grep "$APT_DOMAIN" /etc/hosts) 215 | echo "$LINE" >> "$TMP_rootfs_build/etc/hosts" 216 | fi 217 | # run_status "change hosts" chroot $TMP_rootfs_build /bin/bash -c "service network-manager restart" 218 | 219 | # wpi-update 220 | cp wpi-update/wpi-update ${TMP_rootfs_build}/usr/bin 221 | run_status "run wpi-update" chroot ${TMP_rootfs_build} /bin/bash -c "wpi-update" 222 | 223 | 224 | MODULES_LIST=$(echo ${MODULES_ENABLE} | tr ' ' '\n') 225 | echo "$MODULES_LIST" > ${TMP_rootfs_build}/etc/modules 226 | 227 | 228 | # apt安装各板指定软件 229 | mount_chroot $TMP_rootfs_build 230 | # 插入walnutpi的apt源 231 | echo $APT_SOURCES_WALNUTPI >> ${TMP_rootfs_build}/etc/apt/sources.list.d/walnutpi.list 232 | run_status "apt update" chroot ${TMP_rootfs_build} /bin/bash -c "apt-get update" 233 | 234 | mapfile -t packages < <(grep -vE '^#|^$' ${FILE_apt_base_board}) 235 | if [[ ${ENTER_rootfs_type} == "desktop" ]]; then 236 | mapfile -t desktop_packages < <(grep -vE '^#|^$' ${FILE_apt_desktop_board}) 237 | packages=("${packages[@]}" "${desktop_packages[@]}") 238 | fi 239 | total=${#packages[@]} 240 | for (( i=0; i<${total}; i++ )); do 241 | package=${packages[$i]} 242 | run_status "apt [$((i+1))/${total}] : $package " chroot $TMP_rootfs_build /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::='--force-overwrite' install -y ${package}" 243 | done 244 | 245 | # 删除插入hosts文件的内容 246 | if grep -q "$APT_DOMAIN" "$TMP_rootfs_build/etc/hosts"; then 247 | sed -i "/$APT_DOMAIN/d" "$TMP_rootfs_build/etc/hosts" 248 | fi 249 | 250 | # 去除残余 251 | run_slient_when_successfuly chroot $TMP_rootfs_build /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get clean" 252 | # sed -i '$ d' ${TMP_rootfs_build}/etc/apt/sources.list 253 | rm ${TMP_rootfs_build}/etc/apt/sources.list.d/walnutpi.list 254 | 255 | 256 | cd $TMP_rootfs_build 257 | umount_chroot $TMP_rootfs_build 258 | trap - SIGINT EXIT 259 | } 260 | add_file_to_tmp_rootfs() { 261 | local source_file=$1 262 | local dest_path=$2 263 | if [[ -f "$source_file" ]]; then 264 | if [[ -d "$dest_path" ]]; then 265 | rm -r "$dest_path" 266 | fi 267 | mkdir -p "$dest_path" 268 | run_status "copy $(basename $source_file) to $dest_path" cp "$source_file" "$dest_path" 269 | fi 270 | } 271 | 272 | add_emmc_burn_file(){ 273 | local source_file=$1 274 | add_file_to_tmp_rootfs ${source_file} "${TMP_rootfs_build}/opt/burn" 275 | } 276 | 277 | pack_rootfs() { 278 | cd ${TMP_rootfs_build} 279 | if [ -f "$OUTFILE_rootfs_tar" ]; then 280 | rm $OUTFILE_rootfs_tar 281 | fi 282 | run_status "create tar" tar -c -I 'xz -T0' -f $OUTFILE_rootfs_tar ./ 283 | } -------------------------------------------------------------------------------- /scripts/common.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 获取sudo运行脚本前是什么用户,然后以那个用户的权限执行指令 4 | run_as_user() { 5 | local original_user=$(who am i | awk '{print $1}') 6 | if [ -z $original_user ]; then 7 | bash -c "$*" 8 | else 9 | sudo -u $original_user bash -c "$*" 10 | fi 11 | } 12 | exit_if_last_error() { 13 | if [[ $? -ne 0 ]]; then 14 | echo "上一条命令执行失败,脚本将退出。" 15 | exit 1 16 | fi 17 | } 18 | 19 | run_as_silent() { 20 | $@ > /dev/null 2>&1 21 | } 22 | 23 | 24 | run_slient_when_successfuly() { 25 | local output 26 | output=$("$@" 2>&1) 27 | local exit_status=$? 28 | if [ $exit_status -ne 0 ]; then 29 | echo "$output" 30 | fi 31 | } 32 | 33 | create_dir() { 34 | local directory_path=$1 35 | if [ ! -d "$directory_path" ]; then 36 | run_as_user mkdir -p "$directory_path" 37 | fi 38 | } 39 | 40 | # 需要定义一个LOG_FILE变量指向log文件 41 | log_record() { 42 | # echo "$(date +%Y-%m-%d_%H:%M:%S) $*" >> $LOG_FILE 43 | echo -e "[$(date +%M:%S)]$@" >> $LOG_FILE 44 | } 45 | 46 | run_status() { 47 | local message=$1 48 | shift 49 | local max_retries=5 50 | local retry_delay=5 51 | local retries=0 52 | local start_time=$(date +%s) 53 | 54 | while [ $retries -lt $max_retries ]; do 55 | echo -e -n "...\t$message" 56 | local output 57 | output=$("$@" 2>&1) 58 | local exit_status=$? 59 | log_record $output 60 | if [ $exit_status -ne 0 ]; then 61 | echo -e "\r\033[31m[error]\033[0m" 62 | echo -e "$output" 63 | echo -e "Retrying in $retry_delay seconds..." 64 | sleep $retry_delay 65 | retry_delay=$((retry_delay + 5)) 66 | ((retries++)) 67 | log_record "[error]\t${message}" 68 | else 69 | local end_time=$(date +%s) 70 | local duration=$((end_time - start_time)) 71 | echo -e "\r\033[32m[ok]\033[0m\t${message}\t${duration}s" 72 | log_record "[ok]\t${message}\t${duration}s" 73 | break 74 | fi 75 | done 76 | 77 | if [ $retries -eq $max_retries ]; then 78 | echo -e "\r\033[31m[error]\033[0m\t$message - Maximum retries reached." 79 | exit $exit_status 80 | fi 81 | } 82 | 83 | run_status_no_retry() { 84 | local message=$1 85 | shift 86 | local start_time=$(date +%s) 87 | 88 | echo -e -n "...\t$message" 89 | local output 90 | output=$("$@" 2>&1) 91 | local exit_status=$? 92 | if [ $exit_status -ne 0 ]; then 93 | echo -e "\r\033[31m[error]\033[0m" 94 | echo -e "$output" 95 | else 96 | local end_time=$(date +%s) 97 | local duration=$((end_time - start_time)) 98 | echo -e "\r\033[32m[ok]\033[0m\t${message}\t${duration}s" 99 | fi 100 | 101 | } 102 | 103 | mount_chroot() 104 | { 105 | local target=$1 106 | mount -t proc chproc "${target}"/proc 107 | mount -t sysfs chsys "${target}"/sys 108 | mount -t devtmpfs chdev "${target}"/dev || mount --bind /dev "${target}"/dev 109 | mount -t devpts chpts "${target}"/dev/pts 110 | } 111 | 112 | umount_chroot() 113 | { 114 | local target=$1 115 | while grep -Eq "${target}.*(dev|proc|sys)" /proc/mounts 116 | do 117 | umount -l --recursive "${target}"/dev >/dev/null 2>&1 118 | umount -l "${target}"/proc >/dev/null 2>&1 119 | umount -l "${target}"/sys >/dev/null 2>&1 120 | sleep 5 121 | done 122 | } 123 | 124 | # 卸载指定挂载点 125 | unmount_point() { 126 | local mount_point=$1 127 | if mountpoint -q "$mount_point"; then 128 | echo "Unmounting $mount_point" 129 | while mountpoint -q "$mount_point"; do 130 | umount "$mount_point" 131 | sleep 1 132 | done 133 | fi 134 | } 135 | 136 | 137 | clone_url() { 138 | local git_url="$1" 139 | local dir_name=$(basename "$git_url" .git) 140 | 141 | if [ -d "$dir_name" ]; then 142 | cd "$dir_name" 143 | run_as_user git config --global --add safe.directory $(pwd) 144 | echo "pull : $git_url" 145 | run_as_user git pull 146 | else 147 | echo "clone : $git_url" 148 | run_as_user git clone $git_url 149 | fi 150 | } 151 | clone_branch() { 152 | local git_url="$1" 153 | local branch="$2" 154 | 155 | local dir_name=$(basename "$git_url" .git) 156 | [[ -n $3 ]] && dir_name=$3 157 | 158 | if [ -d "$dir_name" ]; then 159 | cd "$dir_name" 160 | run_as_user git config --global --add safe.directory $(pwd) 161 | echo "pull : $git_url" 162 | run_as_user git pull 163 | else 164 | echo "clone : $git_url" 165 | run_as_user git clone -b $branch --depth 1 $git_url $dir_name 166 | fi 167 | } 168 | 169 | cp_file_if_exsit() { 170 | local file_path_source=$1 171 | local file_path_desc=$2 172 | if [ -f $file_path_source ];then 173 | cp $file_path_source $file_path_desc 174 | fi 175 | } 176 | replace_in_file() { 177 | local file_path=$1 178 | local search_string=$2 179 | local replace_string=$3 180 | 181 | if [ ! -f "$file_path" ]; then 182 | echo "文件 $file_path 不存在。" 183 | return 1 184 | fi 185 | 186 | # 使用sed进行替换 187 | sed -i "s/$search_string/$replace_string/g" "$file_path" 188 | exit_if_last_error "替换字符串失败: $search_string -> $replace_string 在文件 $file_path" 189 | } 190 | 191 | 192 | # 生成deb包需要的postinst文件,功能是在安装时复制指定的文件到指定路径 193 | _gen_postinst_cp_file(){ 194 | local path_package=$1 195 | local source_path=$2 196 | local target_path=$3 197 | postinst_file=$path_package/DEBIAN/postinst 198 | if [ ! -d $path_package/DEBIAN ];then 199 | mkdir $path_package/DEBIAN 200 | fi 201 | cat << EOF > $postinst_file 202 | #!/bin/sh 203 | set -e 204 | case "\$1" in 205 | configure) 206 | old_version="\$2" 207 | new_version="\$3" 208 | echo "Updating from version $old_version to version $new_version" 209 | 210 | cp -r $source_path/* $target_path 211 | 212 | ;; 213 | abort-upgrade|abort-remove|abort-deconfigure) 214 | # 回滚操作 215 | ;; 216 | *) 217 | exit 1 218 | ;; 219 | esac 220 | 221 | EOF 222 | chmod 755 $postinst_file 223 | } -------------------------------------------------------------------------------- /scripts/menu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | menustr="walnutpi-build" 4 | backtitle="Walnut Pi building script" 5 | 6 | 7 | # 继续你的脚本逻辑 8 | show_menu() { 9 | local title="$1" 10 | shift 11 | local options=("$@") 12 | TTY_X=$(($(stty size | awk '{print $2}')-6)) # determine terminal width 13 | TTY_Y=$(($(stty size | awk '{print $1}')-6)) # determine terminal height 14 | TTY_Y_WINDOW=$((TTY_Y - 8)) 15 | if [ "$TTY_X" -le 0 ] || [ "$TTY_Y" -le 0 ] || [ "$TTY_Y_WINDOW" -le 0 ]; then 16 | echo -e "Error: Your terminal is too small \n" 17 | exit 1 18 | fi 19 | whiptail --title "${title}" --backtitle "${backtitle}" --notags \ 20 | --menu "${menustr}" "${TTY_Y}" "${TTY_X}" ${TTY_Y_WINDOW} \ 21 | --cancel-button Exit --ok-button Select "${options[@]}" \ 22 | 3>&1 1>&2 2>&3 23 | 24 | } 25 | 26 | MENU_choose_board() { 27 | # 获取路径下所有文件夹名作为选项 28 | local path_board_list=$1 29 | dirs=$(find ${path_board_list} -mindepth 1 -maxdepth 1 -type d) 30 | local options=() 31 | for dir in $dirs; do 32 | dirname=$(basename "$dir") 33 | options+=("$dir" "$dirname") 34 | done 35 | local titlestr="Choose Board" 36 | show_menu "${titlestr}" "${options[@]}" 37 | } 38 | 39 | MENU_choose_parts(){ 40 | local titlestr="Choose an option" 41 | local options=( 42 | $OPT_part_image "Full OS image" 43 | $OPT_part_bootloader "generate boot.bin" 44 | $OPT_part_kernel "generate Kernel .deb" 45 | $OPT_part_rootfs "generate Rootfs files" 46 | $OPT_part_pack_rootfs "pack the tmp Rootfs files as tar" 47 | $OPT_part_pack_image "pack the output files as an image" 48 | $OPT_part_emmc_burn_rootfs "generate eMMC-burner Rootfs files" 49 | $OPT_part_pack_emmc_burn "pack the eMMC-burner image" 50 | 51 | ) 52 | show_menu "${titlestr}" "${options[@]}" 53 | } 54 | 55 | MENU_sikp_boot(){ 56 | local titlestr="recompile the bootloader ?" 57 | local options=( 58 | "$OPT_NO" "no" 59 | "$OPT_YES" "yes" 60 | ) 61 | show_menu "${titlestr}" "${options[@]}" 62 | } 63 | 64 | MENU_sikp_kernel(){ 65 | local titlestr="recompile the KERNEL ?" 66 | local options=( 67 | "$OPT_NO" "no" 68 | "$OPT_YES" "yes" 69 | ) 70 | show_menu "${titlestr}" "${options[@]}" 71 | } 72 | 73 | 74 | MENU_choose_os() { 75 | # 只测试了bookworm的软件兼容性问题,有些库不确定能不能在旧版debian上运行 76 | titlestr="Choose an os version" 77 | local options=( 78 | ${OPT_os_debian12} "debian 12(bookworm)" 79 | ${OPT_os_ubuntu22} "ubuntu 22.04(Jammy Jellyfish)" 80 | ${OPT_os_ubuntu24} "ubuntu 24.04(Noble Numbat)" 81 | ) 82 | show_menu "${titlestr}" "${options[@]}" 83 | } 84 | 85 | MENU_choose_rootfs_type() { 86 | titlestr="Server or Graphics" 87 | options+=("$OPT_rootfs_server" "server") 88 | options+=("$OPT_rootfs_desktop" "desktop") 89 | show_menu "${titlestr}" "${options[@]}" 90 | } 91 | 92 | MENU_choose_img_file() { 93 | titlestr="choose an img file" 94 | for file in $PATH_OUTPUT/*.img; do 95 | local creation_time=$(stat -c %Y "$file") 96 | options+=("$creation_time:$file") 97 | done 98 | 99 | IFS=$'\n' sorted_options=($(for item in "${options[@]}"; do echo "$item"; done | sort -r | cut -d: -f2)) 100 | unset IFS 101 | 102 | options=() 103 | for file in "${sorted_options[@]}"; do 104 | local name=$(basename "$file") 105 | options+=("$name" "$name") 106 | done 107 | 108 | show_menu "${titlestr}" "${options[@]}" 109 | } 110 | -------------------------------------------------------------------------------- /scripts/option.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | 5 | OPT_user_no_choose="no_choose" 6 | OPT_NO="no" 7 | OPT_YES="yes" 8 | OPT_part_image="image" 9 | OPT_part_bootloader="bootloader" 10 | OPT_part_kernel="kernel" 11 | OPT_part_rootfs="rootfs" 12 | OPT_part_pack_rootfs="pack_rootfs" 13 | OPT_part_pack_image="pack_image" 14 | OPT_part_emmc_burn_rootfs="rootfs_burn_emmc" 15 | OPT_part_pack_emmc_burn="pack_burn_emmc" 16 | OPT_os_debian12="debian12" 17 | OPT_os_debian12_burn="debian12_burn" 18 | OPT_os_ubuntu22="ubuntu22" 19 | OPT_os_ubuntu24="ubuntu24" 20 | OPT_rootfs_server="server" 21 | OPT_rootfs_desktop="desktop" 22 | OPT_skip_boot="skip-boot" 23 | OPT_skip_kernel="skip-kernel" -------------------------------------------------------------------------------- /scripts/path.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # PATH_PROJECT_DIR="$(dirname "$(realpath "${BASH_SOURCE[0]}")")" 4 | PATH_board="${PATH_PROJECT_DIR}/board" 5 | PATH_SOURCE="${PATH_PROJECT_DIR}/source" 6 | PATH_OUTPUT="${PATH_PROJECT_DIR}/output" 7 | PATH_TMP="${PATH_PROJECT_DIR}/.tmp" 8 | PATH_LOG="${PATH_PROJECT_DIR}/log" 9 | PATH_TOOLCHAIN="${PATH_PROJECT_DIR}/toolchain" 10 | create_dir $PATH_SOURCE 11 | create_dir $PATH_OUTPUT 12 | create_dir $PATH_TMP 13 | create_dir $PATH_LOG 14 | create_dir $PATH_TOOLCHAIN 15 | 16 | # LOG_START_TIME=$(date +%m-%d_%H:%M) #在build.sh内定义 17 | LOG_MONTH_DIR="${PATH_LOG}/$(date +%Y-%m)" 18 | LOG_FILE="${LOG_MONTH_DIR}/${LOG_START_TIME}.log" 19 | create_dir $LOG_MONTH_DIR 20 | 21 | FLAG_DIR="${PATH_TMP}/FLAGS" 22 | FLAG_DIR_NO_FIRST="${FLAG_DIR}/not_first" 23 | 24 | # 编译bootloader相关 25 | OUTDIR_boot_package=${PATH_OUTPUT_BOARD}/boot 26 | OUTFILE_boot_bin=${OUTDIR_boot_package}/boot.bin 27 | PATH_save_boot_files="${ENTER_board_name}/boot" 28 | 29 | # 内核编译相关 30 | SOURCE_kernel="${PATH_SOURCE}/$(basename "$LINUX_GIT" .git)-$LINUX_BRANCH" 31 | OUTDIR_kernel_package=${PATH_OUTPUT_BOARD}/kernel 32 | 33 | # 生成rootfs相关 34 | OUTFILE_rootfs_tar="${PATH_OUTPUT_BOARD}/rootfs_${ENTER_os_ver}_${ENTER_rootfs_type}.tar.gz" 35 | TMP_rootfs_build=${PATH_TMP}/${BOARD_MODEL}_${ENTER_os_ver}_${ENTER_rootfs_type} 36 | FILE_base_rootfs=${TMP_rootfs_build}_base_software.tar 37 | FILE_apt_base="${ENTER_board_name}/${ENTER_os_ver}/apt-base" 38 | FILE_apt_del="${ENTER_board_name}/${ENTER_os_ver}/apt-del" 39 | FILE_apt_desktop="${ENTER_board_name}/${ENTER_os_ver}/apt-desktop" 40 | FILE_apt_base_board="${ENTER_board_name}/${ENTER_os_ver}/wpi-base" 41 | FILE_apt_desktop_board="${ENTER_board_name}/${ENTER_os_ver}/wpi-desktop" 42 | FILE_pip_list="${ENTER_board_name}/${ENTER_os_ver}/pip" 43 | PLACE_sf_list="${TMP_rootfs_build}/etc/release-apt" 44 | 45 | # 打包镜像相关 46 | TMP_IMG_DISK1="${PATH_TMP}/PART1-${BOARD_NAME}-${ENTER_os_ver}_${ENTER_rootfs_type}" 47 | TMP_IMG_DISK2="${PATH_TMP}/PART2-${BOARD_NAME}-${ENTER_os_ver}_${ENTER_rootfs_type}" 48 | TMP_mount_disk1="${PATH_TMP}/MOUNT-PART1-${BOARD_NAME}-${ENTER_os_ver}_${ENTER_rootfs_type}" 49 | TMP_mount_disk2="${PATH_TMP}/MOUNT-PART2-${BOARD_NAME}-${ENTER_os_ver}_${ENTER_rootfs_type}" 50 | OUT_IMG_FILE="${PATH_OUTPUT}/V${VERSION_APT}_$(date +%m-%d)_${ENTER_rootfs_type}_${BOARD_NAME}_${LINUX_BRANCH}_${ENTER_os_ver}" 51 | -------------------------------------------------------------------------------- /update-info: -------------------------------------------------------------------------------- 1 | # v1.2 2 | ## Core update 3 | - modify use sudo no passwd necessary 4 | - config.txt add env `console_uart` `console_display` `display_bootinfo` 5 | - add `python3-pyqt5` and settings 6 | - desktop system add software `qt-designed` 7 | - server system add a xorg console 8 | 9 | 10 | 11 | # V1.1 12 | ## Core update 13 | - command `set-vnc`: setting the vnc server 14 | 15 | 16 | 17 | # V1.0 18 | first release 19 | --------------------------------------------------------------------------------