Blog /Jérémie Huchet

10 November
2014

Resize root LVM partition

I like to use LVM on my personal laptop to avoid the crazy partition sizing step. When I set up my system I just create some main partitions (swap, / and /home) then I grow them as I need more space.

Lately I installed docker and instead of creating a logical volume for docker data in /var/data/docker I lazily growed my / partition. In fact, at the time I knew it was a mistake. Few weeks later I got sick of it.

Here is how to resize an unmountable parition, e.g. your system root partition.

  1. create a snapshot SNAP_ROOT of volume ROOT
  2. shrink the filesystem on SNAP_ROOT
  3. ask LVM to merge SNAP_ROOT to ROOT, ie. replace the volume with the original filesystem by the shrinked one
  4. reboot so LVM can do the merge
  5. reduce ROOT volume size with option --resizefs

⚠ First you should remount the partition in read-only mode. I wasn’t able to do it because of all the stuff running and I decided to take the risk to continue. If you do so, you’re responsible.

the short way

lvcreate -s ssd/root -L 40G -n root_backup
e2fsck -f /dev/mapper/ssd-root_backup \
    && resize2fs -p -M /dev/mapper/ssd-root_backup
lvconvert --merge ssd/root_backup
reboot
lvresize -L 20G -r ssd/root

the long way

1. create a snapshot SNAP_ROOT

Create a snapshot of the partition, I used a size of 40G (same size of the original partition) but a such value shouldn’t be necessary.

lvcreate -s ssd/root -L 40G -n root_backup

Running lvdisplay shows the original volume and its snapshot. We can see:

  • original volume size is 40GB
  • snapshot as Copy-On-Write-table size of 40GiB
  • 0% of the COW-table is used for now

lvdisplay ssd/root ssd/root_backup

--- Logical volume ---
LV Path                /dev/ssd/root
LV Name                root
VG Name                ssd
…
LV snapshot status     source of
                       root_backup [active]
…
LV Size                40,00 GiB
…

--- Logical volume ---
LV Path                /dev/ssd/root_backup
LV Name                root_backup
VG Name                ssd
…
LV snapshot status     active destination for root
LV Status              available
…
COW-table size         40,00 GiB
COW-table LE           10240
Allocated to snapshot  0,00%
…

2. shrink the filesystem on SNAP_ROOT

Firstly, a filesystem check must be forced:

e2fsck -f /dev/mapper/ssd-root_backup

e2fsck 1.42.12 (29-Aug-2014)
Passe 1 : vérification des i-noeuds, des blocs et des tailles
Passe 2 : vérification de la structure des répertoires
Passe 3 : vérification de la connectivité des répertoires
Passe 4 : vérification des compteurs de référence
Passe 5 : vérification de l'information du sommaire de groupe
root : 290516/2621440 fichiers (0.2% non contigüs), 4227390/10485760 blocs

Then we are able to resize it:

resize2fs -p -M /dev/mapper/ssd-root_backup

resize2fs 1.42.12 (29-Aug-2014)
En train de redimensionner le système de fichiers sur /dev/mapper/ssd-root_backup à 4527614 (4k) blocs.
The filesystem on /dev/mapper/ssd-root_backup is now 4527614 (4k) blocks long.

Shrinking the filesystem may cause a lot of changes to the volume. During this operation the allocated space of the COW-table will increase. We can run lvdisplay to observe how many space the resize operation taken from the snapshot COW-table.

lvdisplay ssd/root_backup

--- Logical volume ---
LV Path                /dev/ssd/root_backup
LV Name                root_backup
...
Allocated to snapshot  17,13%
...

3. merge SNAP_ROOT to ROOT

lvconvert --merge ssd/root_backup

Logical volume ssd/root contains a filesystem in use.
Can't merge over open origin volume.
Merging of snapshot ssd/root_backup will occur on next activation of ssd/root.

4. reboot

LVM can’t merge a snapshot to an active partition: the partition has te be deactivated. This is done by rebooting the system.

reboot

5. reduce ROOT volume

Let’s see the new partition size we have:

df -h

Sys. de fichiers       Taille Utilisé Dispo Uti% Monté sur
/dev/mapper/ssd-root      17G     16G  742M  96% /

lvdisplay ssd/root

--- Logical volume ---
LV Path                /dev/ssd/root
LV Name                root
VG Name                ssd
…
LV Size                40,00 GiB

