diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2014-06-17 10:37:25 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2014-06-26 11:07:10 +0200 |
commit | 3fef396bb42efc0bb12b0a8caf0d076ab1c4d879 (patch) | |
tree | 91625b2407ed25dffd093b19159135481eb80f84 /Documentation/user/booting-linux.rst | |
parent | 7e65163b9165bccca780da91fad247c0e4ac7f9f (diff) | |
download | barebox-3fef396bb42efc0bb12b0a8caf0d076ab1c4d879.tar.gz barebox-3fef396bb42efc0bb12b0a8caf0d076ab1c4d879.tar.xz |
Documentation: Add new sphinxs docs
This is a rewrite of the Documentation in reStructuredText format using
Sphinx as build system, see http://sphinx-doc.org/.
The documentation is built into static html pages with 'make docs'.
The pages can be found under Documentation/html after building.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'Documentation/user/booting-linux.rst')
-rw-r--r-- | Documentation/user/booting-linux.rst | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/Documentation/user/booting-linux.rst b/Documentation/user/booting-linux.rst new file mode 100644 index 0000000000..561a850ce3 --- /dev/null +++ b/Documentation/user/booting-linux.rst @@ -0,0 +1,267 @@ +.. _booting_linux: + +Booting Linux +============= + +Introduction +------------ + +The basic boot command in barebox is :ref:`command_bootm`. This command +can be used directly, but there is also a :ref:`command_boot` command +which offers additional features like a boot sequence which tries to +boot different entries until one succeeds. + +The bootm command +----------------- + +The :ref:`command_bootm` command is the basic boot command. Depending on the +architecture the bootm command handles different image types. On ARM the +following images are supported: + +* ARM Linux zImage +* U-Boot uImage +* barebox images + +The images can either be passed directly to the bootm command as argument or +in the ``global.bootm.image`` variable: + +.. code-block:: sh + + bootm /path/to/zImage + + # same as: + + global.bootm.image=/path/to/zImage + bootm + +When barebox has an internal devicetree it is passed to the kernel. You can +specify an alternative devicetree with the ``-o DTS`` option or the ``global.bootm.oftree`` +variable: + +.. code-block:: sh + + bootm -o /path/to/dtb /path/to/zImage + + # same as: + + global.bootm.oftree=/path/to/dtb + global.bootm.image=/path/to/zImage + bootm + +**NOTE** It may happen that barebox is probed from the devicetree, but you have +want to start a Kernel without passing a devicetree. In this case call ``oftree -f`` +to free the internal devicetree before calling ``bootm`` + +Passing Kernel Arguments +^^^^^^^^^^^^^^^^^^^^^^^^ + +Depending on the barebox configuration (``CONFIG_FLEXIBLE_BOOTARGS``) there +are to ways to pass bootargs to the Kernel. With ``CONFIG_FLEXIBLE_BOOTARGS`` +disabled the bootm command takes the bootargs from the ``bootargs`` environment +variable. With ``CONFIG_FLEXIBLE_BOOTARGS`` enabled the bootargs are composed +from different :ref:`global_device` variables. All variables beginning with +``global.bootargs.`` will be concatenated to the bootargs: + +.. code-block:: sh + + global linux.bootargs.base="console=ttyO0,115200" + global linux.bootargs.debug="earlyprintk ignore_loglevel" + + bootm zImage + + ... + + Kernel command line: console=ttymxc0,115200n8 earlyprintk ignore_loglevel + +Additionally all variables starting with ``global.linux.mtdparts.`` are concatenated +to a ``mtdparts=`` parameter to the kernel. This makes it possible to consistently +partition devices with the :ref:`command_addpart` command and pass the same string as used +with addpart to the Kernel: + +.. code-block:: sh + + norparts="512k(bootloader),512k(env),4M(kernel),-(root)" + nandparts="1M(bootloader),1M(env),4M(kernel),-(root)" + + global linux.mtdparts.nor0="physmap-flash.0:$norparts" + global linux.mtdparts.nand0="mxc_nand:$nandparts" + + addpart /dev/nor0 $norparts + addpart /dev/nand0 $nandparts + + ... + + bootm zImage + + ... + + Kernel command line: mtdparts=physmap-flash.0:512k(bootloader),512k(env),4M(kernel),-(root); + mxc_nand:1M(bootloader),1M(env),4M(kernel),-(root) + + +The boot command +---------------- + +The :ref:`command_boot` command offers additional convenience for the :ref:`command_bootm` +command. It works with :ref:`boot_entries` and :ref:`bootloader_spec` entries. Boot entries +are located under /env/boot/ and are scripts which setup the bootm variables so that the +``boot`` command can run ``bootm`` without further arguments. + +.. _boot_entries: + +Boot entries +^^^^^^^^^^^^ + +A simple boot entry in ``/env/boot/mmc`` could look like this: + +.. code-block:: sh + + #!/bin/sh + + global.bootm.image=/mnt/mmc1/zImage + global.bootm.oftree=/env/oftree + + global linux.bootargs.dyn.root="root=PARTUUID=deadbeef:01" + +This takes the kernel from ``/mnt/mmc1/zImage`` (which could be an +:ref:`automount` path registered earlier). The devicetree will be used from +``/env/oftree``. The Kernel gets the command line +``root=PARTUUID=deadbeef:01``. Note the ``.dyn`` in the bootargs variable name. +boot entries should always add Kernel command line parameters to variables with +``.dyn`` in it. These will be cleared before booting different boot entries. +This is done so that following boot entries do not leak command line +parameters from the previous boot entries. + +This entry can be booted with ``boot mmc``. It can also be made the default by +setting the ``global.boot.default`` variable to ``mmc`` and then calling +``boot`` without arguments. + +.. _bootloader_spec: + +Bootloader Spec +^^^^^^^^^^^^^^^ + +barebox supports booting according to the bootloader spec: + +http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/ + +It follows another philosophy than the :ref:`boot_entries`. With Boot Entries +booting is completely configured in the bootloader. Bootloader Spec Entries +on the other hand the boot entries are on a boot medium. This gives a boot medium +the possibility to describe where a Kernel is and what parameters it needs. + +All Bootloader Spec Entries are in a partition on the boot medium under ``/loader/entries/*.conf``. +In the Bootloader Spec a boot medium has a dedicated partition to use for +boot entries. barebox is less strict, it accepts Bootloader Spec Entries on +every partition barebox can read. + +A Bootloader Spec Entry consists of key value pairs:: + + /loader/entries/6a9857a393724b7a981ebb5b8495b9ea-3.8.0-2.fc19.x86_64.conf: + + title Fedora 19 (Rawhide) + version 3.8.0-2.fc19.x86_64 + machine-id 6a9857a393724b7a981ebb5b8495b9ea + options root=UUID=6d3376e4-fc93-4509-95ec-a21d68011da2 + linux /6a9857a393724b7a981ebb5b8495b9ea/3.8.0-2.fc19.x86_64/linux + initrd /6a9857a393724b7a981ebb5b8495b9ea/3.8.0-2.fc19.x86_64/initrd + +All pathes are absolute pathes in the partition. Bootloader Spec Entries can +be created manually, but there also is the ``scripts/kernel-install`` tool to +create/list/modify entries directly on a MMC/SD card or other media. To use +it create a SD card / USB memory stick with a /boot partition with type 0xea. +The partition can be formatted with FAT or EXT4 filesystem. If you wish to write +to it from barebox later you must use FAT. The following creates a Bootloader +Spec Entry on a SD card: + +.. code-block:: sh + + scripts/kernel-install --device=/dev/mmcblk0 -a \ + --machine-id=11ab7c89d02c4f66a4e2474ea25b2b84 --kernel-version="3.15" \ + --kernel=/home/sha/linux/arch/arm/boot/zImage --add-root-option \ + --root=/dev/mmcblk0p1 -o "console=ttymxc0,115200" + +The entry can be listed with the -l option: + +.. code-block:: sh + + scripts/kernel-install --device=/dev/mmcblk0 -l + + Entry 0: + title: Linux-3.15 + version: 3.15 + machine_id: 11ab7c89d02c4f66a4e2474ea25b2b84 + options: console=ttymxc0,115200 root=PARTUUID=0007CB20-01 + linux: 11ab7c89d02c4f66a4e2474ea25b2b84.15/linux + +When on barebox the SD card shows up as ``mmc`` then this entry can be booted with +``boot mmc1`` or with setting ``global.boot.default`` to ``mmc1``. + +network boot +------------ + +With the following steps barebox can start the Kernel and root filesystem +over network, a standard development case. + +Configure network: edit ``/env/network/eth0``. For a standard dhcp setup +the following is enough: + +.. code-block:: sh + + #!/bin/sh + + ip=dhcp + serverip=192.168.23.45 + +serverip is only necessary if it differs from the serverip offered from the dhcp server. +A static ip setup can look like this: + +.. code-block:: sh + + #!/bin/sh + + ip=static + ipaddr=192.168.2.10 + netmask=255.255.0.0 + gateway=192.168.2.1 + serverip=192.168.2.1 + +Note that barebox will pass the same ip settings to the kernel, i.e. it passes +``ip=$ipaddr:$serverip:$gateway:$netmask::eth0:`` for a static ip setup and +``ip=dhcp`` for a dynamic dhcp setup. + +Adjust ``global.user`` and maybe ``global.hostname`` in ``/env/config``:: + + global.user=sha + global.hostname=efikasb + +Copy the kernel (and devicetree if needed) to the base dir of the TFTP server:: + + cp zImage /tftpboot/sha-linux-efikasb + cp myboard.dtb /tftpboot/sha-oftree-efikasb + +barebox will pass ``nfsroot=/home/${global.user}/nfsroot/${global.hostname}`` +This may be a link to another location on the NFS server. Make sure that the +link target is exported from the server. + +``boot net`` will then start the Kernel. + +If the pathes or names are not suitable they can be adjusted in +``/env/boot/net``: + +.. code-block:: sh + + #!/bin/sh + + path="/mnt/tftp" + + global.bootm.image="${path}/${global.user}-linux-${global.hostname}" + + oftree="${path}/${global.user}-oftree-${global.hostname}" + if [ -f "${oftree}" ]; then + global.bootm.oftree="$oftree" + fi + + nfsroot="/home/${global.user}/nfsroot/${global.hostname}" + bootargs-ip + global.linux.bootargs.dyn.root="root=/dev/nfs nfsroot=$nfsroot,v3,tcp" |