YannStatic
  • Etiquettes
  • Liens
  • Aide

Machine virtuelle Alpine Linux (vm-alpine01)

  • virtuel
  •  17 août  2024 19 janv. 2025
Afficher/cacher Sommaire

Alpine Linux est une distribution Linux ultra-légère

Alpine Linux

Création machine virtuelle Alpine de type KVM avec 2 Go de RAM, 1 cœur de processeur et 5 Go de disque dur.

Créer vm-alpine sur un serveur

Les dernières images Alpine Linux

Création d’une image virtuelle vm-alpine01 sous le serveur Lenovo rnmkcy.eu
On se connecte sur le serveur Lenovo en SSH, puis on exécute la commande suivante pour créer une machine virtuelle Alpine avec 2 Go de RAM, 1 cœur de processeur et 5 Go de disque dur

sudo virt-install \sudo virt-install \
--osinfo alpinelinux3.17 \
--name vm-alpine01 \
--memory 2048 \
--vcpus 1 \
--cpu host \
--hvm \
--disk path=/srv/kvm/libvirt/images/vm-alpine01.qcow2,format=qcow2,size=5 \
--cdrom /home/yick/FreeUSB2To/iso/alpine-standard-3.21.0-x86_64.iso \
--network bridge=br0 \
--graphics vnc  

Note: La dernière version Alpine Linux est alpinelinux3.20 au 10/07/2024 mais KVM ne connait que alpinelinux3.17 (sudo virt-install --osinfo list |grep alpine)

Après exécution dans un terminal de la commande ci dessus, on arrive sur En attente de fin d’installation

Configurer vm-alpine

ATTENTION: Désactiver "Affichage VNC" des autres machines

Le serveur Lenovo n’a pas d’affichage, il faut créer un tunnel ssh depuis un terminal d’un poste client

ssh -L 5900:127.0.0.1:5900 yick@192.168.0.205 -p 55205 -i /home/yann/.ssh/yick-ed25519

Puis lancer de ce même poste un client VNC

la console s’affiche

Une fois l’image ISO lancée, on arrive à un invite de connexion.
Indiquez root comme nom d’utilisateur, aucun mot de passe ne vous sera demandé à cette étape.

Le système est utilisable, mais on veut l’installer, ce qui passe par la commande suivante (clavier qwerty)

setup-alpine # saisir setup)qlpine

Une suite de questions :

mot de passe root (rtyuiop)

APK mirror…

Utilisateur alpi/alpi49 et suite…

Relever l’adresse ip allouée : ip a –> 192.168.70.12
Puis redémarrer : reboot
La fenêtre vnc se ferme

On n’a plus besoin de VNC, en mode graphique



Eteindre puis redémarrer la machine virtuelle

Explications sur la procédure

Normalement, vous n’avez rien à faire, les paramètres par défaut doivent convenir. Mais si vous le désirez, vous pouvez les modifier pour utiliser une interface particulière, une IP fixe, un serveur proxy, etc.
Une soixantaine de serveurs mirroir vous seront proposés pour télécharger les paquets. Choisissez un numéro dans la liste ou demandez au système de les tester et de sélectionner le plus rapide. Vous pouvez aussi modifier le fichier des sources. Il vous faudra ensuite choisir votre serveur SSH : OpenSSH, Dropbear ou aucun.

On termine par la méthode d’installation. Il en existe quatre :

  • none : le système et ses données sont placés en RAM et seront perdus après le redémarrage
  • sys : le système et ses données sont placés sur un HDD/SSD
  • data : le système est placé en RAM, les données sur un HDD/SSD
  • lvm : utilisation de Logical Volume Manager, les deux choix précédents seront proposés (lvmsys, lvmdata)

Si vous stockez le système en mémoire, il faudra trouver un moyen de sauvegarder la configuration. Vous pourrez le faire uniquement depuis un lecteur de disquettes (!) ou une clé USB. Une fois le système installé, vous pourrez l’utiliser directement s’il est placé en mémoire ou redémarrer si vous avez opté pour un stockage classique.

