Logo carnetderootxzz@carnetderoot.net"La simplicité est la sophistication suprême" - Léonard De Vinci
dimanche 03 octobre 2021

:: Gestion des disques sous Linux ::

Lister les disques

$ lsblk | grep disk
sda               8:0    0 119,2G  0 disk
sdb               8:16   0 931,5G  0 disk
sdc               8:32   0 149,1G  0 disk

Vérification de la santé d'un disque

smartmontools

Afficher les informations du disque

Entre autres informations, cette commande permet de vérifier si le disque supporte S.M.A.R.T.

$ sudo smartctl -i /dev/sdc
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.14.8-arch1-1] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
[...]
SMART support is: Available - device has SMART capability.
SMART support is: Disabled

Ici, on voit que le disque supporte S.M.A.R.T. mais qu'il est désactivé. Pour l'activer :

$ sudo smartctl -s on /dev/sdc
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.14.8-arch1-1] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.

Lancer un test court

$ sudo smartctl -t short /dev/sdc
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.14.8-arch1-1] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Sun Oct  3 11:18:14 2021 CEST
Use smartctl -X to abort test.

Consulter les résultats du test

Pour vérifier si le test s'est bien déroulé :

$ sudo smartctl -H /dev/sdc
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.14.8-arch1-1] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

Afficher un rapport complet du disque

Ici, les paramètres à regarder sont Reallocated_Sector_Ct et Current_Pending_Sector au niveau de la colonne RAW_VALUE.
Si la colonne RAW_VALUE contient une valeur différente de zéro, il est temps de penser à sauvegarder votre disque.
Pour information, le paramètre Reallocated_Sector_Ct correspond au nombre de secteurs défectueux ayant été réalloués et le paramètre Current_Pending_Sector au nombre de secteurs défectueux en attente de réallocation.

$ sudo smartctl -a /dev/sdc
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.14.8-arch1-1] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
[...]

=== START OF READ SMART DATA SECTION ===
[...]
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   100   100   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0007   252   252   025    Pre-fail  Always       -       2000
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       702
  5 Reallocated_Sector_Ct   0x0033   252   252   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000e   252   252   051    Old_age   Always       -       0
  8 Seek_Time_Performance   0x0024   252   252   015    Old_age   Offline      -       0
  9 Power_On_Hours          0x0032   252   252   000    Old_age   Always       -       166
 10 Spin_Retry_Count        0x0032   100   100   051    Old_age   Always       -       2
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       211
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       1
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       39
194 Temperature_Celsius     0x0022   169   100   000    Old_age   Always       -       23 (Min/Max 13/47)
195 Hardware_ECC_Recovered  0x001a   100   100   000    Old_age   Always       -       0
196 Reallocated_Event_Count 0x0032   252   252   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0012   252   252   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   252   252   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0036   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x000a   100   100   000    Old_age   Always       -       0
201 Soft_Read_Error_Rate    0x0032   252   252   000    Old_age   Always       -       0
223 Load_Retry_Count        0x0032   100   100   000    Old_age   Always       -       24
225 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       7646
[...]

Références


dimanche 27 juin 2021

:: CloudSHell2 - Installation d'Archlinux ::

Introduction

Toutes les opérations décrites ci-dessous ont été faites à partir d'un portable sous Archlinux et du reader/writer eMMC se branchant sur le port SD (via un adaptateur micro-SD).

La commande lsblk permet de récupérer le nom du périphérique, ici /dev/sdb :

$ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
[...]
sdb               8:16   1 116,5G  0 disk

Préparation du module eMMC

Remise à zéro

$ sudo dd if=/dev/zero of=/dev/sdb bs=1M count=8

Partitionnement

$ sudo fdisk /dev/sdb

Créer une nouvelle partition primaire vide, en tapant les commandes suivantes :

  1. o : crée une nouvelle table de partition DOS
  2. n : crée une nouvelle partition avec les paramètres suivants :
    • p : type de partition primaire
    • ENTER : numéro de partition (1 par défaut)
    • 4096 : premier secteur
    • ENTER : dernier secteur (par défaut)
  3. w : écrit la table de partition et quitte

Création du système de fichiers ext4

$ sudo mkfs.ext4 /dev/sdb1

Montage du système de fichiers

$ mkdir root  
$ sudo mount /dev/sdb1 root

Téléchargement et extraction du système de fichier root

Téléchargement

$ wget http://os.archlinuxarm.org/os/ArchLinuxARM-odroid-xu3-latest.tar.gz
$ wget http://os.archlinuxarm.org/os/ArchLinuxARM-odroid-xu3-latest.tar.gz.md5

Vérification

$ md5sum -c ArchLinuxARM-odroid-xu3-latest.tar.gz.md5
ArchLinuxARM-odroid-xu3-latest.tar.gz: Réussi

Extraction

$ sudo bsdtar -xpf ArchLinuxARM-odroid-xu3-latest.tar.gz -C root

Flash du bootloader

$ cd root/boot/
$ sudo ./sd_fusing.sh /dev/sdb
/dev/sdb reader is identified.
[...]
U-boot image is fused successfully.

Démontage du système de fichiers

$ cd ../..
$ sudo umount root

Premier démarrage du système

  1. Insérer le module eMMC dans son emplacement sur la carte XU4
  2. Connecter le cable ethernet et brancher l'alimentation
  3. Attendre la fin du démarrage du système puis se connecter en ssh avec le user alarm et le mot de passe alarm

    $ ssh alarm@cloudshell.domaine.lan
  4. Ouvrir une session root avec le mot de passe root

    $ su - root

Gestion de paquets

Pacman

Initialisation du trousseau de clés

# pacman-key --init

Chargement du trousseau de clés

# pacman-key --populate archlinuxarm

Mise à jour du système

# pacman -Syu

Installation de paquets

# pacman -S vim sudo man-pages man-db bash-completion gptfdisk lvm2 git fakeroot binutils unzip wget highlight perl-json-xs fortune-mod uboot-tools

Arch User Repository (AUR) - Facultatif

Attention : Aucun assistant AUR n'est officiellement supporté par les développeurs d'Arch Linux pour la simple raison qu'AUR est un dépôt de paquets non officiellement supportés.

Trizen

trizen est un client pour AUR, léger et écrit en Perl.

Installation de trizen

$ git clone https://aur.archlinux.org/trizen.git
$ cd trizen
$ makepkg -si

Localisation

Fuseau horaire

# ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime

Synchronisation de l'horloge matérielle sur l'horloge système

# hwclock --systohc

Info : cette commande permet de générer le fichier /etc/adjtime, cf. hwclock(8) section "The Adjtime File" pour plus d'information sur ce fichier.

Génération des locales

# vi /etc/locale.gen

Décommenter la ligne fr_FR.UTF-8 UTF-8, puis générer les locales :

# locale-gen
Generating locales...
  fr_FR.UTF-8... done
Generation complete.

Configuration des locales

cf. Locale Variables - ArchWiki pour plus de détails sur les différentes variables supportées.

# vi /etc/locale.conf
LANG=fr_FR.UTF-8

Clavier

# vi /etc/vconsole.conf
KEYMAP=fr

Configuration réseau

Nom d'hôte

# vi /etc/hostname
cloudshell

# vi /etc/hosts
127.0.0.1       localhost
::1             localhost
127.0.1.1       cloudshell.domaine.lan cloudshell

Adresse IP

Comme il s'agit d'un serveur installé dans mon réseau local, j'utilise DHCP pour lui assigner une adresse IP (bail statique sur le routeur) et pour diffuser différentes options. Par sécurité, un profil statique est créé dans le cas où le routeur ne serait pas disponible.

