SWAP sur Raspbian

7 x served & 0 x viewed

Lire le lien : https://raspberrypi.stackexchange.com/questions/84390/how-to-permanently-disable-swap-on-raspbian-stretch-lite (Merci Michel)

J’ai fait un petit script pour faire un free -h et un uname -r sur tous les serveurs :

$ ./ssh-distant-2.sh 
Cnx sur 127.0.0.1 
4.14.34-6-osmc total used free shared buff/cache available Mem: 746M 138M 231M 20M 376M 539M Swap: 0B 0B 0B
Cnx sur 192.168.0.70 
4.14.50+ total used free shared buff/cache available Mem: 433M 28M 51M 5,7M 353M 351M Swap: 99M 0B 99M
Cnx sur 192.168.0.71 
4.14.71-v7+ total used free shared buff/cache available Mem: 927M 183M 138M 46M 604M 633M Swap: 99M 768K 99M
Cnx sur 192.168.0.72 
4.14.50-v7+ total used free shared buff/cache available Mem: 927M 415M 157M 17M 353M 429M Swap: 99M 0B 99M
Cnx sur 192.168.0.73 
4.14.50-v7+ total used free shared buff/cache available Mem: 927M 153M 337M 17M 435M 691M Swap: 99M 0B 99M
Cnx sur 192.168.0.74 
4.14.70-v7+ total used free shared buff/cache available Mem: 927M 158M 127M 57M 641M 647M Swap: 99M 768K 99M

Si je regarde la valuer dans le fichier /etc/dphys-swapfile, via un script : cat /etc/dphys-swapfile | grep CONF_SWAPSIZE

$ ./ssh-distant-3.sh 
Cnx sur 127.0.0.1 
cat: /etc/dphys-swapfile: Aucun fichier ou dossier de ce type
Cnx sur 192.168.0.70 
CONF_SWAPSIZE=100
Cnx sur 192.168.0.71 
CONF_SWAPSIZE=100
Cnx sur 192.168.0.72 
CONF_SWAPSIZE=100
Cnx sur 192.168.0.73 
CONF_SWAPSIZE=100
Cnx sur 192.168.0.74 
CONF_SWAPSIZE=100

Le problème c’est l’écriture sur la carte microSD, je veux être sûr de ne pas user rapidement la carte.

A suivre.

PSSH/SSHPASS : Lancer des scripts en parallèle.

8 x served & 3 x viewed

Etape n°1 :

Installation, facile avec pip :

$ sudo pip install pssh
Collecting pssh
  Downloading https://files.pythonhosted.org/packages/60/9a/8035af3a7d3d1617ae2c7c174efa4f154e5bf9c24b36b623413b38be8e4a/pssh-2.3.1.tar.gz
Installing collected packages: pssh
  Running setup.py install for pssh ... done
Successfully installed pssh-2.3.1

Etape n°2 :

Utilisation simple, tous les serveurs ont le même login (par exemple pi2base) et le même mot de passe :

$ cat pssh-hosts
192.168.0.80  
192.168.0.70 
192.168.0.71  
192.168.0.72   
192.168.0.73 
192.168.0.74 
$ pssh -h pssh-hosts -l pi2base -A -i "hostnamectl"

On fait donc la commande hostnamectl via le login pi2base, sur tous les serveurs dans le fichier pssh-hosts.
Plus complexe, les utilisateurs sont différents mais les mots de passe sont identiques :
pi2base) et le même mot de passe :

$ cat pssh-hosts
user1@192.168.0.80  
user2@192.168.0.70 
user3@192.168.0.71  
user4@192.168.0.72   
user5@192.168.0.73 
user6@192.168.0.74 
$ pssh -h pssh-hosts  -A -i "hostnamectl"

Encore plus complexe, sans demander les mots de passe :

$ apt-get install sshpass pssh

Ensuite il suffit de faire un script :

$ cat ssh-distant.sh 
#!/bin/bash

serveur[1]=127.0.0.1
login[1]=xxxx
password[1]=zzzz
serveur[2]=192.168.0.70
login[2]=xxxx
password[2]=zzzz
serveur[3]=192.168.0.71
login[3]=xxxx
password[3]=zzzz
serveur[4]=192.168.0.72
login[4]=xxxx
password[4]=zzzz
serveur[5]=192.168.0.73
login[5]=xxxx
password[5]=zzzz
serveur[6]=192.168.0.74
login[6]=xxxx            
password[6]=zzzz