Il n’est pas conseillé d’utiliser directement le compte root pour les actions du quotidien.
Si utilisateur non créé dans la procédure d’installation, le créer avec son propre espace dans /home/

adduser alpi

Vous pouvez utiliser l’utilisateur pour vous connecter via SSH (impossible avec le compte root)

Connexion vm-alpine via SSH

Sur un poste linux du réseau

ssh alpi@192.168.70.12

Une fois connecté ,vous pouvez accéder au “root” de manière classique avec la commande :

su -

Mise à jour

apk update
apk upgrade 
# Vous pouvez fusionner les deux lignes avec 
apk -U upgrade

Editeur nano (Vous pouvez aussi opter pour vi qui est nativement présent sur le système)

apk add nano

Réseau - IP statique

How to configure static IP address on Alpine Linux

Le fichier de configuration /etc/network/interfaces

/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address 192.168.70.110
  gateway 192.168.70.1

Fichier de résolution dns

/etc/resolv.conf
search yann.priv
nameserver 192.168.70.1

Les modifications apportées à /etc/network/interfaces peuvent être activées en exécutant

service networking restart 

ATTENTION: Déconnexion SSH car changement adresse IP

Connexion SSH avec IP 192.168.70.110

ssh alpi@192.168.70.110

Message à la connexion SSH, /etc/motd

     _     _         _                _      _                       
    / \   | | _ __  (_) _ __    ___  | |    (_) _ __   _   _ __  __  
   / _ \  | || '_ \ | || '_ \  / _ \ | |    | || '_ \ | | | |\ \/ /  
  / ___ \ | || |_) || || | | ||  __/ | |___ | || | | || |_| | >  <   
 /_/   \_\|_|| .__/ |_||_| |_| \___| |_____||_||_| |_| \__,_|/_/\_\  
             |_|                  _         _                ___   _ 
 __   __ _ __ ___           __ _ | | _ __  (_) _ __    ___  / _ \ / |
 \ \ / /| '_ ` _ \  _____  / _` || || '_ \ | || '_ \  / _ \| | | || |
  \ V / | | | | | ||_____|| (_| || || |_) || || | | ||  __/| |_| || |
   \_/  |_| |_| |_|        \__,_||_|| .__/ |_||_| |_| \___| \___/ |_|
  _   ___  ____      _   __     ___ |_| _   ___     _  _   ___       
 / | / _ \|___ \    / | / /_   ( _ )   / | / _ \   / |/ | / _ \      
 | || (_) | __) |   | || '_ \  / _ \   | || | | |  | || || | | |     
 | | \__, |/ __/  _ | || (_) || (_) |_ | || |_| |_ | || || |_| |     
 |_|   /_/|_____|(_)|_| \___/  \___/(_)|_| \___/(_)|_||_| \___/      

OpenSSH avec clés

Connexion ssh sur un autre port avec un jeu de clés

Générer une paire de clé sur l’ordinateur de bureau PC1
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) pour une liaison SSH avec la machine virtuelle vm-alpine01

ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/vm-alpine01
chmod 600 ~/.ssh/vm-alpine01

Copier la clé publique cat ~/.ssh/vm-alpine01.pub dans le presse-papier

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHJXXXPhNI7WD1q9AJ70fnoI2OyNjReheLKR/hFhWaiz yann@PC1

On se connecte sur la machine virtuelle alpine linux “vm-alpine01” en proxy avec le serveur cwwk (192.168.0.205)

ssh -o ProxyCommand="ssh -W %h:%p -p 55205 -i /home/yann/.ssh/yick-ed25519 yick@192.168.0.205" alpi@192.168.70.110 -p 55110 -i /home/yann/.ssh/vm-alpine01

Créer le répertoire et ouvrir nouveau fichier

mkdir -p $HOME/.ssh/
nano $HOME/.ssh/authorized_keys

Coller le contenu du presse-papier , sauver le fichier et sortir

