Re: Duplicate files /boot/grub/locale/*.mo~ in iso file made by grub-mkrescue

Adam Purkrt <[email protected]> Sat, 24 May 2025 16:48:33 +0200
Newsgroups gmane.comp.boot-loaders.grub.bugs
Message-ID <[email protected]>
Hello, wow, thanks for your efforts... I was able to reproduce the same issue on Arch Linux, going to try Debian too, maybe the issue is with Gentoo and Arch and not in grub.

Experiment with /tmp/grub.faked revealed nothing extraordinary:

renergy ~ # mkdir /tmp/grub.faked
renergy ~ # cp /usr/share/locale/en\@cyrillic/LC_MESSAGES/grub.mo /tmp/grub.faked/en\@cyrillic.mo
renergy ~ # ls -l /tmp/grub.faked/
total 176
-rw-r--r-- 1 root root 177539 May 24 16:38 [email protected]
renergy ~ #

Yeah, the files look like some sort of backup. And, besides /boot/grub/locale, there are no files with '~' in its name on the .iso I created on Gentoo.

Thanks again, going to try Debian.

Adam

On 5/24/25 4:25 PM, Thomas Schmitt wrote:
> Hi,
> 
> just in case it was not clear from my first reply:
> I cannot reproduce the problem on Debian 12 with GRUB 2.06 and 2.13.
> 
> 
> Adam Purkrt wrote:
>> Hi, no, actually there is not any occurrence of the string "mo~" in
>> the output
>> renergy ~ # grub-mkrescue --verbose -o grub.iso 2>&1 | grep mo~
>> renergy ~ #
> 
> Well, then it has to be doubted that the grub-install functions
> underneath grub-mkrescue copied files to paths like
>    /tmp/grub.GoPPTa/[email protected]~
> 
> As "Banana" stated in https://forums.gentoo.org/viewtopic-p-8862390.html
> the names look like what some softwares create as backup files.
> But the /tmp/grub.* directory gets freshly created by grub-mkrescue.
> What software could see the need to make backup copies of the files
> which get copied into that directory ?
> 
> 
> Questions:
> 
> Do any other files in your ISO show the suffix '~' ?
> 
> What happens if you create a directory in /tmp and copy a .mo file
> to it ?
> Like
>    mkdir /tmp/grub.faked
>    cp /usr/share/locale/en@cyrillic/LC_MESSAGES/grub.mo /tmp/grub.faked/[email protected]
> Does a copy with .mo~ appear ?
> 
> 
> -----------------------------------------------------------------------
> 
> The only other idea is to step through the file creation in the
> temporary directory and to watch when the '.mo~' files appear.
> This stepping could be done by gdb (although i don't know how to get
> a grub-mkrescue with debugging symbols).
> In this example i use grub-mkrescue 2.13 from git. The 2.06 binary
> from Debian does not know the function name "copy_locales".
> Hopefully your 2.12 will be much like my 2.13.
> 
>    $ mkdir minimal
>    $ touch /minmal/file.txt
>    $ gdb ./grub-mkrescue
>    ...
>    (No debugging symbols found in /home/thomas/projekte/grub_dir/grub-git/grub-mkrescue)
>    (gdb) b copy_locales
>    Breakpoint 1 at 0x10902
>    (gdb) b grub_install_copy_file
>    Breakpoint 2 at 0xec14
>    (gdb) r --verbose -d /usr/lib/grub/x86_64-efi --locale-directory=/usr/share/locale -o output.iso minimal
>    ...
>    ./grub-mkrescue: info: temporary iso9660 dir is `/tmp/grub.CHwoVy'.
> 
>    Breakpoint 1, 0x0000555555564902 in copy_locales ()
>    (gdb) c
>    Continuing.
> 
>    Breakpoint 2, 0x0000555555562c14 in grub_install_copy_file ()
>    (gdb) (gdb) c
>    Continuing.
>    ./grub-mkrescue: info: copying `/usr/share/locale/fi/LC_MESSAGES/grub.mo' -> `/tmp/grub.CHwoVy/boot/grub/locale/fi.mo'.
> 
>    Breakpoint 2, 0x0000555555562c14 in grub_install_copy_file ()
>    (gdb)
> 
> Now i check in another terminal what's going on in /tmp
>   
>    $ ls -a /tmp/grub.CHwoVy/boot/grub/locale
>    .  ..  fi.mo
>    $
> 
> Back to the gdb terminal:
> 
>    (gdb) c
>    Continuing.
>    ./grub-mkrescue: info: copying `/usr/share/locale/en@greek/LC_MESSAGES/grub.mo' -> `/tmp/grub.CHwoVy/boot/grub/locale/[email protected]'.
> 
>    Breakpoint 2, 0x0000555555562c14 in grub_install_copy_file ()
>    (gdb) c
>    Continuing.
>    ./grub-mkrescue: info: copying `/usr/share/locale/en_AU/LC_MESSAGES/grub.mo' -> `/tmp/grub.CHwoVy/boot/grub/locale/en_AU.mo'.
>    ./grub-mkrescue: info: cannot open `/usr/share/locale/en_AU/LC_MESSAGES/grub.mo': No such file or directory.
> 
>    Breakpoint 2, 0x0000555555562c14 in grub_install_copy_file ()
>    (gdb)
> 
> In the other terminal:
> 
>    $ ls -a /tmp/grub.CHwoVy/boot/grub/locale
>    .  ..  [email protected]  fi.mo
>    $
> 
> The list of .mo files is growing but no .mo~ shows up.
> Hampered by the lack of debug symbols i set a breakpoint to function
> copy_by_ext() where i hope to catch execution after copy_locales()
> and grub_install_copy_nls() are done, because of this code in
> grub_install_copy_files():
> 
>    grub_install_copy_nls(src, dst);
> 
>    if (install_modules.is_default)
>      copy_by_ext (src, dst_platform, ".mod", 1);
>    else
> 
> So i do:
> 
>    (gdb) b copy_by_ext
>    Breakpoint 3 at 0x55555556460a
>    (gdb) del 2
>    (gdb) c
>    ... lots of copy messages ...
>    Breakpoint 3, 0x000055555556460a in copy_by_ext ()
>    (gdb)
> 
> Now /tmp/grub.CHwoVy/boot/grub/locale is well filled with .mo files.
> But no .mo~ is to see.
> 
> I let grub-mkrescue run to the end without further breaks:
> 
>    (del) del 3
>    (gdb) c
>    ...
>    Writing to 'stdio:output.iso' completed successfully.
> 
>    [Inferior 1 (process 1830) exited normally]
>    (gdb) q
>    $
> 
> In the other terminal:
> 
>    $ sudo mount output.iso /mnt/iso
>    mount: /mnt/iso: WARNING: source write-protected, mounted read-only.
>    $ ls -a /mnt/iso/boot/grub/locale
> 
> shows 41 .mo files (plus . and ..) but no .mo~.
> 
> 
> Have a nice day :)
> 
> Thomas
>