
Letztes Wochenende hab ich mir endlich mal die Free Tier Instanz (AMD based Compute VMs with 1/8 OCPU and 1 GB memory each) in der Oracle Cloud geklickt. Das hab ich schon ewig vor mir her geschoben und jetzt hab ich mal ein bisschen Zeit gefunden. Leider konnte ich nicht direkt Debian als Betriebssystem auswählen, aber als Community-Image gab es Ubuntu.
Nachdem ich ein bisschen damit rumgespielt habe, wollte ich aber doch lieber Debian haben (ich hab überall Debian installiert) - also hab ich angefangen zu suchen, ob das schon jemand gelöst hat.
Im Blog von Pieter Hollander wurde ich fündig.
Ich hab auf Verschlüsselung und Swapfile verzichtet, weil ich auf der Box nicht mehr als 1GB RAM brauche und ich Dateisystemverschlüsselung in VMs für Blödsinn halte.
Der Ablauf ist wie folgt:
Eine SSH-Verbindung in das Ubuntu aufbauen, root werden und das Ubuntu mit Alpine Linux ersetzen:
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" ubuntu@REPLACE_WITH_YOUR_INSTANCES_PUBLIC_IP_ADDRESS
sudo -i
cd /
wget https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/x86_64/alpine-virt-3.21.3-x86_64.iso
dd if=alpine-virt-3.21.3-x86_64.iso of=/dev/sda
sync
reboot
Damit rebootet die Instanz in das Alpine Linux, wodurch der SSH-Zugriff verloren geht, da Alpine Linux standardmäßig keinen laufenden SSH-Server hat.
Über die Oracle Cloud Console muss eine Konsolenverbindung erstellt werden.
Dafür auf Compute, Instances und Instance details klicken.
Dann die Instanz auswählen, herunterscrollen und bei Console connection auf Launch Cloud Shell connection klicken.
Wenn die Verbindung zu dem Cloudserver aufgebaut ist, steht im Fenster Instance Console Connection reached state: ACTIVE.
An dem erscheinenden Loginprompt mit dem Benutzernamen root und ohne Passwort einloggen.
Als erstes muss die Netzwerkkonfiguation gefixt werden:
vi /etc/network/interfaces
i drücken, um dein Einfügemodus zu aktivieren.
auto eth0
iface eth0 inet dhcp
Mit :wq den vi verlassen und speichern. Danach das Netzwerk neustarten:
/etc/init.d/networking restart
Um nicht alles in der - doch etwas anstrengenden - Konsole zu machen, richten wir uns den SSH-Server ein:
setup-sshd
Which ssh server? ('openssh', 'dropbear' or 'none') [openssh]
Allow root ssh login? ('?' for help) [prohibit-password]
Enter ssh key or URL for root (or 'none') [none]
* service sshd added to runlevel default
* Caching service dependencies ...
[ ok ]
ssh-keygen: generating new host keys: RSA ECDSA ED25519
* Starting sshd ...
[ ok ]
Den öffentlichen SSH-Schlüssel ablegen:
mkdir /root/.ssh
vi /root/.ssh/authorized_keys
Danach per SSH weitermachen:
ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" root@REPLACE_WITH_YOUR_INSTANCES_PUBLIC_IP_ADDRESS
Das Alpine Linux auf eine Ramdisk bewegen und von da weiterarbeiten:
mkdir /media/setup
cp -a /media/sda/* /media/setup
mkdir /lib/setup
cp -a /.modloop/* /lib/setup
/etc/init.d/modloop stop
umount /dev/sda
mv /media/setup/* /media/sda/
mv /lib/setup/* /.modloop/
Paket-Repositories konfigurieren und benötige Pakete installieren:
setup-apkrepos
apk update
apk add dosfstools e2fsprogs debootstrap cryptsetup nano gptfdisk partx btrfs-progs
Die Festplatte partitionieren:
gdisk /dev/sda
3 drücken, damit gdisk eine neue GPT-Partitionstabelle erstellt.
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-104857566, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-104857566, default = 104855551) or {+-}size{KMGTP}: +1024M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Press n to create the EFI partition. Make it 512MB and set it to EFI.
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-104857566, default = 2099200) or {+-}size{KMGTP}:
Last sector (2099200-104857566, default = 104855551) or {+-}size{KMGTP}: +512M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI system partition'
Press n to create the root file system partition. Make it use all available remaining disk space.
Command (? for help): n
Partition number (3-128, default 3):
First sector (34-104857566, default = 3147776) or {+-}size{KMGTP}:
Last sector (3147776-104857566, default = 104855551) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Press p to display the partition table. It should give the following result:
Command (? for help): p
Disk /dev/sda: 104857600 sectors, 50.0 GiB
Model: BlockVolume
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 57C983BB-7A42-4B74-BD69-F9A0AEFD5199
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)
Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB 8300 Linux filesystem
2 2099200 3147775 512.0 MiB EF00 EFI system partition
3 3147776 104855551 48.5 GiB 8300 Linux filesystem
Mit w speichern und beenden.
Anschließend muss eine MBR-Partitionstabelle auf die Festplatte geschrieben.
Dazu zunächst die alte MBR-Partitionstabelle löschen…
partx -v -d /dev/sda
partition: none, disk: /dev/sda, lower: 0, upper: 0
/dev/sda: partition #1 removed
/dev/sda: partition #2 removed
/dev/sda: partition #3 removed
…und die neue schreiben:
partx -v -a /dev/sda
partition: none, disk: /dev/sda, lower: 0, upper: 0
/dev/sda: partition table type 'gpt' detected
range recount: max partno=3, lower=0, upper=0
/dev/sda: partition #1 added
/dev/sda: partition #2 added
/dev/sda: partition #3 added
Alle Partitionen formatieren…
mkfs.ext4 /dev/sda1
mkfs.vfat /dev/sda2
mkfs.ext4 /dev/sda3
…und mounten:
mount -t ext4 /dev/sda3 /mnt
mkdir /mnt/boot
mount -t ext4 /dev/sda1 /mnt/boot
mkdir /mnt/boot/efi
mount -t vfat /dev/sda2 /mnt/boot/efi
Debian herunterladen und installieren:
mkdir -p /mnt/var/tmp
chmod 1777 /mnt/var/tmp
debootstrap bookworm /mnt
Hostnamen konfigurieren:
echo YOUR_PREFERRED_HOSTNAME > /mnt/etc/hostname
cat <<EOF >> /mnt/etc/hosts
127.0.1.1 YOUR_PREFERRED_HOSTNAME.YOUR_DOMAIN YOUR_PREFERRED_HOSTNAME
EOF
Netzwerk konfigurieren:
rm -rf /mnt/etc/network
cat <<EOF >> /mnt/etc/systemd/network/ens3.network
[Match]
Name=ens3
[Network]
DHCP=yes
EOF
Paketquellen konfigurieren:
cat <<EOF > /mnt/etc/apt/sources.list
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/ bookworm-security main contrib non-free non-free-firmware
#deb-src http://security.debian.org/ bookworm-security main contrib non-free non-free-firmware
# bookworm-updates, previously known as 'volatile'
deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
# bookworm-backports, previously on backports.debian.org
deb http://deb.debian.org/debian/ bookworm-backports main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian/ bookworm-backports main contrib non-free non-free-firmware
EOF
In den root-Mountpoint chrooten:
mount --rbind /dev /mnt/dev
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
LANG=C chroot /mnt /bin/bash
Paketquellen und System updaten:
apt update
apt dist-upgrade -y
Die Systemsprache konfigurieren:
apt install locales -y
dpkg-reconfigure locales
Zeitzone konfigurieren:
dpkg-reconfigure tzdata
Und das Netzwerk konfigurieren:
apt purge ifupdown
systemctl enable systemd-networkd
/etc/fstab erstellen:
cat <<EOF > /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / partition
EOF
echo UUID=$(blkid -s UUID -o value \
/dev/mapper/luks1) \
/ ext4 defaults 0 2 >> /etc/fstab
cat <<EOF >> /etc/fstab
# /boot partition
EOF
echo UUID=$(blkid -s UUID -o value \
/dev/sda1) \
/boot ext4 defaults 0 2 >> /etc/fstab
cat <<EOF >> /etc/fstab
# UEFI /boot/efi partition (fat32)
EOF
echo PARTUUID=$(blkid -s PARTUUID -o value \
/dev/sda2) \
/boot/efi vfat defaults 0 1 >> /etc/fstab
Bootloader installieren:
apt install -y grub-efi
grub-install --target=x86_64-efi --efi-directory=/boot/efi --recheck --no-floppy
Die serielle Konsole im GRUB aktivieren, damit der Zugriff auf den Server über das Webportal noch geht:
cat <<EOF >> /etc/default/grub
GRUB_TERMINAL_INPUT="console serial"
GRUB_TERMINAL_OUTPUT="gfxterm serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200"
GRUB_CMDLINE_LINUX_DEFAULT="\${GRUB_CMDLINE_LINUX_DEFAULT} console=tty0 console=ttyS0,115200"
EOF
update-grub2
Den Kernel und benötigte Pakete installieren:
apt install -y linux-image-amd64 ssh systemd-timesyncd haveged wget curl net-tools git gpg build-essential dosfstools qemu-guest-agent
Und wieder den öffentlichen SSH-Schlüssel ablegen:
mkdir ~/.ssh
vi ~/.ssh/authorized_keys
Und am Ende aufräumen:
apt --purge autoremove
Danach in das Debian rebooten und genießen:
exit
reboot