giovedì 22 aprile 2010

Compattare i dischi di VirtualBox

Per chi come me utilizza VirtualBox per far girare Windows (ma anche altri sistemi ovviamente) avrà sicuramente notato il crescere delle dimensioni del file immagine del disco (normalmente memorizzati nella cartella .VirtualBox/VDI). Tale crescita non va di pari passo all'occupazione reale sotto Windows, trovandosi spesso con un file da 20 Giga a fronte di un fisco pieno per appena 7 Giga!

Per risolvere questo problema bastano pochi passaggi e un po' di tempo libero, visto che l'intero procedimento richiederà diversi minuti!

Il primo passo da compiersi è quello di ripulire il disco sotto Windows eliminando tutti i file temporanei o non necessari, svuotare il cestino e disinstallare i programmi non utilizzati.
Successivamente va deframmentato il disco, utilizzando l'apposito programma che trovate nel menu: Start -> Programmi -> Accessori -> Utilità di sistema -> Utilità di deframmentazione dischi.
Terminata anche la fase di deframmentazione occorrerà ripulire il contenuto dei blocchi lasciati liberi, altrimenti VirtualBox continuerà a crederli impegnati; per fare questo possiamo utilizzare il programma sdelete scaricabile dal sito www.sysinternals.com (link diretto), apriamo una finestra del prompt dei comandi e digitiamo:
<dir_sdelete>\sdelete -c

dove <dir_sdelete> è la cartella dove abbiamo decompresso lo zip dell'utility appena scaricata.
Terminato questo passaggio possiamo fare lo shutdown dell'istanza Windows e passiamo a compattare il disco.
Per evitare qualsiasi errore preferisco lavorare sempre con l'id del disco, nel mio caso il comando di compattazione sarà:
VBoxManage modifyhd 8ad8a5fd-ec5d-4ee1-8d74-4d5df44efba8 --compact

ovviamente voi utilizzerete l'id del vostro disco!!!

giovedì 15 aprile 2010

SMF service per JBoss

Sicuramente chi già utilizza Solaris oppure OpenSolaris conoscerà tutti i benefici e le comodità dei servizi SMF, per chi non conosce l'argomento potete leggere una breve introduzione da me scritta in questi articoli.

Ultimamente per lavoro ho utilizzato molto spesso l'application server JBoss ed ho notato la mancanza di un apposito servizio per integrarlo in SMF, di conseguenza mi sono armato di pazienza e ne ho creato uno. Il servizio è stato testato con JBoss AS versione 5.1.0-GA, ma dovrebbe comportarsi bene anche con la versione 6. I due file che compongono il pacchetto sono il descrittore XML del servizio e uno script di shell che si occupa di far partire (o arrestare) JBoss.

Cominciamo l'analisi del file xml (jboss.xml):
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type='manifest' name='jboss'>

 <service name='application/jboss' type='service' version='1'>

  <!-- Wait for network interfaces to be initialized. -->
  <dependency name='network' grouping='require_all'
      restart_on='none' type='service'>
   <service_fmri value='svc:/milestone/network:default' />
  </dependency>

  <!-- Wait for all local filesystems to be mounted. -->
  <dependency name='filesystem-local' grouping='require_all'
      restart_on='none' type='service'>
   <service_fmri value='svc:/system/filesystem/local:default' />
  </dependency>

  <!-- Wait for the production database to be online
  <dependency name='database' grouping='require_all'
      restart_on='restart' type='service'>
   <service_fmri value='svc:/application/database/mysql:version_51' />
  </dependency>
  -->

  <exec_method type='method' name='start'
      exec='/lib/svc/method/jboss %m %i' timeout_seconds='60' />

  <exec_method type='method' name='stop'
      exec='/lib/svc/method/jboss %m %i' timeout_seconds='60' />

  <!-- rememer to set home dir of jboss user (usermod -d /opt/jboss5/ jboss) -->
  <property_group name="jboss" type="application">
   <propval name="home" type="astring" value="/opt/jboss5" override="true"/>
   <propval name="user" type="astring" value="jboss" override="true"/>
  </property_group>

  <!-- set this to productions values:
   # svccfg -s svc:/application/jboss:default setprop instance/host=0.0.0.0
   # svcadm refresh jboss:default
  -->
  <instance name='default' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

  <instance name='all' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

  <instance name='minimal' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

  <instance name='standard' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

  <instance name='web' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

 <stability value='Stable' />

 <template>
  <common_name>
   <loctext xml:lang='C'>JBoss AS</loctext>
  </common_name>
  <documentation>
   <doc_link name='jboss.org' uri='http://www.jboss.org/jbossas/docs.html' />
  </documentation>
 </template>

 </service>
</service_bundle>

Nella prima parte del servizio ho descritto le dipendenze di base, ovvero networking e filesystem (per ovvie ragioni), inoltre ho inserito anche una dipendenza dal database MySQL (commentata di default), togliendo i commenti JBoss non partirà finche il database non sarà partito, inoltre in caso di restart del servizio database verrà effettuato anche un restart di JBoss.

