Disques durs m'empêchent de démarrer

Tags: #<Tag:0x00007f63f1a51930> #<Tag:0x00007f63f1a51778>

Bonjour à tous,

Je me trouve confronté à un soucis depuis hier avec ma machine sous Debian 9. Tout d’abord je vais vous faire part de détails concernant ma configuration matérielle et après je vous expliquerai mon problème.

Donc je suis actuellement sous Debian 9, je possède dans ma machine 2 HDD et un SSD. En externe, je branche un troisième HDD (disque dur interne dans un boitier) pour effectuer des sauvegardes. Voici chacun de ces disques avec leurs noms :

/dev/sda --> HDD n°1 (Seagate Baracuda 2To)
/dev/sdb --> HDD n°2 (Seagate Exos 7E8 2To)
/dev/sdc --> SSD (Samsung SSD 850)
/dev/sdd --> HDD externe dans un boitier (Seagate Baracuda 2To)

la partition de démarrage est /dev/sdc2.

Ça c’est quand tout va bien. Maintenant, voici mon problème.
Mon HDD externe est alimenté sur le secteur. Il est donc déjà allumé lorsque je boot ma machine : par conséquent, la machine lui attribue le nom /dev/sda, ce qui décale tous les noms des autres disques durs d’une lettre… Ma partition de démarrage se retrouve être /dev/sdd2 au lieu de /dev/sdc2, et ma machine ne peut donc pas démarrer (je tombe sur un truc tu genre “busybox /dev/sdc2 does not exist”).

Une fois le HDD externe débranché, je relance la machine et tout va bien. Alors je pourrais très bien lui dire de booter sur /dev/sdd2, mais cela signifierait que je laisse brancher constamment mon HDD externe, sinon en le débranchant la partition de démarrage serait à nouveau /dev/sdc2.

Donc si je comprends bien :

  • soit je branche mon HDD externe à chaque démarrage de la machine et je renomme la partition de démarrage ;
  • soit je débranche mon HDD externe à chaque démarrage de la machine et je ne renomme rien, mais si je veux utiliser mon HDD il faudra que je le branche ultérieurement…

Dans les 2 cas cela est embêtant car contraire au principe même du disque dur externe, à savoir que l’on peut le brancher et le débrancher quand on veut pour l’emmener…

Finalement, ce que je cherche est un moyen d’attribuer, quoi qu’il arrive, le nom /dev/sdd à mon disque dur externe (et ce, qu’il soit déjà branché avant le boot ou que je le branche après) pour éviter tout problème de “décalage” de nom, à moins qu’une autre solution s’offre à moi.

J’espère avoir été clair pour expliquer mon problème ; il m’a moi-même fallu du temps pour comprendre d’où il venait…

J’espère que vous pourrez m’éclairer dans tous mes noms de disques durs !
Merci par avance.

Par quel type d’interface le boîtier externe est-il connecté ? Si c’est en USB, c’est un peu étonnant car le noyau applique un délai d’une seconde par défaut (réglable) entre la détection et la prise en compte d’un périphérique de stockage USB, ce qui le fait nommer généralement après les disques connectés en ATA ou SCSI.

Néanmoins la structure actuelle du démarrage ne garantit pas la stabilité du nommage des périphériques de stockage ATA/SCSI/USB /dev/sd?. Les noms sont attribués dans l’ordre de détection des périphériques et il n’y a aucun moyen de forcer le nommage d’un périphérique, contrairement aux interfaces réseau. Au plus on peut mettre en place une règle udev qui crée un alias (lien symbolique) pointant vers le nom. Il faut donc s’attendre à un tel renommage et en tenir compte, notamment en n’utilisant pas les noms de périphériques /dev/sd* mais des identifiants persistants comme l’UUID ou le LABEL. C’est ce qu’un système Debian est censé faire par défaut.

La question est donc : comment se fait-il que ton système utilise le nom de périphérique de la racine et non l’UUID ?
Que contient /etc/fstab ?
Quel est le chargeur d’amorçage ? Quelle est sa configuration ?

Bonjour,

En effet cela est étonnant, mon HDD externe devrait porter le nom /dev/sdd puisqu’il est connecté en USB.
J’ai donc décidé de prendre des screens dans le cas 1 où la machine ne démarre pas (HDD externe connecté) et dans le cas 2 ou la machine démarre correctement (pas de HDD externe) : ce que j’ai trouvé est assez étonnant…

