Archivi categoria: Uncategorized

Montare una immagine raw (img)

Con il diffondersi di Rasperry PI, Orange PI, Cubieboartd ed altri micro computerini, il mondo Linux è realmente impazzito e sforna continui aggiornamenti, ma (come mi è capitato oggi) ricompilando un kernel, avevo la necessità di vedere all’interno di un altro img come era stato realizzato l’output su di un led del trigger del carico della CPU.

Sotto Linux è particolarmente semplice (sapendolo …) e sono veramente due comandi: in sostanza bisogna dire al comando mount di partire da un certo punto… Ma da che punto ?

Per prima cosa con fdisk mi faccio dire la struttura dell’immagine:

$fdisk -l debian.img
Disk debian.img: 983 MiB, 1030750208 bytes, 2013184 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Dispositivo Avvio Start Fine Settori Size Id Tipo
debian.img1 2048 26623 24576 12M 83 Linux
debian.img2 26624 1967199 1940576 947,5M 83 Linux

Quindi si vedono due partizioni, entrambe formattate ext4. Per montare la prima bisognerà dire al comando mount di spostarsi di 2048 settori e per la seconda partizione l’offset sarà di 26624 settori!

sudo mount -t ext4 -o loop,offset=$((2048 * 512)) debian.img /mnt/disk

mount -t ext4 -o loop,offset=$((26624 * 512)) imgfile.img /mnt/disk1

Se si dovesse sbagliare l’offset, l’unico errore sarebbe un bel

mount : wrong fs type, bad option, band superblock on /dev/loop,
missing codepage or helper proggram, or other error
In some cases useful info is found in syslog – try
dmesg | tail or so

Da puntualizzare che 512 bytes non va bene per i CD o DVD che hanno il settore di 2352 bytes.

ESP8266

Da quando ho scoperto questo piccolo mostro, me ne sono innamorato… piccolo, potente, con la wifi integrata !! WOW

Solo un piccolo problema: pochi pin in/out, ma con un pezzo di codice è possibile aumentare i pochi pin :

// ******************** CHANGE PIN FUNCTION ********************
pinMode(1, FUNCTION_3); //GPIO 1 swap the pin to a GPIO.
pinMode(3, FUNCTION_3); //GPIO 3 swap the pin to a GPIO.
// ********************
pinMode(1, OUTPUT);
pinMode(3, OUTPUT);

Il codice può essere inserito all’interno di uno scketch di Aruino o all’interno del framework Sming.

Ed altri due pin per attivare o disattivare attuatori !!

ILOM e SUN/Oracle

Integrated Lights-out Manager (ILOM) aiuta la gestione ed il troubleshooting del hardware di un server della Sun/Oracle. Con l’aiuto di ILOM è possibile gestire da remoto il server, anche se (come mi è successo) il server fosse spento per un malfunzionamento della piastra madre.
Riporto i comandi più usati:

Per loggarsi nella macchina

-> start /SP/console        -- inizializza  SP-console
-> show /SP/sessions        -- verifica le sessioni attive
-> stop /SP/console         -- ferma ogni sessione utente

Start and stop system