for index in 1 2 3 4 5 6
do
	printf " cnx sur ${login[index]} \n"
	output=$(sshpass -p ${password[index]} ssh -o StrictHostKeyChecking=no ${login[index]}@${serveur[index]} ' hostnamectl ' 2>&1)
	#echo "$?" 
	echo $output
done

history -c

La commande finale, permet de supprimer l’historique … sinon le mot de passe est en clair dans l’historique.
Par exemple :

$ ./ssh-distant.sh 
 cnx sur xxxxx 
Static hostname: osmc Icon name: computer Machine ID: 1671b5b617884fdf85a465a5ac731b8f Boot ID: a312213621b54c2f953202f480a070d7 Operating System: Open Source Media Center Kernel: Linux 4.14.34-6-osmc Architecture: arm
 cnx sur xxxxx 
Static hostname: raspberrypi Icon name: computer Machine ID: 0b646f6436cf4076bc65ccf9a7517e6c Boot ID: dc978e5c9f4d41a5b4b126b2dd7e923f Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.50+ Architecture: arm
 cnx sur xxxxx 
Static hostname: RASP3 Icon name: computer Machine ID: 5c7798e1c4144782bfc8e591138cce5f Boot ID: 7cd79bf1fa26484d8ff98b2cba06726c Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.71-v7+ Architecture: arm
 cnx sur xxxxx 
Static hostname: RASP4 Icon name: computer Machine ID: b48f53ca95ae44f8bfc503090332c390 Boot ID: c66f163ff98e4d62b0f855b07a86e0ec Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.50-v7+ Architecture: arm
 cnx sur xxxxx 
Static hostname: RASP5 Icon name: computer Machine ID: 45ed4ac581ef4f3fb099a4c8791a4787 Boot ID: e46e4361b8e44dae9f47b812525983ba Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.50-v7+ Architecture: arm
 cnx sur xxxxx 
Static hostname: RASP6 Icon name: computer Machine ID: 072b46046e3a4cdea183a0f7d018a2a3 Boot ID: 0143eb44792f457dbe288e4bbd67a973 Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.70-v7+ Architecture: arm

Sinon il reste Ansible, mais c’est beaucoup plus lourd :

$ sudo pip install ansible

… mais aussi plus performant. Il suffit de copier le fichier des hosts (pssh-hosts dans mon exemple) dans /etc/ansible/hosts . Sachant qu’il faut faire une clef : ssh-keygen, et ensuite il faut copier la clef : ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip-host .

Le problème de ansible, c’est que sur Raspbian par défaut on a une erreur d’installation :

$ sudo pip install ansible
...
arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-ttpzh8/python2.7-2.7.13=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -DUSE__THREAD -DHAVE_SYNC_SYNCHRONIZE -I/usr/include/ffi -I/usr/include/libffi -I/usr/include/python2.7 -c c/_cffi_backend.c -o build/temp.linux-armv7l-2.7/c/_cffi_backend.o
      c/_cffi_backend.c:15:17: fatal error: ffi.h: Aucun fichier ou dossier de ce type
       #include 
                       ^
      compilation terminated.
      error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
  
      ----------------------------------------
  Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-JTBUnP/cffi/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-6maTdm/install-record.txt --single-version-externally-managed --prefix /tmp/pip-build-env-JcZXMj --compile" failed with error code 1 in /tmp/pip-install-JTBUnP/cffi/
  
  ----------------------------------------
Command "/usr/bin/python -m pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-JcZXMj --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- setuptools wheel "cffi>=1.4.1; python_implementation != 'PyPy'"" failed with error code 1 in None

A suivre.

Développement en C sous Linux : pthread et la fonction sleep().

12 x served & 2 x viewed

Un petit exemple vaut mieux que de grands discours, voici le source en C :

#include 
#include 
#include 
#include <sys/time.h>
#include <sys/types.h>
#include 
static long debut = 0;
void* longue_pause(void* a){
        pid_t t = getpid();
        printf("pid = %d\n",(int)t);
        printf("thread longue_pause %d debut : %ld\n",(int)pthread_self(),time(0)-debut);
        sleep(10);
        printf("thread longue_pause %d fin : %ld\n",(int)pthread_self(),time(0)-debut);
}
void* petites_pauses(void* a){
	int i = 0;
        pid_t t = getpid();
        printf("pid = %d\n",t);
        printf("thread petites_pauses %d debut : %ld \n",(int)pthread_self(), time(0)-debut);
        for(; i < 10 ;++i){
                printf("thread petites_pauses %d en cours : %ld \n",(int)pthread_self(), time(0)-debut);
                sleep(1);
        }
}
int main(){
        pthread_t longue;
        pthread_t petit1;
        pthread_t petit2;
        debut = time(0);
        pthread_create(&longue,NULL,longue_pause,NULL);
        pthread_create(&petit1,NULL,petites_pauses,NULL);
        pthread_create(&petit2,NULL,petites_pauses,NULL);
	sleep(8);
	printf("Debut join: %ld\n",time(0)-debut);
        pthread_join(longue,NULL);
        printf("fin long : %ld\n",time(0)-debut); 
        pthread_join(petit1,NULL);
	printf("fin petit1 : %ld\n",time(0)-debut);	
        pthread_join(petit2,NULL);
	printf("fin petit2 : %ld\n",time(0)-debut);
}

