Setting up disks manually: Difference between revisions

From Alpine Linux
m (fix formatting for Raid subtitle)
(moved System Disk Mode to own page)
 
(144 intermediate revisions by 21 users not shown)
Line 1: Line 1:
{{Draft}}
Setting up disks manually involves creating partitions using partitioning tools and formatting such partitions using various filesystem utilities to allow [[System Disk Mode]] or traditional HDD Installation of Alpine Linux. In addition to the above information, this page also documents various Disk layouts involving RAID, Encryption and LVM.


You may have complex needs that aren't handled automatically by the [[Alpine Setup Scripts]]. In those cases, you'll need to prepare your disks manually.
== Manual partitioning ==


=== RAID ===
[[System Disk Mode#setup-disk based Installation|setup-disk based Installation]] allows installing Alpine Linux on a partition after manually partitioning the HDD at the end of [[Installation#Base configuration|Base configuration step of Installation]]. However, the [[Installation#setup-alpine based System Disk Install|setup-alpine based System Disk Install]] requires and uses an entire HDD.
<code>setup-disk</code> will automatically build a RAID array if you supply the '''-r''' switch, or if you specify more than one device.
 
== Partitioning tools ==
 
The installation image environment may have only the very basic busybox built-in <code>fdisk</code> command available. Instead, Alpine Linux allows you to install any of the below listed partitioning tool immediately after setting up [[Installation#Base_configuration|base configuration]].
 
{|class="wikitable" align="center" style="width:100%; border:1px #0771a6 solid; background:#f9f9f9; text-align:left; border-collapse:collapse;"
|- style="background:#333333; color:#ffffff; font-size: 1.2em; text-align:center;"
| width="10%" |Command
|width="15%" | Package name
|width="40%"| Features
|          | Limitations
|-
| fdisk || Inbuilt {{pkg|busybox}} || can read GPT, Modify MBR || Cannot modify GPT
|-
| gdisk || {{pkg|gptfdisk}} || text mode, supports MBR/GPT bidirectional conversion, best for managing GPT partition tables|| None
|-
| cgdisk  || {{pkg|gptfdisk}}  || menu driven curses interface for gdisk || None
|-
| sgdisk || {{pkg|sgdisk}} || scriptable gdisk || Non-interactive
|-
| fdisk || {{pkg|util-linux-misc}} || text mode, supports both gpt and MBR, best for managing MBR partition tables || None except size due to other tools
|-
| cfdisk || {{pkg|cfdisk}} || menu driven curses interface for fdisk || None
|-
| sfdisk || {{pkg|sfdisk}} || scriptable fdisk || Non-interactive
|-
| parted || {{pkg|parted}} || text mode, supports both gpt and MBR|| cannot convert MBR to GPT, different interface from above tools
|}
 
Graphical tools like {{pkg|gparted}} and {{pkg|gnome-disk-utility}} can be used only after [[Installation#Post-Installation|setting up a graphical environment]].
 
== Creating partitions ==
 
For Alpine Linux, only the '''(/)'''root partition is mandatory. Even  a '''/boot''' partition and  '''swap''' are optional.
 
{{Warning|Make sure to choose the correct disk device in the below section. If you choose the wrong device, you will lose your data. Make a backup first and do not proceed, if you are unsure.}}
{{ic|cfdisk}} will be used in all examples here as it is based on text menu without any dependencies. However, installing the {{Pkg|cfdisk}} package requires network to be available if using Standard ISO boot image. Alternately, {{Pkg|<code>sfdisk</code>}} can be installed without network.  


If you instead want to build your RAID array manually, see [[Setting up a software raid1 array]]. Then you can add additional layers of encryption and/or LVM, or just assemble the RAID array, and supply the {{Path|/dev/md<i>i</i>}} device directly to [[setup-disk]]. When you're finished, be sure to disassemble the RAID array before rebooting.
{{Tip|Use {{ic|cgdisk}} from {{Pkg|gptfdisk}} package for GPT partitions and for conversion from MBR to GPT.}}


=== Encryption ===
The following step installs the {{Pkg|cfdisk}} package: {{cmd|# apk add cfdisk }}


See [[Setting up encrypted volumes with LUKS]]. Then you can add an additional layer of LVM, or just unlock the volume you've created (using <code>cryptsetup luksOpen ...</code>), and supply the {{Path|/dev/mapper/<i>something</i>}} device directly to [[setup-disk]]. When you're finished, be sure to relock the volume (using <code>cryptsetup luksClose ...</code>) before rebooting.
Before using {{ic|cfdisk}} to create partitions, the disk name must be identified by using {{ic|blkid}}:{{cmd|# blkid}}
<pre>
/dev/sdX1: LABEL="some" UUID="..." TYPE="vfat"
/dev/sdX2: LABEL="other" UUID="..." TYPE="ext4"
</pre>


=== LVM ===
When {{ic|cfdisk}} is run as follows, it looks for existing partitions on the disk {{Path|/dev/sdX}}: {{cmd|# cfdisk /dev/sdX}}
<code>setup-disk</code> 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 <code>vgchange -ay</code>, format and mount your volumes, and supply the root mountpoint to [[setup-disk]]. When you're finished, be sure to
== Resizing an existing partition ==
{{Cmd|umount ...
{{Warning|Make sure to choose the correct disk device in the below section. If you choose the wrong device, you will lose your data. Make a backup first and do not proceed, if you are unsure.}}
vgchange -an}}
before rebooting.


=== Dual-booting ===
{{ic|cfdisk}} and {{ic|resize2fs}} from {{pkg|e2fsprogs-extra}} package can be used to resize existing partitions of ext2/3/4 filsystem on the disk. For other filsystems, the necessary [[Filesystems#Filesystem_Tools|filesystem tools]] must be installed. This can be done while booted.
See [[Installing Alpine on HDD dualbooting|Install to HDD with dual-boot]]


=== Other needs ===
[[File:Cfdisk screenshot alpine 2024-03-04 143916.png|thumb|cfdisk screenshot ]]
* [[Installing Alpine Linux in a chroot]]
* [[Replacing non-Alpine Linux with Alpine remotely]]


To resize disk, launch the {{ic|cfdisk}}: {{cmd|# cfdisk {{path|/dev/sda}}}}


<!--
# Select the target partition, here as per image {{path|/dev/sda3}}
Create partition with with type "Linux" (83).
# Select ''Resize'' from the bottom menu.
apk_add e2fsprogs rsync
# Enter the new ''Size'' at the prompt.
mkfs.ext3 /dev/hda1
# Select ''Write'', then ''Quit''
mount -t ext3 /dev/hda1 /mnt
ROOT=/mnt apk_add uclibc busybox apk-tools alpine-baselayout alpine-conf
# Install busybox links
mkdir /mnt/proc && mount --bind /proc /mnt/proc && chroot /mnt /bin/busybox --install -s && umount /mnt/proc
# Copy the apk repository
rsync -ruav /media/cdrom/apks /mnt
mkdir /mnt/etc/apk && echo "APK_PATH=file://apks" > /mnt/etc/apk/apk.conf
# Copy the hd/ext3 initramfs image, kernel and kernel modules
rsync -ruav /media/cdrom/kernel/generic/hd-ext3.gz /media/cdrom/kernel/generic/bzImage /mnt
rsync -ruav /lib/modules/* /mnt/lib/modules/
-->


If a filesystem is resized with -f (online mode), then the system must be rebooted immediately after the change is made.


<!--
{{cmd|# resize2fs -f {{path|/dev/sda3}}
== Setting up the RAID ==
&num; reboot}}
Set up a raid array as described [[Setting up a software raid1 array|here]].
In this document two raid arrays are configured: md0 for swap (512MB) and md1 for /var.


== Create filesystem ==
== Formatting partitions ==
We need to install the software to create the filesystem ("format" the partition).
apk_add e2fsprogs


If you use an Alpine release older than 1.3.8 you will need to manually create a link to /etc/mtab.
{{Warning|The {{Path|/dev/sdXY}} is only an example. Make sure you use the right partition name/number. Use {{ic|blkid}} command to verify the partition name/number. Choosing the wrong partition leads to data loss. If you are unsure, do not proceed, seek [[Alpine Linux:Support|support]].}}
ln -fs /proc/mounts /etc/mtab


Create the filesystem. The -j option makes it ext'''3'''. Without the -j option it will become non-journaling ext'''2'''. This step might take some time if your partition is big.
Whenever a partition is [[#Creating_partitions|created]], the partition must be formatted first before using it. Depending on the filesystem to be used, the necessary [[Filesystems#Filesystem_Tools|formatting tool]] for the filesystem must be installed first.
mke2fs -j /dev/md1
{{:Filesystems}}


Install the [[Filesystems#Filesystem_Tools|filesystem tools]] first, if not done already. The following examples show how to use the formatting tools for different filesystems:


Now edit /etc/fstab and add your new partitions. Mine looks like this:
* e2fsprogs for ext4,ext3 and ext2. ext4 is the default filesystem in Alpine Linux: {{Cmd|# mkfs.ext4 /dev/sdaXY}}
none            /proc          proc    defaults 0 0
* btrfs-progs for [[btrfs]] filesystem. {{Cmd|# mkfs.btrfs /dev/sdaXY}}
none            /sys            sysfs  defaults 0 0
* dosfstools for fat12/fat16/fat32 filesystem. This is also used for [[UEFI|EFI]] system partition(ESP). {{Cmd|# mkfs.vfat /dev/sdaXY}}
udev            /dev            tmpfs  size=100k 0 0
* f2fs-tools for [[F2FS]] filesystem. {{Cmd|# mkfs.f2fs /dev/sdaXY}}
none            /dev/pts        devpts  defaults 0 0
tmpfs          /dev/shm        tmpfs  defaults 0 0
/dev/cdrom      /media/cdrom    iso9660 ro 0 0
/dev/fd0        /media/floppy  vfat   noauto  0 0
/dev/usba1      /media/usb      vfat    noauto  0 0
none            /proc/bus/usb  usbfs noauto 0 0
 
/dev/md0        swap            swap    defaults 0 0
/dev/md1        /var            ext3    defaults 0 0


== Move the data ==
== Disk layouts ==
Now you should stop all services running that put anything in /var (syslog for example). If you have booted on a clean installation and not run setup-alpine, then no services should be running. However, some packages might have created dirs in /var so we need to backup /var mount the new and move all backed up dirs back to the raided /var.


mv /var /var.tmp
It is possible to have one or more of [[#RAID|RAID]], [[#Encryption|encrypted]], and/or [[#LVM|Logical Volume]] on your {{Path|/}} (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 {{Path|/boot}} partition are configured properly.
mkdir /var
mount /var
mv /var.tmp/* /var
rmdir /var.tmp


Verify that everyting looks ok with the ''df'' utility.
Your {{Path|/boot}} directory cannot reside on an encrypted or LVM volume, at least not with Alpine's default bootloader (extlinux). (Grub2 can deal with {{Path|/boot}} being on an LVM volume.) The usual practice is to create a small partition for {{Path|/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.
~ $ df
Filesystem          1k-blocks      Used Available Use% Mounted on
none                    255172    23544    231628  9% /
udev                      100        0      100  0% /dev
/dev/cdrom              142276    142276        0 100% /media/cdrom
/dev/md1              37977060    181056  35866876  1% /var


== Survive reboots ==
Sometimes {{Path|/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 {{Path|/boot}}, it gets written to multiple physical partitions. During the pre-init, bootloader phase, only one of those partitions will be read from.
Now we have everything up and running. We need to make sure that everything will be restored during next reboot.


Create an initscript that will mount /var for you during boot. I call it /etc/init.d/mountdisk and it looks like this:
A typical setup might look like this:
#!/sbin/runscript
start() {
        ebegin "Mounting /var"
        mount /var
        eend $?
}
stop() {
        ebegin "Unmounting /var"
        umount /var
        eend $?
}


Make it exectutable:
<pre>
  chmod +x /etc/init.d/mountdisk
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               | |  |
  |  |  +-------------------------------------+ |  |
  |  +------------------------------------------+  |
  +------------------------------------------------+


'''NOTE:''' Since Alpine-1.7.3 there is a ''localmount'' script shipped so you will not need to create your own ''mountdisk'' script.


And that /var is mounted *after* raid is created. The -k option will make alpine to unmount the /Var partition during boot. Also add start of swap too boot
Two-disk system
  rc_add -k -s 06 mountdisk
---------------
  rc_add -k -s 06 swap
  +------------------------------------------------+  +------------------------------------------------+
  |  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 |
  |                                                |  |                                                |
  +------------------------------------------------+ +------------------------------------------------+


The /dev/md* device nodes will not be created automatically so we need to put the on floppy too.
</pre>
lbu include /dev/md*


If you have users on the server and want /home to be permanent, you can create a directory /var/home and create links to /var/home.
In a three-disk system, the {{Path|/boot}} would still be RAID1, but the larger partition might, in that case, be RAID5.
mkdir /var/home
mv /home/* /var/home/
ln -s /var/home/* /home/


'''NOTE:''' You cannot just replace /home with a link that points to /var/home since the base has a /home directory. When the boot tries to copy the config from floppy it will fail because of the already existing /home directory.
=== RAID ===
{{Main|Setting up a software RAID array}}
<code>setup-disk</code> will automatically build a RAID array if you supply the '''-r''' switch, or if you specify more than one device.


Make sure the links are stored to floppy:
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 {{Path|/dev/md<i>i</i>}} device directly to [[setup-disk]]. When you're finished, be sure to disassemble the RAID array before rebooting.
lbu include /home/*


Also remember to move any newly created users to /var/home and create a link:
If <code>setup-disk</code> sees that you're using RAID, either because you gave it the <code>-r</code> switch, or multiple devices, or a {{Path|/dev/md<i>i</i>}} 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 <code>setup-disk</code> 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 <code>$MNT</code> holds the root directory you're installing into:
adduser bob
mv /home/bob /var/home/
ln -s /var/home/bob /home/bob
lbu include /home/bob


Save to floppy:
{{Cmd|1=echo "/sbin/mdadm" > $MNT/etc/mkinitfs/files.d/raid
lbu commit floppy
echo "/etc/mdadm.conf" >> $MNT/etc/mkinitfs/files.d/raid
&#35; edit $MNT/etc/mkinitfs/mkinitfs.conf to make sure features="..."
&#35; includes raid (this field is space-separated and quoted)
mkinitfs -c $MNT/etc/mkinitfs/mkinitfs.conf -b $MNT
&#35; edit $MNT/etc/update-extlinux.conf to make sure modules=... contains
&#35; raid1 or raid456 (whichever your / is on; this field is comma-separated)
&#35; also check the root= setting
extlinux --raid --install $MNT/boot --update
}}


== Test it works ==
You might also need to manually tweak {{Path|$MNT/etc/fstab}}. And you might need to copy {{Path|/usr/share/syslinux/mbr.bin}} to your disk's MBR.
Reboot computer. Now should the raid start and /var should be mounted. Check with df:
~ $ df
Filesystem          1k-blocks      Used Available Use% Mounted on
none                    255172    23976    231196  9% /
mdev                      100        0      100  0% /dev
/dev/cdrom              140932    140932        0 100% /media/cdrom
/dev/md1              37977060    180984  35866948  1% /var


== Upgrades ==
=== Encryption ===
Since the package database is placed on disk, you cannot update by simply replacing the CDROM. You will have to either run the upgrade on the new CDROM or run ''apk_add -u ... && update-conf'' manually.
{{Main|Setting up encrypted volumes with LUKS}}
-->


You can add an additional Logical Volume layer, or just unlock the volume you've created (using <code>cryptsetup luksOpen ...</code>), and supply the {{Path|/dev/mapper/<i>something</i>}} device directly to [[setup-disk]]. When you're finished, be sure to relock the volume (using <code>cryptsetup luksClose ...</code>) before rebooting.


If you install your {{Path|/}} (root) on an encrypted volume, you'll need to manually edit/rebuild your initram and your extlinux.conf file. The following assumes that <code>$MNT</code> holds the root directory you're installing into, that you've created the cryptvolume on the device {{Path|/dev/md2}}, and that you want to unlock the encrypted volume into a virtual volume named "crypt":


{{Cmd|1=&#35; edit $MNT/etc/mkinitfs/mkinitfs.conf to make sure features="..."
&#35; includes cryptsetup (this field is space-separated and quoted)
mkinitfs -c $MNT/etc/mkinitfs/mkinitfs.conf -b $MNT
&#35; edit $MNT/etc/update-extlinux.conf to make sure default_kernel_opts="..."
&#35; contains cryptroot=/dev/md1 and cryptdm=crypt (this field is also space-separated and quoted)
&#35; also check the root= setting
extlinux --install $MNT/boot --update
}}


You might also need to manually tweak {{Path|$MNT/etc/fstab}}.


=== LVM ===
{{Main|Setting up Logical Volumes with LVM}}


<code>setup-disk</code> 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 <code>vgchange -ay</code>, format and mount your volumes, and supply the root mountpoint to [[setup-disk]]. When you're finished, be sure to
{{Cmd|umount ...
vgchange -an}}
before rebooting.


== Setting up swap ==
If <code>setup-disk</code> sees that you're using LVM, perhaps because you gave it the <code>-L</code> 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 <code>$MNT</code> holds the root directory you're installing into:


# create partition with type "linux swap" (82)
{{Cmd|1=&#35; edit $MNT/etc/mkinitfs/mkinitfs.conf to make sure features="..."
# <code>mkswap /dev/sda2</code>
&#35; includes lvm (this field is space-separated and quoted)
# <code>echo -e "/dev/sda2 none swap sw 0 0" >> /mnt/etc/fstab</code>
mkinitfs -c $MNT/etc/mkinitfs/mkinitfs.conf -b $MNT
# <code>swapon /dev/sda2</code>
&#35; edit $MNT/etc/update-extlinux.conf to make sure root= is set correctly
extlinux --install $MNT/boot --update
}}


Then {{Cmd|free}} will show how much swap space is available.
You might also need to manually tweak {{Path|$MNT/etc/fstab}}.


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 at the moment one disk fails, the system will go down. For better reliability, put swap on raid1.
== Troubleshooting ==


See also [[Alpine Setup Scripts#setup-cryptswap|setup-cryptswap]].
== See also ==
* [https://www.rodsbooks.com/gdisk/index.html Gdisk official website] '' walkthroughs available for gdisk,cgdisk and sgdisk''
[[Category:Storage]]

Latest revision as of 15:23, 31 October 2025

Setting up disks manually involves creating partitions using partitioning tools and formatting such partitions using various filesystem utilities to allow System Disk Mode or traditional HDD Installation of Alpine Linux. In addition to the above information, this page also documents various Disk layouts involving RAID, Encryption and LVM.

Manual partitioning

setup-disk based Installation allows installing Alpine Linux on a partition after manually partitioning the HDD at the end of Base configuration step of Installation. However, the setup-alpine based System Disk Install requires and uses an entire HDD.

Partitioning tools

The installation image environment may have only the very basic busybox built-in fdisk command available. Instead, Alpine Linux allows you to install any of the below listed partitioning tool immediately after setting up base configuration.

Command Package name Features Limitations
fdisk Inbuilt busybox can read GPT, Modify MBR Cannot modify GPT
gdisk gptfdisk text mode, supports MBR/GPT bidirectional conversion, best for managing GPT partition tables None
cgdisk gptfdisk menu driven curses interface for gdisk None
sgdisk sgdisk scriptable gdisk Non-interactive
fdisk util-linux-misc text mode, supports both gpt and MBR, best for managing MBR partition tables None except size due to other tools
cfdisk cfdisk menu driven curses interface for fdisk None
sfdisk sfdisk scriptable fdisk Non-interactive
parted parted text mode, supports both gpt and MBR cannot convert MBR to GPT, different interface from above tools

Graphical tools like gparted and gnome-disk-utility can be used only after setting up a graphical environment.

Creating partitions

For Alpine Linux, only the (/)root partition is mandatory. Even a /boot partition and swap are optional.

Warning: Make sure to choose the correct disk device in the below section. If you choose the wrong device, you will lose your data. Make a backup first and do not proceed, if you are unsure.


cfdisk will be used in all examples here as it is based on text menu without any dependencies. However, installing the cfdisk package requires network to be available if using Standard ISO boot image. Alternately, sfdisk can be installed without network.

Tip: Use cgdisk from gptfdisk package for GPT partitions and for conversion from MBR to GPT.

The following step installs the cfdisk package:

# apk add cfdisk

Before using cfdisk to create partitions, the disk name must be identified by using blkid:

# blkid

/dev/sdX1: LABEL="some" UUID="..." TYPE="vfat"
/dev/sdX2: LABEL="other" UUID="..." TYPE="ext4"

When cfdisk is run as follows, it looks for existing partitions on the disk /dev/sdX:

# cfdisk /dev/sdX

Resizing an existing partition

Warning: Make sure to choose the correct disk device in the below section. If you choose the wrong device, you will lose your data. Make a backup first and do not proceed, if you are unsure.


cfdisk and resize2fs from e2fsprogs-extra package can be used to resize existing partitions of ext2/3/4 filsystem on the disk. For other filsystems, the necessary filesystem tools must be installed. This can be done while booted.

cfdisk screenshot

To resize disk, launch the cfdisk:

# cfdisk /dev/sda

  1. Select the target partition, here as per image /dev/sda3
  2. Select Resize from the bottom menu.
  3. Enter the new Size at the prompt.
  4. Select Write, then Quit

If a filesystem is resized with -f (online mode), then the system must be rebooted immediately after the change is made.

# resize2fs -f /dev/sda3 # reboot

Formatting partitions

Warning: The /dev/sdXY is only an example. Make sure you use the right partition name/number. Use blkid command to verify the partition name/number. Choosing the wrong partition leads to data loss. If you are unsure, do not proceed, seek support.


Whenever a partition is created, the partition must be formatted first before using it. Depending on the filesystem to be used, the necessary formatting tool for the filesystem must be installed first.

Tool Filesystem Formatting command Brief Notes
btrfs-progs Btrfs mkfs.btrfs combines copy-on-write and volume management
dosfstools FAT12/FAT16/FAT32 mkfs.vfat also used for EFI partition
e2fsprogs ext2/ext3/ext4 mkfs.ext4 ext4 is current default in Linux
exfatprogs exfat mkfs.exfat Commonly used on USB flash drives and SD cards
f2fs-tools F2FS mkfs.f2fs
hfsprogs HFS/HFS+ mkfs.hfsplus Apple/Mac products
jfsutils JFS mkfs.jfs
ntfs-3g-progs NTFS mkfs.ntfs Full-featured, Microsoft/Windows FUSE driver
squashfs-tools SquashFS mksquashfs compressed read-only file system
xfsprogs XFS mkfs.xfs

Install the filesystem tools first, if not done already. The following examples show how to use the formatting tools for different filesystems:

  • e2fsprogs for ext4,ext3 and ext2. ext4 is the default filesystem in Alpine Linux:

    # mkfs.ext4 /dev/sdaXY

  • btrfs-progs for btrfs filesystem.

    # mkfs.btrfs /dev/sdaXY

  • dosfstools for fat12/fat16/fat32 filesystem. This is also used for EFI system partition(ESP).

    # mkfs.vfat /dev/sdaXY

  • f2fs-tools for F2FS filesystem.

    # mkfs.f2fs /dev/sdaXY

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

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

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

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

You might also need to manually tweak $MNT/etc/fstab.

Troubleshooting

See also