# Need help with custom initramfs, not mounting home and swap.

## vaav

I made custom initramfs, that basically only need lvm and cryptsetup support. 

When booting the systemd Gentoo with custom kernel, the boot process get stuck on recognizing /home and swap. I am able to paste the exact error systemd spits out. However right now i am using genkernel to generate the initramfs, so i can have functional system.

To produce the journalctl -xb errors is kind of a hassle at this moment. I will post the exact error when i got time. But it boils down to: systemd time out when booting and starting to fsck and mount the /dev/mapper/Hellovaa-home and /dev/mapper/Hellovaa-swap

After the time out on home and swap, i get dropped to emergency shell.

With the custom initramfs, i can start /dev/mapper/Hellovaa-root, but when i do "ls -l /dev/disk/by-uuid" and lsblk: only the cryptlvm (luks-device) on nvme0n1p2 and the boot partition on nvme0n1p1 are recognized.

I think the kernel config is ok. because it works fine with genkernel generated initramfs.

This is my kernel .config: http://dpaste.com/2DRPYSS

Note that inside that .config i disabled the /usr/src/initramfs source path to disable the failing initramfs for now, that is embedded into the kernel. So normally the /usr/src/initramfs source path is included into the kernel.

Here is my luks lvm disk layout:

```
$ lsblk

NAME                             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT

nvme0n1                          259:0    0 119.2G  0 disk  

├─nvme0n1p1                      259:1    0   699M  0 part  /boot

└─nvme0n1p2                      259:2    0 118.6G  0 part  

  └─root_nvme0n1p2-Hellovaa-root 253:0    0 118.6G  0 crypt 

    ├─Hellovaa-swap              253:1    0     8G  0 lvm   [SWAP]

    ├─Hellovaa-root              253:2    0    32G  0 lvm   /

    └─Hellovaa-home              253:3    0  78.6G  0 lvm   /home
```

Here are the UUID of the volumes:

```
$ ls -l /dev/disk/by-uuid

total 0

lrwxrwxrwx 1 root root 10 Feb  4 23:40 1a77729e-e978-4553-92ed-917ed1c1a0b5 -> ../../dm-3

lrwxrwxrwx 1 root root 10 Feb  4 23:40 35862606-6b6a-484a-8606-4875d80fe279 -> ../../dm-1

lrwxrwxrwx 1 root root 15 Feb  4 23:40 7335-B062 -> ../../nvme0n1p1

lrwxrwxrwx 1 root root 10 Feb  4 23:40 dbdfcefa-5e86-45d0-994f-7a454ac5a26f -> ../../dm-2

lrwxrwxrwx 1 root root 15 Feb  4 23:40 fd4cf64f-e364-44c8-8287-223909711e34 -> ../../nvme0n1p2
```

/etc/fstab:

```
/dev/nvme0n1p1                                 /boot           vfat            defaults,noatime          1 2

UUID=dbdfcefa-5e86-45d0-994f-7a454ac5a26f      /               ext4            noatime                   0 1

UUID=1a77729e-e978-4553-92ed-917ed1c1a0b5      /home           ext4            noatime                   0 1

UUID=35862606-6b6a-484a-8606-4875d80fe279      none            swap            sw                        0 0
```

And here is the simple initramfs, that is faling to mount home and swap:

```
#!/bin/busybox sh

# Create applets

rescue_shell() {

    echo "Something went Wrong. Dropping to a shell."

    /bin/busybox mkdir -p /usr/sbin /usr/bin /sbin /bin

    /bin/busybox --install -s

    exec /bin/sh

}

# Prepare

mount -t proc none /proc

mount -t sysfs none /sys

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

# Unlock Key

cryptsetup --tries 5 luksOpen $(findfs UUID=fd4cf64f-e364-44c8-8287-223909711e34) cryptlvm

# LVM

lvm vgscan --mknodes || rescue_shell "vgscan failed"

lvm vgchange -a ly Hellovaa/root

lvm vgscan --mknodes || recure_shell "vgscan failed"

# Mount the root filesystem

mount -o ro $(findfs UUID=dbdfcefa-5e86-45d0-994f-7a454ac5a26f) /mnt/root || rescue_shell

# Clean up

umount /proc

umount /sys

# Switchrepoo

exec switch_root /mnt/root /sbin/init
```

Side-note: in this initramfs i am using mdev, because i thought that using devtmpfs was the culprit.

So basically it comes down to i think for "some" reason home and swap not being detected by the system? Can someone please provide some insight, and help boot the box up with custom initramfs.

----------

## AlexJGreen

_Last edited by AlexJGreen on Mon Dec 28, 2020 3:20 am; edited 1 time in total

----------

## szatox

First things first: At what point exactly does it fail?

Then some tips:

 *Quote:*   

> # Prepare
> 
> mount -t proc none /proc
> 
> mount -t sysfs none /sys
> ...

 

You can also mount /dev (-t devtmpfs) instead of generating it with mdev. Kernel already knows what's there. And also /dev/pts on top of that, for terminals.

 *Quote:*   

> # Mount the root filesystem
> 
> mount -o ro $(findfs UUID=dbdfcefa-5e86-45d0-994f-7a454ac5a26f) /mnt/root || rescue_shell

 

You have LVM there. Use names instead (/dev/vg/lv or /dev/mapper/vg-lv ). UUIDs on top of LVM are bad. What if you create a snapshot?

 *Quote:*   

> # Clean up
> 
> umount /proc
> 
> umount /sys
> ...

 Why, oh why? Is there anything specific to your setup that requires umounting everything before switch_root?

Finally, what's not there:

You do not attempt to mount /home and activate swap in this script. And it's OK. You should add them to /etc/fstab instead and have system init mount them for you, after switch_root.

Which makes me wonder why you think it's an issue with your custom initramfs (I'm not saying it's not. I just don't see how those 2 are related right now)

Once you get to the rescue shell, in what state your system is? Are you able to finish the initial setup manually and then hand over with switch_root?