# vi /etc/dhcpcd.conf

Ajouter/modifier les lignes suivantes :

# Allow users of this group to interact with dhcpcd via the control socket.
controlgroup wheel
# Inform the DHCP server of our hostname for DDNS.
hostname
# Persist interface configuration when dhcpcd exits.
persistent
# vendorclassid is set to blank to avoid sending the default of
# dhcpcd-<version>:<os>:<machine>:<platform>
vendorclassid
# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search
option classless_static_routes
# Respect the network MTU. This is applied to DHCP routes.
option interface_mtu
# Most distributions have NTP support.
option ntp_servers
# Rapid commit support.
option rapid_commit
# A ServerID is required by RFC2131.
require dhcp_server_identifier
# Generate Stable Private IPv6 Addresses based from the DUID
slaac private
noipv4ll
# Static profile
profile static_eth0
static ip_address=192.168.0.2/24
static routers=192.168.0.254
static domain_name_servers=192.168.0.254 1.1.1.1
# Fallback to static profile
interface eth0
fallback static_eth0

Mise à jour du firmware JSM561

Téléchargement de l'application de mise à jour

# wget https://wiki.odroid.com/_media/accessory/add-on_boards/xu4_cloudshell2/jms561_fw_updater_onxu4.tgz

Extraction et lancement de la mise à jour

# tar xvzf jms561_fw_updater_onxu4.tgz
# cd JMS561/

On met à jour le firmware pour chaque disque connecté, ici /dev/sda et /dev/sdb :

# ./JMS561FwUpdate -d /dev/sda -f ./jms561_Hardkernel_v158.001.000.004.bin -b ./backup.bin
# ./JMS561FwUpdate -d /dev/sdb -f ./jms561_Hardkernel_v158.001.000.004.bin -b ./backup.bin

Vérification de la version actualisée

# ./JMS561FwUpdate -d /dev/sda -v
Bridge Firmware Version: v158.1.0.4
# ./JMS561FwUpdate -d /dev/sdb -v
Bridge Firmware Version: v158.1.0.4

Installation du gestionnaire de RAID du controleur JMS56X

# wget https://wiki.odroid.com/_media/accessory/add-on_boards/xu4_cloudshell2/raidmgr_static_cloudshell2.zip
# unzip raidmgr_static_cloudshell2.zip
# chmod a+x raidmgr_static
# ./raidmgr_static

JMS56X HW RAID Manager V8.0.0.1
(C) 2008~2011 JMicron Tech, Corp. Command Line Interface RAID Manager For JMS56X.

JMS56X>

Valid commands set are:
=======================

 GC ------------------------------------- Get avail JMS56X
 DC C[n] -------------------------------- Display controller info
 SR C[n] -------------------------------- Show avail RAID info
 SS C[n] -------------------------------- Show avail SATA info
 SM C[n] D[n] --------------------------- Show disk S.M.A.R.T. info
 CR C[n] D[0,..,2] R0|R1|JBOD ----------- Create RAID
 DR C[n] R[n] --------------------------- Delete RAID
 SF C[n] -------------------------------- Show firmware version
 SA C[n] -------------------------------- Set alarm mute
 GR C[n] R[n] --------------------------- Get rebuilding percentage
 ID C[n] D[n] --------------------------- Identify disk
 ST C[n] R[n] timer --------------------- Set standby timer
 AS C[n] D[n] R[n] ---------------------- Add spare disk
 DS C[n] D[n] R[n] ---------------------- Delete spare disk
 EX ------------------------------------- Exit

JMS56X>

Ecran LCD

Activation de l'écran

# echo "options fbtft_device name=hktft9340 busnum=1 rotate=270" > /etc/modprobe.d/cloudshell.conf
# echo "spi_s3c64xx" >> /etc/modules-load.d/fbtft_device.conf
# echo "spidev" >> /etc/modules-load.d/fbtft_device.conf
# echo "fbtft_device" >> /etc/modules-load.d/fbtft_device.conf

Script d'affichage d'infos sur l'écran LCD

Note : ce script est un exemple, adaptez-le à votre besoin

$ sudo vim /bin/cloudshell-lcd

Coller les lignes suivantes :

#!/bin/bash

## Configuration

export TERM="linux"

# console font (see /usr/share/kbd/consolefonts)
# export CONSOLE_FONT=""

# Output Console (ttyX)
export OUTPUT_CONSOLE="1"

# Network Interface: eth0, wlan0, ....
export NETIF="eth0"

# SATA HDD mount
export SATA="/dev/sd"

# Mem Card mount
export MEMCARD="/dev/mmcblk0p1"

# Screen refresh in seconds
export REFRESH="3"

# CPU Temperature in C or F
export TEMPERATURE_FORMAT="C"

# External IP Refresh counts
# The time to update the ip in counts is acquired by using the following formula
# seconds_to_refresh = EXT_IP_REFRESH * REFRESH
export EXT_IP_REFRESH="10"

# Message
#export MESSAGE=`/usr/bin/fortune`
export MESSAGE="La simplicité est la sophistication suprême - Léonard De Vinci"

get_external_ip() {
    export EXTERNAL_IP=`/usr/bin/drill myip.opendns.com @resolver1.opendns.com | awk '/^myip/ {print $5}'`
}

get_full_date() {
    export DATE=`/usr/bin/date +"%d-%m-%Y %H:%M:%S"`
}

get_hostname() {
    export HOSTNAME=`/usr/bin/getent ahosts | awk '/127.0.1.1/ {print $2}'`
}

get_internal_ip() {
    export INTERNAL_IP=`/usr/bin/ip -o -4 a | awk '/eth0/ {print $4}'`
}

get_net_tx_rx_realtime() {
    net_txrx=`/usr/bin/sar -n DEV 1 1 | awk '/Moyenne.*eth0/ {gsub(",",".",$0);print $5" "$6}'`
    # in MB/s
    _tx=`echo $net_txrx | awk '{printf $1}'`
    _rx=`echo $net_txrx | awk '{printf $2}'`
    export NET_TX=`echo "scale=1; x=$_tx/1024; if(x<1) print 0; x" | bc -l`
    export NET_RX=`echo "scale=1; x=$_rx/1024; if(x<1) print 0; x" | bc -l`

}

get_disk_info() {
    t=`/usr/bin/df -h | grep $SATA`
    export DISK_SIZE=`echo $t | awk '{printf $2}'`
    export DISK_USED=`echo $t | awk '{printf $3}'`
    export DISK_FREE=`echo $t | awk '{printf $4}'`
    export DISK_USED_PCT=`echo $t | awk '{printf $5}'`
}

get_memcard_info() {
    t=`/usr/bin/df -h | grep $MEMCARD`
    export MEMCARD_SIZE=`echo $t | awk '{printf $2}'`
    export MEMCARD_USED=`echo $t | awk '{printf $3}'`
    export MEMCARD_FREE=`echo $t | awk '{printf $4}'`
    export MEMCARD_USED_PCT=`echo $t | awk '{printf $5}'`
}

get_memory_info() {
    # in Mbytes
    export MEM_FREE=$(/usr/bin/free -h | awk '/Mem:/ {print $7}')
    export MEM_TOTAL=$(/usr/bin/free -h | awk '/Mem:/ {print $2}')
    export MEM_USED=$(/usr/bin/free -h | awk '/Mem:/ {print $3}')
}

get_cpu_usage() {
    cpufree=`mpstat 1 1 | awk '/Moyenne/ {gsub(",",".",$0); print $12}'`
    export CPU_USAGE=`echo "scale=1; x=100-$cpufree; if(x<1) print 0; x" | bc -l`
}

