Во времена, когда PATA IDE был единственным доступным стандартом для бытовых компьютеров (SCSI я не беру в расчёт), не возникало проблем с именованием дисковых устройств и разделов. Когда стандарт SATA IDE пошёл в массы, возникли проблемы с порядком именования устройств. Суть вот в чём: при включении компьютера, ядро опрашивает всё оборудование компьютера и создаёт им файлы в /dev .

С шиной PATA проблем нет - имена устройствам даются в строгом соответствии с разъёмом контроллёра и перемычками на диске (primary-secondary\master-slave), но вот с SATA можно наткнуться на изменение порядка именования, если в компьютере работает больше одного SATA-диска. Независимо от того, в какой разъём включен жёсткий диск на материнской плате (sata1, sata2 и тд), порядок именования будет проходить по мере опроса, а он не зависит от номера разъёма. Так если, диск включённый в sata1 может обзываться как sda1 и как sda2, если дисков 2 и больше. Для решения этой проблемы именования, можно использовать UUID (Universally Unique Identifier) - это стандарт идентификации для физических или псевдо- устройств, используемый в создании программного обеспечения. Задача, которую решает стандарт - это присвоить и использовать уникальный идентификатор для устройства\диска\раздела. Таким образом, отказавшись от стандартных имён SATA устройств в linux, и используя UUID, можно решить проблему с монтированием устройств и разделов.

Задача

Дано: компьютер с установленной ОС Linux, 3 SATA жёстких диска, один из которых съёмный. disk1 и disk2 - не съёмные, disk3 - съёмный. Описание системы: система устанавливалась когда к компьютеру были подключены 2 диска: disk1 и disk2. Корневая система находится на disk1 и каталоги с disk2 монтируются к ней. disk3 иногда отключается пользователем от компьютера для переноса информации. Каталоги этого диска также монтируются к корневой системе.
Проблема: когда в системе работают только disk1 и disk2, имена распределяются так: disk1 = /dev/sda и disk2 = /dev/sdb . После подключения третьего диска, имена меняются: disk1 = /dev/sda , disk2 = /dev/sdс , disk3 = /dev/sdb . Соответственно, при загрузке, система не находит каталоги в disk2 и переходит в однопользовательский режим. Приходится каждый раз редактировать записи для disk2 и disk3 в /etc/fstab , что совсем не удобно.
Задача: обеспечить монтирование disk1 и disk2 независимо от disk3.
Уровень пользователя: средний, знающий команды монтирования и умеющий работать в одном из текстовых редакторов: vi, nano, mcedit, emacs

Решение:
Примерный план работы:

  1. Загрузиться в нормальном режиме, когда disk1 и disk2 работают в системе.
  2. Выяснить UUID разделов дисков.
  3. Модифицировать /etc/fstab
  4. Перезагрузиться с новыми параметрами в /etc/fstab
  5. Повторить пункты с 2-4 только для диска disk3.

Процесс:

Необходимо загрузиться в нормальном режиме, когда disk1 и disk2 работают в системе. Выясняем какие разделы присутствуют в системе:

 
 # fdisk -l
 Disk /dev/sda: 250.1 GB, 250059350016 bytes
 255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x000b5f01

   Device Boot      Start         End      Blocks   Id  System
 /dev/sda1   *          63      979964      489951   83  Linux
 /dev/sda2          489952      738928      248976   82  Linux swap / Solaris
 /dev/sda3          738929   488392064   487653135    5  Extended
 /dev/sda6          738930   488392064   487653134   83  Linux

 Disk /dev/sdb: 640.1 GB, 640135028736 bytes
 81 heads, 63 sectors/track, 245005 cylinders, total 1250263728 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0xc65c2ceb

   Device Boot      Start         End      Blocks   Id  System
 /dev/sdb1            2048  1250263727   625130840   83  Linux

disk1 разбит на 3 раздела:

  • sda1 - /boot
  • sda2 - swap
  • sda6 - /