The filesystem has a size of 17G, but the volume size is always 40G. We must use lvm to resize the volume. We use option -r/--resizefs which tell LVM to resize the underlying filesystem to the new size of the volume.

lvresize -L 20G -r ssd/root

resize2fs 1.42.12 (29-Aug-2014)
Le système de fichiers de /dev/mapper/ssd-root est monté sur / ; le changement de taille doit être effectué en ligne
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/mapper/ssd-root is now 5242880 (4k) blocks long.
Size of logical volume ssd/root changed from 40,00 GiB (10240 extents) to 20,00 GiB (5120 extents).
Logical volume root successfully resized

Now our partition and our volume size are reduced:

df -h

Sys. de fichiers       Taille Utilisé Dispo Uti% Monté sur
/dev/mapper/ssd-root      20G     16G  3,4G  83% /

lvdisplay ssd/root

--- Logical volume ---
LV Path                /dev/ssd/root
LV Name                root
VG Name                ssd
…
LV Size                20,00 GiB
22 July
2014

Systemd reminder

Petite liste de commandes pour lesquelles je fais un recherche à chaque fois que j’ai besoin de les utiliser…

Lister les services actifs :

systemctl list-units -t service

Lister tous les services disponibles :

systemctl list-units -t service -all

Obtenir le status d’un service :

systemctl status mdmonitor.service

Consulter le journal d’un service :

journalctl -u mdmonitor.service
11 June
2014

Boite à musique avec un Raspberry PI

Voici une petite solution pour utiliser le Raspberry PI comme boite à musique. Personnellement je compte l’installer dans ma voiture :) Attention, diffuser sur les ondes radio est règlementé…

MPDroid pour contrôler la musique émise par le Raspberry PI et diffusée via la radio

l’idée

Le Raspberry PI héberge la musique et un démon mpd permet de la diffuser vers l’autoradio grâce à pifm. Pour contrôler la lecture de la musique, il existe de nombreux clients pour mpd : Android (MPDroid), web, ligne de commande, … Le client doit communiquer avec le démon donc on met en place un hotspot WiFi sur le Raspberry PI sur lequel n’importe quel smarphone pourra se connecter.

le matériel

  • un Raspberry PI
  • un fil de quelques centimères pour l’antenne
  • une clé USB WiFi qui supporte le mode AP

installation de raspbian

source

Téléchargement et création d’une carte SD avec Raspbian

wget -0 raspbian.img http://downloads.raspberrypi.org/raspbian_latest
dd bs=4M if=raspbian.img of=/dev/mmcblk0

configuration de l’adaptateur WiFi

J’utilise une clé USB WiFi à base de Intersil ISL3887 et du coup j’ai suivi le wiki Debian.

wget -O /lib/firmware/isl3887usb https://daemonizer.de/prism54/prism54-fw/fw-usb/2.13.25.0.lm87.arm --no-check-certificate
modprobe -r p54usb ; modprobe p54usb

configuration d’un hotspot WiFi

source

Installation des logiciels nécessaires :

sudo apt-get install hostapd udhcpd
udhcpd

On édite le fichier de configuration de udhcpd, sudo vim /etc/udhcpd.conf :

start 192.168.1.2
end 192.168.1.20
interface wlan0
remaining yes
opt dns 192.168.1.1
opt subnet 255.255.255.0
opt router 192.168.1.1
opt lease 86400 # 1 day DHCP lease

Il faut ausi l’activer explicitement dans /etc/default/udhcpd en commantant la ligne DHCPD_ENABLED="no" :

#DHCPD_ENABLED="no"

Le Raspberry PI doit avoir une adresse IP statique, onpeut ajouter dans /etc/network/interfaces :

iface wlan0 inet static
  address 192.168.1.1
  netmask 255.255.255.0

On démarre le service et on l’active au démarrage :

sudo service udhcpd start
sudo update-rc.d udhcpd enable
hostapd

On créé un fichier de configuration pour le réseau WiFi à créer, sudo vim /etc/hostapd/music.conf :

interface=wlan0
driver=nl80211
ssid=music
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=secret_music_box
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

Dans /etc/default/hostapd on précise la configuration à charger :

DAEMON_CONF="/etc/hostapd/music.conf"

On démarre le service et on l’active au démarrage :

sudo service hostapd start
sudo update-rc.d hostapd enable

installation de pifm

sudo mkdir /opt/pifm
sudo chown pi:pi /opt/pifm
cd /opt/pifm
wget http://omattos.com/pifm.tar.gz
tar zxvf pifm.tar.gz

pifm nécessite les droits root pour être exécuté. On configure sudo pour autoriser l’utilisateur MPD à exécuter pifm en root sans avoir besoin de mot passe. Il faut ajouter par exemple la ligne suivante dans /etc/sudoers :

mpd ALL=(ALL) NOPASSWD: /opt/pifm/pifm

installation de MPD

Installation du démon : sudo apt-get install mpd.

Il faut configurer une sortie autio pour transmettre la musique vers [pifm] :

audio_output {
    type            "pipe"
    name            "FM 103.3"
    command         "sudo /opt/pifm/pifm - 103.3 44100 stereo"
    format          "44100:16:2"
}

On démarre le service et on l’active au démarrage :

sudo service mpd start
sudo update-rc.d mpd enable

Il est possible d’en définir plusieurs afin de pouvoir facilement changer la fréquence sur laquelle [pifm] transmet le son.

photos

aménagement dans le boitier du Raspberry PI

J’ai réutilisé le boitier du Raspberry PI. Afin de tout faire rentrer, j’ai ouvert la clé USB wifi. L’ensemble chauffant pas mal, j’ai préféré mettre un petit ventilateur dont le bruit est largement couvert par le bruit ambiant dans ma voiture.

intégration de la carte wifi dans le boitier

Histoire de gagner un peu de place, j’ai supprimé le port USB supérieur et j’ai soudé le cable USB de la clé wifi directement sous la carte du Raspberry PI.

le résultat

05 January
2014

Installer Debian avec LVM2 sur un serveur dédié OVH Kimsufi

Le manager pour la gamme OVH Kimsufi ne permet pas d’effectuer une installation sur LVM. Voici comment j’ai procédé pour une Debian 7 Wheezy. Le principe doit être applicable à d’autres systèmes.

installation du système de base

Il faut commencer par installer un système de base via le manager.

sauvegarde

Une fois que le système fonctionne, il faut redémarrer le serveur en mode recovery pour s’y connecter et effectuer des sauvegardes des partitions.

mkdir /backup
dd if=/dev/sda1 bs=1M | gzip > /backup/root.img.gz

Il faut bien les sauvegarder sur une autre machine pour ne pas les perdre.

scp /backup/root.img.gz backuphost.net:/home/user/backup

mise en place de LVM

Toujours dans le mode recovery, il faut supprimer les paritions du disque et y créer une unique partition.

fdisk /dev/sda

Commencer par d pour supprimer les partitions, puis c pour en créer une nouvelle avec le system id 8e

On créé les volumes avec LVM. Voir le LVM HOWTO pour plus d’informations si besoin, en particulier l’anatomie de LVM et les tâches courante.

pvcreate /dev/sda1
vgcreate vg0 /dev/sda1
lvcreate -L 10G vg0/root
lvcreate -L 50G vg0/home
lvcreate -L 1G vg0/swap

On restaure le(s) dump(s).

dd if=/backup/root.img.gz bs=1M | gunzip > /dev/vg0/root

On active le swap.