----------

## Goverp

 *szatox wrote:*   

> ...
> 
>  *Quote:*   # Clean up
> 
> umount /proc
> ...

 

As I found recently, umounting is wrong because busybox's switch_root behaves differently to util-linux's, and I'm not sure how umount ever worked.  The best thing is to move the mounts into your new root.  Note that busybox's mount command has different syntax to util-linux's.

```
mount -o move /proc /mnt/root/proc

mount -o move /sys /mnt/root/sys

mount -o move /dev/mnt/root/dev
```

----------

## vaav

 *szatox wrote:*   

> First things first: At what point exactly does it fail?
> 
> Then some tips:
> 
>  *Quote:*   # Prepare
> ...

 

Just woke up, so i will post the journalctl -xb output to wgetpaste right now, will take about 30 minutes from now and i will update this post with the point the system exactly fails.

I used both mounting with devtmpfs and mdev, with no success.

 *Quote:*   

> # Mount the root filesystem
> 
> mount -o ro $(findfs UUID=dbdfcefa-5e86-45d0-994f-7a454ac5a26f) /mnt/root || rescue_shell

 

 *Quote:*   

> You have LVM there. Use names instead (/dev/vg/lv or /dev/mapper/vg-lv ). UUIDs on top of LVM are bad. What if you create a snapshot?

 

Thanks for the advise, i will use names instead of UUID next time.

 *Quote:*   

> # Clean up
> 
> umount /proc
> 
> umount /sys
> ...

  *Quote:*   

> Why, oh why? Is there anything specific to your setup that requires umounting everything before switch_root?
> 
> Finally, what's not there:
> 
> You do not attempt to mount /home and activate swap in this script. And it's OK. You should add them to /etc/fstab instead and have system init mount them for you, after switch_root.
> ...

 

The same /etc/fstab and kernel .config works with genkernel generated initramfs: # genkernel --luks --lvm --udev --install initramfs

So i thought that just replacing the genkernel initramfs with the simple custom initramfs would be enough to make the system boot.

----------

## vaav

 *Goverp wrote:*   

>  *szatox wrote:*   ...
> 
>  *Quote:*   # Clean up
> 
> umount /proc
> ...

 

Thanks for the advise, i will change umount to mount -o move in my next attempt.

----------

## vaav

 *coderanger wrote:*   

> It looks like systemd wants udev support to be present in initramfs
> 
> The issue https://forums.gentoo.org/viewtopic-t-1107588.html has the same symptoms

 

I Thought that simple initramfs does not include udev. So i should use devtmpfs instead, correct me if i am wrong.

----------

## vaav

Here are some log files about the exact issue:

dmesg:

Your paste can be seen here: http://dpaste.com/10MRJQM

here is where the mounting of swap and home fails:

Your paste can be seen here: http://dpaste.com/08ZDNZY

here is the full output of # journalctl -xb

Your paste can be seen here: http://dpaste.com/2BQJHDM

here is the init i am using:

```

#!/bin/busybox sh

# Create applets

rescue_shell() {

    echo "Something went Wrong. Dropping to a shell."

    /bin/busybox mkdir -p /usr/sbin /usr/bin /sbin /bin

    /bin/busybox --install -s

    exec /bin/sh

}

# Prepare

mount -t proc none /proc

mount -t sysfs none /sys

mount -t devtmpfs none /dev

# Unlock Key

cryptsetup --tries 5 luksOpen $(findfs UUID=fd4cf64f-e364-44c8-8287-223909711e34) cryptlvm

# LVM

lvm vgscan --mknodes || rescue_shell "vgscan failed"

lvm lvchange -a ly Hellovaa/root

lvm vgscan --mknodes || recure_shell "vgscan failed"

# Mount the root filesystem

mount -o ro /dev/mapper/Hellovaa-root /mnt/root || rescue_shell

# Clean up

mount -o move /proc /mnt/root/proc

mount -o move /sys /mnt/root/sys

mount -o move /dev/mnt/root/dev

# Switchrepoo

exec switch_root /mnt/root /sbin/init
```

/etc/fstab

```

# /etc/fstab: static file system information.

#

# noatime turns off atimes for increased performance (atimes normally aren't 

# needed); notail increases performance of ReiserFS (at the expense of storage 

# efficiency).  It's safe to drop the noatime options if you want and to 

# switch between notail / tail freely.

#

# The root filesystem should have a pass number of either 0 or 1.

# All other filesystems should have a pass number of 0 or greater than 1.

#

# See the manpage fstab(5) for more information.

#

# <fs>                  <mountpoint>    <type>          <opts>          <dump/pass>

# NOTE: If your BOOT partition is ReiserFS, add the notail option to opts.

#

# NOTE: Even though we list ext4 as the type here, it will work with ext2/ext3

#       filesystems.  This just tells the kernel to use the ext4 driver.

#

# NOTE: You can use full paths to devices like /dev/sda3, but it is often

#       more reliable to use filesystem labels or UUIDs. See your filesystem

#       documentation for details on setting a label. To obtain the UUID, use

#       the blkid(8) command.

#LABEL=boot             /boot           ext4            noauto,noatime  1 2

#UUID=58e72203-57d1-4497-81ad-97655bd56494              /               ext4            noatime         0 1

#LABEL=swap             none            swap            sw              0 0

#/dev/cdrom             /mnt/cdrom      auto            noauto,ro       0 0

#/dev/nvme0n1p1                                 /boot           vfat            defaults,noatime          1 2

#UUID=dbdfcefa-5e86-45d0-994f-7a454ac5a26f      /               ext4            noatime                   0 1

#UUID=1a77729e-e978-4553-92ed-917ed1c1a0b5      /home           ext4            noatime                   0 1

#UUID=35862606-6b6a-484a-8606-4875d80fe279      none            swap            sw                        0 0

/dev/nvme0n1p1          /boot           vfat            defaults,noatime 1 2

/dev/mapper/Hellovaa-root /             ext4            noatime          0 1

/dev/mapper/Hellovaa-home /home         ext4            noatime          0 1

/dev/mapper/Hellovaa-swap none          swap            sw               0 0
```

