[Resolu] L’installation d’Ubuntu (ubiquity) crashe avec une langue autre que l’anglais

Ou « [SOLVED] Ubiquity crashes with non english setup »

Le problème

Lors de l’installation d’Ubuntu (16.04 dans mon cas mais le bug existe avec d’autres versions), ubiquity plante et le message « Nous sommes désolés, l’installateur a planté » apparait. Si vous allez regarder dans le fichier /var/log/syslog vous verrez les lignes suivantes:


Jan 5 11:10:46 ubuntu ubiquity: Setting capabilities for gnome-keyring-daemon using Linux Capabilities failed.
Jan 5 11:10:47 ubuntu /plugininstall.py: log-output -t ubiquity chroot /target mount -t proc proc /proc
Jan 5 11:10:47 ubuntu /plugininstall.py: log-output -t ubiquity chroot /target mount -t sysfs sysfs /sys
Jan 5 11:10:47 ubuntu /plugininstall.py: log-output -t ubiquity mount –bind /dev /target/dev
Jan 5 11:10:47 ubuntu /plugininstall.py: log-output -t ubiquity mount –bind /run /target/run
Jan 5 11:10:47 ubuntu /plugininstall.py: Verifying downloads …
Jan 5 11:10:47 ubuntu /plugininstall.py: Downloads verified successfully
Jan 5 11:10:47 ubuntu /plugininstall.py: Traceback (most recent call last):
Jan 5 11:10:47 ubuntu /plugininstall.py: File « /usr/lib/ubiquity/ubiquity/install_misc.py », line 362, in run
Jan 5 11:10:47 ubuntu /plugininstall.py: self.update_interface()
Jan 5 11:10:47 ubuntu /plugininstall.py: File « /usr/lib/python3/dist-packages/apt/progress/base.py », line 255, in update_interface
Jan 5 11:10:47 ubuntu /plugininstall.py: if float(percent) != self.percent or status_str != self.status:
Jan 5 11:10:47 ubuntu /plugininstall.py: ValueError: could not convert string to float: ‘0,0000’

Jan 5 11:10:47 ubuntu /plugininstall.py:
Jan 5 11:10:49 ubuntu /plugininstall.py: Traceback (most recent call last):
Jan 5 11:10:49 ubuntu /plugininstall.py: File « /usr/lib/ubiquity/ubiquity/install_misc.py », line 954, in do_install
Jan 5 11:10:49 ubuntu /plugininstall.py: cache, fetchprogress, installprogress):
Jan 5 11:10:49 ubuntu /plugininstall.py: File « /usr/lib/ubiquity/ubiquity/install_misc.py », line 889, in commit_with_verify
Jan 5 11:10:49 ubuntu /plugininstall.py: res = cache.install_archives(pm, install_progress)
Jan 5 11:10:49 ubuntu /plugininstall.py: File « /usr/lib/python3/dist-packages/apt/cache.py », line 479, in install_archives
Jan 5 11:10:49 ubuntu /plugininstall.py: res = install_progress.run(pm)
Jan 5 11:10:49 ubuntu /plugininstall.py: File « /usr/lib/ubiquity/ubiquity/install_misc.py », line 409, in run
Jan 5 11:10:49 ubuntu /plugininstall.py: os.write(control_write, b’\1′)
Jan 5 11:10:49 ubuntu /plugininstall.py: BrokenPipeError: [Errno 32] Relais brisé (pipe)
Jan 5 11:10:49 ubuntu /plugininstall.py:
Jan 5 11:10:49 ubuntu ubiquity: PROGRESS STOP
Jan 5 11:10:49 ubuntu /plugininstall.py: log-output -t ubiquity chroot /target umount /sys
Jan 5 11:10:49 ubuntu /plugininstall.py: log-output -t ubiquity chroot /target umount /proc
Jan 5 11:10:49 ubuntu /plugininstall.py: log-output -t ubiquity umount /target/run
Jan 5 11:10:49 ubuntu /plugininstall.py: log-output -t ubiquity umount /target/dev
Jan 5 11:10:50 ubuntu /plugininstall.py: log-output -t ubiquity umount /target/cdrom
Jan 5 11:10:50 ubuntu ubiquity: debconf: DbDriver « config »: /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
Jan 5 11:10:50 ubuntu ubiquity: PROGRESS STOP
Jan 5 11:10:50 ubuntu /plugininstall.py: Exception during installation:
Jan 5 11:10:50 ubuntu /plugininstall.py: During handling of the above exception, another exception occurred:
Jan 5 11:10:50 ubuntu /plugininstall.py: Traceback (most recent call last):
Jan 5 11:10:50 ubuntu /plugininstall.py: File « /usr/share/ubiquity/plugininstall.py », line 1778, in <module>
Jan 5 11:10:50 ubuntu /plugininstall.py: install.run()
Jan 5 11:10:50 ubuntu /plugininstall.py: File « /usr/share/ubiquity/plugininstall.py », line 78, in wrapper
Jan 5 11:10:50 ubuntu /plugininstall.py: func(self)
Jan 5 11:10:50 ubuntu /plugininstall.py: File « /usr/share/ubiquity/plugininstall.py », line 212, in run
Jan 5 11:10:50 ubuntu /plugininstall.py: self.install_language_packs()
Jan 5 11:10:50 ubuntu /plugininstall.py: File « /usr/share/ubiquity/plugininstall.py », line 690, in install_language_packs
Jan 5 11:10:50 ubuntu /plugininstall.py: self.do_install(self.langpacks, langpacks=True)
Jan 5 11:10:50 ubuntu /plugininstall.py: File « /usr/lib/ubiquity/ubiquity/install_misc.py », line 964, in do_install
Jan 5 11:10:50 ubuntu /plugininstall.py: installprogress.finish_update()
Jan 5 11:10:50 ubuntu /plugininstall.py: File « /usr/lib/ubiquity/ubiquity/install_misc.py », line 439, in finish_update
Jan 5 11:10:50 ubuntu /plugininstall.py: self.db.progress(‘STOP’)
Jan 5 11:10:50 ubuntu /plugininstall.py: File « /usr/lib/python3/dist-packages/debconf.py », line 62, in <lambda>
Jan 5 11:10:50 ubuntu /plugininstall.py: lambda *args, **kw: self.command(command, *args, **kw))
Jan 5 11:10:50 ubuntu /plugininstall.py: File « /usr/lib/python3/dist-packages/debconf.py », line 83, in command
Jan 5 11:10:50 ubuntu /plugininstall.py: status = int(status)
Jan 5 11:10:50 ubuntu /plugininstall.py: ValueError: invalid literal for int() with base 10:  »