Pour la compilation :

$ gcc test_pthread_test.c -lpthread -o test2

On lance le test :

$ ./test2 
pid = 324
thread longue_pause 1078445824 debut : 0
pid = 324
thread petites_pauses 1070053120 debut : 0 
thread petites_pauses 1070053120 en cours : 0 
pid = 324
thread petites_pauses 1061660416 debut : 0 
thread petites_pauses 1061660416 en cours : 0 
thread petites_pauses 1070053120 en cours : 1 
thread petites_pauses 1061660416 en cours : 1 
thread petites_pauses 1070053120 en cours : 2 
thread petites_pauses 1061660416 en cours : 2 
thread petites_pauses 1070053120 en cours : 3 
thread petites_pauses 1061660416 en cours : 3 
thread petites_pauses 1070053120 en cours : 4 
thread petites_pauses 1061660416 en cours : 4 
thread petites_pauses 1061660416 en cours : 5 
thread petites_pauses 1070053120 en cours : 5 
thread petites_pauses 1061660416 en cours : 6 
thread petites_pauses 1070053120 en cours : 6 
thread petites_pauses 1070053120 en cours : 7 
thread petites_pauses 1061660416 en cours : 7 
Debut join: 8
thread petites_pauses 1070053120 en cours : 8 
thread petites_pauses 1061660416 en cours : 8 
thread petites_pauses 1070053120 en cours : 9 
thread petites_pauses 1061660416 en cours : 9 
thread longue_pause 1078445824 fin : 10
fin long : 10
fin petit1 : 10
fin petit2 : 10

Le petit exemple nous montre bien qu’aucun sleep() ne fait une attente sur les autres pthreads, même celui dans le main().

J’ai pu voir sur des forums :

Effectivement sur le POSIX il est marqué : http://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html :

The sleep() function shall cause the calling thread to be suspended from execution until either the number of realtime seconds specified by the argument seconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process.

Mais si beaucoup de personne se pose la question c’est que cela n’a pas toujours été le cas. Sauf problème de mémoire j’ai vu le changement entre la Redhat 8.0 et la Fédora 9.0.

Mes OS de développement ont été (dans l’ordre) :

  • Redhat 5.2 ( la seule version que j’ai acheté, misère – pour information la date de release est : 2 novembre 1998 ) : A l’université de Toulouse.
  • SuSE ? : Chez Centre Océanographique de Marseille.
  • Debian ? : Chez Cyber-workers / Alias .
  • Redhat ? : Chez Rightvision
  • Redhat 7.2 : Chez Honeywell / SeCOM
  • Redhat 8.0 : Chez Honeywell / SeCOM
  • Fédora 9.0 : Chez Honeywell / SeCOM
  • Fédora 14.0 : Chez Honeywell / SeCOM
  • Fédora 17.0 : Chez Honeywell / SeCOM
  • Oracle 7.0 : Chez Honeywell / SeCOM
  • Oracle 7.2 : Chez Honeywell / SeCOM
  • Oracle 7.3 : Chez Honeywell / SeCOM
  • Oracle 7.4 : Chez Honeywell / SeCOM
  • Oracle 7.5 & Fédora 26 sous Docker : Chez Honeywell / SeCOM
  • Ubuntu 16.04 :  Chez Honeywell / SeCOM

Chez moi c’est plutôt Raspbian STRETCH ( Débian )  : https://www.raspberrypi.org/downloads/raspbian/ .

Bref, cela fait seulement 20 ans que je suis sous Linux.

Ma version de Linux Ubuntu :

$ uname -a
Linux VirtualBox 4.15.0-36-generic #39~16.04.1-Ubuntu SMP Tue Sep 25 08:59:23 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Au passage on peut aussi voir l’impact des directives de compilation sur la taille :