Modifier les droits

chmod 600 $HOME/.ssh/authorized_keys

Passer en mode su

su -

Modifier la configuration serveur SSH

nano /etc/ssh/sshd_config

Modifier

Port = 55110
PasswordAuthentication no

Relancer le serveur

service sshd restart

Test connexion

ssh -o ProxyCommand="ssh -W %h:%p -p 55205 -i /home/yann/.ssh/yick-ed25519 yick@192.168.0.205" alpi@192.168.70.110 -p 55110 -i /home/yann/.ssh/vm-alpine01

sudo

Passer en root

su -

Ajout dépôt communauté
Editer la configuration des dépôts

nano /etc/apk/repositories

Trouvez maintenant la ligne qui se termine dans /community
Ensuite, retirez le # au début de la ligne.
Le fichier résultant devrait ressembler à ceci

#/media/cdrom/apks
http://mirrors.ircam.fr/pub/alpine/v3.20/main
http://mirrors.ircam.fr/pub/alpine/v3.20/community

Installer sudo

apk update
apk add sudo

Ajouter un utilisateur avec les privlèges root

echo "alpi     ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/20-alpi

Partage (virtiofs)

Virtiofs est un système de fichiers partagé qui permet aux machines virtuelles d’accéder à une arborescence de répertoires sur l’hôte. Contrairement aux approches existantes, il est conçu pour offrir la sémantique et les performances d’un système de fichiers local.

Un arrêt puis un démarrage de la machine virtuelle est obligatoire

Il faut valider Enable shared memory

Puis ajouter un système de fichier

Vue des éléments XML de domaine suivants pour partager le répertoire hôte /path avec l’invité

<domaine>
      ...
  <memoryBacking>
    <source type="memfd"/>
    <access mode="shared"/>
  </memoryBacking>
      ...
  <devices>
        ...
    <filesystem type="mount" accessmode="passthrough">
      <driver type="virtiofs"/>
      <source dir="/sharenfs"/>
      <target dir="sharenfs"/>
    </filesystem>
        ...
   </devices>
</domaine>

Créer dossier local en mode utilisateur

mkdir -p ~/sharenfs

Le partage sur /etc/fstab en mode su

sharenfs   /home/alpi/sharenfs   virtiofs rw 0 0

monter

sudo mount -a

Démarrage automatique VM

Démarrage auto

Modifier DNS

Ajout serveur DNS Unbound 192.168.0.205 (présent dans le serveur debian 12 cwwk rnmkcy.eu)
dans le fichier /etc/resolv.conf

nameserver 192.168.0.205
nameserver 192.168.70.1

Outils Réseau

apk update && apk add bind-tools

Serveur web nginx

Installation nginx

sudo apk add nginx

Nom utilisateur dans le fichier de configuration

sudo nano /etc/nginx/nginx.conf
# /etc/nginx/nginx.conf

user alpi;

On édite ensuite le fichier de configuration du serveur web

sudo nano /etc/nginx/http.d/default.conf

Modifier le contenu du fichier par la configuration suivante

server {
    
    listen 80 default_server;
    listen [::]:80 default_server;

    root /srv/www/;    
    server_name alpine.home.arpa;

    location /files {		
        autoindex on;	
    }
}

On crée ensuite les dossiers et fichiers nécessaires. Vous noterez que nous plaçons le contenu de nos sites web dans le dossier /srv/www/ ce qui n’est pas toujours l’emplacement utilisé par défaut. Il n’y a en effet pas consensus sur le « bon endroit » pour cela, mais la version 3.0 de la FHS (Filesystem Hierarchy Standard), qui fait référence en la matière, précise que /srv/ doit être utilisé pour les services diffusant des données, dont « www »

On modifie les dossiers créés et les librairies de nginx pour en donner la propriété à l’utilisateur ainsi qu’au groupe www-data, qui est celui en général en charge de l’accès aux serveurs web et à leurs données :