The first thing i notice when booting: After providing the luks keys, the first thing that is displayed is: MOUNT CAN NOT FIND /etc/fstab

[edit] Here is grub kernel parameter:

```
GRUB_CMDLINE_LINUX="crypt_root=UUID=fd4cf64f-e364-44c8-8287-223909711e34 dolvm ipv6.disable=1 nvidia-drm.modeset=1 init=/lib/systemd/systemd rootfstype=ext4 i8042.noloop i8042.nomux i8042.nopnp i8042.reset loglevel=2"
```

----------

## vaav

Made small progression, however systemd still failing to mount swap and home.

First the system could not recognize /dev/mapper/Hellovaa-swap and /dev/mapper/Hellovaa-root at all.

After changing the LVM section in the init script from:

```

# LVM

lvm vgscan --mknodes || rescue_shell "vgscan failed"

lvm lvchange -a ly Hellovaa/root

lvm vgscan --mknodes || recure_shell "vgscan failed" 
```

to ->

```
# LVM

lvm vgscan --mknodes || rescue_shell "vgscan failed"

lvm lvchange -a ly Hellovaa/root

lvm lvchange -a ly Hellovaa/home

lvm lvchange -a ly Hellovaa/swap

lvm vgscan --mknodes || recure_shell "vgscan failed" 
```

# lsblk will list that swap and home are detected by the system now.

```
 $ lsblk

NAME                MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT

nvme0n1             259:0    0 119.2G  0 disk  

├─nvme0n1p1         259:1    0   699M  0 part  /boot

└─nvme0n1p2         259:2    0 118.6G  0 part  

  └─cryptlvm        253:0    0 118.6G  0 crypt 

    ├─Hellovaa-root 253:1    0    32G  0 lvm   /

    ├─Hellovaa-home 253:2    0  78.6G  0 lvm   /home

    └─Hellovaa-swap 253:3    0     8G  0 lvm   [SWAP]
```

So when systemd still fails to mount swap and home, i get dropped to emergency shell, i can log-in with root user. Then do:

# mount /dev/mapper/Hellovaa-home /mnt/home

# swapon /dev/mapper/Hellovaa-swap

Log out root-user, then log-in with regular user and startx.

Only still stuck on why systemd does not mount home and swapon swap.

Side-note: /etc/fstab is being read by the system, at least i think because the error mount /etc/fstab is not displayed anymore.

Any help is still appreciated.

----------

## vaav

One more thing, it's still pretty vague for me what /usr/src/initramfs/dev exactly should contain. At the moment i got:

```
$ ls -a /usr/src/initramfs/dev/

.  ..  console  control  cryptlvm  dm-0  dm-1  dm-2  dm-3  Hellovaa-home  Hellovaa-root  Hellovaa-swap  null  nvme0n1  nvme0n1p1  nvme0n1p2  random  tty  urandom
```

----------

## vaav

 *coderanger wrote:*   

> It looks like systemd wants udev support to be present in initramfs
> 
> The issue https://forums.gentoo.org/viewtopic-t-1107588.html has the same symptoms

 

After reading the www, i start to think it might not be possible to get custom initramfs in combination with systemd.

Can someone confirm if we are forced to use genkernel-next (or dracut) to generate the initramfs with -udev flag?

Been spending 5 days on trying to get the custom initramfs to work, but keep on failing to mount swap and root.

For now i will give up.  :  :Evil or Very Mad:   And will stick to genkernel-next to generate the initramfs.

----------

## Hu

 *vaav wrote:*   

> One more thing, it's still pretty vague for me what /usr/src/initramfs/dev exactly should contain.

 Nothing, because you should have the initramfs generated from a manifest.  :Wink:   You should use a devtmpfs in the initramfs, so the manifest only needs to provide (at most) the very basic nodes like console, null, and tty:

```
dir /dev 755 0 0

nod /dev/null 644 0 0 c 1 3

nod /dev/tty 644 0 0 c 5 0

nod /dev/console 600 0 0 c 5 1
```

Why is the service timing out?  It should either succeed or fail instantly, depending on whether the device node is present and functional.  Since it is already waiting and presumably retrying, what happens if you increase the timeout?  What can you see if you add a prerequisite service that lists all available devices, then exits success?

----------

## vaav

 *Hu wrote:*   

>  *vaav wrote:*   One more thing, it's still pretty vague for me what /usr/src/initramfs/dev exactly should contain. Nothing, because you should have the initramfs generated from a manifest.   You should use a devtmpfs in the initramfs, so the manifest only needs to provide (at most) the very basic nodes like console, null, and tty:
> 
> ```
> dir /dev 755 0 0
> 
> ...

 

Oke that is good to know.

 *Hu wrote:*   

> 
> 
> Why is the service timing out?  It should either succeed or fail instantly, depending on whether the device node is present and functional.  Since it is already waiting and presumably retrying, what happens if you increase the timeout?  What can you see if you add a prerequisite service that lists all available devices, then exits success?

 

I am not 100% why mounting swap and home is timing out. When looking at journalctl -xb: http://dpaste.com/08ZDNZY

It looks like fsck is starting and times out.

About increasing the time-out: 1 minute and 30 seconds is already a pretty long time out i.m.h.o  :Wink: 

Not sure what you mean with: "What can you see if you add a prerequisite service that lists all available devices, then exits success"

Honestly Hu, what should i do now?

I start to believe that the only option is genkernel-next initramfs with --udev flag. Not sure if it's even possible to get custom simple initramfs on this particular system build.

[edit]

```
-- The unit systemd-rfkill.service has successfully entered the 'dead' state.

Feb 05 21:20:32 Rerrazaur systemd[1]: dev-mapper-Hellovaa\x2dhome.device: Job dev-mapper-Hellovaa\x2dhome.device/start timed out.