mkswap -l swap /dev/vg0/swap`

réinstallation de GRUB2

Toujours en mode recovery, il faut reconfigurer GRUB2 pour lui indiquer comment trouver la partition racine et le noyau. Pour cela il faut chrooter dans l’environnement cible.

Préparation de l’environnement cible.

# on monte la partition racine
mount /dev/vg0/root /mnt
# puis /sys, /dev et /proc
mount -t proc none /mnt/tmp/proc
mount -t sysfs none /mnt/tmp/sys
mount -o bind /dev /mnt/tmp/dev

Entrer dans l’environnement cible.

chroot /mnt

Mettre à jour Grub.

# génère un nouveau fichier /boot/grub/grub.cfg en fonction de la configuration /etc/grub.d/*
update-grub
# réinstallation
grub-install /dev/sda

On quitte l’environnement cible.

exit
umount /dev \
       /proc \
       /sys \
       /

redémarrer le serveur

Penser à changer la configuration du manager pour booter de nouveau sur le disque. Puis redémarrer.

26 September
2013

Sony Vaio Pro 13 : défauts

L’ultrabook est superbe et je trouve que certains défauts que j’ai pu lire dans des articles en ligne ne sont pas forcément présents.Au contraire, j’en ai noté d’autres.

clavier

La frappe est vraiment très courte, je préfèrais le clavier de mon ancien Vaio E. Les touches les plus petites (flèches, fonction, suppr) ne sont pas agréables à utiliser.

batterie additionnelle

La batterie additionnelle n’est pas plate mais elle est surélevée, probablement pour limiter la surchaufe. Ça reste quand même vraiment dommage car ça rend l’ensemble peu pratique à déplacer.

bruit

J’avais un Vaio avec Core i5 première génération 450M qui chauffait énormément et qui faisait un buit pas possible à la moindre sollicitation. Après lecture d’articles et de forums j’avais peur de retrouver la même chose. Bonne surprise : c’est bien mieux que ce à quoi je m’attendais. En tous cas pour la version i5 4200U…

C’est vrai que dès qu’on sollicite le CPU le ventilateur commence à se mettre en route. Il monte progressivement jusqu’à être désagréable à partir de quelques minutes mais s’arrête rapidement après l’activité.

22 September
2013

Linux sur Sony Vaio Pro 13

Petit retour d’expérience sur l’installation de Arch Linux sur le Sony Vaio Pro 13. De manière générale, tout - ou presque - fonctionne bien du premier coup. LE truc qui m’a fait galérer c’est l’UEFI.

Je pense avoir essayé de faire les choses dans les règles mais ça n’a pas abouti. À titre d’information voici ce que j’ai tenté.

partitions

À l’origine le SSD est partitionné en mode GPT avec 6 paritions :

device taille type description
/dev/sda1 260Mo EFI SONYSYS ???
/dev/sda2 1.4Go Basic Windows tools
/dev/sda3 260Mo EFI Semble héberger le programme de démarrage windows
/dev/sda4 128Mo Microsoft reserved ???
/dev/sda5 212Go Basic Partition windows
/dev/sda6 23.8Go Basic Partition de restauration

Avant l’installation J’ai redimensionné la partition /dev/sda5 pour faire un peu de place à une nouvelle partition.

device taille type description
/dev/sda7 153Go LVM Linux

installation arch linux

J’ai suivi le guide d’installation Arch Linux sans aucune complication durant l’installation. J’ai installé Grub2 après avoir monté la partition /dev/sda3 dans /boot/efi.

boot et uefi

fail

J’ai tenté de jouer avec efibootmgr pour ajouter une entrée.

$ efibootmgr -v
BootCurrent: 0007
Timeout: 0 seconds
BootOrder: 0005,0007,0008,0009,0001,000A
Boot0001* Windows Boot Manager  HD(3,363800,82000,9d44d229-3120-440e-aaab-feafe27db15e)File(\EFI\Microsoft\Boot\bootmgfw.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...\................
Boot0005* Sony Original HD(1,800,82000,43ed05b6-502f-4166-bb93-4f4b01fa154f)File(\EFI\Microsoft\Boot\bootmgfw.efi)
Boot0007* Windows Boot Manager  HD(3,363800,82000,9d44d229-3120-440e-aaab-feafe27db15e)File(\EFI\Boot\bootx64.efi)
Boot0008* Windows Boot Manager  HD(5,425800,1a939000,e982cb93-f4b3-477d-b3cc-936586a030a7)File(\EFI\Boot\bootx64.efi)
Boot0009* Windows Boot Manager  HD(5,425800,6ec1000,e982cb93-f4b3-477d-b3cc-936586a030a7)File(\EFI\Boot\bootx64.efi)
Boot000A* Windows Boot Manager  HD(5,425800,7555000,e982cb93-f4b3-477d-b3cc-936586a030a7)File(\EFI\Boot\bootx64.efi)

C’est là que les choses se sont compliquées :

  1. Je n’ai jamais vu aucun menu me proposant les options précédentes. J’ai donc commencé par modifier le timeout du menu avec efibootmgr -t 5. Aucun menu ne s’est affiché au démarrage.
  2. J’ai quand même essayé d’ajouter une entrée dans le menu et de modifier le boot order. Non seulement mon entrée n’était pas utilisée au démarrage suivant, mais en plus elle disparaissait.

solution

Au final j’ai remplacé le fichier /EFI/Boot/bootx64.efi de la partition /dev/sda3 par le fichier grubx64.efi généré lors de l’installation de grub.

$ mount /dev/sda3 /boot/efi
$ cp /boot/efi/EFI/arch_grub/grubx64.efi /boot/efi/EFI/Boot/bootx64.efi

Dorénavant c’est grub qui apparait au lieu de windows 8. Il suffit ensuite d’ajouter la configuration suivante dans /etc/grub.d/40_custom pour ajouter une entrée pour booter sous windows 8 :

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry "Microsoft Windows 8" {
        insmod part_gpt
        insmod fat
        insmod search_fs_uuid
        insmod chain
        search --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-baremetal=ahci0,gpt3 5044-08C1
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

Le dernier paramètre de la ligne search est obtenu avec la commande blkid /dev/sda3.

liens

10 February
2013

Maven, déployer sur Github simplement

Quand on fait de petits modules maven, parfois c’est pratique de les déployer quelque part pour les utiliser dans d’autres projets. La question est : où les déployer ? En local ? Ce n’est pas très pratique si on utilise plusieurs postes et surtout ça ne facilite pas la tâche à ceux qui souhaiteraient réutiliser le module en question. Sur son serveur perso ? Oui on en a tous un, mais niveau qualité de service et surtout niveau disponibilité c’est beaucoup moins garanti.

J’ai vu quelques tuto pour déployer ses artefacts sur Github. Le problème c’est qu’ils s’intégraient mal dans un cycle de release automatique avec le maven-release-plugin. J’ai cherché un peu et j’ai trouvré la solution suivante.

Le principe est le même que dans les différents articles que j’ai lu : la différence c’est qu’on pousse dans la branche gh-pages avec le site-maven-plugin de com.github.github au lieu de le faire à la main.

  1. déployer dans un répertoire local / configurer le maven-deploy-plugin pour déployer dans ${basedir}/target/<<repository_to_deploy>>/
  2. pousser ce qui a été généré dans la branche gh-pages / configurer le maven-site-plugin pour pousser ${basedir/target/<<repository_to_deploy>>/

On ajoute dans le pom.xml :

<project>
    <distributionManagement>
        <repository>
            <id>github-releases</id>
            <url>http://<<github_account>>.github.com/<<github_project_name>>/repository/releases</url>
        </repository>
        <snapshotRepository>
            <id>github-snapshots</id>
            <url>http://<<github_account>>.github.com/<<github_project_name>>/repository/snapshots</url>
        </snapshotRepository>
    </distributionManagement>
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.7</version>
                    <configuration>
                        <altDeploymentRepository>local::default::file://${project.build.directory}/gh-pages/repository/snapshots</altDeploymentRepository>
                        <uniqueVersion>false</uniqueVersion>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.6</version>
                </plugin>
                <plugin>
                    <groupId>com.github.github</groupId>
                    <artifactId>site-maven-plugin</artifactId>
                    <version>0.7</version>
                    <configuration>
                        <message>deploying artefacts for version ${project.version}</message>
                        <merge>true</merge>
                        <outputDirectory>${project.build.directory}/gh-pages</outputDirectory>
                        <noJekyll>true</noJekyll>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <profiles>
        <profile>
            <!-- profil pour déployer les releases dans un sous répertoire "releases" -->
            <id>release</id>
            <activation>
                <property>
                    <name>performRelease</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-deploy-plugin</artifactId>
                        <configuration>
                            <altDeploymentRepository>local::default::file://${project.build.directory}/gh-pages/repository/releases</altDeploymentRepository>
                            <updateReleaseInfo>true</updateReleaseInfo>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Avec cette configuration on peut exécuter mvn deploy pour déployer et les artefacts sont disponibles via :

http://<<github_account>>.github.com/<<github_project_name>>/repository/snapshots/
http://<<github_account>>.github.com/<<github_project_name>>/repository/releases/

Notez que Github pages ne liste pas le contenu des répertoires. On ne peut pas parcourir le dépot, mais les fichiers sont bien accessibles.

Vous pouvez jeter un oeil à dudie-maven-plugin si ce n’est pas encore assez clair.

Développement Web

Développement de site web, intégration de gestionnaire de contenus

Développement Java

4 ans d'expérience dans le développement Java/JEE

Android

Expérience en développement mobile Android : ItinéRennes

Articles