get_cpu_temperature() {
    _t=$[`cat /sys/class/thermal/thermal_zone0/temp` / 1000]
    if [ "$TEMPERATURE_FORMAT" = "C" ]; then
        export CPU_TEMP="$_t"C
    else
        _t1=$[ $_t * 9 / 5 + 32 ]
        export CPU_TEMP="$_t1"F
    fi
}

get_ssh_connections() {
    export SSH_CONNECTIONS=$(/usr/bin/who | wc -l)
}

get_process_count() {
    export PROCESS_COUNT=`ps xa | wc -l`
}

# local variables
ext_ip_refresh_c=0
COFF=$(tput sgr0)
CGREEN=$(tput setaf 2)
CRED=$(tput setaf 1)
CBLUE=$(tput setaf 6)
oc="/dev/tty$OUTPUT_CONSOLE"

# font setup
#setfont $CONSOLE_FONT > $oc

# Ensure that we are in the right TTY
chvt $OUTPUT_CONSOLE

# infinite loop
while true; do

    # Ensure that we are in the right TTY
    chvt $OUTPUT_CONSOLE

    # check if EXT_IP_REFRESH
    if (( ($ext_ip_refresh_c % $EXT_IP_REFRESH) == 0 )); then
        get_external_ip
    fi

    # increment $ext_ip_refresh_c
    ext_ip_refresh_c=$[$ext_ip_refresh_c+1]

    # get data
    get_internal_ip
    get_hostname
    get_disk_info
    get_memcard_info
    get_full_date
    get_net_tx_rx_realtime
    get_memory_info
    get_cpu_usage
    get_cpu_temperature
    get_ssh_connections
    get_process_count

    # clear the screen every loop
    # we only wipe the screen when we are ready to write data to it
    clear > $oc

    # format the data on screen
    echo "" > $oc
    echo -e "$CBLUE$HOSTNAME $COFF: $DATE" > $oc
    echo "" > $oc
    # line CPU Usage
    echo -e "CPU Usage: $CBLUE$CPU_USAGE%$COFF   CPU Temp: $CBLUE$CPU_TEMP$COFF" > $oc
    # Line Memory
    echo -e "Memory Free: $CBLUE$MEM_FREE$COFF   Used: $CBLUE$MEM_USED$COFF" > $oc
    # Line IP Addresses
    echo -e "IP: $CBLUE$INTERNAL_IP$COFF   Rem: $CBLUE$EXTERNAL_IP$COFF" > $oc
    # Line network usage
    echo -e "TX: $CBLUE$NET_TX MB/s$COFF RX: $CBLUE$NET_RX MB/s$COFF" > $oc
    # Line Disk Space
    echo -e "Disk Used: $CBLUE$DISK_USED$COFF ($CBLUE$DISK_USED_PCT$COFF)  Free: $CBLUE$DISK_FREE$COFF" > $oc
    # Line Memcard Space
    echo -e "Mem Card Used: $CBLUE$MEMCARD_USED$COFF ($CBLUE$MEMCARD_USED_PCT$COFF)  Free: $CBLUE$MEMCARD_FREE$COFF" > $oc
    # Line SSH
    echo -e "SSH Connections: $CBLUE$SSH_CONNECTIONS$COFF" > $oc
    # line Processes
    echo -e "Processes Running: $CBLUE$PROCESS_COUNT$COFF" > $oc
    # Custom Message
    echo -e "$CRED$MESSAGE$COFF" > $oc

    # sleep
    sleep $REFRESH
done

On rend le script exécutable :

$ sudo chmod a+x /bin/cloudshell-lcd

Service systemd

$ sudo vim /etc/systemd/system/cloudshell-lcd.service

Coller les lignes suivantes :

[Unit]
Description="ODROID Cloudshell LCD Info"
DefaultDependencies=no
Requires=sysinit.target
After=sysinit.target

[Service]
Type=simple
ExecStart=/bin/cloudshell-lcd

[Install]
WantedBy=basic.target
WantedBy=sysinit.target

Maintenant on active le service et on le démarre :

$ sudo systemctl enable cloudshell-lcd.service
$ sudo systemctl start cloudshell-lcd.service

Ventilateur

Script de contrôle du ventilateur

$ sudo vim /bin/cloudshell-fan

Coller les lignes suivantes :

#!/bin/bash
REFRESH="1"
DISK_TEMP_THRESHOLD="45"
CPU_TEMP_THRESHOLD="60"
FAN_CHANGED="*"

get_disk_dev_info() {
    # Pull disk info from /dev/sd*
    fdisk -l > disks.txt 2>/dev/null
    SATA=($(awk '/^\/dev\/sd/ {printf "%s ", $1}' disks.txt))
    rm disks.txt
}

get_disk_temperature() {
    for i in "${!SATA[@]}"
    do
        # declare and assign variable seperately to avoid masking return value
        DISK_TEMP[$i]=" (IDLE)"
        local t
        t=$(smartctl -a "${SATA[$i]}" -d sat | grep "Temp")
        if (( $? == 0 ))
        then
            local temp=$(echo $t | awk '{print $10}')
            DISK_TEMP[$i]="$temp"
        else
            DISK_TEMP[$i]=""
        fi
    done
}

get_cpu_temperature() {
    for i in {0..4}
    do
        _t=$(($(</sys/class/thermal/thermal_zone${i}/temp) / 1000))
        CPU_TEMP[$i]="$_t"
    done
}

fan_on() {
    i2cset -y 1 0x60 0x05 0x00
}

fan_off() {
    i2cset -y 1 0x60 0x05 0x05
}

handle_fan() {
    for i in "${!DISK_TEMP[@]}"
    do
        if (( "${DISK_TEMP[$i]}" > "${DISK_TEMP_THRESHOLD}" ))
        then
            if [ "${FAN_CHANGED}" != "1" ]
            then
                echo "Turning fan on because disk $i has hit the threshold"
            fi

            FAN_CHANGED="1"
            fan_on
            return
        fi
    done

    for i in "${!CPU_TEMP[@]}"
    do
        if (( "${CPU_TEMP[$i]}" > "${CPU_TEMP_THRESHOLD}" ))
        then
            if [ "${FAN_CHANGED}" != "1" ]
            then
                echo "Turning fan on because CPU $i has hit the threshold"
            fi

            FAN_CHANGED="1"
            fan_on
            return
        fi
    done

    # No fuss, fan is off
    if [ "${FAN_CHANGED}" != "0" ]
    then
        echo "All temps nominal, turning fan off"
        FAN_CHANGED="0"
    fi
    fan_off
}

while true; do
    get_disk_dev_info
    get_disk_temperature
    get_cpu_temperature
    handle_fan

    sleep ${REFRESH}
done

On rend le script exécutable :

$ sudo chmod a+x /bin/cloudshell-fan

Service systemd

$ sudo vim /etc/systemd/system/cloudshell-fan.service

Coller les lignes suivantes :

[Unit]
Description="ODROID Cloudshell Fan Control"
DefaultDependencies=no
Requires=sysinit.target
After=sysinit.target

[Service]
Type=simple
ExecStart=/bin/cloudshell-fan

[Install]
WantedBy=basic.target
WantedBy=sysinit.target

Maintenant on active le service et on le démarre :

$ sudo systemctl enable cloudshell-fan.service
$ sudo systemctl start cloudshell-fan.service

Configuration uboot

Afin de supprimer les messages susceptibles d'apparaitre à l'écran une fois le système redémarré, on modifie les fichier /boot/boot.txt :

$ sudo vim /boot/boot.txt

Modifier la ligne suivante en ajoutant les paramètres quiet et splash à la fin de la ligne :

setenv bootargs "console=tty1 console=ttySAC2,115200n8 root=PARTUUID=${uuid} rw rootwait smsc95xx.macaddr=${macaddr} ${videoconfig} quiet splash"

Mettre à jour le fichier boot.scr :

$ cd /boot/
$ sudo ./mkscr

Redémarrage du système

# reboot

Finalisation de la configuration du système

Se connecter en ssh avec le user alarm et le mot de passe alarm

$ ssh alarm@cloudshell.domaine.lan

Ouvrir une session root avec le mot de passe root

$ su - root

Utilisateurs

Définir un mot de passe root

# passwd

Définir un mot de passe pour l'utilisateur alarm et le renommer

# passwd alarm
# usermod -l new_user alarm
# usermod -m -d /home/new_user new_user

Configuration des disques

Le CloudShell2 permet de connecter deux disques SATA au format 3.5" par défaut (et 2.5" avec adaptateur), et supporte les technologies RAID0, RAID1, SPAN ainsi que l'accès direct (mode PM).

Dans ma configuration, j'ai branché deux disques SATA 2To en 2.5" et configuré le 'DIP switch' en accès direct (mode PM). Ces deux disques seront configurés via LVM pour former un volume logique unique de 4To.

Note : Sur un serveur on devrait dans l'idéal créer un volume RAID1 avec deux disques, mais ici on est limité au niveau matériel, en effet le CLoudshell2 connecte les deux disques SATA en USB via UART et à l'heure actuelle la synchronisation des deux disques provoque de nombreuses erreurs fatales, jusqu'à rendre USB indisponible. Les solutions de contournement consistent à limiter la taille et la bande passante allouée à la synchronisation, ce qui induit des pertes de performances non négligeables. Je préfère donc pour le moment sauvegarder les données de manière régulière sur un autre mini-serveur de mon réseau dédié à la sauvegarde (un raspberry Pi avec un disque externe de 4To).

Préparation des disques

$ sudo gdisk /dev/sda

Supprimer toutes les données GPT et MBR du disque, en tapant les commandes suivantes :

  1. x : accéder aux fonctionnalités avancées
  2. z : détruire les données GPT et MBR

Partitionnement

$ sudo gdisk /dev/sda

Créer une nouvelle partition de type 'Linux LVM' (8e00) sur le disque, en tapant les commandes suivantes :

  1. n : créer une nouvelle partition avec les paramètres suivants :
    • Partition number (1-128, default 1):
    • First sector (34-3907029134, default = 2048) or {+-}size{KMGTP}:
    • Last sector (2048-3907029134, default = 3907029134) or {+-}size{KMGTP}:
    • Hex code or GUID (L to show codes, Enter = 8300): 8e00
  2. w : appliquer les changements et quitter

Répéter l'opération sur le 2ème disque (/dev/sdb).

Vérification

$ sudo fdisk -l
[...]
Disk /dev/sda: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors
[...]
Device     Start        End    Sectors  Size Type
/dev/sda1   2048 3907029134 3907027087  1.8T Linux LVM

Disk /dev/sdb: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors
[...]
Device     Start        End    Sectors  Size Type
/dev/sdb1   2048 3907029134 3907027087  1.8T Linux LVM

Création des volumes physiques

$ sudo pvcreate /dev/sda1 /dev/sdb1
  Physical volume "/dev/sda1" successfully created.
  Physical volume "/dev/sdb1" successfully created.

Création du groupe de volume

$ sudo vgcreate system /dev/sda1 /dev/sdb1
  Volume group "system" successfully created

Création du volume logique

Formatage de la partition

# mkfs.ext4 /dev/sda1

Synchronisation du contenu de /home

# mkdir /mnt/data
# mount /dev/sda1 /mnt/data
# rsync -avz /home/ /mnt/data/

Une fois les données synchronisées (et vérifiées !), on peut nettoyer le répertoire /home :

# rm -rf /home/*

Montage de la partition et génération du fstab

# mount /dev/sda1 /home
# genfstab -p -U / > /etc/fstab

Récepteur infrarouge

Références


mercredi 23 juin 2021

:: Bash - Trucs utiles ::

Couleurs

Afficher les couleurs supportées par le terminal

for color in {0..255}; do
    tput setab $color
    echo -n "$color "
done
tput sgr0
echo

~/.bashrc

Equivalence de couleurs

Couleur Code
Black 0;30
Blue 0;34
Green 0;32
Cyan 0;36
Red 0;31
Purple 0;35
Brown 0;33
Light Gray 0;37
Dark Gray 1;30
Light Blue 1;34
Light Green 1;32
Light Cyan 1;36
Light Red 1;31
Light Purple 1;35
Yellow 1;33
White 1;37

Eléments basiques

Code Elément affiché
\a Echappement
\d Date (Sun Jun 20)
\e Caractère 'Bell'
\h Nom d'hôte (hostname)
\H Nom d'hôte complet (hostname.domain.tld)
\j Nombre de process lancés par le shell
\l Nom du terminal
\n Retour à la ligne
\r Retour chariot
\u Nom d'utilisateur
\v Version de Bash
\w Répertoire courant
\W Chemin complet du répertoire courant
! Numéro d'historique de la commande en cours

Exemples

Couleur du prompt en rouge

PS1='\[\033[31m\][\u@\h \W]\$\[\033[0m\] '

Couleur du prompt en bleu

PS1='\[\033[34m\][\u@\h \W]\$\[\033[0m\] '

Bashrc

#
# ~/.bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

####################
# SHELL OPTS
###############
#PS1='[\u@\h \W]\$ '
PS1='\[\033[34m\][\u@\h \w]\$\[\033[0m\] '

####################
# ENV
###############
# Editor
export EDITOR=vim

####################
# ALIAS
###############
# Colorization of outputs
alias diff='diff --color=auto'
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias ip='ip --color=auto'
alias dmesg='dmesg --color=always'

# Commands alias
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
alias cls='clear'
alias vi='vim'

# Tricks & Useful aliases
alias cd..='cd ..'
alias env='env | sort'
# -> if the second argument is an alias, it will get expanded prior to passing to sudo
alias sudo='sudo '
alias keygen='keygen -C "$(whoami)@$(uname -n)-$(date -I)"'

Références


jeudi 17 juin 2021

:: Gestion RAID avec mdadm ::

Créer un RAID1 logiciel

Configurer les disques

Créer une partition sur chaque disque à l'aide de gdisk :

$ sudo gdisk /dev/sda
$ sudo gdisk /dev/sdb

Si une partition existe déjà, vider la partition avant de construire le volume RAID :

$ sudo mdadm --misc --zero-superblock /dev/sda1
$ sudo mdadm --misc --zero-superblock /dev/sdb1

Construire le volume RAID

$ sudo mdadm --create /dev/md0 --level=1 

Reconstruire un RAID1 logiciel

Copie de la table de partition à partir du disque sain

# sfdisk -d /dev/sda | sfdisk /dev/sdb 

Reconstruction de la grappe

# mdadm --manage --add /dev/md0 /dev/sdb1 

Suivi de la reconstruction

# watch -n 60 cat /proc/mdstat 

md1 : active raid1 sdc5[3] sda5[2] 
      488133496 blocks super 1.2 [2/1] [U_] 
      [>....................]  recovery =  0.3% (1780160/488133496) finish=59.1min speed=136935K/sec 

Ajouter un disque à un ensemble RAID5

Copie de la table des partitions

# sfdisk -d /dev/sdb > sdb.output
# sfdisk /dev/sde < sdb.output

Ajout d'un quatrième disque au RAID5

# mdadm --add /dev/md2 /dev/sde1

Extension du RAID

# mdadm --grow /dev/md2 -n 4

# watch cat /proc/mdstat
[...]
md2 : active raid5 sde1[3] sdc1[0] sdb1[1] sdf1[2]
      1953257472 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      [>....................]  reshape =  0.2% (2835920/976628736) finish=1070.3min speed=15163K/sec
      bitmap: 0/8 pages [0KB], 65536KB chunk

Agrandissement du volume logique et du système de fichiers

# umount /dev/md2
# pvdisplay
# pvresize /dev/md2
# lvdisplay
# lvresize -l +100%FREE /dev/vg1/data
# e2fsck -f /dev/vg1/data
# resize2fs /dev/vg1/data
# e2fsck -f /dev/vg1/data

vendredi 23 avril 2021

:: Simple application avec Dancer2 ::

Présentation

Dans cet exemple, on va créer une simple application web avec Dancer2.

Pour le déploiement, on se basera sur Starman pour la gestion de l'application avec Nginx en frontal.

Installation de Dancer

Préparation de l'environnement

Afin de sécuriser l'application, on fait tourner Starman (notre serveur d'application) sous une identité propre que nous appelerons starman. La seule manière d'y accéder sera via l'utilisateur root.

$ sudo useradd starman

Brewing Perl

Afin de séparer la distribution Perl installée sur le système de celle que l'on souhaite utiliser pour lancer notre application, nous utiliserons PerlBrew, un outil de gestion des versions de Perl.

Pour installer PerlBrew, cf.Gestion des versions de Perl avec Perlbrew

  • Liste des versions Perl disponibles à l'installation

    # su - starman
    $ perlbrew available
       perl-5.33.2   
       perl-5.32.0   
       perl-5.30.3   
       [...]
  • Installation

    $ perlbrew install perl-5.32.0
  • Vérification de la version installée (deux méthodes)

    1. Lister les versions installées :

      $ perlbrew list
        perl-5.32.0   
    2. Lister les versions disponibles (remarquez le "i" devant la version installée) :

      $ perlbrew available
         perl-5.33.2   
      i  perl-5.32.0   
         perl-5.30.3   
         [...]
  • Utilisation

    1. Pour cette session uniquement

      $ perlbrew use perl-5.32.0
    2. Comme version par défaut à l'ouverture de session

      $ perlbrew switch perl-5.32.0

Installation des modules CPAN

Avant tout, on installe un client cpan. Pour cela, on utilise la commande PerlBrew permettant d'installer cpanminus.

$ perlbrew install-cpanm

Puis on installe les modules :

$ cpanm Dancer2 Starman Daemon::Control

Création de l'application

La méthode la plus rapide pour créer son application est d'utiliser la commande dancer2 qui met en place l'arborescence des répertoires et fichiers à partir d'un squelette standard :

$ dancer2 gen -a MonApp

Cette commande crée le répertoire MonApp ainsi qu'un ensemble de sous-répertoires et fichiers.

Pour lancer l'application, exécuter la commande suivante :

$ cd MonApp/
$ plackup -R lib bin/app.psgi 
Watching lib bin/lib bin/app.psgi for file updates.
HTTP::Server::PSGI: Accepting connections at http://0:5000/

L'application (vide) est dorénavant disponible à l'adresse http://AdresseServeur:5000. (Ctrl+C pour stopper)

Mise en place du service systemd Starman

Pour lancer automatiquement notre application, on crée le fichier /etc/systemd/system/starman.service avec le contenu ci-dessous :

$ sudo vi /etc/systemd/system/starman.service

[Unit]
Description=Starman
After=syslog.target

[Service]
Type=forking
ExecStart=/home/starman/perl5/perlbrew/perls/perl-5.32.0/bin/starman --listen 127.0.0.1:5001 --env development --daemonize /home/starman/apps/MonApp/bin/app.psgi
Restart=always

[Install]
WantedBy=multi-user.target

Lancement et activation du service au démarrage :

$ sudo systemctl start starman.service
$ sudo systemctl enable starman.service

Installation et configuration de Nginx

$ sudo pacman -S nginx

$ sudo vi /etc/nginx/nginx.conf
[...]
server {
    listen       80;
    server_name  www;

    access_log  /var/log/www.access.log;
    error_log   /var/log/www.error.log info;

    location / {
        try_files $uri @proxy;
        access_log off;
        expires max;
    }

    # proxy to Starman listening on 127.0.0.1:5001
    #
    location @proxy {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass       http://127.0.0.1:5001;
    }
}

lundi 05 avril 2021

:: Installation d'Archlinux et Wayland sur Asus Zenbook ::

Liens intéressants

Arch Linux

Wayland

Installation d'Arch Linux

Caractéristiques du portable

Asus Zenbook UX 303 LN
Ecran 13.3 pouces, résolution 3200x1800px, IPS, tactile
Processeur Intel Haswell Core i7-4510U CPU
Chipset Intel HM87
Video Intel 4400 HD intégré + Nvidia GeForce GT840M 2Go
Memory 8Go DDR3
Stockage 256Go SSD
Connectivity Wireless AC, Bluetooth, Lan (avec adapteur USB-Ethernet)
Ports 3 x USB3.0, lecteur de carte SD, HDMI, mini-DisplayPort
Batterie 50 Wh
Dimensions Epaisseur 21mm avec les pieds (18mm sans)
Poids 1.5 kg (3.3 pounds)
Extras Clavier retro-éclairé, haut-parleurs Bang and Olufsen

Préparation de l'installation

  1. Télécharger la dernière iso sur le site de téléchargement Arch Linux et vérifier son intégrité à l'aide des sommes de contrôle MD5 ou SHA1 :

    $ wget http://archlinux.mirrors.ovh.net/archlinux/iso/2021.02.01/archlinux-2021.02.01-x86_64.iso
    $ wget http://archlinux.mirrors.ovh.net/archlinux/iso/2021.02.01/sha1sums.txt
    $ sha1sum -c sha1sums.txt 
  2. Créer la clé USB

    $ sudo dd if=archlinux-2021.02.01-x86_64.iso of=/dev/sdx bs=16384

    où /dev/sdx correspond au périphérique USB (Attention à ne pas se tromper !!)

Démarrage de l'installation

Démarrer sur la clé et sélectionner "Arch Linux install medium (x86_64, UEFI)" dans le menu de démarrage. On arrive sur la ligne de commande avec un prompt root.

Agencement du clavier

    # loadkeys fr

Pour lister les agencements disponibles :

    # find /usr/share/kbd/keymaps/ -type f

Vérifier que l'on est en mode EFI. Si c'est bien le cas, la commande ci-dessous doit afficher les variables EFI :

    # efivar -l 

Connexion réseau wifi

Utiliser la commande iwctl fournie par iwd (iNet wireless daemon) :

# iwctl device list                                           ---> Récupérer le nom de l'interface (ici, wlan0)
# iwctl station wlan0 scan                                    ---> Scan wifi
# iwctl station wlan0 get-networks                            ---> Lister les réseaux wifi détectés
# iwctl --passphrase passphrase station wlan0 connect myssid  ---> Connexion au point d'accès
# ping www.google.com                                         ---> Test de la connexion

Partitionner l'espace disque.

Schéma de partitionnement cible :

NAME                  MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                     8:0    0 238,5G  0 disk
├─sda1                  8:1    0   512M  0 part  /boot/efi
├─sda2                  8:2    0   512M  0 part  /boot
└─sda3                  8:3    0 237,5G  0 part
  └─cryptroot         254:0    0 G  0 crypt
    ├─vg0-swap        254:1    0 G  0 lvm   [SWAP]
    ├─vg0-root        254:2    0 G  0 lvm   /
    └─vg0-home        254:3    0 G  0 lvm   /home