sudo adduser $USER www-data
sudo mkdir -p /srv/www/files/
sudo chown $USER:www-data -R /srv/www
sudo chown -R $USER:www-data /var/lib/nginx
echo "Serveur alpine.home.arpa !" > /srv/www/index.html
# Télécharger logo
wget https://static.rnmkcy.eu//images/alpine-linux-logo.png -O /srv/www/files/logo.png

Tout est prêt, on peut donc tester le fichier de configuration et lancer nginx s’il est valide

sudo nginx -t
sudo rc-service nginx start

Les URL suivantes devraient fonctionner depuis votre machine (adaptez avec le hostname ou l’IP du serveur)

http://alpine.home.arpa/
http://alpine.home.arpa/files/
http://alpine.home.arpa/files/logo.png

Vous pouvez ajouter nginx à la liste des services à lancer au démarrage de la machine

sudo rc-update add nginx default
reboot

Bash sur Alpine Linux (NON INSTALLE)

How to install bash shell in Alpine Linux
Par défaut, bash n’est pas inclus avec BusyBox et Linux alpine.

Installer un shell bash dans Alpine Linux
Voici comment installer un shell bash dans Alpine Linux en utilisant la commande apk.

Passer en mode root : su -

apk update
apk upgrade
apk add bash

Obtenez une liste des “shell” de connexion valides sur Linux Alpine

cat /etc/shells

Produit :

# valid login shells
/bin/sh
/bin/ash
/bin/bash

documentation et auto complétion
Installer la documentation de bash : apk add bash-doc
Installer l’auto complétion bash : apk add bash-completion

Vérifiez et appelez /etc/bash/bash_completion.sh

source /etc/bash/bash_completion.sh
cat /etc/bash/bash_completion.sh

Comment configurer bash comme shell login

Pour utiliser bash juste saisir : bash
Changer le root shell en bash
En mode su : nano /etc/passwd
Remplacer /bin/sh par /bin/bash pour les utilisateurs root et alpi

root:x:0:0:root:/root:/bin/bash
alpi:x:1000:1000:alpi:/home/alpi:/bin/bash

Personnaliser le bash

cat > ~/.bashrc << EOF
alias update='apk update && apk upgrade'
export HISTTIMEFORMAT="%d/%m/%y %T "
export PS1='\u@\h:\W \$ '
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
source /etc/bash/bash_completion.sh
export PS1="\[\e[31m\][\[\e[m\]\[\e[38;5;172m\]\u\[\e[m\]@\[\e[38;5;153m\]\h\[\e[m\] \[\e[38;5;214m\]\W\[\e[m\]\[\e[31m\]]\[\e[m\]\\$ "
EOF

Version bash : bash --version

GNU bash, version 5.2.26(1)-release (x86_64-alpine-linux-musl)
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Docker (NON INSTALLE)

Installation

Install docker & docker-compose on Alpine Linux

Passer en root

su -

Ajout dépôt communauté (si non effectué lors de l’installation)
Editer la configuration des dépôts

nano /etc/apk/repositories

Trouvez maintenant la ligne qui se termine dans /community Ensuite, retirez le # au début de la ligne. Le fichier résultant devrait ressembler à ceci

#/media/cdrom/apks
http://mirrors.ircam.fr/pub/alpine/v3.20/main
http://mirrors.ircam.fr/pub/alpine/v3.20/community

Installation docker
Installer docker et docker-compose

apk update
apk add docker docker-compose

Activer autostart sur boot en utilisant

rc-update add docker default

puis vous pouvez lancer le service docker en utilisant la commande

/etc/init.d/docker start
# ou
service docker start

Site statique (NON INSTALLE)

Ruby

Installation de Ruby avec RVM sur Alpine Linux (Installing Ruby with RVM on Alpine Linux)
Passer en mode root : su -

Paquets de base

apk update
apk add curl gcc gnupg gpg dirmngr procps musl-dev linux-headers zlib zlib-dev openssl openssl-dev build-base
# libssl1.1
exit