Suivies ou non de plein d’autres lignes d’erreur.

Ce qui nous intéresse ici, ce sont les premières lignes d’erreurs (puisque les autres en découlent), a savoir celles en gras ci dessus.
On voit que le programme essaie de convertir en float la valeur 0,0000, ce qui est une valeur numérique pour nous, européens, mais pas pour des programmes informatiques où ce même nombre s’écrit « 0.0000 » (Notez le point à la place de la virgule). Du coup, le programme plante et plein d’autres erreurs arrivent.

La solution

La solution pour corriger ce problème, va être de rajouter une ligne dans le programme « /usr/lib/python3/dist-packages/apt/progress/base.py ».

Ouvrez ce fichier avec les droits root dans votre éditeur préféré. Aux alentours de la ligne 255, vous devriez voir ceci:

elif status == "pmstatus":
    # FIXME: Float comparison
    if float(percent) != self.percent or status_str != self.status:
        self.status_change(pkgname, float(percent), status_str.strip())
        self.percent = float(percent)
        self.status = status_str.strip()

Modifiez ce bloc pour qu’il soit ainsi:

elif status == "pmstatus":
    # FIXME: Float comparison
    percent = str(percent).replace(',', '.') #<---------- Ajouter cette ligne
    if float(percent) != self.percent or status_str != self.status:
        self.status_change(pkgname, float(percent), status_str.strip())
        self.percent = float(percent)
        self.status = status_str.strip()

Dans le détail, on définit que percent est lui même mais en remplaçant la virgule par un point. Ainsi, la conversion en float du nombre ne plante plus.

Cela ne règle pas toutes les erreurs de l’installateur, mais les autres sont négligeables. Ces fonctions ne servent qu’à l’affichage de la barre de progression de l’installation et ne sont pas bloquantes, au contraire de celle que nous venons de corriger.

Maintenant, l’installation devrait se passer sans problème et aller jusqu’au bout.

PS: Vous noterez quand même que les développeurs sont conscinet du problème puisqu’il ont marqué « # FIXME: Float comparison » …

Articles en relation: