3

I set up a triple boot system on btrfs, and have arch, xenial, and bionic like so:

  • encrypted btrfs container
  • each has a dedicated btrfs subvol for it's own root
  • shared unencrypted /boot between the three

I've een using this setup for arch and xenial for more than a year and it's been great. Now that I've added bionic, I have slight worries about the naming of the kernel and initrd. For example:

$ ls /boot
initramfs-linux.img           # arch; no problems here
initrd.img-4.13.0-39-generic  # xenial
initrd.img-4.15.0-20-generic  # bionic
vmlinuz-linux                 # arch
vmlinuz-4.13.0-39-generic     # xenial
vmlinuz-4.15.0-20-generic     # bionic

Maybe bionic names will never conflict with xenial, but maybe they will.

I'm wondering if there's a hook or config file somewhere that could set the default name of these files without me having to compile my own. Basically, some way to act like CONFIG_LOCALVERSION or EXTRAVERSION was passed? Or a hook that could intercept the default file names and append something else?

I maintain my own bootloader (rEFInd now), I don't have worries about that aspect (some may foresee concerns syncing up what I'm asking with grub, for example).


As an aside, I'm open to other solutions. I think the general case is "How do I have several distro boot files co-exist in one partition?" I mention this as I just stumbled on this post, which is about setting a subdirectory, not changing the names. Using paths to separate these would work great as well. Maybe that's described in initramfs-tools, but it's not clear to me [yet].


I can't post a comment that gets at the primary answer well enough, so I'm adding this to address the primary response so far:

You can't change the names for Ubuntu kernels because so many programs refers back to the original names.

This is followed by the use of locate to show how many times in the filesystem the kernel version string is used.

I'm writing from Ubuntu xenial booted with the following refind.conf entry:

$ cat /boot/efi/EFI/refind/refind.conf
menuentry "xenial" {
    icon        /EFI/refind/icons/os_ubuntu.png
    volume      4bdcd743-9d09-2f41-9379-e5491e79ae9d
    loader      /vmlinuz-foo
    initrd      /initrd-foo
    options     "root=UUID=xxxx rootflags=compress=lzo,discard,ssd,subvol=xenial nomodeset $vt_handoff add_efi_memmap ro"
}

To do this, I did:

$ cd /boot
$ sudo mv initrd.img-4.13.0-39-generic initrd-foo
$ sudo mv vmlinuz-4.13.0-39-generic vmlinuz-foo

The filename itself doesn't matter, as the kernel version is in the kernel:

$ uname -a
Linux roboxenial 4.13.0-39-generic #44~16.04.1-Ubuntu SMP Thu Apr 5 16:43:10 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

So... I can run from any filename I want. The questions still remains if there is a way to have every kernel name changed in some way during installation/upgrade (like a hook). This could be a convention (e.g. initrd-xenial), suffix (initrd.img-4.13.0-39-generic_xenial) or otherwise.

Hendy
  • 256
  • If it's the same name it should be the same kernel. – WinEunuuchs2Unix Apr 30 '18 at 15:17
  • @WinEunuuchs2Unix ah, interesting. So since arch will never conflict, I don't really need to care as xenial/bionic can run off the same one? – Hendy Apr 30 '18 at 15:30
  • I will add that this still would be helpful, as I'd know in advance what the kernel is called. I have been symlinking /boot/vmlinuz-xenial to it's most recent versioned instance, for example. If it always was foo-xenial that would avoid me having to do that. – Hendy Apr 30 '18 at 15:31
  • I believe arch uses real Linux number. Ubuntu starts off real ie Linux 4.15 but keeps it long after Linux number is EOL. They just adding suffix to dead kernel number as they update it with code from future real kernels. Drives me nuts and there is no cross reference table kept up to date I could find. I posted a question on that topic here in Ask Ubuntu. – WinEunuuchs2Unix Apr 30 '18 at 17:40

1 Answers1

2

You can't change the names for Ubuntu kernels because so many programs refers back to the original names. Take for example my current kernel 4.14.34:

