Dans tw_cli , commencer par retirer le disque defaillant avec
/cx/px remove
Remplacer le disque (ou pas) puis rescanner le disque avec
/cx rescan
enfin lancer le rebuild avec
/cx/ux start rebuild disk=n
avec n le numero du port px où est connecté de disque (La doc n’est absolument pas claire à ce sujet)
VirtualBox – Gestion de l’usb
Pour que la gestion de l’usb fonctionne correctement il faut disposer de la version « fermée » de VirtualBox
Il est nécessaire de rebooter (enfin non mais c plus simple) après l’installation du paquet VirtualBox pour que UDEV prenne en compte les modification de règles d’accès des peripheriques usb (accès rw au groupe vboxusers)
Il faut évidemment aussi que l’utilisateur des VM appartienne à ce groupe.
# adduser $username vboxusers
Apache mod_proxy sous debian
La configuration par défaut du mod_proxy de Apache sous Debian implique les réglages suivants
<IfModule mod_proxy.c> #turning ProxyRequests on and allowing proxying from all may allow #spammers to use your proxy to send email. ProxyRequests Off <<<<<<<< Très bien :smile: <Proxy *> AddDefaultCharset off Order deny,allow Deny from all <<<<<<< RAAAAHHHHHH ! :mad: #Allow from .example.com </Proxy> # Enable/disable the handling of HTTP/1.1 "Via:" headers. # ("Full" adds the server version; "Block" removes all outgoing Via: headers) # Set to one of: Off | On | Full | Block ProxyVia On </IfModule>
Ce genre de sécurités à la con me sortent par les yeux parce qu’elles impliques que si vous activez (à priori volontairement) une option, cette option sera par defaut inutilisable. Et vous chercherez vainement ce que vous avez bien pu faire de travers alors que ce n’est pas de votre faute.
Changer le reglage par defaut de debian est une mauvaise piste. => gare à la prochaine mise à jour.
un vhost qui veut faire du proxy doit donc au moins avoir pour directives :
<VirtualHost :80> ServerName fqdn.server.com proxyPass localpath http://targeturl/ proxyVia off <proxy > Order Deny,Allow Deny from all Allow from all </proxy></strong> </VirtualHost>
Ajouter la Clé GPG d’un repo debian
en supposant que la clé soit le fichier server.key présent à la racine du serveur la commande magique est
wget http://serveur:port/server.key -O - | apt-key add -
Netstat et ses options sympa
Pour avoir des statistiques réseau sous linux, vous connaissez certainement netstat
Certaines combinaisons d’options sont plus faciles à retenir avec des moyens mnemotechniques
Parmis les options intéressantes :
netstat -lapute
ou encore
netstat -pantalon
Ce sont évidemment des options composées, pour plus d’infos RTFM.
Monitoring CPU temps réel
voici un petit bout de code C qui mesure l’activité CPU d’une machine et envoie les statistiques à une machine de monitoring
#include <stdio.h> #include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <string.h> #include <unistd.h> #define BUFSIZE 1024 enum { CURRENT , OLD , DIFF , PERCENT , TABSIZE }; enum { USR, NICE, SYSTEM , IDLE , IOWAIT , IRQ , SOFTIRQ , TOTAL , NBCOLS }; enum { ERROR, OK }; unsigned long long int table[NBCOLS][TABSIZE]; void setcolor(int f, int b) { printf("%c[0;%d;%dm",27,30+f,40+b); } void setfcolor(int f) { printf("%c[%d;%dm", 27, f/8, 30+(f%8) ); } void setbcolor(int b) { printf("%c[%d;%dm", 27, b/8, 40+(b%8) ); } void setdefault(void) { printf("%c[m",27); } char thishostname[BUFSIZE]; int s; struct sockaddr_in srvAddr; struct hostent *h; void recuphostname(void) { FILE * f; f=fopen("/etc/hostname" ,"r"); fgets(thishostname , BUFSIZE-1 , f); if ( thishostname[strlen(thishostname)-1] == '\n') thishostname[strlen(thishostname)-1] ='\0'; fclose(f); } int recup(void) { FILE * f; char cpuline[BUFSIZE]; unsigned int i; f=fopen("/proc/stat" ,"r"); if (!f) return ERROR; fgets(cpuline , BUFSIZE-1 , f); fclose(f); for ( i=0 ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[USR][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[NICE][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[SYSTEM][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[IDLE][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[IOWAIT][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[IRQ][CURRENT] ) ); for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++; sscanf(cpuline+i, "%llu", &( table[SOFTIRQ][CURRENT] ) ); return OK; } void affiche(void) { printf("USR=%03lu ", table[USR][PERCENT]); printf("NICE=%03lu ", table[NICE][PERCENT]); printf("SYSTEM=%03lu ", table[SYSTEM][PERCENT]); printf("IDLE=%03lu ", table[IDLE][PERCENT]); printf("IOWAIT=%03lu ", table[IOWAIT][PERCENT]); printf("IRQ=%03lu ", table[IRQ][PERCENT]); printf("SOFTIRQ=%03lu\n", table[SOFTIRQ][PERCENT]); } void affiche2(void) { int i; int cpt=0; printf("["); //setfcolor(0); setfcolor(2); for ( i=0 ; i < table[USR][PERCENT] ; i++ ) { putc('U',stdout); cpt++; } setfcolor(1); for ( i=0 ; i < table[SYSTEM][PERCENT] ; i++ ) { putc('S',stdout); cpt++; } setfcolor(4); for ( i=0 ; i < table[IOWAIT][PERCENT] ; i++ ) { putc('W',stdout); cpt++; } setfcolor(6); for ( i=0 ; i < table[IRQ][PERCENT]+table[SOFTIRQ][PERCENT] ; i++ ) { putc('I',stdout); cpt++; } setdefault(); for ( i=cpt ; i < 100 ; i++ ) putc(' ',stdout); printf("] CHARGE CPU : %4lu%% \n", 100 - table[IDLE][PERCENT] ); } void affichenet(void) { char outbuffer[2000]; sprintf(outbuffer , "%s|",thishostname); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[USR][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[NICE][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[SYSTEM][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IDLE][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IOWAIT][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IRQ][PERCENT]); sprintf(outbuffer+strlen(outbuffer) , "%lu\n", table[SOFTIRQ][PERCENT]); printf("%s", outbuffer); sendto(s, outbuffer, strlen(outbuffer)+1, 0, (struct sockaddr *) &srvAddr, sizeof(srvAddr)); } void submain(void) { unsigned int i=0; if ( ! recup() ) return; for ( i=USR ; i<TOTAL ; i++) { if (table[i][CURRENT]<table[i][OLD]) return; } table[TOTAL][CURRENT] = 0; for ( i=USR ; i<TOTAL ; i++ ) table[TOTAL][CURRENT] += table[i][CURRENT]; /*genere le total */ for ( i=USR ; i<=TOTAL ; i++) table[i][DIFF] = table[i][CURRENT] - table[i][OLD]; /*genere différences */ if ( table[TOTAL][DIFF] == 0 ) return; for ( i=USR ; i<=TOTAL ; i++) table[i][PERCENT] = ( table[i][DIFF] * 100 ) / table[TOTAL][DIFF]; /*calcul pourcentages */ //affiche2(); affichenet(); for ( i=USR ; i<=TOTAL ; i++ ) table[i][OLD]=table[i][CURRENT]; /*archive les anciennes valeur pour la prochaine mesure */ } int main(void) { unsigned int i=0; unsigned int j=0; struct timespec ts; ts.tv_sec=0; ts.tv_nsec=100000000; for ( i=USR ; i<=TOTAL ; i++) for (j=CURRENT ; j<NBCOLS ; j++ ) table[i][j]=0; recuphostname(); srvAddr.sin_family = AF_INET; srvAddr.sin_port = htons(31857); srvAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); s=socket(AF_INET,SOCK_DGRAM,0); if ( s<0 ) return 1; while (1) { nanosleep(&ts, NULL); submain(); } return 0; }
Disques virtuels avec LVM pour machines XEN
Lors de la création de machines virtuelles XEN, (on parle de machines paravirtualisées et non émulées) On peut utiliser des volumes logiques pour créer les disques virtuels de cette machine. Il faut absolument éviter d’utiliser LVM à l’intérieur du domU car la couche lvm de dom0 reconnaitra les PV du domU comme un nouveau VG de dom0.
Le systeme *peut* fonctionner comme ça mais il y a quand même de gros risques de confusion ou cafouillages en particulier si on tente de manipuler les volumes en question à partir de dom0.
donc : une manipe à éviter.
Programmation openGL sous Debian (Lenny)
Les paquets nécessaires pour compiler une application opengl minimale sont :
apt-get install --assume-yes libxi-dev libxi6 apt-get install --assume-yes libxmu6 libxmu-dev apt-get install --assume-yes freeglut3-dev freeglut3 libglut3 libglut3-dev glutg3 glutg3-dev apt-get install --assume-yes libgl1-mesa-dev libglib2.0-dev libglu1-mesa-dev libglut3 libglut3-dev
Tracer une série de points avec GnuPlot
Pour tracer une série de valeurs avec gnuplot, la commande suivante est bien sympa.
( echo "set term x11" ; echo "plot \"-\" with lines;" ; cat data.txt ) | gnuplot -persist
au lieu de cat data.txt
, ont peut mettre une commande qui génere les data à tracer.
Rsync en specifiant une clé RSA
L’astuce est de specifier la commande ssh que rsync doit utiliser pour se connecter et de donner les bonnes options à ssh
exemple
rsync -av -e "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PasswordAuthentication=no -i $RSAKEYFILE" --delete-before $LOCALPATH user@$BACKUPSRV:$REMOTEBACKUPPATH
(Supprimer les retour de ligne pour utiliser)