Re: adding swap when expanding root filesystem

From: Mike Karels <mike_at_karels.net>
Date: Sat, 19 Nov 2022 13:48:44 UTC
On 18 Nov 2022, at 16:45, John-Mark Gurney wrote:

> Mike Karels wrote this message on Fri, Nov 18, 2022 at 09:45 -0600:
>> On 17 Nov 2022, at 19:03, John-Mark Gurney wrote:
>>
>>> Mike Karels wrote this message on Mon, Nov 07, 2022 at 10:10 -0600:
>>>> This question is not really arm-specific, but I couldn't think of a better
>>>> mailing list for it.
>>>>
>>>> There are peridic issues reported on small systems like Raspberry Pi
>>>> where people are running buildworld or poudriere and running out of
>>>> memory.  As the user gets no control over the disk layout when installing,
>>>> there is no option to add swap space on the install image.  I have added
>>>> swap space on a USB disk, but this is often not an option.  It occurred
>>>> to me that it might be reasonable to add swap space before expanding
>>>> the root filesystem if there is sufficient space.  I have a prototype,
>>>
>>> So, if you boot to single user mode, before growfs runs on first boot,
>>> you can manually add a swap partition at the end of the disk.
>>>
>>> You'll need to gpart recover the disk first, so that the gpt (iirc)
>>> covers the remaining disk, and then add a swap partition at the end.
>>> This'll take a bit of math, but isn't too hard.
>>
>> Right, that???s what my prototype does (as part of the growfs script).
>>
>>>> and wondered if this is a good thing to do.  Granted, this will often
>>>> create swap on microSD, which is not optimal, but probably better than
>>>> nothing.
>>>
>>> The other option is to use a swap file as outlined in the handbook:
>>> https://docs.freebsd.org/en/books/handbook/config/#create-swapfile
>>>
>>>> The current prototype creates a swap partition which is 1/10 of the disk
>>>> if the disk is at least 15 GB and the initial root partition is no more
>>>> than 1/3 of the disk, but only up to 1.5x of physical memory.  I would
>>>> probably enable this by default, but provide a way to disable it via a
>>>> kenv variable and/or a variable in /etc/rc.conf.
>>>
>>> I would like to see the ability to drop a file on the FAT file system
>>> so that the system can be configured at first boot w/o requiring someone
>>> to either boot to single user mode, or have a FreeBSD system.  This isn't
>>> too hard, as I have a review already open for it:
>>> https://reviews.freebsd.org/D26713
>>>
>>> It makes use of cpercival's cloud init, but slightly modified so it looks
>>> on the fat file system that most arm images have.
>>>
>>> with this, it wouldn't be too hard to gin up some commands to automatically
>>> add the swap partition on first boot, but until something like this is
>>> done, it has to be done manually.
>>
>> I like the config script idea, but it runs after the root file system is
>> mounted read/write, and growfs runs before that.  Meanwhile, I have added
>> the ability to suppress swap space, or set its size, via either /etc/rc.conf
>> or kernel environment.  I will probably have something ready for review soon.
>> Meanwhile, if anyone wants to test (especially on GPT), let me know.
>
> It looks like growfs can run on read-write UFS filesystems, or at least that's
> what the man page implies:
>
> CAVEATS
>      When expanding a file system mounted read-write, any writes to that file
>      system will be temporarily	suspended until	the expansion is finished.
>
> I haven't tried it though.
>
> https://www.freebsd.org/cgi/man.cgi?query=growfs&apropos=0&sektion=0&manpath=FreeBSD+13.1-RELEASE+and+Ports&arch=default&format=html

Although that is true, and I have used it, it seems better to do the growfs
step before root is read/write.  As the comment added to the growfs script
says, “We need to run early, because there might be not enough free space
on rootfs for the boot to succeed”.  (Comment added when “BEFORE: root” was
added.)  I don’t see any significant advantage in using the config script
that would outweigh this, although the fstab entry could be added at the
same time.

I have run into a small snag with adding a dump device.  We don’t currently
have ‘dumpdev=“AUTO”’ in rc.conf for the arm images.  We could add it when
building, or I could add it when modifying the fstab (in that case, only
when adding a swap partition).  Also, this step runs well after the dumpon
script.  I suppose I can just do “dumpon -a” again if adding to fstab.

		Mike

> -- 
>   John-Mark Gurney				Voice: +1 415 225 5579
>
>      "All that I will do, has been done, All that I have, has not."