Feb 05 21:20:32 Rerrazaur systemd[1]: Timed out waiting for device /dev/mapper/Hellovaa-home.

-- Subject: A start job for unit dev-mapper-Hellovaa\x2dhome.device has failed

-- Defined-By: systemd

-- Support: https://gentoo.org/support/

-- 

-- A start job for unit dev-mapper-Hellovaa\x2dhome.device has finished with a failure.

-- 

-- The job identifier is 57 and the job result is timeout.

Feb 05 21:20:32 Rerrazaur systemd[1]: Dependency failed for /home.

-- Subject: A start job for unit home.mount has failed

-- Defined-By: systemd

-- Support: https://gentoo.org/support/

-- 

-- A start job for unit home.mount has finished with a failure.
```

Not sure if /dev/rfkill got anything to do with the issue.

Systemd saying: " Dependency failed " what could that be?

[another edit] Seems that the system is trying to mount swap and root that does not exist. No solution so far.

----------

## Hu

I asked why it is timing out because I don't think it should be waiting at all.  It should either immediately succeed or immediately fail.  Delaying is wrong.

We need to see the system state, and none of your journalctl output shows that.  I want to know when those device nodes appear, because that tells us whether the mount fails because the nodes are missing or because they are broken.

----------

## vaav

 *Hu wrote:*   

> I asked why it is timing out because I don't think it should be waiting at all.  It should either immediately succeed or immediately fail.  Delaying is wrong.
> 
> 

 Ah oke, sorry for misunderstanding.

 *Hu wrote:*   

> We need to see the system state, and none of your journalctl output shows that.  I want to know when those device nodes appear, because that tells us whether the mount fails because the nodes are missing or because they are broken.

 

How can i provide such information about, when nodes appear, if mount fails, or nodes are missing because they are broken?

Could you guide me trough the process?

Sorry for late reaction, just woke up in Netherlands  :Wink: 

----------

## vaav

One more confusion on mounting the root filesystem to ? /mnt/root ? 

Is that on /mnt/root

or on /usr/src/initramfs/mnt/root?

----------

## vaav

Just to clear things up. For /usr/src/initramfs/dev 

I do:

```
/usr/src/initramfs/dev $ sudo rm *

/usr/src/initramfs/dev $ ls

/usr/src/initramfs/dev $ sudo cp --archive /dev/{null,console,tty,nvme0n1p2} /usr/src/initramfs/dev/

/usr/src/initramfs/dev $ ls

console  null  nvme0n1p2  tty

```

And I noticed in the past the /dev/nvme0n1p2 (luks device) was labeled "cryptlvm" and lsblk would show "cryptlvm". But now i noticed that the /dev/nvme0n1p2/ (luks device) is called: 

"root_nvme0n1p2-Hellovaa-root" and NOT "cryptlvm".

Does the name change of /dev/nvme0n1p2 (luks device) matter?

```

/usr/src/initramfs $ lsblk

NAME                             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT

nvme0n1                          259:0    0 119.2G  0 disk  

├─nvme0n1p1                      259:1    0   699M  0 part  /boot

└─nvme0n1p2                      259:2    0 118.6G  0 part  

  └─root_nvme0n1p2-Hellovaa-root 253:0    0 118.6G  0 crypt 

    ├─Hellovaa-swap              253:1    0     8G  0 lvm   [SWAP]

    ├─Hellovaa-root              253:2    0    32G  0 lvm   /

    └─Hellovaa-home              253:3    0  78.6G  0 lvm   /home

```

```

/usr/src/initramfs $ sudo parted -a optimal /dev/nvme0n1

GNU Parted 3.3

Using /dev/nvme0n1

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) p                                                                

Model: RPFTJ128PDD2EWX (nvme)

Disk /dev/nvme0n1: 128GB

Sector size (logical/physical): 512B/512B

Partition Table: gpt

Disk Flags: 

Number  Start   End    Size   File system  Name       Flags

 1      1049kB  734MB  733MB  fat32        bios_grub  bios_grub

 2      735MB   128GB  127GB               cryptlvm

```

Still stuck  :Sad: 

----------

## Hu

 *vaav wrote:*   

> How can i provide such information about, when nodes appear, if mount fails, or nodes are missing because they are broken?

 Make the initramfs print the required data to screen.  For things that happen after systemd takes over, you may need to make systemd print the required information.  I don't know how to make it do that. *vaav wrote:*   

> One more confusion on mounting the root filesystem to ? /mnt/root ? 
> 
> Is that on /mnt/root
> 
> or on /usr/src/initramfs/mnt/root?

 /mnt/root in the initramfs. *vaav wrote:*   

> Just to clear things up. For /usr/src/initramfs/dev 
> 
> I do:

 That should be safe, although unnecessary.  You only need enough nodes to get devtmpfs up. *vaav wrote:*   

> And I noticed in the past the /dev/nvme0n1p2 (luks device) was labeled "cryptlvm" and lsblk would show "cryptlvm".
> 
> Does the name change of /dev/nvme0n1p2 (luks device) matter?

 Only if your boot process depends on those names.

What do you hope to achieve by using a custom initramfs?  Why are you trying to avoid the use of a generated one that works?

----------

## vaav

 *Hu wrote:*   

> What do you hope to achieve by using a custom initramfs?  Why are you trying to avoid the use of a generated one that works?

 

I thought it would be cool to make initramfs by hand, and not depend on genkernel-next to make the initramfs.

But honestly i did not expect making the initramfs with this exotic gentoo setup would be that much of a p.i.t.a.

So for now, because i use the Gentoo box for gaming, i will just stick to: genkernel-next to make the initramfs with udev support.

I will not mark thread solved, because the issue is not solved.

For now i will:

```
$ sudo rm -r /usr/src/initramfs/
```

and:

```
genkernel --luks --lvm --udev --install initramfs
```

----------

## Hu

I use a custom initramfs that looks very similar to the one you showed, and it works fine.  I don't use systemd though, so I don't know if its startup processes expect something that my current initramfs does not do.

----------

## NeddySeagoon

vaav,

I use a custom initrd without systemd too.

As my initrd does not contain any kernel modules, its like firmware. Unchanged since the system was new in 2009.

You need to take care that you do not need any kernel modules to be able to mount the real root.

That implies that you didn't make your kernel with 

```
genkernel all
```

as almost everything is modular.

```
ls -l /dev/disk/by-uuid
```

is not expected to work in the initrd.

All the /dev/disk/by* entries are symbolic links created by udev and you don't have udev in the initrd.

I use the initrd creation process documented on the wiki

That does not require devtmpfs to provide /dev.

That example is all the userspace tools for root on lvm on top of raid5.

You will need to drop the raid5 and add in luks.

----------

## vaav

Hey NeddySeagoon,

The kernel is not build with genkernel.

The kernel .config can be seen in post #1, i am pretty sure there are no modular modules, that are being expected when booting the initramfs. The initramfs kernel dependency's are all build-in. Unless i missed one by accident, i think the kernel should be fine. 

Looking at the wiki you provided, i am trying to translate the initramfs_list to my own setup.

I stripped away the # Raid section. And changed the /dev/sda /dev/sdb devices to /dev/nvme0 because that is the only ssd i am using.

To include dm-crypt (luks) into the initramfs_list  how would i do that?

The custom initramfs gentoo handbook notes that: "Since cryptsetup also often requires the use of the kernel's random device, include them as well."

```
# cp --archive /dev/{urandom,random} /usr/src/initramfs/dev 
```

I have problems with building lvm2 and cryptsetup static, on my previous initramfs attempt i had to lddtree the /sbin/lvm and /sbin/cryptsetup dynamically. How would i translate the dynamic binaries into this Old Fashioned Gentoo making the initrd_list?

----------

## NeddySeagoon

vaav,

Point lddtree at the dynamically linked binary you need in the initrd.

For example 

```
$ sudo lddtree /bin/mount

Password: 

/bin/mount (interpreter => /lib64/ld-linux-x86-64.so.2)

    libc.so.6 => /lib64/libc.so.6

    libmount.so.1 => /lib64/libmount.so.1

        libblkid.so.1 => /lib64/libblkid.so.1
```

This tells that  /bin/mount  needs 

```
/lib64/ld-linux-x86-64.so.2

/lib64/libc.so.6

/lib64/libmount.so.1

/lib64/libblkid.so.1
```

in the initrd.

However, it looks for libc.so.6, so you need /lib64 in your PATH, or it won't be found.

The initrd is very simple. Its just the kernel, the things in the initrd and the init script that tells what to do.

and nothing else. If you don't set a PATH, then its not set.

If you need some environment variables, you must set them. 

The hard part of doing it yourself is to think simply enough. It fails when you make an assumption that you were not even aware of making.

----------

## vaav

Oke i will have a look at it, one last thing though:

i have to mask udev? even it being dependency of systemd?

----------

## vaav

I am bit sleepy at the moment, so i might make some mistakes. Might get a night rest  first.

The dynamical linked /sbin/lvm and the dynamical linked /sbin/cryptsetup:

```
$ sudo lddtree /sbin/lvm

/sbin/lvm (interpreter => /lib64/ld-linux-x86-64.so.2)

    libdevmapper-event.so.1.02 => /lib64/libdevmapper-event.so.1.02

        libpthread.so.0 => /lib64/libpthread.so.0

    libsystemd.so.0 => /lib64/libsystemd.so.0

        librt.so.1 => /lib64/librt.so.1

        liblz4.so.1 => /usr/lib64/liblz4.so.1

        libcap.so.2 => /lib64/libcap.so.2

        libgcrypt.so.20 => /usr/lib64/libgcrypt.so.20

            libgpg-error.so.0 => /usr/lib64/libgpg-error.so.0

    libudev.so.1 => /lib64/libudev.so.1

    libdl.so.2 => /lib64/libdl.so.2

    libblkid.so.1 => /lib64/libblkid.so.1

    libdevmapper.so.1.02 => /lib64/libdevmapper.so.1.02

        libm.so.6 => /lib64/libm.so.6

    libaio.so.1 => /lib64/libaio.so.1

    libreadline.so.8 => /lib64/libreadline.so.8

        libtinfow.so.6 => /lib64/libtinfow.so.6

    libc.so.6 => /lib64/libc.so.6
```

```
$ sudo lddtree /sbin/cryptsetup

/sbin/cryptsetup (interpreter => /lib64/ld-linux-x86-64.so.2)

    libcryptsetup.so.12 => /usr/lib64/libcryptsetup.so.12

        libdevmapper.so.1.02 => /lib64/libdevmapper.so.1.02

            libudev.so.1 => /lib64/libudev.so.1

                librt.so.1 => /lib64/librt.so.1

            libpthread.so.0 => /lib64/libpthread.so.0

            libm.so.6 => /lib64/libm.so.6

        libcrypto.so.1.1 => /usr/lib64/libcrypto.so.1.1

            libz.so.1 => /lib64/libz.so.1

            libdl.so.2 => /lib64/libdl.so.2

        libargon2.so.1 => /usr/lib64/libargon2.so.1

        libjson-c.so.4 => /usr/lib64/libjson-c.so.4

    libpopt.so.0 => /usr/lib64/libpopt.so.0

    libuuid.so.1 => /lib64/libuuid.so.1

    libblkid.so.1 => /lib64/libblkid.so.1

    libc.so.6 => /lib64/libc.so.6

```

 How exactly do i translate that into /root/initrd/initramfs_list?

```

# directory structure

dir /proc       755 0 0

dir /usr        755 0 0

dir /bin        755 0 0

dir /sys        755 0 0

dir /var        755 0 0

#dir /lib        755 0 0

dir /lib64      755 0 0

dir /sbin       755 0 0