En mode utilisateur
Téléchargez ensuite la dernière version stable de rvm depuis Github, décompressez-la, placez-la dans le répertoire utilisateur approprié (~/.rvm) et installez toutes les bibliothèques requises :

curl -sSL https://github.com/rvm/rvm/tarball/stable -o rvm-stable.tar.gz
echo 'export rvm_prefix="$HOME"' > ~/.rvmrc
echo 'export rvm_path="$HOME/.rvm"' >> ~/.rvmrc
mkdir rvm && cd rvm
tar --strip-components=1 -xzf ../rvm-stable.tar.gz
./install --auto-dotfiles --autolibs=0

Faire le ménage et créer un lien vers rvm

cd ../ && rm -rf rvm-stable stable.tar.gz rvm
source ~/.rvm/scripts/rvm

On va installer la version Ruby 3.1.4

rvm install ruby-3.1.4

Patienter plusieurs minutes…

Vérification : ruby -v
ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux-musl]

Projet jekyll

On va dupliquer le dossier yannstatic existant sur PC1 en alpistatic sur vm-alpine01

Installer Jekyll et Bundler

Vérifier les sources

localhost:~$ gem source
*** CURRENT SOURCES ***

# rien ci dessus ,on active une source
localhost:~$ gem source -a https://rubygems.org/
https://rubygems.org/ added to sources
# Vérification
localhost:~$ gem source
*** CURRENT SOURCES ***

https://rubygems.org/

installez Jekyll et Bundler

gem install jekyll bundler

Naviguez dans le répertoire de votre projet Jekyll et exécutez:

cd /home/alpi/alpistatic

Le fichier Gemfile

source "https://rubygems.org"

# gem "github-pages", group: :jekyll_plugins
gem "jekyll-text-theme"
gem "sass-embedded", "1.76.0"

Supprimer Gemfile.lock : rm Gemfile.lock

Bundle lit le fichier Gemfile

bundle install

An error occurred while installing eventmachine (1.2.7), and Bundler cannot continue.
Il faut installer le paquet build-base

GCC, qui représente GNU Compiler Collection, est un système de compilation libre et open-source produit par le projet GNU.
Le moyen le plus rapide pour commencer avec GCC sur Alpine Linux est de lancer la commande suivante:

sudo apk add build-base

build-base est un méta-package qui installera les paquets gcc, musl-dev et binutils (entre autres).

Info sur jekyll après installation : bundle info jekyll

  * jekyll (4.3.4)
	Summary: A simple, blog aware, static site generator.
	Homepage: https://jekyllrb.com
	Source Code: https://github.com/jekyll/jekyll
	Changelog: https://github.com/jekyll/jekyll/releases
	Bug Tracker: https://github.com/jekyll/jekyll/issues
	Path: /home/alpi/.rvm/gems/ruby-3.1.4/gems/jekyll-4.3.4
	Reverse Dependencies: 
		jekyll-feed (0.17.0) depends on jekyll (>= 3.7, < 5.0)
		jekyll-sitemap (1.4.0) depends on jekyll (>= 3.7, < 5.0)
		jekyll-text-theme (2.2.6) depends on jekyll (>= 3.6, < 5.0)
		jemoji (0.13.0) depends on jekyll (>= 3.0, < 5.0)

Création des liens

Création des liens sur les dossiers files , images , _posts et htmldoc

ln -s /home/alpi/statique/files /home/alpi/alpistatic/files
ln -s /home/alpi/statique/images /home/alpi/alpistatic/images
ln -s /home/alpi/statique/_posts /home/alpi/alpistatic/_posts
ln -s /home/alpi/statique/htmldoc /home/alpi/alpistatic/htmldoc
ln -s /home/alpi/statique/htmldoc/htmldoc.md /home/alpi/alpistatic/htmldoc.md

La structure des liens : ls -l ~/alpistatic/ |grep ^l

