diff --git a/README.md b/README.md index d6d8b901..00ac0fe0 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Buildroot被设计为在Linux系统上运行,我们只支持在ubuntu20.04、u – unzip – rsync – file (must be in /usr/bin/file) +– device-tree-compiler – bc • Source fetching tools: – wget @@ -81,7 +82,7 @@ phytium_e2000_debian_desktop_defconfig 生成的根文件系统、内核、e2000 img 镜像位于output/images目录。 #### e2000 img 镜像 -目前buildroot支持编译e2000 img 镜像(disk.img),生成的e2000 img 镜像位于output/images目录。e2000 img 镜像包含了根文件系统、内核、设备树。 +目前buildroot支持编译e2000 img 镜像(disk.img),生成的e2000 img 镜像位于output/images目录。e2000 img 镜像包含了根文件系统、内核、设备树和GRUB。 使用e2000 img 镜像安装系统,不需要像之前那样将存储设备手动分区再拷贝文件,只需要将disk.img文件写入存储设备即可。 ### 更换文件系统的linux内核版本 @@ -186,12 +187,6 @@ pyjailhouse安装到/usr/local/lib/python3.8/dist-packages。 ``` 关于jailhouse的使用方法等更多信息,请参考`https://gitee.com/phytium_embedded/phytium-jailhouse/blob/master/Readme.md` -## 清理编译结果 -(1)`$ make clean` -删除所有编译结果,包括output目录下的所有内容。当编译完一个文件系统后,编译另一个文件系统前,需要执行此命令。 -(2)`$ make distclean` -重置buildroot,删除所有编译结果、下载目录以及配置。 - ## 为d2000编译文件系统 与“为e2000编译文件系统”相比,“为d2000编译文件系统”还需要“准备内核源码”和“编译initrd”。 ### 准备内核源码 @@ -268,19 +263,58 @@ phytiumpi_ubuntu_desktop_defconfig 生成的根文件系统、内核位于 output/images 目录。 sdcard.img 就是 SD 的镜像文件。 后续部署及使用方法,请参考`https://gitee.com/phytium_embedded/phytium-embedded-docs/tree/master/phytiumpi/linux` -# 在开发板上启动文件系统 -## 在e2000开发板上启动文件系统 -### 使用U-Boot启动文件系统(手动分区) -(1)主机端将SATA盘或U盘分成两个分区(以主机识别设备名为/dev/sdb 为例,请按实际识别设备名更改) -`$ sudo fdisk /dev/sdb` +## 清理编译结果 +(1)`$ make clean` +删除所有编译结果,包括output目录下的所有内容。当编译完一个文件系统后,编译另一个文件系统前,需要执行此命令。 +(2)`$ make distclean` +重置buildroot,删除所有编译结果、下载目录以及配置。 -(2)主机端将内核和设备树拷贝到第一个分区,将根文件系统拷贝到第二个分区 +## 树外构建 +默认情况下,buildroot生成的所有内容都存储在buildroot源码目录的output目录。然而,buildroot也支持树外构建。树外构建允许使用除output以外的其他输出目录。 +使用树外构建时,buildroot的.config和临时文件也存储在输出目录中。这意味着使用相同的buildroot源码树,只要使用不同的输出目录,可以并行运行多个构建。 +使用树外构建进行配置的方式有以下三种: +(1)在buildroot源码目录运行,使用O变量指定输出目录: +`$ make O=xxx/foo-output phytium_xxx_defconfig` +(2)在一个空的输出目录运行,需要指定O变量和buildroot源码树的路径: +`$ mkdir xxx/foo-output` +`$ cd xxx/foo-output` +`$ make -C xxx/phytium-linux-buildroot/ O=$(pwd) phytium_xxx_defconfig` +(3)对于使用`merge_config.sh`合并配置文件的情况,在buildroot源码目录运行: +`$ mkdir xxx/foo-output` +`$ ./support/kconfig/merge_config.sh -O xxx/foo-output configs/phytium_xxx_defconfig configs/phytium_xxx.config` + +运行上述命令之一,buildroot会在输出目录中创建一个Makefile,所以在输出目录中再次运行make时,不再需要指定O变量和buildroot源码树的路径。 +因此配置完成后,编译的命令为: +`$ cd xxx/foo-output` +`$ make` + +# 在开发板上启动系统 +## 在e2000开发板上启动系统 +### 安装系统 +可以通过手动分区的方式安装系统,将存储设备分区、格式化后,再将buildroot生成的文件拷贝到对应的分区; +也可以使用e2000 img 镜像安装系统,这种方式不需要手动将存储设备分区再拷贝文件,只需要将disk.img文件写入存储设备即可。 +#### 手动分区安装系统 +(1)主机端将存储设备分成两个分区(以主机识别设备名为/dev/sdb 为例,请按实际识别设备名更改) +`$ sudo fdisk /dev/sdb` +这将启动fdisk程序,在其中输入命令: +``` +输入g创建GPT分区表; +输入n创建分区,需要创建两个分区; +输入t将第一个分区的分区类型修改为'EFI System'; +输入p打印分区表,确保输出中包含'Disklabel type: gpt'及第一个分区的类型为'EFI System'; +输入w将分区表写入磁盘并退出。 ``` -$ sudo mkfs.ext4 /dev/sdb1 +(2)格式化分区 +``` +$ sudo mkfs.vfat /dev/sdb1 $ sudo mkfs.ext4 /dev/sdb2 +``` +(3)将内核、设备树和GRUB拷贝到第一个分区(EFI分区),将根文件系统拷贝到第二个分区(根分区) +``` $ sudo mount /dev/sdb1 /mnt $ sudo cp xxx/phytium-linux-buildroot/output/images/Image /mnt -$ sudo cp xxx/phytium-linux-buildroot/output/images/e2000q-demo-board.dtb /mnt +$ sudo cp xxx/phytium-linux-buildroot/output/images/e2000q-demo-board.dtb /mnt(用于U-Boot启动) +$ sudo cp -r xxx/phytium-linux-buildroot/output/images/efi-part/EFI/ /mnt(用于UEFI启动) $ sync $ sudo umount /dev/sdb1 $ sudo mount /dev/sdb2 /mnt @@ -291,30 +325,13 @@ $ sync $ cd ~ $ sudo umount /dev/sdb2 ``` - -(3)SATA盘或U盘接到开发板,启动开发板电源,串口输出U-Boot命令行,设置U-Boot环境变量,启动文件系统 -SATA盘: -``` -=>setenv bootargs console=ttyAMA1,115200 audit=0 earlycon=pl011,0x2800d000 root=/dev/sda2 rw; -=>ext4load scsi 0:1 0x90100000 Image; -=>ext4load scsi 0:1 0x90000000 e2000q-demo-board.dtb; -=>booti 0x90100000 - 0x90000000 -``` -U盘: -``` -=>setenv bootargs console=ttyAMA1,115200 audit=0 earlycon=pl011,0x2800d000 root=/dev/sda2 rootdelay=5 rw; -=>usb start -=>ext4load usb 0:1 0x90100000 Image; -=>ext4load usb 0:1 0x90000000 e2000q-demo-board.dtb; -=>booti 0x90100000 - 0x90000000 -``` - -### 使用U-Boot启动文件系统(使用e2000 img 镜像) -(1)将e2000 img 镜像(disk.img)写入SATA盘或U盘: +#### 使用e2000 img 镜像安装系统 +将e2000 img 镜像(disk.img)写入存储设备: `$ sudo dd if=xxx/phytium-linux-buildroot/output/images/disk.img of=/dev/sdb bs=1M` `$ sync` -(2)SATA盘或U盘接到开发板,启动开发板电源,串口输出U-Boot命令行,设置U-Boot环境变量,启动文件系统 +### U-Boot启动系统 +安装系统后,将存储设备接到开发板,启动开发板电源,串口输出U-Boot命令行,设置U-Boot环境变量来启动系统。 SATA盘: ``` =>setenv bootargs console=ttyAMA1,115200 audit=0 earlycon=pl011,0x2800d000 root=/dev/sda2 rw; @@ -331,18 +348,40 @@ U盘: =>booti 0x90100000 - 0x90000000 ``` -## 在d2000开发板上启动文件系统 -### 使用U-Boot启动文件系统 -(1)主机端将SATA盘或U盘分成两个分区(以主机识别设备名为/dev/sdb 为例,请按实际识别设备名更改) +### UEFI启动系统 +如果是使用e2000 img 镜像安装系统,将存储设备接到开发板,启动开发板电源,即可自动启动系统。 +如果是通过手动分区的方式安装系统,安装系统后,还需要在主机端配置存储设备的EFI分区中的/EFI/BOOT/grub.cfg文件,确保菜单条目中内核命令行参数root的值为根分区(这里是第二个分区)。 +(1)通过分区UUID +获取第二个分区的UUID: +`$ sudo blkid -s PARTUUID -o value /dev/sdb2` +将grub.cfg中root的值设置为"root=PARTUUID=xxx",xxx为分区UUID的值。 +(2)通过设备名 +将grub.cfg中root的值设置为"root=/dev/sda2"。 +然后将存储设备接到开发板,启动开发板电源,自动启动系统。 + +## 在d2000开发板上启动系统 +### 安装系统 +(1)主机端将存储设备分成两个分区(以主机识别设备名为/dev/sdb 为例,请按实际识别设备名更改) `$ sudo fdisk /dev/sdb` - -(2)主机端将内核、设备树和initrd拷贝到第一个分区,将根文件系统拷贝到第二个分区 +这将启动fdisk程序,在其中输入命令: +``` +输入g创建GPT分区表; +输入n创建分区,需要创建两个分区; +输入t将第一个分区的分区类型修改为'EFI System'; +输入p打印分区表,确保输出中包含'Disklabel type: gpt'及第一个分区的类型为'EFI System'; +输入w将分区表写入磁盘并退出。 ``` -$ sudo mkfs.ext4 /dev/sdb1 +(2)格式化分区 +``` +$ sudo mkfs.vfat /dev/sdb1 $ sudo mkfs.ext4 /dev/sdb2 +``` +(3)主机端将内核、设备树、GRUB和initrd拷贝到第一个分区(EFI分区),将根文件系统拷贝到第二个分区(根分区) +``` $ sudo mount /dev/sdb1 /mnt $ sudo cp xxx/phytium-linux-buildroot/output/images/Image /mnt -$ sudo cp xxx/phytium-linux-buildroot/output/images/d2000-devboard-dsk.dtb /mnt +$ sudo cp xxx/phytium-linux-buildroot/output/images/d2000-devboard-dsk.dtb /mnt(用于U-Boot启动) +$ sudo cp -r xxx/phytium-linux-buildroot/output/images/efi-part/EFI/ /mnt(用于UEFI启动) $ sudo cp ~/initrd /mnt $ sync $ sudo umount /dev/sdb1 @@ -354,25 +393,34 @@ $ sync $ cd ~ $ sudo umount /dev/sdb2 ``` - -(3)SATA盘或U盘接到开发板,启动开发板电源,串口输出U-Boot命令行,设置U-Boot环境变量,启动文件系统 +### U-Boot启动系统 +安装系统后,将存储设备接到开发板,启动开发板电源,串口输出U-Boot命令行,设置U-Boot环境变量来启动系统。 SATA盘: ``` =>setenv bootargs console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/sda2 rootdelay=5 rw initrd=0x93000000,85M -=>ext4load scsi 0:1 0x90100000 d2000-devboard-dsk.dtb -=>ext4load scsi 0:1 0x90200000 Image -=>ext4load scsi 0:1 0x93000000 initrd +=>fatload scsi 0:1 0x90100000 d2000-devboard-dsk.dtb +=>fatload scsi 0:1 0x90200000 Image +=>fatload scsi 0:1 0x93000000 initrd =>booti 0x90200000 - 0x90100000 ``` U盘: ``` =>setenv bootargs console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/sda2 rootdelay=5 rw initrd=0x93000000,85M =>usb start -=>ext4load usb 0:1 0x90100000 d2000-devboard-dsk.dtb -=>ext4load usb 0:1 0x90200000 Image -=>ext4load usb 0:1 0x93000000 initrd +=>fatload usb 0:1 0x90100000 d2000-devboard-dsk.dtb +=>fatload usb 0:1 0x90200000 Image +=>fatload usb 0:1 0x93000000 initrd =>booti 0x90200000 - 0x90100000 ``` +### UEFI启动系统 +安装系统后,需要在主机端配置存储设备的EFI分区中的/EFI/BOOT/grub.cfg文件,确保菜单条目中内核命令行参数root的值为根分区(这里是第二个分区)。 +(1)通过分区UUID +获取第二个分区的UUID: +`$ sudo blkid -s PARTUUID -o value /dev/sdb2` +将grub.cfg中root的值设置为"root=PARTUUID=xxx",xxx为分区UUID的值。 +(2)通过设备名 +将grub.cfg中root的值设置为"root=/dev/sda2"。 +然后将存储设备接到开发板,启动开发板电源,自动启动系统。 # ubuntu系统安装桌面 `phytium_e2000_ubuntu_desktop_defconfig`和`phytium_d2000_ubuntu_desktop_defconfig`默认安装了xfce桌面,配置并编译它就可以获得带 diff --git a/board/phytium/common/post-custom-skeleton-debian-base-11.sh b/board/phytium/common/post-custom-skeleton-debian-base-11.sh index ac79cd4b..c2abd206 100755 --- a/board/phytium/common/post-custom-skeleton-debian-base-11.sh +++ b/board/phytium/common/post-custom-skeleton-debian-base-11.sh @@ -190,6 +190,7 @@ full_rtf() } deploy_kernel_headers_510 () { + topdir=$(pwd) pdir=$1 version=$2 srctree=$pdir/lib/modules/$version/source @@ -226,8 +227,7 @@ deploy_kernel_headers_510 () { # copy .config manually to be where it's expected to be cp .config $destdir/.config find $destdir -name "*.o" -type f -exec rm -rf {} \; - cd $pdir - cd ../.. + cd $topdir # cp -r board/phytium/common/linux-5.10/scripts $destdir rm -rf $srctree @@ -236,6 +236,7 @@ deploy_kernel_headers_510 () { } deploy_kernel_headers_419 () { + topdir=$(pwd) pdir=$1 version=$2 srctree=$pdir/lib/modules/$version/source @@ -262,8 +263,7 @@ deploy_kernel_headers_419 () { (cd $srctree; cp --parents tools/include/tools/be_byteshift.h $destdir) (cd $srctree; cp --parents tools/include/tools/le_byteshift.h $destdir) find $destdir -name "*.o" -type f -exec rm -rf {} \; - cd $pdir - cd ../.. + cd $topdir # cp -r board/phytium/common/linux-4.19/scripts $destdir rm -rf "$objtree/debian" diff --git a/board/phytium/common/post-custom-skeleton-ubuntu-base-20.04.sh b/board/phytium/common/post-custom-skeleton-ubuntu-base-20.04.sh index 7abfae7e..e8e030a2 100755 --- a/board/phytium/common/post-custom-skeleton-ubuntu-base-20.04.sh +++ b/board/phytium/common/post-custom-skeleton-ubuntu-base-20.04.sh @@ -194,6 +194,7 @@ full_rtf() } deploy_kernel_headers_510 () { + topdir=$(pwd) pdir=$1 version=$2 srctree=$pdir/lib/modules/$version/source @@ -230,8 +231,7 @@ deploy_kernel_headers_510 () { # copy .config manually to be where it's expected to be cp .config $destdir/.config find $destdir -name "*.o" -type f -exec rm -rf {} \; - cd $pdir - cd ../.. + cd $topdir # cp -r board/phytium/common/linux-5.10/scripts $destdir rm -rf $srctree @@ -240,6 +240,7 @@ deploy_kernel_headers_510 () { } deploy_kernel_headers_419 () { + topdir=$(pwd) pdir=$1 version=$2 srctree=$pdir/lib/modules/$version/source @@ -266,8 +267,7 @@ deploy_kernel_headers_419 () { (cd $srctree; cp --parents tools/include/tools/be_byteshift.h $destdir) (cd $srctree; cp --parents tools/include/tools/le_byteshift.h $destdir) find $destdir -name "*.o" -type f -exec rm -rf {} \; - cd $pdir - cd ../.. + cd $topdir # cp -r board/phytium/common/linux-4.19/scripts $destdir rm -rf "$objtree/debian" diff --git a/board/phytium/grub-d2000.cfg b/board/phytium/grub-d2000.cfg new file mode 100644 index 00000000..069c9454 --- /dev/null +++ b/board/phytium/grub-d2000.cfg @@ -0,0 +1,7 @@ +set default="0" +set timeout="5" + +menuentry "Buildroot" { + linux /Image root=/dev/sda2 rootwait rw + initrd /initrd +} diff --git a/board/phytium/grub.cfg b/board/phytium/grub.cfg index 04506814..482b1f82 100644 --- a/board/phytium/grub.cfg +++ b/board/phytium/grub.cfg @@ -2,5 +2,5 @@ set default="0" set timeout="5" menuentry "Buildroot" { - linux /Image root=PARTUUID="0a52c129-7e0f-43ad-989f-d96b07ccdbb2" rootdelay=10 rw console=ttyAMA0,115200 + linux /Image root=PARTUUID="0a52c129-7e0f-43ad-989f-d96b07ccdbb2" rootwait rw console=ttyAMA0,115200 } diff --git a/board/phytium/post-image.sh b/board/phytium/post-image.sh index f0214dc8..325eb808 100755 --- a/board/phytium/post-image.sh +++ b/board/phytium/post-image.sh @@ -2,4 +2,8 @@ BOARD_DIR="$(dirname $0)" -cp -f ${BOARD_DIR}/grub.cfg ${BINARIES_DIR}/efi-part/EFI/BOOT/grub.cfg +if grep -Eq "^BR2_TARGET_GENERIC_HOSTNAME=\"D2000\"$" ${BR2_CONFIG}; then + cp -f ${BOARD_DIR}/grub-d2000.cfg ${BINARIES_DIR}/efi-part/EFI/BOOT/grub.cfg +else + cp -f ${BOARD_DIR}/grub.cfg ${BINARIES_DIR}/efi-part/EFI/BOOT/grub.cfg +fi diff --git a/boot/grub2/grub.cfg b/boot/grub2/grub.cfg index 4006eb94..bd3e3f00 100644 --- a/boot/grub2/grub.cfg +++ b/boot/grub2/grub.cfg @@ -2,6 +2,5 @@ set default="0" set timeout="5" menuentry "Buildroot" { - linux /Image root=/dev/sda2 rw - initrd /initrd + linux /boot/bzImage root=/dev/sda1 rootwait console=tty1 } diff --git a/configs/phytium_d2000_debian_defconfig b/configs/phytium_d2000_debian_defconfig index 2dbc9eb2..fa148bdf 100644 --- a/configs/phytium_d2000_debian_defconfig +++ b/configs/phytium_d2000_debian_defconfig @@ -6,6 +6,7 @@ BR2_cortex_a53=y BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="5G" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/phytium/post-image.sh" # custom skeleton BR2_ROOTFS_SKELETON_UBUNTU=y diff --git a/configs/phytium_d2000_debian_desktop_defconfig b/configs/phytium_d2000_debian_desktop_defconfig index 762eb8c1..32466bc9 100644 --- a/configs/phytium_d2000_debian_desktop_defconfig +++ b/configs/phytium_d2000_debian_desktop_defconfig @@ -7,6 +7,7 @@ BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="5G" BR2_ROOTFS_CHOWN=y +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/phytium/post-image.sh" # custom skeleton BR2_ROOTFS_SKELETON_UBUNTU=y diff --git a/configs/phytium_d2000_defconfig b/configs/phytium_d2000_defconfig index 5e56eeee..328926b4 100644 --- a/configs/phytium_d2000_defconfig +++ b/configs/phytium_d2000_defconfig @@ -6,6 +6,7 @@ BR2_cortex_a53=y BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="1G" +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/phytium/post-image.sh" # Hostname and issue BR2_TARGET_GENERIC_HOSTNAME="D2000" diff --git a/configs/phytium_d2000_ubuntu_defconfig b/configs/phytium_d2000_ubuntu_defconfig index b501cb1d..e37b68ce 100644 --- a/configs/phytium_d2000_ubuntu_defconfig +++ b/configs/phytium_d2000_ubuntu_defconfig @@ -7,6 +7,7 @@ BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="5G" BR2_ROOTFS_CHOWN=y +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/phytium/post-image.sh" # custom skeleton BR2_ROOTFS_SKELETON_UBUNTU=y diff --git a/configs/phytium_d2000_ubuntu_desktop_defconfig b/configs/phytium_d2000_ubuntu_desktop_defconfig index aba1220a..9242ce4a 100644 --- a/configs/phytium_d2000_ubuntu_desktop_defconfig +++ b/configs/phytium_d2000_ubuntu_desktop_defconfig @@ -7,6 +7,7 @@ BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="5G" BR2_ROOTFS_CHOWN=y +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/phytium/post-image.sh" # custom skeleton BR2_ROOTFS_SKELETON_UBUNTU=y diff --git a/configs/phytium_d2000_ubuntu_qt5_defconfig b/configs/phytium_d2000_ubuntu_qt5_defconfig index b68a2cf1..d13f45d3 100644 --- a/configs/phytium_d2000_ubuntu_qt5_defconfig +++ b/configs/phytium_d2000_ubuntu_qt5_defconfig @@ -7,6 +7,7 @@ BR2_TARGET_ROOTFS_EXT2=y BR2_TARGET_ROOTFS_EXT2_4=y BR2_TARGET_ROOTFS_EXT2_SIZE="5G" BR2_ROOTFS_CHOWN=y +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/phytium/post-image.sh" # custom skeleton BR2_ROOTFS_SKELETON_UBUNTU=y