Création des partitions

# gdisk /dev/sda
Partition Périphérique Taille Système Hex code
EFI /dev/sda1 512M vfat ef00
boot /dev/sda2 512M ext2 8300
cryptroot /dev/sda3 Espace disque restant luks 8300

Formatage des partitions

# mkfs.vfat -F32 /dev/sda1
# mkfs.ext2 /dev/sda2

Chiffrement de la partition principale

# cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 -y --use-random /dev/sda3
# cryptsetup luksOpen /dev/sda3 crypt

Création des volumes logiques

Créer un groupe de volume (arch) et les volumes logiques suivants :

Volume logique Taille
swap 8G
root 40G
home le reste
# pvcreate /dev/mapper/crypt
# vgcreate arch /dev/mapper/crypt
# lvcreate --size 8G arch --name swap
# lvcreate --size 40G arch --name root
# lvcreate --extents +100%FREE vg0 --name home

Création des systèmes de fichiers

# mkfs.ext4 /dev/mapper/arch-root
# mkfs.ext4 /dev/mapper/arch-home
# mkswap /dev/mapper/arch-swap
# swapon /dev/mapper/arch-swap

Montage des partitions

# mount /dev/mapper/arch-root /mnt
# mkdir /mnt/boot && mount /dev/sda2 /mnt/boot
# mkdir /mnt/boot/efi && mount /dev/sda1 /mnt/boot/efi
# mkdir /mnt/home && mount /dev/mapper/arch-home /mnt/home

Sélection des miroirs

Automatique

Sur le système Live, lorsqu'on active la connexion internet, reflector met à jour la liste des miroirs en choisissant les 70 derniers miroirs synchronisés et en les classant par leur bande passante (le plus rapide en haut).

Manuelle