lrwxrwxrwx    1 alpi   alpi          28 Sep 18 19:43 _posts -> /home/alpi/statique/_posts
lrwxrwxrwx    1 alpi   alpi          27 Sep 18 19:43 files -> /home/alpi/statique/files
lrwxrwxrwx    1 alpi   alpi          29 Sep 18 19:46 htmldoc -> /home/alpi/statique/htmldoc
lrwxrwxrwx    1 alpi   alpi          40 Sep 18 19:44 htmldoc.md -> /home/alpi/statique/htmldoc/htmldoc.md
lrwxrwxrwx    1 alpi   alpi          28 Sep 18 19:43 images -> /home/alpi/statique/images

Génération dossier “static”

Dans le dossier alpistatic

cd $HOME/alpistatic
bundle exec jekyll build

C’est ça ! Maintenant si vous exécutez bundle exec jekyll serve vous trouverez votre projet Jekyll fonctionnant localement!

localhost:~/alpistatic$ bundle exec jekyll serve --source "$HOME/alpistatic"
Configuration file: /home/alpi/alpistatic/_config.yml
            Source: /home/alpi/alpistatic
       Destination: /home/alpi/alpistatic/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
       Jekyll Feed: Generating feed for posts
                    done in 31.908 seconds.
 Auto-regeneration: enabled for '/home/alpi/alpistatic'
    Server address: http://127.0.0.1:4000
  Server running... press ctrl-c to stop.

Dans un terminal de PC1

ssh -L 9500:localhost:4000 alpi@192.168.70.110

Dans un navigateur de PC1 : localhost:9500

Service gener_static

  • OpenRC
  • Working with OpenRC
  • How to Create and Manage a Service in an Alpine Linux Container

Créer un script gener_static.sh

sudo nano /usr/local/bin/gener_static.sh
#!/bin/sh
echo $$ > /run/gener_static.pid  # Store the PID of this process
cd $HOME/alpistatic
bundle exec jekyll build --watch --incremental

Le rendre exécutable

sudo chmod +x /usr/local/bin/gener_static.sh

Augmenter taille disque virtuel

[yann@yann-pc1 ~]$ sudo virsh list
 ID   Nom           État
------------------------------------------
 1    vm-debian12   en cours d’exécution
 6    vm-alpine01   en cours d’exécution

[yann@yann-pc1 ~]$ sudo virsh shutdown vm-alpine01
Le domaine 'vm-alpine01' est en cours de fermeture

[yann@yann-pc1 ~]$ sudo virsh domblklist vm-alpine01
 Cible   Source
---------------------------------------------------
 vda     /home/yann/virtuel/KVM/vm-alpine01.qcow2


[yann@yann-pc1 ~]$ sudo qemu-img resize /home/yann/virtuel/KVM/vm-alpine01.qcow2 +15G
Image resized.

[yann@yann-pc1 ~]$ sudo qemu-img info /home/yann/virtuel/KVM/vm-alpine01.qcow2
image: /home/yann/virtuel/KVM/vm-alpine01.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 3.11 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
    extended l2: false
Child node '/file':
    filename: /home/yann/virtuel/KVM/vm-alpine01.qcow2
    protocol type: file
    file length: 5 GiB (5369757696 bytes)
    disk size: 3.11 GiB


[yann@yann-pc1 ~]$ sudo virsh start vm-alpine01
Domaine 'vm-alpine01' démarré

Connexion ssh alpi@192.168.70.110

# Outils
sudo apk add --no-cache cfdisk e2fsprogs-extra

# cfdisk pour redimensionner la partition vda3
localhost:~$ sudo cfdisk

sélectionner la partition à étendre puis resize write quit

Syncing disks.

# resize
localhost:~$ sudo resize2fs /dev/vda3
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/vda3 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 3
The filesystem on /dev/vda3 is now 4838144 (4k) blocks long.

# vérification
localhost:~$ sudo df -H |grep vda3
/dev/vda3                18.1G      2.9G     14.4G  17% /


PRÉCÉDENTGitea
SUIVANTPython venv OVH API
Recherche