Hi Maxim,

Good job ! It must not have been easy to come up with a series of steps
that actually work...

The method I use for https://guix-hosting.com/ is somewhat different and
does not require partitionning the disk but has the disadvantage of
ending up with an ext4 drive instead of btrfs, which now that I have
space problems with the store (mitigated by some aggressive gc-ing see
https://the-dam.org/docs/explanations/GarbageCollection.html), may be
nice to have.

A single pass of btrfs-convert may solve that later problem however.

Here is the method, jottled down quickly, please forgive me if I did not
take the time to publish it properly and sooner.

On your main machine, create an image of the system you want on your
VPS, or use the base install image from the GNU Guix website:

guix system image /tmp/baseGS.scm

Reboot your VPS in rescue mode, then in the rescue system, run:

: apt update
: apt install qemu-utils  # Do it first otherwise no space left to do it after
: rm /var/cache/apt/archives/*
: wget $TOTO # The image created earlier, you can also scp it from your
main machine to the rescue.
: qemu-img dd if=gs.qcow2 bs=4M of=/dev/sdb  -O raw


Resize the partition
: fdisk /dev/sdb
then d, n, p, w to recreate the partition till the end of the disk
Resize the FS
: resize2fs /dev/sdb2

# I guesse here is where btrfs-convert would be appropriate

>From there you can reboot into Guix and it should work.

As for the system I use (minimal-ovh) from my channel as a base:


https://gitlab.com/edouardklein/guix/-/blob/beaverlabs/beaver/system.scm?ref_type=heads#L171

which looks mostly like yours.


Again I apologize for not publishing it sooner, I guess it would have
saved you some troubles.

Cheers,

Edouard.

Maxim Cournoyer <maxim.courno...@gmail.com> writes:

> Hi,
>
> I've recently experimented with installing Guix System on a cheap OVH
> VPS server, and here are my findings in case it helps someone else:
>
> 1. The base images do not include Guix System, so start with something
> like Debian 12 or newer.
>
> 2. From their web interface, reboot into their rescue mode.
>
> 3. Make enough space on the rescue root to have about 500 MiB free,
> enough for 'apt install guix' to succeed.  I found one unused kernel
> image which freed a lot of space, along with 'gcc'.
>
> 4. Recreate /dev/sdb1 from 20 GB to 15 GB, and create a new 5 GB
> partition after that, as /dev/sdb2.  Mount /dev/sdb2 as /gnu in the
> rescue.  This is because the rescue file system is too small to run
> 'guix system init'.
>
> I've also opted for Btrfs file system, and made sure to mount the
> partitions with 'mount -o compress=zstd ...' to shrink space usage as
> much as I could.
>
> 5. Run 'guix system init /mnt your-config.scm', where /mnt is the mount
> point for /dev/sdb1.  For the config, start with the bare-bones.tmpl
> config.  Use plain GRUB (BIOS, not UEFI), and add the virtio_scsi module
> to the initrd:
>
>   (initrd-modules (cons "virtio_scsi"    ; Needed to find the disk
>                         %base-initrd-modules))
>
>
> The other important bit to see the kernel messages at boot is this:
>
>   (kernel-arguments (list "console=ttyS0 console=tty0"))
>
>
>
> Here's what my actual config file looks like, with some parts redacted:
>
> (use-modules (gnu))
> (use-service-modules networking ssh)
> (use-package-modules ssh)
>
> (operating-system
>   (host-name "vps-xxx")
>   (locale "en_US.utf8")
>
>   (bootloader (bootloader-configuration
>                (bootloader grub-bootloader)
>                (targets '("/dev/sdb"))))
>
>   (kernel-arguments (list "console=ttyS0 console=tty0"))
>
>   (file-systems (cons* (file-system
>                          (device (uuid 
> "bbf61fb4-b6ce-44af-ac57-1850cd708965"))
>                          (mount-point "/")
>                          (type "btrfs")
>                          (options "compress=zstd"))
>                        %base-file-systems))
>
>   (initrd-modules (cons "virtio_scsi"    ; Needed to find the disk
>                         %base-initrd-modules))
>
>   ;; This is where user accounts are specified.  The "root"
>   ;; account is implicit, and is initially created with the
>   ;; empty password.
>   (users (cons (user-account
>                 (name "some-user")
>                 (group "users")
>                 ;; Adding the account to the "wheel" group
>                 ;; makes it a sudoer.  Adding it to "audio"
>                 ;; and "video" allows the user to play sound
>                 ;; and access the webcam.
>                 (supplementary-groups '("wheel")))
>                %base-user-accounts))
>
>   ;; Add services to the baseline: a DHCP client and an SSH
>   ;; server.  You may wish to add an NTP service here.
>   (services
>    (append
>     (list (service dhcp-client-service-type)
>           (service openssh-service-type
>                    (openssh-configuration
>                     (openssh openssh-sans-x)
>                     (port-number 2222)
>                     (authorized-keys
>                      `(("some-user" ,(plain-file "maxim-ssh.pub"
>                                                  "ssh-XXX XXXXXXXX")))))))
>     %base-services))
>
>   (sudoers-file
>    (plain-file "sudoers"
>                (string-append (plain-file-content %sudoers-specification)
>                               "some-user ALL = NOPASSWD: ALL\n"))))
>
> The sudoers-file part is so that I can 'guix deploy' to it.
>
> Happy hacking!

Reply via email to