Browse Source

support booting the system through UEFI

support out-of-tree build

Signed-off-by: weishanshan1084 <weishanshan1084@phytium.com.cn>
pull/11/head
weishanshan1084 1 year ago
parent
commit
8e5b4d1040
  1. 150
      README.md
  2. 8
      board/phytium/common/post-custom-skeleton-debian-base-11.sh
  3. 8
      board/phytium/common/post-custom-skeleton-ubuntu-base-20.04.sh
  4. 7
      board/phytium/grub-d2000.cfg
  5. 2
      board/phytium/grub.cfg
  6. 6
      board/phytium/post-image.sh
  7. 3
      boot/grub2/grub.cfg
  8. 1
      configs/phytium_d2000_debian_defconfig
  9. 1
      configs/phytium_d2000_debian_desktop_defconfig
  10. 1
      configs/phytium_d2000_defconfig
  11. 1
      configs/phytium_d2000_ubuntu_defconfig
  12. 1
      configs/phytium_d2000_ubuntu_desktop_defconfig
  13. 1
      configs/phytium_d2000_ubuntu_qt5_defconfig

150
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程序,在其中输入命令:
```
$ sudo mkfs.ext4 /dev/sdb1
输入g创建GPT分区表;
输入n创建分区,需要创建两个分区;
输入t将第一个分区的分区类型修改为'EFI System';
输入p打印分区表,确保输出中包含'Disklabel type: gpt'及第一个分区的类型为'EFI System';
输入w将分区表写入磁盘并退出。
```
(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桌面,配置并编译它就可以获得带

8
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"

8
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"

7
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
}

2
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
}

6
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

3
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
}

1
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

1
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

1
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"

1
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

1
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

1
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

Loading…
Cancel
Save