$ gcc test_pthread_test.c -lpthread -o test2
$ gcc test_pthread_test.c -lpthread -O2 -o test2-O2
$ gcc test_pthread_test.c -lpthread -O3 -o test2-O3
$ gcc test_pthread_test.c -lpthread -O -o test2-O
$ gcc test_pthread_test.c -lpthread -g -o test2-g
$ gcc test_pthread_test.c -lpthread -g -O3 -o test2-g-03
$ ls -l test2*
13208  test2
15024  test2-g
14880  test2-g-03
9120   test2-O
9120   test2-O2
9120   test2-O3

Voila.

(Bisous à Luc)

VirtualBox avec Ubuntu sous Mac : Avec le copier/coller et le clavier Mac c’est mieux :)

12 x served & 4 x viewed

Ma version :

  • Version : VirtualBox 5.2.18
  • MacOS : 10.13.6 : macOS High Sierra.

Pour le copier coller :

Normalement il faut lancer « GuestAdditions.iso » mais on a ce type d’erreur :

La procédure « normale » est donc :

$ sudo apt-get upgrade
$ sudo apt-get install virtualbox-guest-additions-iso
$ sudo apt-get install virtualbox-guest-utils

Ensuite on monte le cdrom et on lance l’utilitaire ( faire un ls dans /media/ le nom n’est pas forcément cdrom ) :

$ cd /media/cdrom
$ sudo ./VBoxLinuxAdditions.run

Normalement le cdrom doit être visible :

dev/sr0           56618     56618         0 100% /media/cdrom/VBox_GAs_5.2.18

Sinon on peut faire avec « brew », petit rappel au passage sur la recherche d’un fichier avec apt-file

$ sudo apt-get install apt-file
$ sudo apt-file update
$ apt-file find bin/brew
$ sudo apt-get install linuxbrew-wrapper
$ sudo brew install virtualbox-guest-utils
$ brew install virtualbox-guest-utils
$ sudo brew install virtualbox-guest-additions-iso

Normalement l’installation se faire dans /optc/

$ du -sh /opt/VBoxGuestAdditions-5.2.18/
17M	/opt/VBoxGuestAdditions-5.2.18/

A noter aussi qu’il faut activer la capture vidéo pour que cela fonctionne (ne pas me demander pourquoi).

On peut voir ensuite les softs qui tournent :

$ ps -fax | grep "VB"
  372 ?        I<     0:00  \_ [iprt-VBoxWQueue]
 1332 ?        I<     0:00  \_ [iprt-VBoxWQueue]
 1336 ?        S      0:00  \_ [iprt-VBoxTscThr]
  858 ?        Sl     0:00 /usr/sbin/VBoxService
31325 pts/18   S+     0:00          |       \_ grep --color=auto VB
 1390 ?        S      0:00 /usr/bin/VBoxClient --clipboard
 1391 ?        Sl     0:00  \_ /usr/bin/VBoxClient --clipboard
 1400 ?        S      0:00 /usr/bin/VBoxClient --display
 1401 ?        S      0:00  \_ /usr/bin/VBoxClient --display
 1405 ?        S      0:00 /usr/bin/VBoxClient --seamless
 1407 ?        Sl     0:00  \_ /usr/bin/VBoxClient --seamless
 1410 ?        S      0:00 /usr/bin/VBoxClient --draganddrop
 1411 ?        Sl     0:04  \_ /usr/bin/VBoxClient --draganddrop

A noter aussi que l’on peut extraire le ISO du package ( afficher le contenu du paquet sur le soft dans Application puis Contents/MacOS/ )  pour le lancer ensuite manuellement :

Pour le clavier Mac :

Les commandes sont les suivantes :

$ sudo dpkg-reconfigure keyboard-configuration
[sudo] password for toto : 
Your console font configuration will be updated the next time your system
boots. If you want to update it now, run 'setupcon' from a virtual console.
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
update-initramfs: deferring update (trigger activated)
Processing triggers for initramfs-tools (0.122ubuntu8.11) ...
update-initramfs: Generating /boot/initrd.img-4.15.0-36-generic

Si on change uniquement pour avoir un clavier Mac :

Le problème c’est que le pipe : cmd+shit+L ne va pas fonctionner …. pour les développeurs c’est assez pénible.

Il faut donc faire ainsi :

Je passe du gauche au droit pour la commande et ensuite je reconfigure le clavier :

J’ai ainsi le clavier et le copier/coller qui sont fonctionnel avec mon Ubuntu sur un Mac.

AMAZON : Ou le filtrage stupide des commentaires.

8 x served & 2 x viewed

Misère.