Setting up disks manually
The menu choices that are provided by setup-alpine
might not cover all needs, however, it's possible to:
- Call setup-disk directly, instead of through
setup-alpine
, and pass some specific partitioning parameters to it. - Set up the partitions and filesystems manually (to the desired details) and tell setup-disk to install to the prepared target mountpoint.
(Beta reference: docs.alpinelinux.org )
Using setup-alpine (setup-disk) features
For "diskless" and "data" disk mode installs
This requires some manual steps, as long as the setup-scripts auto-detect usable partitions only on removable devices (not internal harddisks). They do not support creating new, writable partitions to be used by Alpine.
How to prepare writable storage space is explained in the section manual partitioning, below.
For "sys" disk mode installs
This material is work-in-progress ... Some information on this page may be incomplete or outdate. |
Disk layouts
It is possible to have one or more of RAID, encrypted, and/or Logical Volume on your / (root) volume. However, the Alpine init script only knows how to handle them when they're layered in that order, and your initram and extlinux.conf files in the /boot partition are configured properly.
Your /boot directory cannot reside on an encrypted or LVM volume, at least not with Alpine's default bootloader (extlinux). (Grub2 can deal with /boot being on an LVM volume.) The usual practice is to create a small partition for /boot, then devote the rest of your disk to a separate partition on which you layer one or more of RAID, encryption, and/or Logical Volumes.
Sometimes /boot is also set up as a mirrored (RAID1) volume. However, this is just for post-init access. That way, when you write a new kernel or bootloader config file to /boot, it gets written to multiple physical partitions. During the pre-init, bootloader phase, only one of those partitions will be read from.
A typical setup might look like this:
One-disk system --------------- +------------------------------------------------+ | small partition (32--100M), holding | | only /boot, filesystem needn't be journaled | +------------------------------------------------+ | rest of disk in second partition | | +------------------------------------------+ | | | cryptsetup volume | | | | +-------------------------------------+ | | | | | LVM PV, containing single VG, | | | | | | containing multiple LVs, holding | | | | | | /, /home, swap, etc | | | | | +-------------------------------------+ | | | +------------------------------------------+ | +------------------------------------------------+ Two-disk system --------------- +------------------------------------------------+ +------------------------------------------------+ | small partition (32--100M), holding | | small partition (32--100M), holding | These 2 partitions might | only /boot, filesystem needn't be journaled | | only /boot, filesystem needn't be journaled | form a mirrored (RAID1) +------------------------------------------------+ +------------------------------------------------+ volume | rest of disk in second partition | | rest of disk in second partition | | T================================================================================================T | These 2 partitions form | T +--------------------------------------------------------------------------------------------+ T | a second mirrored | T | cryptsetup volume | T | (RAID1) volume | T | +---------------------------------------------------------------------------------------+ | T | | T | | LVM PV, containing single VG, | | T | | T | | containing multiple LVs, holding | | T | | T | | /, /home, swap, etc | | T | | T | +---------------------------------------------------------------------------------------+ | T | | T +--------------------------------------------------------------------------------------------+ T | | T================================================================================================T | | | | | +------------------------------------------------+ +------------------------------------------------+
In a three-disk system, the /boot would still be RAID1, but the larger partition might, in that case, be RAID5.
RAID
setup-disk
will automatically build a RAID array if you supply the -r switch, or if you specify more than one device.
If you want to build your RAID array manually, see Setting up a software RAID array. Then you can add additional layers of encryption and/or Logical Volumes, or just assemble the RAID array, and supply the /dev/mdi device directly to setup-disk. When you're finished, be sure to disassemble the RAID array before rebooting.
If setup-disk
sees that you're using RAID, either because you gave it the -r
switch, or multiple devices, or a /dev/mdi device, then it will set up your initramfs and extlinux.conf file properly. However, in other cases, such as when you're also using encryption, or you invoke setup-disk
with a mounted directory argument, these might not be properly set up for RAID. In that case, you may need to manually edit/rebuild them. The following assumes that $MNT
holds the root directory you're installing into:
echo "/sbin/mdadm" > $MNT/etc/mkinitfs/files.d/raid echo "/etc/mdadm.conf" >> $MNT/etc/mkinitfs/files.d/raid # edit $MNT/etc/mkinitfs/mkinitfs.conf to make sure features="..." # includes raid (this field is space-separated and quoted) mkinitfs -c $MNT/etc/mkinitfs/mkinitfs.conf -b $MNT # edit $MNT/etc/update-extlinux.conf to make sure modules=... contains # raid1 or raid456 (whichever your / is on; this field is comma-separated) # also check the root= setting extlinux --raid --install $MNT/boot --update
--update
option to extlinux ...
suffice to make /boot/extlinux.conf be regenerated? Or do we need to manually tweak that file, or run update-extlinux
, as well?
You might also need to manually tweak $MNT/etc/fstab. And you might need to copy /usr/share/syslinux/mbr.bin to your disk's MBR.
Encryption
See Setting up encrypted volumes with LUKS. You can add an additional Logical Volume layer, or just unlock the volume you've created (using cryptsetup luksOpen ...
), and supply the /dev/mapper/something device directly to setup-disk. When you're finished, be sure to relock the volume (using cryptsetup luksClose ...
) before rebooting.
If you install your / (root) on an encrypted volume, you'll need to manually edit/rebuild your initram and your extlinux.conf file. The following assumes that $MNT
holds the root directory you're installing into, that you've created the cryptvolume on the device /dev/md2, and that you want to unlock the encrypted volume into a virtual volume named "crypt":
# edit $MNT/etc/mkinitfs/mkinitfs.conf to make sure features="..." # includes cryptsetup (this field is space-separated and quoted) mkinitfs -c $MNT/etc/mkinitfs/mkinitfs.conf -b $MNT # edit $MNT/etc/update-extlinux.conf to make sure default_kernel_opts="..." # contains cryptroot=/dev/md1 and cryptdm=crypt (this field is also space-separated and quoted) # also check the root= setting extlinux --install $MNT/boot --update
--update
option to extlinux ...
suffice to make /boot/extlinux.conf be regenerated? Or do we need to manually tweak that file, or run update-extlinux
, as well?
You might also need to manually tweak $MNT/etc/fstab.
LVM
setup-disk
will automatically build and use volumes in a LVM group if you supply the -L switch.
If you instead want to build your LVM system manually, see Setting up Logical Volumes with LVM. Then vgchange -ay
, format and mount your volumes, and supply the root mountpoint to setup-disk. When you're finished, be sure to
umount ... vgchange -an
before rebooting.
If setup-disk
sees that you're using LVM, perhaps because you gave it the -L
switch, then it will set up your initram and extlinux.conf file properly. However, in other cases, these might not be properly set up. In that case, you may need to manually edit/rebuild them. The following assumes that $MNT
holds the root directory you're installing into:
# edit $MNT/etc/mkinitfs/mkinitfs.conf to make sure features="..." # includes lvm (this field is space-separated and quoted) mkinitfs -c $MNT/etc/mkinitfs/mkinitfs.conf -b $MNT # edit $MNT/etc/update-extlinux.conf to make sure root= is set correctly extlinux --install $MNT/boot --update
--update
option to extlinux ...
suffice to make /boot/extlinux.conf be regenerated? Or do we need to manually tweak that file, or run update-extlinux
, as well?
You might also need to manually tweak $MNT/etc/fstab.
Manual partitioning
Partitioning tools
The installation image enviroment may have only the very basic busybox built-in fdisk
command available. However, alpine allows you to install more complete partitioning tool packages like sfdisk
(scriptable fdisk), gptfdisk
, parted
(CLI), cfdisk
(text menus), or even gparted
(after setting up a graphical environment).
The following steps installs cfdisk
, looks for existing partitions, and runs cfdisk against /dev/sdX
:
# apk add cfdisk e2fsprogs
# blkid
/dev/sdX1: LABEL="some" UUID="..." TYPE="vfat" /dev/sdX2: LABEL="other" UUID="..." TYPE="ext4"
# cfdisk /dev/sdX
For "diskless" and "data" disk mode installs
- Be aware of this Bug: #11589. The APKOVL loading of diskless setups doesn't work on btrfs and xfs filesystems, or nvme-based devices => So, for the moment, use only ext4 filesystem partitions on classic drives to store diskless mode states.
The following creates an ext4 partition with disabled journaling, to reduce write operations and allow the disk to spin down after the .apkovl and the packages have been read from the partition during the boot.
# mkfs.ext4 -O ^has_journal /dev/sdXY # the "-O ^has_journal" DISABLES journaling ("^" means "not")
For "sys" disk mode installs
setup-disk
will by default set up a root partition, a separate /boot partition and a swap partition. If you want a different layout, you can manually create the partitions, filesystems and mount them on /mnt (or any other mount point) then run:
setup-disk /mnt
setup-disk
will install your running system on the mounted root, detect your file system layout and generate an fstab.
If you're using the MBR, you are responsible for making the proper partition bootable and make sure the MBR is OK for extlinux. If you're going to use EFI, make sure you mount esp
partition on /boot/efi
and set BOOTLOADER=grub
and USE_EFI=1
, and that grub-efi and efibootmgr are installed before running setup-disk
. If your system still does not boot, you can try to manually create a boot entry with efibootmgr, for which instructions can be found at EFI Boot Stub.
See also setup-partitions
Dual-booting
See Install to HDD with dual-boot
Other needs
Setting up swap
- create a partition with the type set to "linux swap" (82) (If you're going to use a logical volume for swap, skip this step and
lvcreate
that instead.) mkswap /dev/sda2
echo -e "/dev/sda2 none swap sw 0 0" >> /mnt/etc/fstab
swapon /dev/sda2
(orrc-service swap start
)
free -m
will show how much swap space is available (in MB).
If you prefer maximum speed, you don't need configure any raid devices for swap. Just add 2 swap partitions on different disks and linux will stripe them automatically. The downside is that the moment one disk fails, the system will go down. For better reliability, put swap on RAID1.
Custom boot partition size
The default boot partition size is under 40MB. This can cause errors if package updates require additional space on /boot.
Executing export BOOT_SIZE=512
before running setup-disk
will result in a 512MB boot partition.
Expanding an existing disk
Unlike gnu `fdisk`, busybox `fdisk` is rather limited in edit operations. Instead, use `cfdisk` and `resize2fs` to resize the disk. This can be done while booted.
Install tools:
# apk add cfdisk e2fsprogs-extra
resize disk
# cfdisk /dev/sda
- Select the target partition, often /dev/sda3
- Select Resize from the bottom menu
- Select Write, then Quit
resize filesystem with -f (online mode), then reboot
# resize2fs -f /dev/sda3 # reboot