disk2 и disk3 (не показан) имеют по одному разделу.
Смотрим куда что монтируется /etc/fstab

 
 $ cat /etc/fstab
  # 
  # /etc/fstab: static file system information
  #
  # <file system>        <dir>         <type>    <options>          <dump> <pass>
  devpts                 /dev/pts      devpts    defaults            0      0
  shm                    /dev/shm      tmpfs     nodev,nosuid        0      0

  /dev/cdrom             /cdrom   auto    ro,user=user,noauto,unhide   0      0

  /dev/sda1 /boot ext3 defaults 0 1
  /dev/sda2 swap swap defaults 0 0
  /dev/sda6 /boot ext3 defaults 0 1

  # 650Gb disk
  /dev/sdb1 /disk2 ext3 defaults 0 1

  # Removable
  # /dev/sdc1 /disk3 ext3 defaults 0 1

Обратите внимание, что строка с sdс1 помечена ремаркой и не обрабатывается. С ним будем работать после всех настроек.

Теперь делаем листинг директории, где система создаёт UUID имена и сохраняем его:

 
 $ ls -l /dev/disk/by-uuid/
  total 0
  lrwxrwxrwx 1 root root 10 Apr 11 11:42 484b1cbb-5a3d-4a54-841b-424da3254db6 -> ../../sda1
  lrwxrwxrwx 1 root root 10 Apr 11 11:42 d14021bb-912e-4801-b6a8-874c41b8225c -> ../../sda2
  lrwxrwxrwx 1 root root 10 Apr 11 11:42 dedd9b49-5410-4c72-a018-f8293311c28e -> ../../sda6
  lrwxrwxrwx 1 root root 10 Apr 11 11:42 182ecbac-dd36-4113-b019-58f181c755a5 -> ../../sdb1

Для сохранения вывода команды в файл, можно попробовать:

 $ ls -l /dev/disk/by-uuid/ | /home/username/имя_файла.txt

Если работа производится в графической среде, можно просто скопипастить непосредственно в редактор.

Делаем резервную копию файла /etc/fstab на случай, если UUID будет неправильно введён и система не сможет загрузиться.

 # cd /etc
 # cp fstab fsab.bak

Кстати, не помешает и какой-нибудь liveCD с Linux`ом "на борту" на всякий аварийных случай.

Редактируем сам файл /etc/fstab и вместо sda1, sda2,… sdb1 подставляем UUID раздела. Должно получиться что-то типа:

 
 $ cat /etc/fstab
  # 
  # /etc/fstab: static file system information
  #
  # <file system>        <dir>         <type>    <options>          <dump> <pass>
  devpts                 /dev/pts      devpts    defaults            0      0
  shm                    /dev/shm      tmpfs     nodev,nosuid        0      0

  /dev/cdrom             /cdrom   auto    ro,user=user,noauto,unhide   0      0

  UUID=484b1cbb-5a3d-4a54-841b-424da3254db6 /boot ext3 defaults 0 1
  UUID=d14021bb-912e-4801-b6a8-874c41b8225c swap swap defaults 0 0
  UUID=dedd9b49-5410-4c72-a018-f8293311c28e /boot ext3 defaults 0 1

  # 650Gb disk
  UUID=182ecbac-dd36-4113-b019-58f181c755a5 /disk2 ext3 defaults 0 1

  # Removable
  # /dev/sdc1 /disk3 ext3 defaults 0 1

Если в Вашей системе не оказалось каталога /dev/disk/by-uuid/ , можно воспользоваться утилитой blkid для выяснения UUID:

 # blkid /dev/sda1
 /dev/sda1: UUID="484b1cbb-5a3d-4a54-841b-424da3254db6" TYPE="ext3" 

Нужно будет получить номер для каждого монтируемого раздела.

Внимание!
В файле /etc/fstab , в самом конце всегда нужно оставлять пустую строку, иначе система не сможет корректно распознать записи и загрузиться!

Когда fstab отредактирован, для проверки, пробуем отмонтировать disk2 и снова примонтировать:

 # umount /disk2
 # mount  /disk2

Примечание: предполагается, что ресурсы на disk2 не заблокированы каким-либо процессом, иначе система не сможет отмонтировать disk2.

Если всё прошло удачно, перезагружаем машину.

Если загрузка прошла удачно, можно выключить компьютер, подключить disk3, выяснить его UUID и модифицировать строку fstab, касающуюся монтирования disk3.

Смотрите также

Печать/экспорт