$ locate 4.14.34 | wc -l
70192
$ ll /boot/*4.14.34*
-rw-r--r-- 1 root root  1496011 Apr 12 05:53 /boot/abi-4.14.34-041434-generic
-rw-r--r-- 1 root root   213406 Apr 12 05:53 /boot/config-4.14.34-041434-generic
-rw-r--r-- 1 root root 58514444 Apr 28 13:36 /boot/initrd.img-4.14.34-041434-generic
-rw-r--r-- 1 root root        0 Apr 12 05:53 /boot/retpoline-4.14.34-041434-generic
-rw------- 1 root root  3952348 Apr 12 05:53 /boot/System.map-4.14.34-041434-generic
-rw------- 1 root root  8607504 Apr 30 03:52 /boot/vmlinuz-4.14.34-041434-generic

There are 70,192 files link to kernel version 4.14.34 but only five of them reside in /boot where you wish to do your renaming.

As mentioned in comments there is little danger of ArchLinux using the same kernel name as Ubuntu because they have their own unique numbering system: How do I map Linux Kernels to Ubuntu Kernels?

NOTE: At the time this was run I had two Ubuntu 16.04 partitions mounted so the 4.14.34 file count is 35,096 for a single 16.04 installation. Also note headers are included which I believe are optional but which I always install "just in case".

Large listing

Below is the beginning of the locate listing. If vmlinuz were to be renamed the module files would likely not be locatable:

$ locate 4.14.34 | head -n1000
/boot/System.map-4.14.34-041434-generic
/boot/abi-4.14.34-041434-generic
/boot/config-4.14.34-041434-generic
/boot/initrd.img-4.14.34-041434-generic
/boot/retpoline-4.14.34-041434-generic
/lib/modprobe.d/blacklist_linux_4.14.34-041434-generic.conf
/lib/modules/4.14.34-041434-generic
/lib/modules/4.14.34-041434-generic/build
/lib/modules/4.14.34-041434-generic/initrd
/lib/modules/4.14.34-041434-generic/kernel
/lib/modules/4.14.34-041434-generic/modules.alias
/lib/modules/4.14.34-041434-generic/modules.alias.bin
/lib/modules/4.14.34-041434-generic/modules.builtin
/lib/modules/4.14.34-041434-generic/modules.builtin.bin
/lib/modules/4.14.34-041434-generic/modules.dep
/lib/modules/4.14.34-041434-generic/modules.dep.bin
/lib/modules/4.14.34-041434-generic/modules.devname
/lib/modules/4.14.34-041434-generic/modules.order
/lib/modules/4.14.34-041434-generic/modules.softdep
/lib/modules/4.14.34-041434-generic/modules.symbols
/lib/modules/4.14.34-041434-generic/modules.symbols.bin
/lib/modules/4.14.34-041434-generic/vdso
/lib/modules/4.14.34-041434-generic/kernel/arch
/lib/modules/4.14.34-041434-generic/kernel/block
/lib/modules/4.14.34-041434-generic/kernel/crypto
/lib/modules/4.14.34-041434-generic/kernel/drivers
/lib/modules/4.14.34-041434-generic/kernel/fs
/lib/modules/4.14.34-041434-generic/kernel/kernel
/lib/modules/4.14.34-041434-generic/kernel/lib
/lib/modules/4.14.34-041434-generic/kernel/mm
/lib/modules/4.14.34-041434-generic/kernel/net
/lib/modules/4.14.34-041434-generic/kernel/sound
/lib/modules/4.14.34-041434-generic/kernel/virt
/lib/modules/4.14.34-041434-generic/kernel/arch/x86
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/events
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kernel
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kvm
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/oprofile
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/platform
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/aes-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/aesni-intel.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/blowfish-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/camellia-aesni-avx-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/camellia-aesni-avx2.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/camellia-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/cast5-avx-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/cast6-avx-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/chacha20-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/crc32-pclmul.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/crct10dif-pclmul.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/des3_ede-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/ghash-clmulni-intel.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/glue_helper.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/poly1305-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/salsa20-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/serpent-avx-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/serpent-avx2.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/serpent-sse2-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha1-mb
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha1-ssse3.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha256-mb
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha256-ssse3.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha512-mb
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha512-ssse3.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/twofish-avx-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/twofish-x86_64-3way.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/twofish-x86_64.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha1-mb/sha1-mb.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha256-mb/sha256-mb.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/crypto/sha512-mb/sha512-mb.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/events/intel
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/events/intel/intel-cstate.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/events/intel/intel-rapl-perf.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kernel/cpu
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kernel/cpuid.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kernel/msr.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kernel/cpu/mcheck
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kernel/cpu/mcheck/mce-inject.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kvm/kvm-amd.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kvm/kvm-intel.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/kvm/kvm.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/oprofile/oprofile.ko
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/platform/atom
/lib/modules/4.14.34-041434-generic/kernel/arch/x86/platform/atom/punit_atom_debug.ko
/lib/modules/4.14.34-041434-generic/kernel/block/bfq.ko
/lib/modules/4.14.34-041434-generic/kernel/block/kyber-iosched.ko
/lib/modules/4.14.34-041434-generic/kernel/block/mq-deadline.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/842.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/ablk_helper.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/aes_ti.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/af_alg.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/algif_aead.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/algif_hash.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/algif_rng.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/algif_skcipher.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/ansi_cprng.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/anubis.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/arc4.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/asymmetric_keys
/lib/modules/4.14.34-041434-generic/kernel/crypto/async_tx
/lib/modules/4.14.34-041434-generic/kernel/crypto/authenc.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/authencesn.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/blowfish_common.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/blowfish_generic.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/camellia_generic.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/cast5_generic.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/cast6_generic.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/cast_common.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/ccm.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/chacha20_generic.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/chacha20poly1305.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/cmac.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/crc32_generic.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/cryptd.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/crypto_engine.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/crypto_simd.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/crypto_user.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/deflate.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/des_generic.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/ecdh_generic.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/echainiv.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/fcrypt.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/keywrap.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/khazad.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/lrw.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/lz4.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/lz4hc.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/mcryptd.ko
/lib/modules/4.14.34-041434-generic/kernel/crypto/md4.ko
  • I thought this was legit, but now I don't think so. locate x.xx.xx is simply finding instances of that string. Look at your ls -l output; there's only one link to the files themselves. Who knows what all of those locate hits are (e.g. versioned modules)? What I'm asking is to have a predictable name for the current kernel/init to point the bootloader to. – Hendy May 04 '18 at 15:05
  • Simply leave off the | WC -l portion to see the file names. If files created today are missing or files deleted today are included, run sudo updatedb before using locate command. – WinEunuuchs2Unix May 04 '18 at 15:08
  • That's not what I meant. Your statement does not follow. The fact that 72k files use 4.14.34 in their name has nothing to do with them being "linked" to the kernel's filename. As a practical test, if you rename your kernel image to vmlinuz-foo and update your bootloader entry accordingly... what do you predict will happen? – Hendy May 04 '18 at 20:01
  • @Hendy I reran locate 4.14.34 | wc -l and the result is 35096 which is exactly half of 70192. I was developing a script at the same time which duplicated 16.04 partition to a new partition to prep for 18.04 test upgrade. So the number of files is doubled. I checked the list without wc and as far back as bash shell can scroll they are all valid. I ran sudo mv vmlinuz-4.14.34-041434-generic vm-foo then time sudo updatedb then locate 4.14.34 | wc -l and the result is 35905 exactly one less. Everything works as it should. Just my initial count was for two Ubuntu 16.04 installations – WinEunuuchs2Unix May 04 '18 at 22:48
  • 1
    I think we're still crossing paths. locate gets hits for filenames... that doesn't mean they depend in any way on the name of another file that happens to share part of that name. This is like saying you can't rename a lib* file because locate lib | wc -l gets a ton of hits. – Hendy May 06 '18 at 01:48
  • 1
    @Hendy I guess the only way of finding out for sure what depends on what is to rename a kernel and see what happens. If something breaks just reboot and pick an unmodified kernel version. – WinEunuuchs2Unix May 06 '18 at 01:52
  • 1
    I did this experiment. It worked fine. Part of the question is answered (it's fine to rename these files whatever one wants); the part about how to do this with a hook/script is still unknown to me. – Hendy May 16 '18 at 13:42