Hello everybody,
J'aimerais vous faire part d'une méthode à caractère didactique qu'il m'arrive d'utiliser pour installer des paquets debian, hors connection, qui prend identiquement en charge l'ensemble de leurs éventuelles dépendances puisqu'elle passe par les mêmes outils que sont apt-get et synaptic, presque comme si on était relié à internet en somme, la seule véritable différence étant l'absence du côté temps réel des mises à jours.
(Et, si cette méthode semble à prime abord ne pas s'adresser aux plus illuminés d'entre nous qui ne supporteraient pas de ne pas avoir un système actualisable à la micro-seconde près, en réalité, rien n'interdit d'utiliser conjointement la méthode offline et online, en accordant cependant une légère priorité aux dépots locaux, dans le fichier sources.list).
Bien entendu, tout ceci réclame un petit peu d'effort de mise en oeuvre mais son utilité finale n'est pas des moindres.
Tout d'abord, voici à quoi ressemblera le contenu du fichier /etc/apt/sources.list
(en l'occurence, celui d'une distribution ubuntu hardy heron 8.04)
(où "ubuntu" est l'hostname par défaut de la distrib du même nom mais pourrait tout aussi bien être plus personnalisé, les scripts ultérieurs étant de toute façon conçus pour tenir compte de ces nuances) :
deb file:/home/ubuntu/archive hardy main restricted universe multiverse
deb file:/home/ubuntu/archive hardy-security main restricted universe multiverse
deb file:/home/ubuntu/archive hardy-updates main restricted universe multiverse
A ce stade ci, si vous avez de la suite dans les idées, vous remarquerez que la deuxième chose qui s'impose, c'est la présence d'un répertoire nommé "archive" qui se logera à l'intérieur de votre répertoire /home/user/ (user étant le nom de votre choix, ou "ubuntu" dans le cas où vous testeriez cette petite expérience telquelle depuis un ubuntu live (hardy 8.04.2) par exemple.
Tant qu'on yest, pourquoi ne pas y aller franchement en faisant directement depuis un terminal:
sudo sh -c 'printf "deb file:$HOME/archive hardy main restricted universe multiverse\ndeb file:$HOME/archive hardy-security main restricted universe multiverse\ndeb file:$HOME/archive hardy-updates main restricted universe multiverse" >/etc/apt/sources.list'
suivi d'un:
mkdir $HOME/archive
Ensuite, que serait ce sources.list sans ses releases est ses packages (actualisés, de préférence)?
L'étape suivante nécessite donc une première connection internet provisoire (l'application "wget" sous-entend que cet ordinateur online permette en virtualisation ou en vrai de faire tourner un environnement linux, et sur lequel sera également présent le fameux répertoire "archive", monté au niveau du /home/user/ depuis votre clé USB ou tout autre support amovible)
Sur cet ordinateur, on lance les commandes suivantes afin de récupèrer les listings de paquets sur le support choisit préalablement:
#!/bin/bash
wget -cNrnH --cut-dirs=1 -P ~/archive -a ~/archive/log_DMH http://archive.ubuntu.com/ubuntu/dists/{hardy,jaunty}/Release{,.gpg}
wget -cNrnH --cut-dirs=1 -P ~/archive -a ~/archive/log_DMH\
http://archive.ubuntu.com/ubuntu/dists/{hardy,jaunty}/{main,restricted,universe,multiverse}/binary-i386/Packages.bz2
wget -cNrnH --cut-dirs=1 -P ~/archive -a ~/archive/log_DMH\
http://archive.ubuntu.com/ubuntu/dists/{hardy,jaunty}/{main,restricted,universe,multiverse}/i18n/Translation-fr.bz2
A noter que j'utilise l'interpréteur de commandes
bash et non
sh afin de pouvoir utiliser les abréviations, car même si on y perd en portabilité, on y gagne en légèreté (même si c'est plutôt contraire aux dernières recommandations de Canonical, cf:
https://wiki.ubuntu.com/DashAsBinSh#{)
Vous remarquerez aussi que dans le lot, on télécharge également les listings de paquets de jaunty (la dernière version stable d'avril 2009 d'ubuntu), ainsi que les traductions disponibles des descriptions de paquets, tout ceci est facultatif mais vu que l'ensemble pèse à peine plus de 16 Mb, pourquoi s'en priver, d'autant plus que ça pourra toujours servir!
Revenu sur l'ordinateur non connecté, on remet tout ça en place pour que le répertoire "archive" nous présente son sous-répertoire "dists" qui contient les "Packages.bz2" et autres fichiers fraichement téléchargés
A ce moment là on est prêt pour faire un petit:
sudo apt-get update
cette étape est capitale, on peut toutefois aussi le faire à la souris (allez dans Synaptic et cliquez sur "Recharger" dans le coin supérieur gauche du programme)
Maintenant que le système est actualisé (à l'heure et à la date précise où vous avez lancez le script du téléchargement des listings), il ne nous reste quasi plus qu'à déterminer quels sont les paquets que l'on désire installer, afin, étape ultime, d'aller faire télécharger ceux-ci par un script fait sur mesure, qui placera les paquets (nécessaires) dans le répertoire "pool" (toujours dans "$HOME/archive") qui sera en totale conformité avec l'arborescence des sites officiels d'ubuntu.
Ici encore, le script mérite quelques retouches (jipicy, lami20j ou encore fiddy, si vous me lisez...), mais l'essentiel est déjà la, et entièrement fonctionnel:
apt-get -qq --print-uris install vlc | sed -e 's/'\''//; s/'\''.*//' -e 's#file:/[^/]*/[^/]*/archive#wget -cNrnH --cut-dirs=1 -P$HOME/archive -a$HOME/archive/log_POOL\\\n http://archive.ubuntu.com/ubuntu#; 1i\#!/bin/sh' >> /tmp/apt-wget_deb.sh && chmod +x /tmp/apt-wget_deb.sh
Dans cet exemple, c'est le paquet "vlc" qui est candidat pour la future installation, il suffit de faire de même pour d'autres paquets, soit individuellement, soit groupé comme ci-dessous (avec combinaison de son choix):
apt-get -qq --print-uris install vlc build-essential smbfs | sed -e 's/'\''//; s/'\''.*//' -e 's#file:/[^/]*/[^/]*/archive#wget -cNrnH --cut-dirs=1 -P$HOME/archive -a$HOME/archive/log_POOL\\\n http://archive.ubuntu.com/ubuntu#; 1i\#!/bin/sh' >> /tmp/apt-wget_deb.sh && chmod +x /tmp/apt-wget_deb.sh
Par précaution, ce script crée le script (sur mesure) de téléchargement de paquet dans le répertoire "/tmp", avec pour nom de fichier "apt-wget_deb.sh".
Libre à chacun de faire le choix qui lui conviendrait le mieux en modifiant la fin du script.
Si le fichier est vide, c'est que vous avez déjà installés les paquets et ses éventuelles dépendances.
Si vous vous trompez de nom de paquet, apt-get le signalera par le message suivant:
"E: Impossible de trouver le paquet
nom du paquet"
Arrive donc le moment du téléchargement des paquets en tant que tel, qui nécessite donc de retourner une seconde et dernière fois sur l'ordinateur connecté au net, d'y rebrancher sa clé USB (ou le support de son choix), d'exécuter le fichier "apt-wget_deb.sh" généré préalablement par votre système et de le laisser faire ses téléchargements jusqu'au dernier paquet.
Quant tout cela est sauvegardé, on revient finalement sur son ordinateur de départ, on rebranche le support amovible et on installe les programmes de la même manière que si l'on était connecté (en sensiblement plus rapide), par le biais de Synaptic ou en commande via "sudo apt-get install"
voila.
Grâce à l'option -N de wget, on ne téléchargera jamais inutilement 2 fois le même paquet, car s'il s'avérait qu'un de ceux-ci était déjà présent dans le répertoire "pool", wget prendrait le soin de comparer son empreinte temporelle avec celle du paquet d'internet qui est censé le remplacer pour déterminer la nécessité de le télécharger effectivement.
si vous avez l'une ou l'autre suggestion d'optimisation (par exemple j'aimerais déjà savoir comment faire pour que le script aille de lui même dénicher dans le système les variables hardy,jaunty, ...), d'épuration, de précision, d'universalité/portabilité, de clarification ou encore de rectification, je serais plus que ravi que vous nous en fassiez profiter.
Merci.
En outre, je tenais à signaler que toutes ces manipulations peuvent également être effectuées sur le même ordinateur, d'ailleurs quand bien même celui-ci serait pourvu d'une connection très haut-débit et absolument illimitée, c'est toujours intéressant de disposer localement et non virtuellement des paquets les plus usuels, surtout si l'on est adepte d'installations similaires ou régulières, d'autant plus qu'avec le world wide web on ne sait jamais trop ce qu'il peut arriver!