Voici les screens :

On peut voir que :

  • L’UUID de sda1 est identique dans les 2 cas (Seagate Baracuda interne)
  • L’UUID de sdb1 existe sur le 2ème screen mais pas sur le 1er (Seagate Baracuda externe)
  • L’UUID de sdc1 sur le 2ème screen est celui de sdb1 sur le 1er (Samsung SSD 850 remplacé par Seagate Exos 7E8)
  • L’UUID de sdd1 sur le 2ème screen est celui de sdc1 sur le 1er (Samsung SSD 850 décalé d’une lettre)
  • Idem pour sdd2 et sdd3

Je me suis donc trompé : le HDD externe ne prend pas /dev/sda mais /dev/sdb.

J’ajoute un second message pour ajouter mes 2 autres liens, puisque je suis limité à 2 liens par post.

Le fichier /etc/fstab : https://pastebin.com/HhdjT0dX
Le chargeur d’amorçage est GRUB 2, voici sa configuration :
https://prnt.sc/mz9wjb

Je ne vois pas vraiment quoi faire…

Tu pourrais commencer par inclure le texte brut directement dans le forum au lieu de liens vers des sites de téléchargement et des captures d’écran.
Concernant la configuration de GRUB, ce n’est pas une photo que j’attendais mais le contenu des fichiers /boot/grub/grub.cfg et /etc/default/grub (en texte brut dans le forum entre balises de texte préformaté). Ni la sortie de blkid qui n’apporte aucune information utile.

/boot/grub/grub.cfg est mal généré : le paramètre root passé au noyau devrait contenir l’UUID et non le nom de périphérique de la racine.

C’est une nouvelle installation ? Cela arrive parfois lors de l’installation. Dans ce cas le regénérer avec update-grub devrait régler le problème.

Il est fastidieux de recopier à la main tout un fichier de configuration ; car c’est ce que je suis amené à faire puisque, dans 2 de mes captures d’écran, Debian n’avait pas encore boot…
Néanmoins je tâcherai de mettre directement le texte dans mes messages.

Je pensais que la commande blkid pouvait s’avérer utile pour comparer les UUID des disques durs.

