Во времена, когда 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
Решение:
Примерный план работы:
- Загрузиться в нормальном режиме, когда disk1 и disk2 работают в системе.
- Выяснить UUID разделов дисков.
- Модифицировать /etc/fstab
- Перезагрузиться с новыми параметрами в /etc/fstab
- Повторить пункты с 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.