Aujourdâhui on va sâintĂ©resser Ă lâarborescence '/dev' de votre Linux. Jâai fait ces recherches pour le projet prepare-raspbian-sd avec lâobjectif de dĂ©tecter la carte SD et de connaĂźtre le pĂ©riphĂ©rique rattachĂ©.
Le mot anglais « device » signifiant dispositif, appareil. En informatique il est utilisĂ© pour parler dâun dispositif ajoutĂ© Ă lâordinateur, un appareil pĂ©riphĂ©rique. En français on simplifie cela par le mot pĂ©riphĂ©rique. En anglais informatique ce mot « device » est souvent abrĂ©gĂ© par « dev ».
Le dossier /dev
contient les caractéristiques des périphériques présents sur la machine. Ici, nous nous intéresserons principalement aux périphériques de stockage, mais par exemple votre souris ou votre webcam est également décrite dans cette arborescence.
Quelques astuces simples :
Par libellé
Le dossier /dev/disk/by-label/
contiens, comme il lâindique son nom, la liste des labelles (Ă©tiquette, nom du disque) de vos disques. On peut le constater simplement Ă lâaide de :
ls -l --color /dev/disk/by-label/
Par exemple, sur un Raspberry
standard (le seul disque dur est une carte SD avec deux partitions)Â :
lrwxrwxrwx 1 root root 15 Aug 5 00:08 boot -> ../../mmcblk0p1
lrwxrwxrwx 1 root root 15 Aug 5 00:08 rootfs -> ../../mmcblk0p2
On retrouve bien les 2 partitions Raspberry Pi OS
nommĂ©es boot et ** rootfs**, lâutilisation du paramĂštre -l permet de voir que ces fichiers sont des liens.
libellé | lien | Chemin réel du fichier cible |
---|---|---|
boot | ./../mmcblk0p1 | /dev/mmcblk0p1 |
rootfs | ./../mmcblk0p2 | /dev/mmcblk0p2 |
Les fichiers se trouvant directement sous /dev
ne sont pas lisibles directement (et ne doivent par ĂȘtre utilisĂ© en dehors de manipulations spĂ©cifiques) mais ils correspondent au contenu brut des donnĂ©es de la partition.
Par identificateur
Le dossier /dev/disk/by-id/
contiens, la liste des identificateurs (id) de vos disques. De mĂȘme :
ls -l --color /dev/disk/by-id/
Par exemple, ici le cas encore le cas de Raspberry Pi OS
de base :
lrwxrwxrwx 1 root root 13 Aug 5 00:08 mmc-ACLCD_0x84153af7 -> ../../mmcblk0
lrwxrwxrwx 1 root root 15 Aug 5 00:08 mmc-ACLCD_0x84153af7-part1 -> ../../mmcblk0p1
lrwxrwxrwx 1 root root 15 Aug 5 00:08 mmc-ACLCD_0x84153af7-part2 -> ../../mmcblk0p2
Ici, vous noterez il semble quâil y ait 3 partitions :
identificateur | lien | Chemin réel du fichier cible |
---|---|---|
mmc-ACLCD_0x84153af7 | ./../mmcblk0 | /dev/mmcblk0 |
mmc-ACLCD_0x84153af7-part1 | ./../mmcblk0p1 | /dev/mmcblk0p1 |
mmc-ACLCD_0x84153af7-part2 | ./../mmcblk0p2 | /dev/mmcblk0p2 |
En réalité /dev/mmcblk0
est le fichier correspondant Ă lâensemble du disque. Les fichiers /dev/mmcblk0p1
et /dev/mmcblk0p2
Ă©tant les deux partitions de ce disque.
Sur une autre machine, on a quelque chose comme cela :
lrwxrwxrwx 1 root root 9 Aug 5 00:04 ata-Samsung_Portable_SSD_T5_S4B1NV0M71Y -> ../../sda
lrwxrwxrwx 1 root root 10 Aug 5 00:04 ata-Samsung_Portable_SSD_T5_S4B1NV0M71Y-part1 -> ../../sda1
lrwxrwxrwx 1 root root 13 Aug 5 00:04 mmc-SC128_0x79314ba7 -> ../../mmcblk0
lrwxrwxrwx 1 root root 15 Aug 5 00:04 mmc-SC128_0x79314ba7-part1 -> ../../mmcblk0p1
lrwxrwxrwx 1 root root 15 Aug 5 00:04 mmc-SC128_0x79314ba7-part2 -> ../../mmcblk0p2
lrwxrwxrwx 1 root root 9 Aug 5 00:04 wwn-0x5000002538e00000 -> ../../sda
lrwxrwxrwx 1 root root 10 Aug 5 00:04 wwn-0x5000002538e00000-part1 -> ../../sda1
Ici on comprend quâil y a deux pĂ©riphĂ©riques de stockage (disque dur, carte SDâŠ). On note que le pĂ©riphĂ©rique /dev/sda
et son unique partition ont deux identificateurs.
Allons un peu plus loin Ă la recherche de nos cartes SD
On ne peut pas sâappuyer sur le nom (par exemple mmcblk0) pour identifier une carte SD. Cela de comment elle est connectĂ©e au systĂšme (avec un adaptateur USB externe par exemple). Il va donc falloir aller un peu plus loin pour rechercher nos cartes SD.
Le répertoire /sys/block
contient un lien symbolique pour chaque périphérique de bloc (comme les unités de stockage) qui a été découvert sur le systÚme. Les liens symboliques pointent vers les répertoires correspondants sous /sys/devices
.
Le répertoire /sys/devices
contiens une reprĂ©sentation du systĂšme de fichier. Il dĂ©finit la structure des pĂ©riphĂ©riques connue par le noyau du systĂšme. Il sâagit de la hiĂ©rarchie des pĂ©riphĂ©riques tel quâelle a Ă©tĂ© prise en compte par le systĂšme.
LâidĂ©e est de parcourir les blocs systĂšmes liĂ©s Ă un pĂ©riphĂ©rique pour cela on va lister le dossier /sys/block
et pour chacune de ces entrées, on va suivre le lien (donc se retrouver dessus : /sys/devices
) et lĂ on va se limiter aux dossiers contenant un sous-dossier device.
Cette méthode qui peut sembler obscure, permet de filtrer les périphériques supportant la gestion en blocs.
Le code est le suivant :
for DEV in /sys/block/* ; do
if [ -d "${DEV}/device" ] ; then
echo "${DEV} -> $( realpath "${DEV}" ) - ${DEV}/device/ -> $( realpath "${DEV}/device" )"
ls -la --color "${DEV}/device/"
fi
done
Le mĂȘme code, plus difficile Ă lire (mais cela fait la mĂȘme chose promis) et qui affiche ce quâil se passe avec des codes couleurs.
function show_bloc_with_device {
YELLOW=$'\033[0;33m'
LIGHT_YELLOW=$'\033[1;33m'
CYAN=$'\033[0;36m'
LIGHT_CYAN=$'\033[1;36m'
NOCOLOR=$'\033[0m'
for DEV in /sys/block/* ; do
if [ -d "${DEV}/device" ] ; then
cat <<EOF
${YELLOW}${DEV}${NOCOLOR} -> ${LIGHT_YELLOW}$( realpath "${DEV}" )${NOCOLOR}
${CYAN}${DEV}/device/${NOCOLOR} -> ${LIGHT_CYAN}$( realpath "${DEV}/device" )${NOCOLOR}
-----
${YELLOW}ls -la --color "${DEV}"${NOCOLOR}
$( ls -la --color "${DEV}" )
-----
${LIGHT_YELLOW}ls -la --color "${DEV}/"${NOCOLOR}
$( ls -la --color "${DEV}/" )
-----
${CYAN}ls -la --color "${DEV}/device"${NOCOLOR}
$( ls -la --color "${DEV}/device" )
-----
${LIGHT_CYAN}ls -la --color "${DEV}/device/"${NOCOLOR}
$( ls -la --color "${DEV}/device/" )
EOF
fi
done
}
show_bloc_with_device
On comprend que la zone est remplie de lien symbolique et que câest en les suivants que lâon va pouvoir filtrer ce qui nous intĂ©resse.
Et en fait, on y est presque puisque le dossier ${DEV}/device/
, sâil existe, contiens un fichier nommĂ© type
qui va nous Ă©clairer sur la nature du support.
function show_type_for_bloc_with_device {
YELLOW=$'\033[0;33m'
LIGHT_YELLOW=$'\033[1;33m'
CYAN=$'\033[0;36m'
LIGHT_CYAN=$'\033[1;36m'
NOCOLOR=$'\033[0m'
for DEV in /sys/block/* ; do
if [ -d "${DEV}/device" ] ; then
cat <<EOF
${YELLOW}${DEV}${NOCOLOR} -> ${LIGHT_YELLOW}$( realpath "${DEV}" )${NOCOLOR}
${CYAN}${DEV}/device/${NOCOLOR} -> ${LIGHT_CYAN}$( realpath "${DEV}/device" )${NOCOLOR}
-----
${LIGHT_CYAN}cat "${DEV}/device/type"${NOCOLOR}
$( cat "${DEV}/device/type" )
EOF
fi
done
}
show_type_for_bloc_with_device
On constate alors que lorsquâil sâagit dâune carte SD, le contenu du fichier type
contiens la valeur SD
. Et comme le nom de base en partant de /sys/block/
est le nom du pĂ©riphĂ©rique, on peut utiliser ce nom (sans le chemin) et le prĂ©fixĂ© par `/dev/â pour avoir le chemin technique.
Finalement le code donnant la solution est trÚs compact :
function get_SD_device {
local dev_path=
for dev_path in /sys/block/* ; do
if [ -f "${dev_path}/device/type" ] ; then
if [ "$( cat "${dev_path}/device/type" )" = 'SD' ] ; then
basename "${dev_path}"
fi
fi
done
}
SDDEV="$( get_SD_device )" &&
echo "SDDEV='${SDDEV}'" &&
if [ -z "${SDDEV}" ] ; then echo "#NOSD" ; else ls -l --color "/dev/${SDDEV}"* ; fi
Attention ! Ce code risque de ne pas fonctionner comme attendu si votre systĂšme est exĂ©cutĂ© depuis une carte SD. En effet la carte SD du systĂšme sera prise en compte dans le rĂ©sultat et câest probablement pas ce que vous attendez.
En particulier, ce code ne fonctionne pas depuis un Raspberry classiquement configurĂ©. Plus prĂ©cisĂ©ment, câest la SD embarquĂ©e que vous obtiendrez Ă savoir :
/dev/mmcblk0
/dev/mmcblk0p1
/dev/mmcblk0p2
Alternative avec la commande find
Ce dernier code peut s'écrire à l'aide la commande find comme suit :
function get_SD_device {
find '/sys/block' -maxdepth 1 -type l -exec test -f '{}/device/type' \; -print | while read -r dev_path ; do
if [ "$( cat "${dev_path}/device/type" )" = 'SD' ] ; then
basename "${dev_path}"
fi
done
}
SDDEV="$( get_SD_device )" &&
echo "SDDEV='${SDDEV}'" &&
if [ -z "${SDDEV}" ] ; then echo "#NOSD" ; else ls -l --color "/dev/${SDDEV}"* ; fi
Références
- Manuel de sysfs en anglais.
኿