Di seguito trovate le proprietà generali di JBoss, ovvero la cartella dove è installato e l'utente con cui lo si vuole far partire, mentre tutte le altre proprietà sono state specificate a livello di istanza, facendo così sulla stessa macchina potreste far partire JBoss profilo standard sull'indirizzo 127.0.0.1 e JBoss profilo web su 192.168.10.1. Per modificare queste proprietà basterà dare i seguenti comandi:
# svccfg -s svc:/application/jboss:default setprop instance/host=0.0.0.0
# svcadm refresh jboss:default

in questo caso abbiamo impostato l'host per l'instanza default al valore 0.0.0.0; ovviamente se JBoss erà già stato avviato occorrerà farlo ripartire con un:
# svcadm restart jboss:default

Ovviamente se nella vostra installazione avrete creato altre configurazioni personalizzate di JBoss non dovrete far altro che aggiungere al file XML una nuova istanza copiando una di quelle esistenti.

Evito l'analisi dello script di supporto in quanto è decisamente banale, concludo invece con le informazioni per installare il tutto sul vostro sistema. Scaricate il file da qui, scompattatelo con:
# gzcat jboss-smf.tar.gz | tar xf -

ora copiamo il file di script e rendiamolo eseguibile:
# cp jboss /lib/svc/method/
# chmod +x /lib/svc/method/jboss

ed importiamo il descrittore di servizio:
# svccfg import jboss.xml

a questo punto tutte le istanze saratto regolarmente configurate:
# svcs -a|grep jboss
disabled        9:46:57 svc:/application/jboss:all
disabled        9:46:57 svc:/application/jboss:default
disabled        9:46:57 svc:/application/jboss:web
disabled        9:46:57 svc:/application/jboss:minimal
disabled       14:16:17 svc:/application/jboss:standard

per farne partire una basterà digitare:
# svcadm enable jboss:standard

e, ad ogni riavvio del sistema, verrà fatto ripartire anche JBoss!

mercoledì 14 aprile 2010

Ancora su OpenSolaris e schede grafiche Intel

Visto che era diverso tempo che non scrivevo più nulla su questo blog voglio approfittare per parlare di un recente fix per le schede grafiche Intel sotto OpenSolaris. Già da qualche tempo si era parlato di un fix che correggeva un bel crash del sistema, tuttavia rimaneva un fastidioso incoveniente: a volte il video rimaneva bloccato per alcuni secondi, e nei log di sistema si leggeva questo messaggio:
i915_gem_ring_throttle: i915_wait_request request->seqno 414454 now 414454

fortunatamente questo baco è stato individuato e risolto (bug #12528), tuttavia occorrerà attendere il rilascio ufficiale della prima versione "sotto" Oracle di OpenSolaris, però ancora la data rimane un mistero... quindi ecco alcuni semplici passi da seguire e beneficiare subito del fix.

Per prima cosa scaricare il file da qui, scompattatelo in una qualsiasi cartella con:
gzcat i915.tar.gz | tar xf -

creiamo un nuovo boot environment e lo montiamo su /mnt con:
pfexec beadm create -a opensolaris-134a
pfexec beadm mount opensolaris-134a /mnt

copiamo i file necessari:
pfexec cp kernel/drv/i915 /mnt/kernel/drv
pfexec cp kernel/drv/amd64/i915 /mnt/kernel/drv/amd64

aggiorniamo l'archivio di boot e smontiamo il tutto:
pfexec bootadm update-archive -R /mnt
pfexec beadm umount opensolaris-134a

ora non resta altro da fare che riavviare il sistema e godervi in santa pace la vostra installazione senza  nessun freeze dello schermo!!

venerdì 5 febbraio 2010

OpenSolaris e schede grafiche Intel

Le recenti build di OpenSolaris (a partire dalla 130) soffrono di numerosi problemi relativi ai driver per schede grafiche Intel; tali bachi sono in corso di risoluzione, tuttavia occorrerà attendere la build 134 per averli nei repository!

Quando ho aperto la segnalazione del baco abbiamo fatto dei test insieme ad Edward Shu ed è riuscito ad "anticiparmi" alcuni file da aggiornare e testare sulla mia macchina... e devo dire che funzionano!!!

Aggiornare la propria macchina è relativamente semplice, per prima installate l'ultima release di sviluppo (attualmente la 132) con il solito Package Manager o con il comando pkg image-update, ma prima di eseguire il reboot carichiamo nel nuovo boot environment i file da aggiornare.

Scaricate il file da qui, poi da linea di comando montiamo il BE (chiamato nel mio caso opensolaris-132) nella directory /mnt:
$ pfexec beadm mount opensolaris-132 /mnt

ora scompattiamo e copiamo i file appena scaricati:
$ tar xfz intel.tar.gz
$ pfexec cp intel/agptarget.de32 /mnt/kernel/drv/agptarget
$ pfexec cp intel/agptarget.de64 /mnt/kernel/drv/amd64/agptarget
$ pfexec cp intel/libexa.so.32  /mnt/usr/lib/xorg/modules/libexa.so
$ pfexec cp intel/libexa.so.amd64 /mnt/usr/lib/xorg/modules/amd64/libexa.so

aggiorniamo il boot-archive del nostro boot environment (per tranquillizzare il servizio boot-archive e dirgli che siamo stati noi a modificare i file sotto la directory kernel/*):
$ pfexec bootadm update-archive -R /mnt

smontiamo il BE:
$ pfexec beadm umount opensolaris-132

e ora siamo pronti per fare un reboot con la release appena aggiornata e con i driver funzionanti!