-> start /SYS                            (fa partire il sistema)  
-> stop [-force] /SYS                    (ferma sistema)
-> show /SYS                             (verifica lo stato)
-> reset /SYS                            (reset del host)
-> reset /SP                             (reset di ILOM SP)
-> set /HOST send_break_action=break     (invia break all'OS)
-> reset /CMM                            (resetta CMM dello Chassis delle blade)

Comandi per la rete

-> show /SP/network

Per settare l’IP address della ILOM

-> set pendingipdiscovery=static 
-> set pendingipaddress=10.10.10.10
-> set pendingipnetmask=255.255.255.0
-> set pendingipgateway=10.10.10.1
-> set commitpending=true

Per verificare il MAC address della SP

show /SP/network macaddress

Per verificare il CMM IP dello chassis della blade

-> show /CMM/network

Amministrazione degli utenti

-> show /SP/users                  (mostra gli utenti ILOM)
-> show /SP/user/admin             (La configurazione di un utente)
-> create /SP/users/user_name password=PWD role=[administrator|operator]    (crea)
-> delete /SP/users/username       (cancella un user)
-> set /SP/users/admin01 role=administrator           (definisce il ruolo)
-> set /SP/users/admin01           (cambio password)

Monitoring e logs

-> show /SP/logs/event/list     (event log di ILOM)
-> show -level all -output table /SP/faultmgmt     (mostra i fault hardware)
-> show -level all -output table /SYS type==Temperature value

hardware info

-> show -level all -output table /SYS type==DIMM                (mostra DIMMS)
-> show -level all -output table /SYS type=='Host Processor'    (mostra CPUs)
-> show -l all /SYS type=='Hard Disk'                           (mostra disks)

Calcolo della distanza fra due punti GPS

Dovendo calcolare la distanza fra due punti GPS, ho cercato su DuckDuck un aiuto per poter eseguire il calcolo ed ho adattato quello trovato facendolo divenire il seguente pezzo di codice PHP:

function distanza(lat2,lon2)
{
$R=6371;
$pigreco=3.1415927;
$f=0;
$p=0;
$d1=0;
// Coordinate di Piazza del Campidoglio, Roma
$lat2=41.89326;
$lon2=12.48298;
/* Converte i gradi in radianti */
$lat_alfa = $pigreco * $lat1 / 180;
$lat_beta = $pigreco * $lat2 / 180;
$lon_alfa = $pigreco * $lon1 / 180;
$lon_beta = $pigreco * $lon2 / 180;
// Calcola l’angolo compreso fi
$fi = abs($lon_alfa – $lon_beta);
// Calcola il terzo lato del triangolo sferico
$p = acos(sin($lat_beta) * sin($lat_alfa) + cos($lat_beta) * cos($lat_alfa) * cos($fi));
// Calcola la distanza sulla superficie terrestre R = ~6371 km
$d1 = $p * $R;
}

Non servendomi una grande precisione, assumo che la terra sia una sfera perfetta .
Dunque, osservando la figura in alto, diciamo che, in base alla trigonometria sferica (teorema di Eulero), tra i lati ab e p del triangolo sferico ABP vale la relazione:

cos p = cos a cos b + sen a sen b cos φ

Ora, dette lat(A)lon(A)lat(B)lon(B), la latitudine e la longitudine dei punti A e B e, considerato che utilizzando la regola mnemonica di Nepero si ha:

  • a = 90° – lat(B)
  • b = 90° – lat(A)
  • φ = lon(A) – lon(B)

abbiamo tutti i dati per calcolare la lunghezza del lato p considerando il raggio della Terra approssimabile a R = 6371 km.

Da Via e Civico a coordinate GPS

Per un mio interesse volevo riportare su mappa una serie di luoghi, ma avevo solo l’indirizzo a mia disposizione.

Mi sono trovato, quindi, nella necessità di trasformare questi indirizzi in punti GPS: LocationIQ mi ò venuto in aiuto.

www.locationiq.com è un sito tramite il quale, una volta registrati ed ottenuta la key da sviluppatore, si possono convertire indirizzi (via e civico) in coordinate gps e fino a 10000 indizzzi nelle 24 ore, il servizio è gratuito !!

#!/bin/bash

echo -e "lat	lon	title	description	icon	iconSize	iconOffset">lista.txt
rm update_poi.sql
while IFS=\; read poi indirizzo 
do

indirizzo1="$indirizzo1,rome,lazio,italy"
echo $indirizzo
wget -O ppp.xml  "https://eu1.locationiq.com/v1/search.php?key=ppqqtt&q=${indirizzo1}&format=xml"

actualsize=$(wc -c <"ppp.xml")
if [ $actualsize -ge 1 ]; then
  XML_FILE=ppp.xml
  LAT=$(xmllint --xpath 'string(/searchresults/place/@lat)' $XML_FILE)
  LON=$(xmllint --xpath 'string(/searchresults/place/@lon)' $XML_FILE)
  echo $poi","$LAT,$LON 
  echo -e "$LAT\t$LON\t$poi\t$indirizzo\n$LAT\n$LON\tOl_icon_blue_example.png	24,24	0,-24" >> lista.txt
  echo "update fact_data_provisioning_gps set lat='${LAT}', lon='${LON}' where cod_poi='${poi}';">>update_poi.sql
fi
sleep 1
rm ppp.xml

done<esportazione.dsv

il piccolo programmino in bash che a fronte dell’indirizzo via/civico del mio poi, ottiene le coordinate gps e crea il file che mi permetterè l’aggiornamento della mia tabella Oracle.

A questo punto dopo aver cercato in rete qualcosa che mi potesse aiutare a mappare i punti gps ottenuti sulla cartina.

Anche in questo caso una breve ricerca e sono arrivato alla pagina

https://wiki.openstreetmap.org/wiki/Openlayers_POI_layer_example

che mi ha consentito di rappresentare i miei punti GPS in un attimo !

rc.local ed Ubuntu 17.04

Quanto serve un qualcosa che parta alla fine dello startup del sistema operativo!!

Ma con Ubuntu 16.10 (e forse anche prima) con il passaggio a Sytemd è stato tolto l’utile rc.local; per riabilitarlo bisogna eseguire i seguenti passi:

Dopo aver verificato che il servizio non è effettivamente attivo

sudo systemctl status rc-local
● rc-local.service - /etc/rc.local Compatibility
 Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
 Active: failed (Result: exit-code) since Thu 2015-11-26 23:54:58 CST; 59s ago
 Process: 1001 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)