Voici le fichier /boot/grub/grub.cfg :

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}
function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod ext2
set root='hd2,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  1195f68e-c08b-4f75-b44a-c1cf96fbcef6
else
  search --no-floppy --fs-uuid --set=root 1195f68e-c08b-4f75-b44a-c1cf96fbcef6
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=fr_FR
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
    set timeout=5
  # Fallback normal timeout code in case the timeout_style feature is
  # unavailable.
  else
    set timeout=5
  fi
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
	set gfxpayload="${1}"
}
set linux_gfx_mode=
export linux_gfx_mode
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-1195f68e-c08b-4f75-b44a-c1cf96fbcef6' {
	load_video
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_gpt
	insmod ext2
	set root='hd2,gpt2'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  1195f68e-c08b-4f75-b44a-c1cf96fbcef6
	else
	  search --no-floppy --fs-uuid --set=root 1195f68e-c08b-4f75-b44a-c1cf96fbcef6
	fi
	echo	'Chargement de Linux 4.9.0-4-amd64…'
	linux	/boot/vmlinuz-4.9.0-4-amd64 root=/dev/sdc2 ro  quiet
	echo	'Chargement du disque mémoire initial…'
	initrd	/boot/initrd.img-4.9.0-4-amd64
}
submenu 'Options avancées pour Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-1195f68e-c08b-4f75-b44a-c1cf96fbcef6' {
	menuentry 'Debian GNU/Linux, avec Linux 4.9.0-4-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-4-amd64-advanced-1195f68e-c08b-4f75-b44a-c1cf96fbcef6' {
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd2,gpt2'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  1195f68e-c08b-4f75-b44a-c1cf96fbcef6
		else
		  search --no-floppy --fs-uuid --set=root 1195f68e-c08b-4f75-b44a-c1cf96fbcef6
		fi
		echo	'Chargement de Linux 4.9.0-4-amd64…'
		linux	/boot/vmlinuz-4.9.0-4-amd64 root=/dev/sdc2 ro  quiet
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.9.0-4-amd64
	}
	menuentry 'Debian GNU/Linux, with Linux 4.9.0-4-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-4-amd64-recovery-1195f68e-c08b-4f75-b44a-c1cf96fbcef6' {
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd2,gpt2'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt2 --hint-efi=hd2,gpt2 --hint-baremetal=ahci2,gpt2  1195f68e-c08b-4f75-b44a-c1cf96fbcef6
		else
		  search --no-floppy --fs-uuid --set=root 1195f68e-c08b-4f75-b44a-c1cf96fbcef6
		fi
		echo	'Chargement de Linux 4.9.0-4-amd64…'
		linux	/boot/vmlinuz-4.9.0-4-amd64 root=/dev/sdc2 ro single 
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.9.0-4-amd64
	}
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###

### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/30_uefi-firmware ###
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {
	fwsetup
}
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

Le fichier /etc/default/grub :

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

Je vais essayer la commande update-grub

Pas du tout ! Personne ne te demande de recopier à la main. Tu peux copier le fichier une fois que le système a démarré.

Cette option est commentée donc normalement update-grub inscrit l’UUID dans le paramètre root= de la ligne de commande du noyau.

Tu n’as pas répondu : c’est une nouvelle installation ?

Il s’agit effectivement d’une nouvelle installation, vieille de 3 mois

Cependant je viens de régler le problème avec la commande update-grub qui a changé /dev/sdc2 par l’UUID de mon SSD : je n’ai donc plus de problème au démarrage.

J’ai inscrit mes autres HDD (sauf l’externe) dans le fichier fstab en prenant le soin de les inscrire selon leur UUID et après vérification, mes disques durs se montent bien !

Merci beaucoup pour ton aide !
J’ai une dernière question (parce que je suis du genre perfectionniste) : n’y a-t-il pas moyen de monter une partition d’un HDD externe automatiquement dans un répertoire que l’on définit, dès qu’on le branche ?

Pourtant la dernière mise à jour du noyau date de moins de 3 mois (à l’occasion de la mise à jour Debian 9.8), et elle aurait dû regénérer grub.cfg.

Probablement mais je ne sais pas faire, et je pense que ça devrait faire l’objet d’une nouvelle discussion.

D’accord merci pour ton aide et tes réponses rapides.

C’est exactement le rôle de automount , fonctionnalité réalisée en intallant et configurant le paquet autofs.

debmany autofs

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة


F. Petitjean
Ingénieur civil du Génie Maritime.

« On ne perd pas son temps en aiguisant ses outils. »
Proverbe français

« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » (R. Devos)

Je croyais qu’automount faisait le montage à la demande (à l’utilisation), pas au branchement.

Exactement.

Mais vu qu’on ne peut pas utiliser le périphérique sans le brancher d’une part, et que le montage automatique peut s’effectuer en un laps de temps très court par rapport à la (ou les) seconde(s) que dure le branchement d’autre part, cette distinction subtile est plutôt théorique que pratique.

De plus, le démontage automatique au bout de quelques minutes de non utilisation contribue à optimiser l’ensemble du système en évitant des accès inutiles.

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة


F. Petitjean
Ingénieur civil du Génie Maritime.

« L’arbre tombe toujours du côté où il penche. »
Proverbe français

« Un ordinateur c’est comme un frigo : on le branche et ça marche. »
Laurent Serano Directeur informatique, réunion Délégués du Personnel 2010

Mais on peut accéder au point de montage défini même lorsque le périphérique n’est pas branché, ce qui devrait déclencher une tentative de montage automatique et un échec, non ?

Oui, bien évidemment. Et ce montage automatique n’est pas le bon outil pour gérer les problématiques liées au branchement/débranchement d’un périphérique.

Bon, les programmes ou scripts qui ne testent pas les codes de retour, cela n’est pas nouveau. Néanmoins, la création du point de montage et la configuration d’automount sont faites consciemment. C’est le moment pour faire des tests du fonctionnement de ce montage automatique : c’est magique !
Et pour les événements liés au branchement il faudrait combiner avec des règles udev si on veut faire les choses au mieux.

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة


F. Petitjean

« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » (R. Devos)

« Celui qui, parti de rien, n’est arrivé nulle part n’a de merci à dire à personne !! »
Pierre Dac

J’ai laché mes share sshfs en _netdev au profit de l’autofs: je m’en félicite tous les jours.