dir /mnt        755 0 0

dir /mnt/root   755 0 0

dir /etc        755 0 0

dir /root       700 0 0

dir /dev        755 0 0

dir /dev/mapper 755 0 0

# we have a static /dev so we need all dev entries too

# e.g. /dev/console below

nod /dev/console        0600 0 0 c 5 1

nod /dev/null           0666 0 0 c 1 5

# dev/nvme0 and partitions

nod /dev/nvme0      0660 0 0 b 8 0

nod /dev/nvme0n1           0660 0 0 b 8 1

nod /dev/nvme0n1p1           0660 0 0 b 8 2

nod /dev/nvme0n1p2           0660 0 0 b 8 4

# all the lvm nodes I need

nod /dev/dm-0            0660 0 0 b 253 0

nod /dev/dm-1            0660 0 0 b 253 1

nod /dev/dm-2            0660 0 0 b 254 2

nod /dev/dm-3

# ...

slink /dev/stderr                       /proc/self/fd/2                 777 0 0

slink /dev/stdin                        /proc/self/fd/0                 777 0 0

slink /dev/std/out                      /proc/self/fd/1                 777 0 0

# busybox

file /bin/busybox /bin/busybox  755 0 0

file /sbin/lvm.static           /sbin/lvm.static         755 0 0

# libraries required by /sbin/fsck.ext4 and /sbin/fsck

slink   /lib                            /lib64                          777 0 0

file    /lib64/ld-linux-x86-64.so.2     /lib64/ld-linux-x86-64.so.2     755 0 0

file    /lib64/libext2fs.so.2           /lib64/libext2fs.so.2           755 0 0

file    /lib64/libcom_err.so.2          /lib64/libcom_err.so.2          755 0 0

file    /lib64/libpthread.so.0          /lib64/libpthread.so.0          755 0 0

file    /lib64/libblkid.so.1            /lib64/libblkid.so.1            755 0 0

file    /lib64/libuuid.so.1             /lib64/libuuid.so.1             755 0 0

file    /lib64/libe2p.so.2              /lib64/libe2p.so.2              755 0 0

file    /lib64/libc.so.6                /lib64/libc.so.6                755 0 0

file    /lib64/libmount.so.1            /lib64/libmount.so.1            755 0 0

file    /sbin/fsck              /sbin/fsck                      755 0 0

file    /sbin/fsck.ext4         /sbin/fsck.ext4                 755 0 0

# our init script

file    /init                   /root/initrd/init               755 0 0

```

----------

## vaav

This is my pro to-type initramfs_list that includes dynamic /sbin/lvm and dynamic /sbin/cryptsetup.

Please correct any mistakes.

```
/root/initrd/initramfs_list

# directory structure

dir /proc       755 0 0

dir /usr        755 0 0

dir /usr/lib64 755 0 0

dir /bin        755 0 0

dir /sys        755 0 0

dir /var        755 0 0

dir /lib        755 0 0

dir /lib64      755 0 0

dir /sbin       755 0 0

dir /mnt        755 0 0

dir /mnt/root   755 0 0

dir /etc        755 0 0

dir /root       700 0 0

dir /dev        755 0 0

dir /dev/mapper 755 0 0

# we have a static /dev so we need all dev entries too

# e.g. /dev/console below

nod /dev/console        0600 0 0 c 5 1

nod /dev/null           0666 0 0 c 1 5

# dev/nvme0 and partitions

nod /dev/nvme0      0660 0 0 b 8 0

nod /dev/nvme0n1           0660 0 0 b 8 1

nod /dev/nvme0n1p1           0660 0 0 b 8 2

nod /dev/nvme0n1p2           0660 0 0 b 8 4

# all the lvm nodes I need

nod /dev/dm-0            0660 0 0 b 253 0

nod /dev/dm-1            0660 0 0 b 253 1

nod /dev/dm-2            0660 0 0 b 254 2

nod /dev/dm-3

# ...

slink /dev/stderr                       /proc/self/fd/2                 777 0 0

slink /dev/stdin                        /proc/self/fd/0                 777 0 0

slink /dev/std/out                      /proc/self/fd/1                 777 0 0

# busybox

file /bin/busybox /bin/busybox  755 0 0

# libraries required by /sbin/fsck.ext4 and /sbin/fsck

slink   /lib                            /lib64                          777 0 0

file    /lib64/ld-linux-x86-64.so.2     /lib64/ld-linux-x86-64.so.2     755 0 0

file    /lib64/libext2fs.so.2           /lib64/libext2fs.so.2           755 0 0

file    /lib64/libcom_err.so.2          /lib64/libcom_err.so.2          755 0 0

file    /lib64/libpthread.so.0          /lib64/libpthread.so.0          755 0 0

file    /lib64/libblkid.so.1            /lib64/libblkid.so.1            755 0 0

file    /lib64/libuuid.so.1             /lib64/libuuid.so.1             755 0 0

file    /lib64/libe2p.so.2              /lib64/libe2p.so.2              755 0 0

file    /lib64/libc.so.6                /lib64/libc.so.6                755 0 0

file    /lib64/libmount.so.1            /lib64/libmount.so.1            755 0 0

file    /sbin/fsck              /sbin/fsck                      755 0 0

file    /sbin/fsck.ext4         /sbin/fsck.ext4                 755 0 0

# libraries required by /sbin/lvm

slink   /lib                            /lib64                          777 0 0

file    /lib64/ld-linux-x86-64.so.2     /lib64/ld-linux-x86-64.so.2     755 0 0

file    /lib64/libdevmapper-event.so.1.02 /lib64/libdevmapper-event.so.1.02  755 0 0

file    /lib64/libpthread.so.0          /lib64/libpthread.so.0          755 0 0

file    /lib64/libsystemd.so.0          /lib64/libsystemd.so.0          755 0 0

file    /lib64/librt.so.1               /lib64/librt.so.1               755 0 0

file    /usr/lib64/liblz4.so.1          /usr/lib64/liblz4.so.1          755 0 0