Décommenter et déplacer le miroir préféré en haut du fichier /etc/pacman.d/mirrorlist. Préférer un miroir géographiquement proche (vérifier sur http://archlinux.org/mirrorlist/).

Installation du système et des outils nécessaires au premier démarrage.

 Système de base

# pacstrap /mnt base base-devel linux linux-firmware 

Outils supplémentaires (liste non-exhaustive) :

# pacstrap /mnt grub efibootmgr mkinitcpio lvm2 iwd vim bash-completion man-db

Création du fstab

# genfstab -pU /mnt >> /mnt/etc/fstab

tempfs sur /tmp

# /tmp
tmpfs   /tmp    tmpfs   defaults,noatime,mode=1777  0   0

Options pour SSD

Remplacer les options relatime par noatime sur les partitions sauf celle de boot (limite les accès et augmente donc la durée de vie d'un disque SSD).

Entrer dans le nouveau système

# arch-chroot /mnt /bin/bash

Fuseau horaire

# ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
# hwclock --systohc --utc

Localisation

  • /etc/locale.gen

Décommenter fr_FR.UTF-8 UTF-8 dans le fichier puis regénérer les locales :

# locale-gen
  • /etc/locale.conf

    LANG=fr_FR.UTF-8
  • /etc/vconsole.conf

    KEYMAP=fr

Nom d'hôte

  • /etc/hostname

    myhostname
  • /etc/hosts

    127.0.0.1    localhost
    ::1          localhost
    127.0.1.1    myhostname.domain.local myhostname

Utilisateurs

Modification du mot de passe root

# passwd

Utilisateur supplémentaire

# useradd -m -g users -G wheel username
# passwd username

Configuration de mkinitcpio

Editer le fichier /etc/mkinitcpio.conf

Ajouter les options suivantes avant 'filesystems' :

  • keymap : chargement du clavier
  • encrypt : gestion du chiffrement
  • lvm2 : gestion des volumes logiques
  • resume : gestion du mode hibernation

Note : quelque soit l'ordre choisi, pensez toujours à placer keymap devant encrypt, sous peine de vous retrouver avec un clavier qwerty pour taper la passphrase permettant de déchiffrer le volume principal

Au final, cela donne :

HOOKS=(base udev autodetect modconf block keymap encrypt lvm2 resume filesystems keyboard fsck)

Regénérer l'image initrd

# mkinitcpio -p linux

GRUB

Installation

# grub-install

Configuration

Editer le fichier /etc/default/grub et modifier la variable GRUB_CMDLINE_LINUX afin de préciser le périphérique chiffré (cryptroot) et le périphérique d'hibernation (partition de swap) :

GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda3:crypt resume=/dev/mapper/arch-swap"

Regénérer le grub.cfg

# grub-mkconfig -o /boot/grub/grub.cfg

Fin de l'installation et redémarrage

# exit
# umount -R /mnt
# swapoff -a
# reboot

Au démarrage la passphrase est demandée afin de déchiffrer le volume puis on accède à la console. On a maintenant un système minimal installé et fonctionnel.

Gestion d'écran HiDPI (High Dots Per Inch)

L'écran de l'UX303LN est un écran 13.3" avec une résolution QuadHD+ de 3200x1800 pixels. Les éléments affichés apparaissent donc trés petits (boutons, polices, etc.), à la limite du lisible.

Vous trouverez ci-dessous une liste (non exhaustive) de modifications permettant de profiter pleinement d'une haute résolution sans avoir besoin d'une loupe :-)

Paramètres X

En l'absence d'un environnement de bureau manipulant les paramètres X (Gnome, KDE, Xfce, etc.), il faut définir ces paramètres manuellement dans le fichier ~/.Xresources :

# Gestion HiDPI
Xft.dpi: 192
Xft.autohint: 0
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb

Note : Adaptez le paramètre Xft.dpi à votre définition d'écran (ici 192dpi).

XTerm

Ici aussi on modifie le fichier ~/.Xresources pour préciser la police désirée, sa taille et sa résolution :

# Police XTerm
xterm*faceName:DejaVu Sans Mono:size=11:antialias=false
xterm*font: 7x13

Note : Modifiez ces paramètres selon vos desideratas.

Firefox et Thunderbird

Dans Firefox, aller dans les préférences avancées (about:config) et modifier le paramètre layout.css.devPixelsPerPx à 2 (défaut : -1). Dans le cas d'une utilisation multi-écran, il est possible d'utiliser le module Firefox AutoHiDPI (Non testé).

Dans Thunderbird, les paramètres avancés sont disponibles sous Edition / Préférences / Avancé / Editeur de configuration.

Installation de yaourt (Yet AnOther User Repository Tool)

Important : Il est vivement conseillé de se documenter sur AUR afin d'en comprendre les mécanismes et d'utiliser yaourt, ainsi que ABS et makepkg.

Méthode 1 - Installation depuis AUR

curl -O https://aur.archlinux.org/packages/pa/package-query/package-query.tar.gz
tar zxvf package-query.tar.gz
cd package-query
makepkg -si
cd ..
curl -O https://aur.archlinux.org/packages/ya/yaourt/yaourt.tar.gz
tar zxvf yaourt.tar.gz
cd yaourt
makepkg -si
cd ..

Méthode 2 - Installation depuis le dépôt archlinux.fr

Editer le fichier /etc/pacman.conf et ajouter les lignes suivantes :

[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch

Puis, installer le paquet yaourt :

pacman -Sy yaourt

vendredi 12 février 2021

:: Installation d'Archlinux et Openbox sur Asus Zenbook ::

Liens intéressants

Arch Linux

Openbox

Installation d'Arch Linux

Caractéristiques du portable

Asus Zenbook UX 303 LN
Ecran 13.3 pouces, résolution 3200x1800px, IPS, tactile
Processeur Intel Haswell Core i7-4510U CPU
Chipset Intel HM87
Video Intel 4400 HD intégré + Nvidia GeForce GT840M 2Go
Memory 8Go DDR3
Stockage 256Go SSD
Connectivity Wireless AC, Bluetooth, Lan (avec adapteur USB-Ethernet)
Ports 3 x USB3.0, lecteur de carte SD, HDMI, mini-DisplayPort
Batterie 50 Wh
Dimensions Epaisseur 21mm avec les pieds (18mm sans)
Poids 1.5 kg (3.3 pounds)
Extras Clavier retro-éclairé, haut-parleurs Bang and Olufsen

Préparation de l'installation

  1. Télécharger la dernière iso sur le site de téléchargement Arch Linux et vérifier son intégrité à l'aide des sommes de contrôle MD5 ou SHA1 :

    $ md5sum archlinux-2015.01.01-dual.iso

    ou

    $ sha1sum archlinux-2015.01.01-dual.iso

    puis comparer la somme de contrôle obtenue à celle présente sur la page de téléchargement.

  2. Créer la clé USB

    $ sudo dd if=archlinux.iso of=/dev/sdx bs=512k

    où /dev/sdx correspond au périphérique USB (Attention à ne pas se tromper !!)

  3. Démarrer sur la clé et sélectionner "Arch Linux archiso x86_64 UEFI" dans le menu de démarrage. On arrive sur la ligne de commande avec un prompt root.

  4. Avant toute chose, modifier l'agencement du clavier (par défaut US-qwerty) :

    # loadkeys fr

    Pour lister les agencements disponibles :

    # find /usr/share/kbd/keymaps/ -type f
  5. Vérifier que l'on est en mode EFI. Si c'est bien le cas, la commande ci-dessous doit afficher les variables EFI :

    # efivar -l 
  6. Etablir une connexion internet. N'ayant pas de port ethernet, ni de câble USB-Ethernet, j'ai configuré le wifi :

    # iw dev                    ---> Récupérer le nom de l'interface (ici, wlp2s0)
    # ip link set wlp2s0 up     ---> Activation de l'interface
    # wifi-menu wlp2s0          ---> Connexion au point d'accès
    # ping www.google.com       ---> Test de la connexion
  7. Partitionner l'espace disque. N'ayant pas l'utilité d'un Windows 8.1, j'ai supprimé l'intégralité du disque. Pour cela, utiliser j'utilise gdisk, un équivalent de fdisk pour GPT (GUID Partition Table), nécessaire pour le mode EFI.

    # gdisk /dev/sda

    Schéma de partitionnement cible :

    Périphérique Point de montage Taille Type
    /dev/sda1 / 20 GiB 8300
    /dev/sda2 /boot 1024 MiB EF00
    /dev/sda3 /home le reste de l'espace disque 8300
  8. Formater les partitions

    # mkfs.ext4 /dev/sda1
    # mkfs.ext4 /dev/sda3
    # mkfs.fat -F32 /dev/sda2
  9. Monter les partitions

    # mount /dev/sda1 /mnt
    # mkdir /mnt/home && mount /dev/sda3 /mnt/home
    # mkdir /mnt/boot && mount /dev/sda2 /mnt/boot

Installation d'Arch Linux et configuration de base

  1. Choix du miroir de téléchargement. Préférer un miroir géographiquement proche (vérifier sur http://archlinux.org/mirrorlist/).

    # nano /etc/pacman.d/mirrorlist
  2. Installer le système de base Arch Linux.

    # pacstrap -i /mnt base base-devel
  3. Créer le fichier fstab.

    # genfstab -U -p /mnt >> /mnt/etc/fstab
  4. Faire un chroot pour accéder au système nouvellement installé.

    # arch-root /mnt
  5. Définir le nom d'hôte

    # echo computer_name > /etc/hostname
  6. Configurer la time zone

    # ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
  7. Configurer les locales Editer le fichier /etc/locale.gen et décommenter la ligne fr_FR.UTF-8 UTF-8 Générer les locales :

    # locale-gen

    Créer le fichier /etc/locale.conf et modifier la valeur LANG

    # echo LANG=fr_FR.UTF-8 > /etc/locale.conf
    # export LANG=fr_FR.UTF-8
  8. Démonter les systèmes de fichiers

    # umount /mnt/boot /mnt/home /mnt
  9. Redémarrer

    # reboot

Configuration post-installation

  1. Créer un utilisateur

    # useradd -g users -m -s /bin/bash utilisateur
    # passwd utilisateur

Gestion d'écran HiDPI (High Dots Per Inch)

L'écran de l'UX303LN est un écran 13.3" avec une résolution QuadHD+ de 3200x1800 pixels. Les éléments affichés apparaissent donc trés petits (boutons, polices, etc.), à la limite du lisible.

Vous trouverez ci-dessous une liste (non exhaustive) de modifications permettant de profiter pleinement d'une haute résolution sans avoir besoin d'une loupe :-)

Paramètres X

En l'absence d'un environnement de bureau manipulant les paramètres X (Gnome, KDE, Xfce, etc.), il faut définir ces paramètres manuellement dans le fichier ~/.Xresources :

# Gestion HiDPI
Xft.dpi: 192
Xft.autohint: 0
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintfull
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgb

Note : Adaptez le paramètre Xft.dpi à votre définition d'écran (ici 192dpi).

XTerm

Ici aussi on modifie le fichier ~/.Xresources pour préciser la police désirée, sa taille et sa résolution :

# Police XTerm
xterm*faceName:DejaVu Sans Mono:size=11:antialias=false
xterm*font: 7x13

Note : Modifiez ces paramètres selon vos desideratas.

Firefox et Thunderbird

Dans Firefox, aller dans les préférences avancées (about:config) et modifier le paramètre layout.css.devPixelsPerPx à 2 (défaut : -1). Dans le cas d'une utilisation multi-écran, il est possible d'utiliser le module Firefox AutoHiDPI (Non testé).

Dans Thunderbird, les paramètres avancés sont disponibles sous Edition / Préférences / Avancé / Editeur de configuration.

Installation de yaourt (Yet AnOther User Repository Tool)

Important : Il est vivement conseillé de se documenter sur AUR afin d'en comprendre les mécanismes et d'utiliser yaourt, ainsi que ABS et makepkg.

Méthode 1 - Installation depuis AUR

curl -O https://aur.archlinux.org/packages/pa/package-query/package-query.tar.gz
tar zxvf package-query.tar.gz
cd package-query
makepkg -si
cd ..
curl -O https://aur.archlinux.org/packages/ya/yaourt/yaourt.tar.gz
tar zxvf yaourt.tar.gz
cd yaourt
makepkg -si
cd ..

Méthode 2 - Installation depuis le dépôt archlinux.fr

Editer le fichier /etc/pacman.conf et ajouter les lignes suivantes :

[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch

Puis, installer le paquet yaourt :

pacman -Sy yaourt

mercredi 03 février 2021

:: Gestion des versions de Perl avec Perlbrew ::

Installation

$ curl -kL http://install.perlbrew.pl | bash

Ou, si vous préférez utiliser wget :

$ wget --no-check-certificate -O - https://install.perlbrew.pl | bash

Configuration

Editer le fichier .bashrc

$ vi ~/.bashrc

Et ajouter la ligne suivante à la fin du fichier :

# Perlbrew
source ~/perl5/perlbrew/etc/bashrc

Puis charger le nouvel environnement :

$ . ~/.bashrc

Gestion des versions de Perl

Initialisation

$ perlbrew init

Versions disponibles

$ perlbrew available
perl-5.33.6   
perl-5.32.1   
perl-5.30.3   
perl-5.28.3   
perl-5.26.3   
perl-5.24.4   
perl-5.22.4   
perl-5.20.3   
perl-5.18.4   
perl-5.16.3   
[...]

Versions installées

$ perlbrew list
* perl-5.22.0
perl-5.21.6
perl-5.20.1
perl-5.18.4   
perl-5.16.3   

Installation d'une version particulière

$ perlbrew install 5.32.1
Installing /home/starman/perl5/perlbrew/build/perl-5.32.1/perl-5.32.1 into ~/perl5/perlbrew/perls/perl-5.32.1

This could take a while. You can run the following command on another shell to track the status:

  tail -f ~/perl5/perlbrew/build.perl-5.32.1.log

Mise à jour vers la dernière version mineure (ici 5.22.0 vers 5.22.4)

Script upgrade-perl

$ perlbrew upgrade-perl
Upgrading perl-5.22.0 to 5.22.4
Fetching perl 5.22.4 as /home/starman/perl5/perlbrew/dists/perl-5.22.4.tar.bz2
Download http://www.cpan.org/src/5.0/perl-5.22.4.tar.bz2 to /home/starman/perl5/perlbrew/dists/perl-5.22.4.tar.bz2
Installing /home/starman/perl5/perlbrew/build/perl-5.22.4 into ~/perl5/perlbrew/perls/perl-5.22.0

This could take a while. You can run the following command on another shell to track the status:

  tail -f ~/perl5/perlbrew/build.perl-5.22.4.log

Vérification de la mise à jour

$ perlbrew list
perl-5.32.1
* perl-5.22.0 (5.22.4)
perl-5.21.6
perl-5.20.1
perl-5.18.4   
perl-5.16.3   

Utilisation d'une version particulière de perl

De manière permanente

$ perlbrew switch perl-5.32.1

Uniquement dans le shell courant

$ perlbrew use perl-5.32.1

Arrêt de perlbrew et retour au perl système

$ parlbrew off

Démarrage de perlbrew : commandes switch or use

$ perlbrew switch perl-5.32.1
$ perlbrew use perl-5.32.1

Tester un script sur toutes les versions de perl installées

$ perlbrew exec perl monscript.pl
$ perlbrew exec -- perl -E 'say $]'

Accéder à l'aide

$ perlbrew help

Utilisation dans un script bash

Pour utiliser perlbrew dans un script, il faut definir PERLBREW_ROOT et PERLBREW_HOME avant de charger l'environnement bashrc.

#!/bin/bash

## Variables d'environnement requises
export PERLBREW_ROOT=/opt/perlbrew
export PERLBREW_HOME=/tmp/.perlbrew
source ${PERLBREW_ROOT}/etc/bashrc

## Utilisation de la version 5.14.1
perlbrew use 5.14.1
perl /app/mon-application

## Utilisation de la version 5.12.3
perlbrew use 5.12.3
perl /app/mon-application

Gestion des modules CPAN

Installation d'un client CPAN

Pour installer des modules CPAN additionnels, on utilisera cpanm, une alternative à cpan offrant une meilleure compatibilité avec perlbrew.

La méthode habituelle d'installation (cpan -i App::cpanminus) installe bien cpanm, mais uniquement dans l'environnement perlbrew utilisé. Dans ce cas, si on en change, plus de cpanm ('cpanm is not found'...).

Afin d'éviter ce désagrément, Perlbrew fournit un script pour installer cpanm sous ~/perl5/perlbrew/bin, il sera ainsi disponible quelque soit la version de Perl utilisée.

$ perlbrew install-cpanm

Installation de modules

$ cpanm List::Util

Lister les modules installés

$ perlbrew list-modules

Mettre à jour les modules installés

$ perlbrew list-modules | perlbrew exec cpanm

Migrer les modules installés dans la version de perl courante vers une autre (ici 5.16.3).

$ perlbrew list-modules | perlbrew exec --with perl-5.16.3 cpanm

Références


mardi 05 janvier 2021

:: Outils d'administration CDS ::

Les cl-tools

Commandes cl-info

Gestion des utilisateurs

Liste des utilisateurs

# cl-info -u service

# cl-info -u unix
All users in LDAP for service Unix
+------+---------+-----------------------------+---------------+----------------+
| ID   | Login   | Name                        | Primary group | Home directory |
+------+---------+-----------------------------+---------------+----------------+
| 900  | client  | Client unix workstation     | 900           | /dev/null      |
| 901  | admin   | Administrator samba service | 544           | /dev/null      |
| 1001 | d_admin | Domain Admin                | 512           | /home/d_admin  |
+------+---------+-----------------------------+---------------+----------------+
(3 rows)

# cl-info -u samba
All users in LDAP for service Samba
+---------+-----------------------------+------+----------+
| Login   | Name                        | Lock | Password |
+---------+-----------------------------+------+----------+
| client  | Client unix workstation     | Yes  | No       |
| admin   | Administrator samba service | No   | Yes      |
| d_admin | Domain Admin                | No   | Yes      |
+---------+-----------------------------+------+----------+
(3 rows)

Détails d'un utilisateur

# cl-info -U utilisateur service

# cl-info -U admin unix
Information about user admin for service Unix
+----------------------+-----------------------------+
| Field                | Value                       |
+----------------------+-----------------------------+
| ID                   | 901                         |
| Login                | admin                       |
| Name                 | Administrator samba service |
| Lock                 | No                          |
| Visible              | No                          |
| Primary group        | 544                         |
| Supplementary groups | 544                         |
| Home directory       | /dev/null                   |
| Shell                | /bin/false                  |
| Password             | No                          |
| Last change password | 16.01.2020                  |
| Jabber ID            | admin@willy.greenbee.lan    |
| Mail                 | No                          |
+----------------------+-----------------------------+
(13 rows)

# cl-info -U admin samba
Information about user admin for service Samba
+----------------------+----------------------------------------+
| Field                | Value                                  |
+----------------------+----------------------------------------+
| Login                | admin                                  |
| Name                 | Administrator samba service            |
| Lock                 | No                                     |
| Password             | Yes                                    |
| Last change password | 16.01.2020                             |
| Primary group        | Administrators                         |
| Supplementary groups | Administrators                         |
| Share directory      | /var/calculate/server-data/samba/share |
+----------------------+----------------------------------------+
(8 rows)

Commandes cl-setup

cl-setup
cl-setup-boot
cl-setup-locale
cl-setup-session
cl-setup-themes
cl-setup-video
cl-setup-audio
cl-setup-boot-live
cl-setup-network
cl-setup-system
cl-setup-update

cl-setup-network

cl-setup-network permet de configurer le réseau.

# cl-setup-network --hostname servername --iface enp0s3:192.168.10.20:24 --route default:192.168.10.254 --dns 192.168.10.10

Paramètres :

--hostname  spécifier le nom d'hôte   
--iface     configurer l'interface réseau
--route     configurer la route par défaut
--dns       spécifier le serveur dns

cl-setup-update

cl-setup-update permet de configurer la mise à jour automatique.

# cl-setup-update -a ON -I 12h --clean-pkg ON -o ON

Paramètres de mises à jour :

-a ON           vérifier les mises à jour automatiquement (enabled by default)
-I 12h          spécifier l'intervalle de vérification de mises à jour ('list' pour afficher les valeurs possibles)
--clean-pkg ON  supprimer les archives logicielles obsolètes
-o ON           actualiser les autres overlays

:: Boîte à outils Calculate Directory Server ::

Conflit lors de la mise à jour de Perl

Une mise à jour système peut parfois provoquer des conflits lors de la mise à jour de Perl. Dans ce cas, mettre à jour selon la méthode conseillée :

root # emerge -uDNav --with-bdeps=y --backtrack=100 --autounmask-keep-masks=y @world
root # perl-cleaner --all