Debian Bookworn avec kernel v 6.1 sur Odroid Xu4
Copie de l'image
En remplaçant /dev/sdX par la bonne valeur
root@deb:/home/bruno# dd if=./Armbian_24.2.1_Odroidxu4_bookworm_current_6.1.77_minimal.img of=/dev/sdX bs=2048
Première connection
Il faut trouver l'adresse IP de la carte soit sur l'écran connecté en hdmi à l'Xu4, soit dans l'interface de la box (Bails DHCP actifs). On se connecte en root avec le mot de passe provisoire 1234
bruno@deb:~$ ssh root@192.168.0.100
Création d'un mot de passe root, d'un utilisateur (odroid ici), timezone et locales.
Ajout d'une clef pour se connecter par clef :
Après avoir créé une paire de clef son son ordinateur servant à se connecter à l'Xu4, on l'a copie sur l'Xu4.
bruno@deb:~$ ssh-copy-id -i /home/bruno/.ssh/id_rsa.pub root@192.168.0.100
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/bruno/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.100's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.0.100'"
and check to make sure that only the key(s) you wanted were added.
bruno@deb:~$ ssh root@192.168.0.100
On fait de même avec l'utilisateur odroid
On essai de se connecter à l'utilisateur nouvellement créé, puis à root, normalement, plus de mot de passe demandé. Si ok, on peut supprimer la connexion directe à root et par mot de passe.
root@odroidxu4:~# nano /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
Hostname
Pour remplacer odroidxu4 par votre nom personnel de machine (omega ici), faire les modifs dans ces deux fichiers.
root@odroidxu4:~# nano /etc/hostname
root@odroidxu4:~# nano /etc/hosts
ipv6 fixe
NetworkManager est utilisé pour créer, gérer, supprimer des connexions réseau. Là, on définie une adresse ipv6 de la plage d'adresses fournie par le fournisseur d'accès. (! A adapter selon votre plage d'adresses)
root@omega:~# nmcli connection add type ethernet con-name "Ipv6 fixe" ipv6.addresses 2a01:e0a:195:1040:cdaf:219b:207e:d823/64 ipv6.method manual
root@omega:~# nmcli connection mod "Ipv6 fixe" ipv6.gateway fe80::
root@omega:~# nmcli connection mod "Ipv6 fixe" ipv6.dns fd0f:ee:b0::1,2001:4860:4860::8888
root@omega:~# nmcli c down "Ipv6 fixe" && nmcli c up "Ipv6 fixe"
Connection 'Ipv6 fixe' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
root@omega:~# nmcli -p connection show
======================================
NetworkManager connection profiles
======================================
NAME UUID TYPE DEVICE
-----------------------------------------------------------------------------------------------------------------------
Ipv6 fixe c4ba93b7-d225-39c3-9e2d-5f665ad729d3 ethernet enx001e06300937
lo 2bf4146f-7aae-43d7-a8e3-8968b500cb96 loopback lo
root@omega:~#
root@omega:/home/odroid# cat /etc/NetworkManager/system-connections/Ipv6\ fixe.nmconnection
[connection]
id=Ipv6 fixe
uuid=85da0bb7-1825-404a-aa92-fc3b4d94a6e2
type=ethernet
timestamp=1711381369
[ethernet]
[ipv4]
method=auto
[ipv6]
addr-gen-mode=default
address1=2a01:e0a:195:1040:cdaf:219b:207e:d823/64,fe80::
dns=fd0f:ee:b0::1;2001:4860:4860::8888;
method=manual
[proxy]
Pour une interface graphique
root@odroidxu4:~# nmtui
Pour vérifier
root@odroidxu4:~# ip address | grep inet6
inet6 ::1/128 scope host noprefixroute
inet6 2a01:e0a:195:1040:cdaf:219b:207e:d823/64 scope global noprefixroute
inet6 fe80::3d92:5d30:67d1:10bd/64 scope link noprefixroute
root@odroidxu4:~#
les 3 addresses (locale, adresse fixe, lien réseau local)
Pour l'ipv4, j'ai définie une adresse privée fixe dans la box (192.168.0.100). En cas de ré-installation complète, cela permet de garder l'adresse. Effectuez une translation d'adresse (NAT) pour un accès ipv4 depuis internet.
On redémarre
root@odroidxu4:~# reboot
On met à jour
odroid@omega:~$ sudo apt update
odroid@omega:~$ sudo apt upgrade
Montage du disque externe
Trouvez UUID de la partition à monter (sda1 ici)
root@omega:/home/odroid# lsblk -o name,uuid
NAME UUID
sda
└─sda1 2dadfe57-6d61-43a2-b38c-c264a84f8a80
mmcblk1
└─mmcblk1p1 83630b40-b297-4624-bf44-feede454fdd0
mmcblk1boot0
mmcblk1boot1
zram0
zram1
zram2
root@omega:/home/odroid#
Pour ajouter un disque externe branché en usb, créez un répertoire et éditez le fichier /etc/fstab :
odroid@omega:~$ sudo -s
[sudo] Mot de passe de odroid :
root@omega:/home/odroid# mkdir /srv/hdd
root@omega:/home/odroid# nano /etc/fstab
UUID=2dadfe41-6e61-43b2-b48c-c264a83a8a80 /srv/hdd ext4 rw,noatime 0 0
root@omega:/home/odroid# systemctl daemon-reload
root@omega:/home/odroid# mount /srv/hdd
motd
Pour modifier la page d'accueil lors d'un accès ssh, cela se passe dans
/etc/update-motd.d/
Dans le fichier 30-armbian-sysinfo, Modifier ip -4 en ip, quelque echo pour faire des saut de ligne.
bruno@deb:~$ ssh odroid@omega.ducouet.fr
___ _ _ _ __ ___ _ _ _
/ _ \ __| |_ __ ___ (_) __| | \ \/ / | | | || |
| | | |/ _` | '__/ _ \| |/ _` | \ /| | | | || |_
| |_| | (_| | | | (_) | | (_| | / \| |_| |__ _|
\___/ \__,_|_| \___/|_|\__,_| /_/\_\\___/ |_|
Welcome to Armbian 24.2.1 Bookworm with Linux 6.1.79-current-odroidxu4
System load: 1% Up time: 2 days 2:45
Memory usage: 7% of 1.94G
IP:
192.168.0.100
2a01:e0a:195:1040:cdaf:219b:207e:d823
fe80::3d92:5d30:67d1:10bd
CPU temp: 49°C Usage of /: 9% of 29G
storage/: 24% of 440G
Tip of the day: Check what is new in Armbian v24.2 https://www.armbian.com/newsflash/armbian-24-2-kereru/
Last login: Thu Mar 28 17:09:32 2024 from 2a01:e0a:195:1040:8bf7:102f:4cf0:13f6
odroid@omega:~$
J'ai toutes mes adresses IPs qui s'affichent.
Serveur web Apache et php
root@omega:/home/odroid# apt install apache2 libapache2-mod-php
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
apache2-bin apache2-data apache2-utils libapache2-mod-php8.2 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libicu72 liblua5.3-0 libmagic-mgc libmagic1 libsodium23 libxml2 php-common php8.2-cli php8.2-common
php8.2-opcache php8.2-readline
Paquets suggérés :
apache2-doc apache2-suexec-pristine | apache2-suexec-custom www-browser php-pear file
Paquets recommandés :
ssl-cert
Les NOUVEAUX paquets suivants seront installés :
apache2 apache2-bin apache2-data apache2-utils libapache2-mod-php libapache2-mod-php8.2 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libicu72 liblua5.3-0 libmagic-mgc libmagic1 libsodium23 libxml2 php-common
php8.2-cli php8.2-common php8.2-opcache php8.2-readline
0 mis à jour, 21 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 15,8 Mo dans les archives.
Après cette opération, 66,2 Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o
...
root@omega:~# apt install php-sqlite3 php-xml
fail2ban / reaction
https://blog.ppom.me/fr-reaction/
root@omega:/home/odroid# ls -l /usr/local/bin
total 5792
-rwxr-xr-x 1 root root 370 12 févr. 09:41 hdmi-hotplug
-rwxr-xr-x 1 root root 371084 21 mars 16:49 ip46tables
-rwxr-xr-x 1 root root 371048 21 mars 16:49 nft46
-rwxr-xr-x 1 root root 5177496 21 mars 16:49 reaction
root@omega:/home/odroid# cat /etc/systemd/system/reaction.service
[Unit]
Description=A daemon that scans program outputs for repeated patterns, and takes action.
Documentation=https://framagit.org/ppom/reaction-wiki
[Service]
ExecStart=/usr/local/bin/reaction start -c /etc/reaction.jsonnet
StateDirectory=reaction
RuntimeDirectory=reaction
WorkingDirectory=/var/lib/reaction
[Install]
WantedBy=multi-user.target
root@omega:/home/odroid#
root@omega:/home/odroid# cat /etc/reaction.jsonnet
// This is the extensive configuration used on a **real** server!
local banFor(time) = {
ban: {
cmd: ['ip46tables', '-w', '-A', 'reaction', '-s', '<ip>', '-j', 'DROP'],
},
unban: {
after: time,
cmd: ['ip46tables', '-w', '-D', 'reaction', '-s', '<ip>', '-j', 'DROP'],
},
};
{
patterns: {
// IPs can be IPv4 or IPv6
// ip46tables (C program also in this repo) handles running the good commands
ip: {
regex: @'(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}|(?:(?:[0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?:(?::[0-9a-fA-F]{1,4}){1,6})|:(?:(?::[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(?::[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(?:ffff(?::0{1,4}){0,1}:){0,1}(?:(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])|(?:[0-9a-fA-F]{1,4}:){1,4}:(?:(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9]))',
ignore: ['127.0.0.1', '::1',],
// Ignore les adresses IPv6 locales
ignoreregex: [@'2a01:e0a:195:1040:.*'],
},
},
start: [
['ip46tables', '-w', '-N', 'reaction'],
['ip46tables', '-w', '-I', 'INPUT', '-p', 'all', '-j', 'reaction'],
],
stop: [
['ip46tables', '-w', '-D', 'INPUT', '-p', 'all', '-j', 'reaction'],
['ip46tables', '-w', '-F', 'reaction'],
['ip46tables', '-w', '-X', 'reaction'],
],
streams: {
// Ban hosts failing to connect via ssh
ssh: {
cmd: ['journalctl', '-fn0', '-u','ssh'],
filters: {
failedlogin: {
regex: [
@'authentication failure;.*rhost=<ip>',
@'Connection (reset|closed) by (authenticating|invalid) user .* <ip>',
@'Failed password for .* from <ip>',
],
retry: 2,
retryperiod: '48h',
actions: banFor('336h'),
},
},
},
// Ban invalid http request
http: {
cmd: ['tail', '-fn0', '/var/log/apache2/error.log'],
filters: {
baduser: {
regex: [
@'^\[.*\] \[php:error\] \[.*\] \[client <ip>.*\] script .* not found or unable to stat',
],
retry: 3,
retryperiod: '24h',
actions: banFor('168h'),
},
},
},
},
}
root@omega:/home/odroid#
root@omega:/home/odroid# systemctl daemon-reload
root@omega:/home/odroid# systemctl enable reaction.service
Created symlink /etc/systemd/system/multi-user.target.wants/reaction.service → /etc/systemd/system/reaction.service.
root@omega:/home/odroid# systemctl start reaction.service
root@omega:/home/odroid# systemctl status reaction
● reaction.service - A daemon that scans program outputs for repeated patterns, and takes action.
Loaded: loaded (/etc/systemd/system/reaction.service; enabled; preset: enabled)
Active: active (running) since Sun 2024-04-07 18:18:17 CEST; 4 days ago
Docs: https://framagit.org/ppom/reaction-wiki
Main PID: 27005 (reaction)
Tasks: 18 (limit: 4442)
Memory: 4.6M
CPU: 2min 16.563s
CGroup: /system.slice/reaction.service
├─27005 /usr/local/bin/reaction start -c /etc/reaction.jsonnet
├─27021 tail -fn0 /var/log/apache2/error.log
└─27023 journalctl -fn0 -u ssh
avril 11 15:31:06 omega reaction[27005]: 2024/04/11 15:31:06 INFO ssh.failedlogin: match [222.113.80.162]
avril 11 15:48:50 omega reaction[27005]: 2024/04/11 15:48:50 INFO ssh.failedlogin: match [2001:470:2cc:1:a599:5036:213b:47fd]
avril 11 16:00:38 omega reaction[27005]: 2024/04/11 16:00:38 INFO ssh.failedlogin: match [65.20.249.180]
avril 11 16:05:07 omega reaction[27005]: 2024/04/11 16:05:07 INFO ssh.failedlogin: match [182.75.197.174]
avril 11 16:36:00 omega reaction[27005]: 2024/04/11 16:36:00 INFO ssh.failedlogin: match [60.246.152.189]
avril 11 17:11:12 omega reaction[27005]: 2024/04/11 17:11:12 INFO ssh.failedlogin: match [185.199.98.51]
avril 11 17:11:12 omega reaction[27005]: 2024/04/11 17:11:12 INFO ssh.failedlogin.ban: run [ip46tables -w -A reaction -s 185.199.98.51 -j DROP]
avril 11 17:33:03 omega reaction[27005]: 2024/04/11 17:33:03 INFO ssh.failedlogin: match [49.65.1.179]
avril 11 17:54:03 omega reaction[27005]: 2024/04/11 17:54:03 INFO ssh.failedlogin: match [121.66.124.148]
avril 11 18:34:15 omega reaction[27005]: 2024/04/11 18:34:15 INFO http.baduser: match [37.165.198.45]
root@omega:/home/odroid#
Rclone
- Rclone de la box + logs
- Rclone Omega + wget des logs de la box + logs
Gestion du ventilateur :
Pour avoir la température avec thermal_zone[0-4] (Lecture seule).
root@omega:/home/odroid# cat /sys/devices/virtual/thermal/thermal_zone[0-4]/temp
43000
42000
46000
44000
43000
root@omega:/home/odroid#
Pour gérer les vitesses du ventilateur (de 0 à 255) (lecture écriture).
root@omega:/home/odroid# cat /sys/devices/platform/pwm-fan/hwmon/hwmon0/device/fan_speed
0 120 180 240 root@omega:/home/odroid#
root@omega:/home/odroid# echo "0 90 150 254" > /sys/devices/platform/pwm-fan/hwmon/hwmon0/device/fan_speed
root@omega:/home/odroid# cat /sys/devices/platform/pwm-fan/hwmon/hwmon0/device/fan_speed
0 90 150 254 root@omega:/home/odroid#
root@omega:/home/odroid#
Pour gérer les seuils de déclenchement des différentes vitesses avec trip_point_[0-2]_temp (lecture écriture).
root@omega:/home/odroid# cat /sys/devices/virtual/thermal/thermal_zone0/trip_point_[0-2]_temp
echo '58000' > /sys/devices/virtual/thermal/thermal_zone0/trip_point_0_temp
Pour pérenniser les modifications des vitesses du ventilateur et des différents seuils de déclenchement, ajoutez les "echo" dans le fichier /etc/rc.local.
Gestion des performances du processeur :
nano /etc/default/cpufrequtils
Pour voir le governor actuellement utilisé
cat /sys/devices/system/cpu/cpu[0-7]/cpufreq/scaling_governor
Pour voir les fréquences
root@omega:/home/odroid# cat /sys/devices/system/cpu/cpu[0-7]/cpufreq/cpuinfo_cur_freq
900000
900000
900000
900000
600000
600000
600000
600000
root@omega:/home/odroid#
Pour tout savoir sur les différents core du CPU :
root@omega:/home/odroid# /usr/bin/cpufreq-info
Pour les gérer de façon perenne avec le fichier /etc/default/cpufrequtils
root@omega:/home/odroid# nano /etc/default/cpufrequtils
ENABLE=true
MIN_SPEED=600000
MAX_SPEED=2000000
GOVERNOR=schedutil