file    /lib64/libcap.so.2              /lib64/libcap.so.2              755 0 0

file    /usr/lib64/libgcrypt.so.20      /usr/lib64/libgcrypt.so.20      755 0 0

file    /usr/lib64/libgpg-error.so.0    /usr/lib64/libgpg-error.so.0    755 0 0

file    /lib64/libudev.so.1             /lib64/libudev.so.1             755 0 0

file    /lib64/libdl.so.2               /lib64/libdl.so.2               755 0 0

file    /lib64/libblkid.so.1            /lib64/libblkid.so.1            755 0 0

file    /lib64/libdevmapper.so.1.02     /lib64/libdevmapper.so.1.02     755 0 0

file    /lib64/libm.so.6                /lib64/libm.so.6                755 0 0

file    /lib64/libaio.so.1              /lib64/libaio.so.1              755 0 0

file    /lib64/libreadline.so.8         /lib64/libreadline.so.8         755 0 0

file    /lib64/libtinfow.so.6           /lib64/libtinfow.so.6           755 0 0

file    /lib64/libc.so.6                /lib64/libc.so.6                755 0 0

file     /sbin/lvm                      /sbin/lvm                       755 0 0

# libraries required by /sbin/cryptsetup

slink   /lib                            /lib64                          777 0 0

file    /usr/lib64/libcryptsetup.so.12  /usr/lib64/libcryptsetup.so.12  755 0 0

file    /lib64/libdevmapper.so.1.02     /lib64/libdevmapper.so.1.       755 0 0

file    /lib64/libudev.so.1             /lib64/libcom_err.so.2          755 0 0

file    /lib64/librt.so.1               /lib64/librt.so.1               755 0 0

file    /lib64/libm.so.6                /lib64/libm.so.6                755 0 0

file    /usr/lib64/libcrypto.so.1.1     /usr/lib64/libcrypto.so.1.1     755 0 0

file    /lib64/libz.so.1                /lib64/libz.so.1                755 0 0

file    /lib64/libdl.so.2               /lib64/libdl.so.2               755 0 0

file    /usr/lib64/libargon2.so.1       /usr/lib64/libargon2.so.1       755 0 0

file    /usr/lib64/libjson-c.so.4       /usr/lib64/libjson-c.so.4       755 0 0

file    /usr/lib64/libpopt.so.0         /usr/lib64/libpopt.so.0         755 0 0

file    /lib64/libuuid.so.1             /lib64/libuuid.so.1             755 0 0

file    /lib64/libblkid.so.1            /lib64/libblkid.so.1            755 0 0

file    /lib64/libc.so.6                /lib64/libc.so.6                755 0 0

file    /sbin/cryptsetup                /sbin/cryptsetup                755 0 0

# our init script

file    /init                   /root/initrd/init               755 0 0

```

----------

## NeddySeagoon

vaav,

Think of the initrd as being a completely separate install to your real root. It is.

It borrows binaries because that's convenient but it doesn't have to.

e.g. genkernel all builds its own binaries for the initrd.

Do not mask udev.

/sbin/lvm shows that it needs libudev.so.1. That's fine.

The udev service will not be started in the initrd and udev will not make any adjustments to /dev for you.

Its not runnning, so it cant,

```
nod /dev/nvme0      0660 0 0 b 8 0 
```

looks wrong.

The 

```
b 8 0 
```

means a block device with kernel major number 8, minor number 0.  That's /dev/sda

From your

```
$ lsblk

NAME                             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT

nvme0n1                          259:0    0 119.2G  0 disk 

├─nvme0n1p1                      259:1    0   699M  0 part  /boot

└─nvme0n1p2                      259:2    0 118.6G  0 part 

  └─root_nvme0n1p2-Hellovaa-root 253:0    0 118.6G  0 crypt

    ├─Hellovaa-swap              253:1    0     8G  0 lvm   [SWAP]

    ├─Hellovaa-root              253:2    0    32G  0 lvm   /

    └─Hellovaa-home              253:3    0  78.6G  0 lvm   /home 
```

You need 

```
nod /dev/nvme0      0660 0 0 b 259 0 
```

Check your other nod entries too.

```
# libraries required by /sbin/fsck.ext4 and /sbin/fsck

slink   /lib                            /lib64     
```

slink make a symbolic link.

```
file    /lib64/ld-linux-x86-64.so.2     /lib64/ld-linux-x86-64.so.2     755 0 0 
```

Copies  the input file to the output file (in the intrd) and gives it 755 permissions, thats rwxr-xr-x

The order of file statements is not important. They are copied to the initrd, 

There is no need to list any file more than once.

My directory structure is for a /no-multilib/ profile. Multilib may be different.

I just copied the output of 

```
ls /
```

----------

## vaav

Changed to nod entries:

```

# we have a static /dev so we need all dev entries too

# e.g. /dev/console below

nod /dev/console        0600 0 0 c 5 1

nod /dev/null           0666 0 0 c 1 5

# dev/nvme0 and partitions

nod /dev/nvme0                0660 0 0 b 259 0

nod /dev/nvme0n1              0660 0 0 b 259 0

nod /dev/nvme0n1p1            0660 0 0 b 259 0

nod /dev/nvme0n1p2            0660 0 0 b 259 0

# all the lvm nodes I need

nod /dev/dm-0            0660 0 0 b 259 0

nod /dev/dm-1            0660 0 0 b 259 0

nod /dev/dm-2            0660 0 0 b 259 0

nod /dev/dm-3            0660 0 0 b 259 0
```

I assumed the lvm nodes and nvme0 partition are also "0660 0 0 b 259 0"

Here is my new initramfs_list pro to-type:

```

/root/initrd/initramfs_list

# directory structure

dir /proc       755 0 0

dir /usr        755 0 0

dir /bin        755 0 0

dir /sys        755 0 0

dir /var        755 0 0

dir /lib        755 0 0

dir /lib64      755 0 0