Nov 26 23:54:57 vivid rc.local[1001]: File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 920, in require
Nov 26 23:54:57 vivid rc.local[1001]: needed = self.resolve(parse_requirements(requirements))
Nov 26 23:54:57 vivid rc.local[1001]: File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 807, in resolve
Nov 26 23:54:57 vivid rc.local[1001]: raise DistributionNotFound(req)
Nov 26 23:54:57 vivid rc.local[1001]: pkg_resources.DistributionNotFound: shadowsocks==2.8.2
Nov 26 23:54:58 vivid sudo[1008]: pam_unix(sudo:session): session closed for user root
Nov 26 23:54:58 vivid systemd[1]: rc-local.service: control process exited, code=exited status=1
Nov 26 23:54:58 vivid systemd[1]: Failed to start /etc/rc.local Compatibility.
Nov 26 23:54:58 vivid systemd[1]: Unit rc-local.service entered failed state.
Nov 26 23:54:58 vivid systemd[1]: rc-local.service failed.
sudo systemctl enable rc-local
The unit files have no [Install] section. They are not meant to be enabled
 using systemctl.
 Possible reasons for having this kind of units are:
 1) A unit may be statically enabled by being symlinked from another unit's
 .wants/ or .requires/ directory.
 2) A unit's purpose may be to act as a helper for some other unit which has
 a requirement dependency on it.
 3) A unit may be started when needed via activation (socket, path, timer,
 D-Bus, udev, scripted systemctl call, ...).

bisogna abilitarlo editando il file

sudo vi /etc/systemd/system/rc-local.service

e modificarlo affinchè sia uguale a quello qui sotto:

[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

A questo punto abilitiamo l’esecuzione del file rc.local

sudo chmod +x /etc/rc.local

ed abilitiamo il servizio

sudo systemctl enable rc-local
Created symlink from /etc/systemd/system/multi-user.target.wants/rc-local.service to /etc/systemd/system/rc-local.service.

Controlliamo che tutto sia a posto

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility
 Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
 Active: active (running) since Fri 2015-11-27 00:32:56 CST; 14min ago
 Process: 879 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 880 (watch)
 CGroup: /system.slice/rc-local.service

Fatto !

(è possibile usare anche il crontab con la keyword @reboot … )

Errori di PAC durante lo startup

Da molto uso PAC per la gestione dei diversi ststemi sui quali lavoro, ma questo fine settimana dopo l’aggiornamento alla versione 17.04 di Ubuntu, è apparso un bel errore:

Use of uninitialized value in subroutine entry at /opt/pac/lib/PACKeePass.pm line 273.

dopo aver girovagato ho trovato la soluzione

apt install libglib2.0-dev libpango1.0-dev libvte-dev libvte-2.91-dev dh-make-perl
dh-make-perl --cpan Gnome2::Vte --build
sudo dpkg -i libgnome2-vte*.deb
sudo find /opt/pac/ -name "Vte.so*" -exec rm {} +

ma verso la fine della compilazione avevo questo errore

MakeMaker FATAL: prerequisites not found.
ExtUtils::Depends not installed
ExtUtils::PkgConfig not installed

ho installato allora i pachetti necessari con

apt install libextutils-pkgconfig-perl libextutils-depends-perl

e tutto è andato perfettamente.

CrossCompiling ARM per C.H.I.P. 9$ computer

Per prima cosa bisogna soddisfare alcuni prerequisiti:

sudo apt-get install git ncurses-dev make gcc-arm-linux-gnueabi

git il sistema di controllo di versione del team di sviluppo del kernel
ncurses una libreria testuale usata da menuconfig
make make…
gcc-arm-linux-gnueabi il cross compiler

recuperiamo il codice sorgente del kernel che vogliamo compilare

versione kernel 4.3

git clone --single-branch --branch debian/4.3.0-ntc-4 --depth 1 https://github.com/NextThingCo/CHIP-linux.git

version kernel 4.4

git clone --single-branch --branch debian/4.4.11-ntc-1 --depth 1 https://github.com/NextThingCo/CHIP-linux.git

il comando clonerà tutto il contenuto del repository ufficiale in una directory chiamata CHIP-linux.

Il problema nasce dal contenuto di default del .config. Nel mio caso ho usato il file di configurazione di renzo:

mkdir /tmp/chiplinux4.3.0rd235+
pushd /tmp/chiplinux4.3.0rd235+
wget http://www.raspibo.org/renzo/chiplinux4.3.0rd235+.tgz
tar zxf chiplinux4.3.0rd235+.tgz
popd
cp /tmp/chiplinux4.3.0rd235+/boot/config-4.3.0rd235+ .config

A questo punto configuriamo il kernel

make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig

eventualmente mofichiamo la configurazione con menuconfig

make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- menuconfig

e lanciamo la compilazione

make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k

sul piccolo chip servono oltre tre ore, ma con un semplice make: una volta crosscompilato, spostiamo tutta la directory /src/CHIP-linux dal computer al chip.

L’installazione si completa con

sudo make INSTALL_FW_PATH=/lib/firmware/new modules_install

CDDB

Come calcolare l’id unico che consente di ottenere le informazioni del cd da freecd o simili:

 

Assumiamo per esempio che il cd da analizzare abbia le seguenti caratteristiche:

 

# Track frame offsets:
#	150
#	15095
#	28530
#	40556
#	60479
#	81952
#	100762
#	112675
#	128656
#	145954
#
# Disc length: 2260

10 brani con lunghezza totale di 2.260 secondi: il discid di questo cd sarà 6808d20a , dove (partendo da destra) 0x0a sono i 10 brani del cd; 0x08da sono i 2.260 secondi della lunghezza del CD.

il primo valore corrisponde alla somma dei singoli numeri dell’inizio della traccia / 75… in pratica

 

ST ST/75 SUM
150 2 2
15095 201 3
28530 380 11
40556 540 9
60479 806 14
81952 1092 12
100762 1343 11
112675 1502 8
128656 1715 14
145954 1946 20
104

Il valore 104, che è la somma di tutti i valori, deve essere divisa per 255 e prendere il resto: questo in esadecimale è proprio 0x68.

 

 

Una volta che si hanno i dati del CD puoi ottenere il resto delle informazioni:

 

$ telnet freedb.freedb.org 8880
Trying 195.214.216.38...
Connected to freedb.freedb.org.
Escape character is '^]'.
201 mirror1.freedb.org CDDBP server v1.5.2PL0 ready at Wed Jul 13 16:20:36 2016
cddb hello username hostname clientname version
200 Hello and welcome username@hostname running clientname version.
CDDB QUERY  f00d0c10 16 150 20972 36331 50117 69524 86255 101371 112896 131608 138844 157390 174137 193697 208667 224774 238280 3342
200 data f00d0c10 Halsey / Badlands
CDDB READ data f00d0c10
210 data f00d0c10 CD database entry follows (until terminating `.')
# xmcd
#
# Track frame offsets:
#        150
#        20972
#        36331
#        50117
#        69524
#        86255
#        101371
#        112896
#        131608
#        138844
#        157390
#        174137
#        193697
#        208667
#        224774
#        238280
#
# Disc length: 3342 seconds
#
# Revision: 0
# Processed by: cddbd v1.5.2PL0 Copyright (c) Steve Scherf et al.
# Submitted via: ExactAudioCopyFreeDBPlugin 1.0
#
DISCID=f00d0c10
DTITLE=Halsey / Badlands
TTITLE0=Castle
TTITLE1=Hold Me Down
TTITLE2=New Americana
TTITLE3=Drive
TTITLE4=Hurricane
TTITLE5=Roman Holiday
TTITLE6=Ghost
TTITLE7=Colors
TTITLE8=Colors Pt. II
TTITLE9=Strange Love
TTITLE10=Coming Down
TTITLE11=Haunting
TTITLE12=Gasoline
TTITLE13=Control
TTITLE14=Young God
TTITLE15=I Walk The Line
EXTD=
EXTT0=
EXTT1=
EXTT2=
EXTT3=
EXTT4=
EXTT5=
EXTT6=
EXTT7=
EXTT8=
EXTT9=
EXTT10=
EXTT11=
EXTT12=
EXTT13=
EXTT14=
EXTT15=
PLAYORDER=

 

ed il gioco è fatto !!

dd con percentuale

Ho sempre voluto sapere quanto mancasse alla fine del comando dd: ecco la soluzione

utilizzando l’utente root

(pv -n /dev/sdb | dd of=/dev/sdc bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0

una bella barra colorata con tanto di percentuale mi tiene aggiornato.