|
|
Line 1: |
Line 1: |
− | This guide is intended to demonstrate how to install NixOS on an Allwinner | + | This page has been moved to the official NixOS Wiki: |
− | target device, using u-boot, allowing for use of the GPT partition scheme.
| |
| | | |
− | The main advantage of going this way is the ability to boot using a UEFI-based
| + | ⇒ '''[https://wiki.nixos.org/wiki/NixOS_on_ARM/Allwinner_GPT_Installation NixOS on ARM/Allwinner GPT Installation]''' |
− | bootloader from u-boot, on one single storage.
| |
| | | |
− | This guide uses [https://github.com/samueldr/holey holey], a script intended to
| + | ''— samueldr, Lead of NixOS on ARM.'' |
− | make this easier. A manual method using <code>cgpt</code> and <code>gdisk</code> will be described at
| |
− | the end.
| |
− | | |
− | == What will this do? ==
| |
− | | |
− | This will create a GPT partitioned disk with a hole between the Primary GPT
| |
− | header and the Primary GPT Table. The location where the Allwinner SoC looks
| |
− | for the bootloader falls within that hole, and this is where u-boot will be
| |
− | installed. Without that hole, the u-boot bootloader would be installed over
| |
− | the end of the Primary GPT table.
| |
− | | |
− | On a MBR partitioned disk, this location is at the beginning of the disk. As
| |
− | long as care is taken not to add a partition over it, there should be no clash.
| |
− | | |
− | By using a hole in the GPT, the installed firmware is more resilient to
| |
− | re-partitioning, as long as the GPT table is not cleared and written anew.
| |
− | There is no risk of overwriting the bootloader by manipulating partitions.
| |
− | | |
− | == Preparations ==
| |
− | | |
− | You will need to boot the installation media from a different storage than the
| |
− | target storage (where you will install). On some, if not most, Allwinner
| |
− | systems, it is possible to boot from USB as long as you can boot u-boot in some
| |
− | manner. This means that you could flash the u-boot bootloader to an empty SD
| |
− | card, and boot from a USB drive containing either the UEFI iso or the SD image
| |
− | installer. Alternatively, some platforms will have multiple storage, and will
| |
− | boot from SD card before booting from the internal storage.
| |
− | | |
− | This is needed because the target storage will be erased, while the usual SD
| |
− | image from NixOS expects the user to re-use the partitions from the booted
| |
− | system.
| |
− | | |
− | Alternatively, it should be possible to install to a smaller storage, and <code>dd</code>
| |
− | it to the internal storage and resize the partitions. Though it is untested.
| |
− | Finally, it is possible to install on a USB connected storage, e.g. to another
| |
− | SD card in a USB SD reader, or a specialized eMMC USB adapter.
| |
− | | |
− | == Partitioning ==
| |
− | | |
− | Once booted to the installer system, you will need to get the holey tool.
| |
− | | |
− | <pre>
| |
− | nix-shell -p 'import (fetchTarball https://github.com/samueldr/holey/archive/master.tar.gz) {}'
| |
− | </pre>
| |
− | | |
− | This will drop you in a shell with holey available.
| |
− | | |
− | Create a new GPT partition table on the target drive. By default it will
| |
− | leave a 2MiB gap which is plenty for the default u-boot builds, with spare
| |
− | space for further increase in size if needed.
| |
− | | |
− | <pre>
| |
− | $ holey /dev/$DISK init
| |
− | </pre>
| |
− | | |
− | You can verify that it worked.
| |
− | | |
− | <pre>
| |
− | $ holey /dev/$DISK check
| |
− | Holey GPT looks fine!
| |
− | start size part contents
| |
− | 0 1 PMBR (Boot GUID: FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF)
| |
− | 1 1 Pri GPT header
| |
− | 4100 32 Pri GPT table
| |
− | 61071327 32 Sec GPT table
| |
− | 61071359 1 Sec GPT header
| |
− | </pre>
| |
− | | |
− | At that point, the GPT has been split, there is a gap between the header and
| |
− | the table.
| |
− | | |
− | You can continue either by using <code>holey</code> to add partitions, or partition like
| |
− | you want using tools like <code>cfdisk</code>, <code>fdisk</code> or <code>gdisk</code>.
| |
− | | |
− | The next commands will prepare an ESP (EFI System Partition) and a root
| |
− | partition for the system. For the size of the ESP, 512MiB has been chosen,
| |
− | keep in mind that on ARM platforms the kernel is not compressed, and can
| |
− | be around 2-3 times bigger than on x86_64.
| |
− | | |
− | <pre>
| |
− | holey /dev/$DISK add esp 512
| |
− | holey /dev/$DISK add linux
| |
− | </pre>
| |
− | | |
− | The last call will make the partition as big as it can fit.
| |
− | | |
− | == Installing u-boot ==
| |
− | | |
− | This is done as usually is done.
| |
− | | |
− | <pre>
| |
− | dd if=result/u-boot-sunxi-with-spl.bin of=/dev/$DISK bs=1024 seek=8 oflag=sync
| |
− | </pre>
| |
− | | |
− | This is also how an update to u-boot would be installed.
| |
− | | |
− | == Finishing ==
| |
− | | |
− | From here, the installation process is as usual with NixOS.
| |
− | | |
− | <hr />
| |
− | | |
− | == Using other tools ==
| |
− | | |
− | === Create the hole using <code>gdisk</code> ===
| |
− | | |
− | Follows the transcript, starting from an empty disk.
| |
− | | |
− | <pre>
| |
− | $ gdisk /dev/$DISK
| |
− | GPT fdisk (gdisk) version 1.0.4
| |
− | | |
− | Partition table scan:
| |
− | MBR: not present
| |
− | BSD: not present
| |
− | APM: not present
| |
− | GPT: not present
| |
− | | |
− | Creating new GPT entries in memory.
| |
− | | |
− | Command (? for help): o
| |
− | This option deletes all partitions and creates a new protective MBR.
| |
− | Proceed? (Y/N): y
| |
− | | |
− | Command (? for help): x
| |
− | | |
− | Expert command (? for help): j
| |
− | Currently, main partition table begins at sector 2 and ends at sector 33
| |
− | Enter new starting location (2 to 18446744073709551583; default is 2; 1 to abort): 4100
| |
− | | |
− | Expert command (? for help): m
| |
− | | |
− | Command (? for help): w
| |
− | | |
− | Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
| |
− | PARTITIONS!!
| |
− | | |
− | Do you want to proceed? (Y/N): y
| |
− | OK; writing new GUID partition table (GPT) to disk.img.
| |
− | Warning: The kernel is still using the old partition table.
| |
− | The new table will be used at the next reboot or after you
| |
− | run partprobe(8) or kpartx(8)
| |
− | The operation has completed successfully.
| |
− | | |
− | </pre>
| |
− | | |
− | === Create the hole using <code>cgpt</code> ===
| |
− | | |
− | <code>cgpt</code> is a GPT manipulation tool. We start by zeroing the GPT and
| |
− | continue by creating a new partition table, then add the protective
| |
− | MBR. Adding that PMBR is what is needed for the kernel and tools to
| |
− | see and understand the GPT properly.
| |
− | | |
− | <pre>
| |
− | # Zeroes the GPTs, if it makes sense
| |
− | cgpt create -z /dev/$DISK
| |
− | | |
− | # Creates new GPTs with space for the bootloader
| |
− | cgpt create -p 4100 /dev/$DISK
| |
− | | |
− | # Creates the PMBR; also makes the GPT show up in most tools.
| |
− | cgpt boot -p /dev/$DISK
| |
− | </pre>
| |