dir /sbin       755 0 0

dir /mnt        755 0 0

dir /mnt/root   755 0 0

dir /etc        755 0 0

dir /root       700 0 0

dir /dev        755 0 0

dir /dev/mapper 755 0 0

# we have a static /dev so we need all dev entries too

# e.g. /dev/console below

nod /dev/console        0600 0 0 c 5 1

nod /dev/null           0666 0 0 c 1 5

# dev/nvme0 and partitions

nod /dev/nvme0      0660 0 0 b 259 0

nod /dev/nvme0n1           0660 0 0 b 259 0

nod /dev/nvme0n1p1           0660 0 0 b 259 0

nod /dev/nvme0n1p2           0660 0 0 b 259 0

# all the lvm nodes I need

nod /dev/dm-0            0660 0 0 b 259 0

nod /dev/dm-1            0660 0 0 b 259 0

nod /dev/dm-2            0660 0 0 b 259 0

nod /dev/dm-3

# ...

slink /dev/stderr                       /proc/self/fd/2                 777 0 0

slink /dev/stdin                        /proc/self/fd/0                 777 0 0

slink /dev/std/out                      /proc/self/fd/1                 777 0 0

# busybox

file /bin/busybox /bin/busybox  755 0 0

# libraries required by /sbin/fsck.ext4 and /sbin/fsck

slink   /lib                            /lib64                          777 0 0

file    /lib64/ld-linux-x86-64.so.2     /lib64/ld-linux-x86-64.so.2     755 0 0

file    /lib64/libext2fs.so.2           /lib64/libext2fs.so.2           755 0 0

file    /lib64/libcom_err.so.2          /lib64/libcom_err.so.2          755 0 0

file    /lib64/libpthread.so.0          /lib64/libpthread.so.0          755 0 0

file    /lib64/libblkid.so.1            /lib64/libblkid.so.1            755 0 0

file    /lib64/libuuid.so.1             /lib64/libuuid.so.1             755 0 0

file    /lib64/libe2p.so.2              /lib64/libe2p.so.2              755 0 0

file    /lib64/libc.so.6                /lib64/libc.so.6                755 0 0

file    /lib64/libmount.so.1            /lib64/libmount.so.1            755 0 0

file    /sbin/fsck              /sbin/fsck                      755 0 0

file    /sbin/fsck.ext4         /sbin/fsck.ext4                 755 0 0

# libraries required by /sbin/cryptsetup and /sbin/lvm

slink   /lib                            /lib64                          777 0 0

file    /usr/lib64/libcryptsetup.so.12  /usr/lib64/libcryptsetup.so.12  755 0 0

file    /usr/lib64/libcrypto.so.1.1     /usr/lib64/libcrypto.so.1.1     755 0 0

file    /lib64/libz.so.1                /lib64/libz.so.1                755 0 0

file    /usr/lib64/libargon2.so.1       /usr/lib64/libargon2.so.1       755 0 0

file    /usr/lib64/libjson-c.so.4       /usr/lib64/libjson-c.so.4       755 0 0

file    /usr/lib64/libpopt.so.0         /usr/lib64/libpopt.so.0         755 0 0

file    /lib64/libuuid.so.1             /lib64/libuuid.so.1             755 0 0

file    /lib64/libdevmapper-event.so.1.02 /lib64/libdevmapper-event.so.1.02  755 0 0

file    /lib64/libpthread.so.0          /lib64/libpthread.so.0          755 0 0

file    /lib64/libsystemd.so.0          /lib64/libsystemd.so.0          755 0 0

file    /lib64/librt.so.1               /lib64/librt.so.1               755 0 0

file    /usr/lib64/liblz4.so.1          /usr/lib64/liblz4.so.1          755 0 0

file    /lib64/libcap.so.2              /lib64/libcap.so.2              755 0 0

file    /usr/lib64/libgcrypt.so.20      /usr/lib64/libgcrypt.so.20      755 0 0

file    /usr/lib64/libgpg-error.so.0    /usr/lib64/libgpg-error.so.0    755 0 0

file    /lib64/libudev.so.1             /lib64/libudev.so.1             755 0 0

file    /lib64/libdl.so.2               /lib64/libdl.so.2               755 0 0

file    /lib64/libblkid.so.1            /lib64/libblkid.so.1            755 0 0

file    /lib64/libdevmapper.so.1.02     /lib64/libdevmapper.so.1.02     755 0 0

file    /lib64/libm.so.6                /lib64/libm.so.6                755 0 0

file    /lib64/libaio.so.1              /lib64/libaio.so.1              755 0 0

file    /lib64/libreadline.so.8         /lib64/libreadline.so.8         755 0 0

file    /lib64/libtinfow.so.6           /lib64/libtinfow.so.6           755 0 0

file    /lib64/libc.so.6                /lib64/libc.so.6                755 0 0

file    /sbin/cryptsetup                /sbin/cryptsetup                755 0 0

file    /sbin/lvm                      /sbin/lvm                       755 0 0

# our init script

file    /init                   /root/initrd/init               755 0 0

```

 Looks OK?

----------

## vaav

After putting the initramfs_list and init in post above, in /root/initrd/ 

And rebooting, i was greeted with kernel panic. Not able to mount root filesystem.

Think i have to look deeper at how the initramfs_list and init should actually should look. And keep it simple  :Wink: 

[edit] looking at that initramfs_list and init at the wiki, it seems way too complicated. And i lack the skills for every achieving something like that.

That leaves me to a question that is popping up right now: Should i switch from systemd to openRC, because writing initramfs with /dev/tmpfs would probably be easier to achieve on openRC?

But then again, will openRC ever reach end of life status?

Maybe i should keep this system in tact, and use genkernel initramfs.

----------

## vaav

Don't want to necrobump my own post. But just want to update, that i switched systemd for openRC, and the custom initramfs works just fine on openRC.

So the custom initramfs failing to mount /home and swap, must have been udev / systemd related.

----------

