[U-Boot] [PATCH 15/15] x86: Update README to explain booting Ubuntu on Minnowmax
Bin Meng
bmeng.cn at gmail.com
Tue Jul 28 09:50:15 CEST 2015
Hi Simon,
On Tue, Jul 28, 2015 at 5:47 AM, Simon Glass <sjg at chromium.org> wrote:
> The steps required to boot a Linux distribution from U-Boot on x86 are not
> very complicated, but it is a good idea to have these written down in an
> accessible place.
>
> Document how to examine the boot media from U-Boot, how to load a kernel,
> load a ramdisk, set the kernel boot arguments and start the kernel. With
> these instructions Ubuntu boots mostly normally on Minnowmax.
>
> Note that the TSC timer does not operate correctly and gives warnings in
> the boot log. I expect that ACPI support will solve this.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
Please see some comments below.
> ---
>
> doc/README.x86 | 275 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 275 insertions(+)
>
> diff --git a/doc/README.x86 b/doc/README.x86
> index 5d71244..5435d79 100644
> --- a/doc/README.x86
> +++ b/doc/README.x86
> @@ -325,6 +325,278 @@ mtrr - List and set the Memory Type Range Registers (MTRR). These are used to
> mode to use. U-Boot sets up some reasonable values but you can
> adjust then with this command.
>
> +Booting Ubuntu
> +--------------
> +As an example of how to set up your boot flow with U-Boot, here are
> +instructions for starting Ubuntu from U-Boot. These instructions have been
> +testinged on Minnowboard MAX with a SATA driver but are equally applicable on
tested
> +other platforms and other media. There are really only four steps and its a
> +very simple script, but a more detailed explaination is provided here for
explanation
> +completeness.
> +
> +Note: It is possible to set up U-Boot to boot automatically using syslinux.
> +It could also use the grub.cfg file (/efi/ubuntu/grub.cfg) to obtain the
> +GUID. If you figure these out, please post patches to this README.
> +
> +Firstly, you will need Ubunutu installed on an available disk. It should be
> +possible to make U-Boot start a USB start-up disk but for now let's assume
> +that you used another boot loader to install Ubuntu.
> +
> +Use the U-Boot command line to find the UUID of the partition you want to
> +boot. For example our disk is SCSI device 0:
> +
> +=> part list scsi 0
> +
> +Partition Map for SCSI device 0 -- Partition Type: EFI
> +
> + Part Start LBA End LBA Name
> + Attributes
> + Type GUID
> + Partition GUID
> + 1 0x00000800 0x001007ff ""
> + attrs: 0x0000000000000000
> + type: c12a7328-f81f-11d2-ba4b-00a0c93ec93b
> + guid: 9d02e8e4-4d59-408f-a9b0-fd497bc9291c
> + 2 0x00100800 0x037d8fff ""
> + attrs: 0x0000000000000000
> + type: 0fc63daf-8483-4772-8e79-3d69d8477de4
> + guid: 965c59ee-1822-4326-90d2-b02446050059
> + 3 0x037d9000 0x03ba27ff ""
> + attrs: 0x0000000000000000
> + type: 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
> + guid: 2c4282bd-1e82-4bcf-a5ff-51dedbf39f17
> + =>
> +
> +This shows that your SCSI disk has three partitions. The really long hex
> +strings are called Globally Unique Identifiers (GUIDs). You can look up the
> +'type' ones here [11]. On this disk the first partition is for EFI and is in
> +VFAT format (DOS/Windows):
> +
> + => fatls scsi 0:1
> + efi/
> +
> + 0 file(s), 1 dir(s)
> +
> +
> +Partition 2 is 'Linux filesystem data' so that will be our root disk. It is
> +in ext2 format:
> +
> + => ext2ls scsi 0:2
> + <DIR> 4096 .
> + <DIR> 4096 ..
> + <DIR> 16384 lost+found
> + <DIR> 4096 boot
> + <DIR> 12288 etc
> + <DIR> 4096 media
> + <DIR> 4096 bin
> + <DIR> 4096 dev
> + <DIR> 4096 home
> + <DIR> 4096 lib
> + <DIR> 4096 lib64
> + <DIR> 4096 mnt
> + <DIR> 4096 opt
> + <DIR> 4096 proc
> + <DIR> 4096 root
> + <DIR> 4096 run
> + <DIR> 12288 sbin
> + <DIR> 4096 srv
> + <DIR> 4096 sys
> + <DIR> 4096 tmp
> + <DIR> 4096 usr
> + <DIR> 4096 var
> + <SYM> 33 initrd.img
> + <SYM> 30 vmlinuz
> + <DIR> 4096 cdrom
> + <SYM> 33 initrd.img.old
> + =>
> +
> +and if you look in the /boot directory you will see the kernel:
> +
> + => ext2ls scsi 0:2 /boot
> + <DIR> 4096 .
> + <DIR> 4096 ..
> + <DIR> 4096 efi
> + <DIR> 4096 grub
> + 3381262 System.map-3.13.0-32-generic
> + 1162712 abi-3.13.0-32-generic
> + 165611 config-3.13.0-32-generic
> + 176500 memtest86+.bin
> + 178176 memtest86+.elf
> + 178680 memtest86+_multiboot.bin
> + 5798112 vmlinuz-3.13.0-32-generic
> + 165762 config-3.13.0-58-generic
> + 1165129 abi-3.13.0-58-generic
> + 5823136 vmlinuz-3.13.0-58-generic
> + 19215259 initrd.img-3.13.0-58-generic
> + 3391763 System.map-3.13.0-58-generic
> + 5825048 vmlinuz-3.13.0-58-generic.efi.signed
> + 28304443 initrd.img-3.13.0-32-generic
> + =>
> +
> +The 'vmlinuz' files contain a packaged Linux kernel. The format is a kind of
> +self-extracting compressed file mixed with some 'setup' configuration data.
> +Despite its size (uncompressed it is >10MB) this only includes a basic set of
> +device drivers, enough to boot on most hardware types.
> +
> +The 'initrd' files contain a RAM disk. This is something that can be loaded
> +into RAM and will appear to Linux like a disk. Ubuntu uses this to hold lots
> +of drivers for whatever hardware you might have. It is loaded before the
> +real root disk is accessed.
> +
> +The numbers after the end of each file are the version. Here it is Linux
> +version 3.13. You can find the source code for this in the Linux tree with
> +the tag v3.13. The '.0' allows for additional Linux releases to fix problems,
> +but normally this is not needed. The '-58' is used by Ubuntu. Each time they
> +release a new kernel they increment this number. New Ubuntu versions might
> +include kernel patches to fix reported bugs. Stable kernels can exist for
> +some years so this number can get quite high.
> +
> +The '.efi.signed' kernel is signed for EFI's secure boot. U-Boot has its own
> +secure boot mechanism - see [12] [13] and cannot read .efi files at present.
> +
> +To boot Ubuntu from U-Boot the steps are as follows:
> +
> +1. Set up the boot arguments. Use the GUID for the partition you want to
> +boot:
> +
> + => setenv bootargs root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
> +
> +Here root= tells Linux the location of its root disk. The disk is specified
> +by its GUID, using '/dev/disk/by-partuuid/', a Linux path to a 'directory'
> +containing all the GUIDs Linux has found. When it starts up, there will be a
> +file in that directory with this name in it. It is also possible to use a
> +device name here, see later.
> +
> +2. Load the kernel. Since it is an ext2/4 filesystem we can do:
> +
> + => ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic
> +
> +The address 30000000 is arbitrary, but there seem to be problems with using
> +small addresses (sometimes Linux cannot find the ramdisk). This is 48MB into
> +the start of RAM (which is at 0 on x86).
> +
> +3. Load the ramdisk (to 64MB):
> +
> + => ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic
> +
> +4. Start up the kernel. We need to know the size of the ramdisk, but can use
> +a variable for that. U-Boot sets 'filesize' to the size of the last file it
> +loaded.
> +
> + => zboot 03000000 0 04000000 ${filesize}
> +
> +Type 'help zboot' if you want to see what the arguments are. U-Boot on x86 is
> +quite verbose when it boots a kernel. You should see these messages from
> +U-Boot:
> +
> + Valid Boot Flag
> + Setup Size = 0x00004400
> + Magic signature found
> + Using boot protocol version 2.0c
> + Linux kernel version 3.13.0-58-generic (buildd at allspice) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015
> + Building boot_params at 0x00090000
> + Loading bzImage at address 100000 (5805728 bytes)
> + Magic signature found
> + Initial RAM disk at linear address 0x04000000, size 19215259 bytes
> + Kernel command line: "console=ttyS0,115200 root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro"
> +
> + Starting kernel ...
> +
> +U-Boot prints out some bootstage timing. This is more useful if you put the
> +above commands into a script since then it will be faster.
> +
> + Timer summary in microseconds:
> + Mark Elapsed Stage
> + 0 0 reset
> + 241,535 241,535 board_init_r
> + 2,421,611 2,180,076 id=64
> + 2,421,790 179 id=65
> + 2,428,215 6,425 main_loop
> + 48,860,584 46,432,369 start_kernel
> +
> + Accumulated time:
> + 240,329 ahci
> + 1,422,704 vesa display
> +
> +Now the kernel actually starts:
> +
> + [ 0.000000] Initializing cgroup subsys cpuset
> + [ 0.000000] Initializing cgroup subsys cpu
> + [ 0.000000] Initializing cgroup subsys cpuacct
> + [ 0.000000] Linux version 3.13.0-58-generic (buildd at allspice) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #97-Ubuntu SMP Wed Jul 8 02:56:15 UTC 2015 (Ubuntu 3.13.0-58.97-generic 3.13.11-ckt22)
> + [ 0.000000] Command line: console=ttyS0,115200 root=/dev/disk/by-partuuid/965c59ee-1822-4326-90d2-b02446050059 ro
> +
> +It continues for a long time. Along the way you will see it pick up your
> +ramdisk:
> +
> + [ 0.000000] RAMDISK: [mem 0x04000000-0x05253fff]
> +...
> + [ 0.788540] Trying to unpack rootfs image as initramfs...
> + [ 1.540111] Freeing initrd memory: 18768K (ffff880004000000 - ffff880005254000)
> +...
> +
> +Later it actually starts using it:
> +
> + Begin: Running /scripts/local-premount ... done.
> +
> +You should also see your boot disk turn up:
> +
> + [ 4.357243] scsi 1:0:0:0: Direct-Access ATA ADATA SP310 5.2 PQ: 0 ANSI: 5
> + [ 4.366860] sd 1:0:0:0: [sda] 62533296 512-byte logical blocks: (32.0 GB/29.8 GiB)
> + [ 4.375677] sd 1:0:0:0: Attached scsi generic sg0 type 0
> + [ 4.381859] sd 1:0:0:0: [sda] Write Protect is off
> + [ 4.387452] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
> + [ 4.399535] sda: sda1 sda2 sda3
> +
> +Linux has found the three partitions (sda1-3). Mercifully it doesn't print out
> +the GUIDs. In step 1 above we could have used:
> +
> + setenv bootargs root=/dev/sda2 ro
> +
> +instead of the GUID. However if you add another drive to your board the
> +numbering may change whereas the GUIDs will not. So if your boot partition
> +becomes sdb2, it will still boot. For embedded systems where you just want to
> +boot the first disk, you have that option.
> +
> +The last thing you will see on the console is mention of plymouth (which
> +displays the Ubuntu start-up screen) and a lot of 'Starting' messages:
> +
> + * Starting Mount filesystems on boot [ OK ]
> +
> +After a pause you should see a login screen on your display and you are done.
> +
> +If you want to put this in a script you can use something like this:
> +
> + setenv bootargs root=UUID=b2aaf743-0418-4d90-94cc-3e6108d7d968 ro
> + setenv boot zboot 03000000 0 04000000 \${filesize}
I believe \ is not needed.
> + setenv bootcmd "ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; run boot"
> + saveenv
> +
> +You will also need to add this to your board configuration file, e.g.
> +include/configs/minnowmax.h:
> +
> + #define CONFIG_BOOTDELAY 2
> +
> +Now when you reset your board it wait a few seconds (in case you want to
> +interrupt) and then should boot straight into Ubuntu.
> +
> +You can also bake this behaviour into your build by hard-coding the
> +environment variables if you add this to minnowmax.h:
> +
> +#undef CONFIG_BOOTARGS
> +#undef CONFIG_BOOTCOMMAND
> +
> +#define CONFIG_BOOTARGS \
> + "root=/dev/sda2 ro"
> +#define CONFIG_BOOTCOMMAND \
> + "ext2load scsi 0:2 03000000 /boot/vmlinuz-3.13.0-58-generic; " \
> + "ext2load scsi 0:2 04000000 /boot/initrd.img-3.13.0-58-generic; " \
> + "run boot"
> +
> +#undef CONFIG_EXTRA_ENV_SETTINGS
> +#define CONFIG_EXTRA_ENV_SETTINGS "boot=zboot 03000000 0 04000000 ${filesize}"
> +
> +
> Development Flow
> ----------------
> These notes are for those who want to port U-Boot to a new x86 platform.
> @@ -406,3 +678,6 @@ References
> [8] http://en.wikipedia.org/wiki/Microcode
> [9] http://simplefirmware.org
> [10] http://www.intel.com/design/archives/processors/pro/docs/242016.htm
> +[11] https://en.wikipedia.org/wiki/GUID_Partition_Table
> +[12] http://events.linuxfoundation.org/sites/events/files/slides/chromeos_and_diy_vboot_0.pdf
> +[13] http://events.linuxfoundation.org/sites/events/files/slides/elce-2014.pdf
> --
Regards,
Bin
More information about the U-Boot
mailing list