вторник, 7 июля 2009 г.

SMI и EFI

Один из наиболее часто задаваемых вопросов на курсе SA-200-S10 - в чем разница между метками SMI и EFI жестких дисков и что вообще означают эти аббревиатуры?

JFGI сообщает нам, что :

SMI означает Sun Microsystems Incorporated, а
EFI означает Extensible Firmware Interface.

Что ж, логично. Первый тип меток - это, собственно, оригинальная сановская таблица разделов о восьми слайсах, с s0 по s7 при неиспользуемом в обычных условиях s2, означающем весь диск:

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 25 129.19MB (26/0/0) 264576
1 swap wu 26 - 51 129.19MB (26/0/0) 264576
2 backup wu 0 - 14086 68.35GB (14087/0/0) 143349312
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 usr wm 52 - 14086 68.10GB (14035/0/0) 142820160
7 unassigned wm 0 0 (0/0/0) 0

Именно такой тип метки использует по умолчанию (не в экспертном режиме) утилита format, именно этот тип требуется для того, чтобы с диска можно было загружаться, именно этот тип используют при разметке диска/слайса в UFS.

Давайте проведем небольшой эксперимент, и сменим метку на несистемном диске одного сервера, случайно оказавшегося под рукой, и посмотрим, для чего можно использовать метки EFI.

server5# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0 /pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0 /pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): 0
selecting c0t0d0
[disk formatted]

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
inquiry - show vendor, product and revision
scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache
volname - set 8-character volume name
! - execute , then return
quit
format> label
[0] SMI Label
[1] EFI Label
Specify Label type[0]: 1
Warning: This disk has an SMI label. Changing to EFI label will erase all
current partitions.
Continue? y
format> partition

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
8 - change '8' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
! - execute , then return
quit
partition> print
Current partition table (default):
Total disk sectors available: 143358320 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector
0 usr wm 34 68.36GB 143358320
1 unassigned wm 0 0 0
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
7 unassigned wm 0 0 0
8 reserved wm 143358321 8.00MB 143374704

Что мы видим?

Во-первых, разница в структуре метки.

Нулевой слайс имеет тэг usr, а не root - что автоматически означает невозможность загрузки с этого диска. Это понятно.

Восьмой слайс, который нельзя модифицировать - это, очевидно, резерв на замену секторов.

Нулевой слайс, таим образом, занимает фактически весь диск (что хорошо для объединения таких дисков в пулы ZFS), и отсутствует overlapping - пока мы не определяем других слайсов - что тоже существенно упрощает задачу разбиения.

В некоторых публикациях утверждается, что EFI не используется или не может использоваться с UFS. Проверим?

server5# newfs /dev/rdsk/c0t0d0s0
newfs: construct a new file system /dev/rdsk/c0t0d0s0: (y/n)? y
Warning: 5810 sector(s) in last cylinder unallocated
/dev/rdsk/c0t0d0s0: 143358286 sectors in 23334 cylinders of 48 tracks, 128 sectors
69999.2MB in 1459 cyl groups (16 c/g, 48.00MB/g, 5824 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
Initializing cylinder groups:
............................
super-block backups for last 10 cylinder groups at:
142447776, 142546208, 142644640, 142743072, 142841504, 142939936, 143038368,
143136800, 143235232, 143333664

Так, в UFS сформатировали. Враки. Для блезира попробуем протестировать и смонтировать диск с EFI+UFS:

server5# fsck -y /dev/rdsk/c0t0d0s0
** /dev/rdsk/c0t0d0s0
** Last Mounted on
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3a - Check Connectivity
** Phase 3b - Verify Shadows/ACLs
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cylinder Groups
2 files, 9 used, 70593599 free (15 frags, 8824198 blocks, 0.0% fragmentation)
server5# mount /dev/dsk/c0t0d0s0 /mnt
server5# df -h /mnt
Filesystem size used avail capacity Mounted on
/dev/dsk/c0t0d0s0 67G 64M 67G 1% /mnt

Нет проблем. UFS на дисках с EFI использовать можно.

Окей, что дальше?

Разумеется, ZFS-пул на таком диске создать можно. Собственно, утверждается, что именно такая метка создается на диске при добавлении диска в нерутовый пул. Проверим и это:

Сначала разрушим метку:

server5# umount /mnt
server5# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): 0
selecting c0t0d0
[disk formatted]

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
inquiry - show vendor, product and revision
scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache
volname - set 8-character volume name
! - execute , then return
quit
format> label
[0] SMI Label
[1] EFI Label
Specify Label type[1]: 0
Warning: This disk has an EFI label. Changing to SMI label will erase all
current partitions.
Continue? y
Auto configuration via format.dat[no]? yes
format> partition

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
! - execute , then return
quit
partition> print
Current partition table (default):
Total disk cylinders available: 14087 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 - 25 129.19MB (26/0/0) 264576
1 swap wu 26 - 51 129.19MB (26/0/0) 264576
2 backup wu 0 - 14086 68.35GB (14087/0/0) 143349312
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 usr wm 52 - 14086 68.10GB (14035/0/0) 142820160
7 unassigned wm 0 0 (0/0/0) 0

Разрушили EFI и снова создали SMI. Построим пул ZFS на этом диске:

server5# zpool create -f data c0t0d0
server5# zpool status
pool: data
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
data ONLINE 0 0 0
c0t0d0 ONLINE 0 0 0

errors: No known data errors
server5# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): 0
selecting c0t0d0
[disk formatted]
/dev/dsk/c0t0d0s0 is part of active ZFS pool data. Please see zpool(1M).

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
inquiry - show vendor, product and revision
scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache
volname - set 8-character volume name
! - execute , then return
quit
format> partition

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
8 - change '8' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
! - execute , then return
quit
partition> print
Current partition table (original):
Total disk sectors available: 143358320 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector
0 usr wm 256 68.36GB 143358320
1 unassigned wm 0 0 0
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
7 unassigned wm 0 0 0
8 reserved wm 143358321 8.00MB 143374704

Действительно, при создании ZFS-пула в нотации дисков cxtydz на диск автоматически записывается метка EFI.

Дабы не занимать место, замечу, что если использовать при создании пула нотацию логических устройств со слайсами, то метка останется SMI (что и требуется при создании ZFS root pool).

Иначе говоря, что следует из вышепроделанного? Метка EFI предполагает использование диска целиком.

Как справедливо заметил один знакомый системный инженер Sun: "Мы не разбиваем диски, как на PC. Sun не настольная система. Мы их объединяем."

Давайте воспользуемся подвернувшимся сервером и проделаем еще один небольшой эксперимент и посмотрим, нельзя ли, случайно, на диске с меткой EFI создать более чем один слайс (восьмой мы не считаем):

server5# zpool destroy data
server5# format -e
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c0t0d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@0,0
1. c0t1d0
/pci@1e,600000/pci@0/pci@a/pci@0/pci@8/scsi@1/sd@1,0
Specify disk (enter its number): 0
selecting c0t0d0
[disk formatted]

FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
inquiry - show vendor, product and revision
scsi - independent SCSI mode selects
cache - enable, disable or query SCSI disk cache
volname - set 8-character volume name
! - execute , then return
quit
format> partition

PARTITION MENU:
0 - change `0' partition
1 - change `1' partition
2 - change `2' partition
3 - change `3' partition
4 - change `4' partition
5 - change `5' partition
6 - change `6' partition
7 - change `7' partition
8 - change '8' partition
select - select a predefined table
modify - modify a predefined partition table
name - name the current table
print - display the current table
label - write partition map and label to the disk
! - execute , then return
quit
partition> print
Current partition table (original):
Total disk sectors available: 143358320 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector
0 usr wm 256 68.36GB 143358320
1 unassigned wm 0 0 0
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
7 unassigned wm 0 0 0
8 reserved wm 143358321 8.00MB 143374704

partition> 0
Part Tag Flag First Sector Size Last Sector
0 usr wm 256 68.36GB 143358320

Enter partition id tag[usr]:
Enter partition permission flags[wm]:
Enter new starting Sector[256]:
Enter partition size[143358065b, 143358320e, 69999mb, 68gb, 0tb]: 30gb
partition> print
Current partition table (unnamed):
Total disk sectors available: 143358320 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector
0 usr wm 256 30.00GB 62914815
1 unassigned wm 0 0 0
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
7 unassigned wm 0 0 0
8 reserved wm 143358321 8.00MB 143374704

partition> 1
Part Tag Flag First Sector Size Last Sector
1 unassigned wm 0 0 0

Enter partition id tag[usr]: backup
Enter partition permission flags[wm]:
Enter new starting Sector[62914816]:
Enter partition size[0b, 62914815e, 0mb, 0gb, 0tb]: 30gb
partition> print
Current partition table (unnamed):
Total disk sectors available: 143358320 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector
0 usr wm 256 30.00GB 62914815
1 backup wm 62914816 30.00GB 125829375
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
7 unassigned wm 0 0 0
8 reserved wm 143358321 8.00MB 143374704

partition> label
[0] SMI Label
[1] EFI Label
Specify Label type[1]: 1
Ready to label disk, continue? y

partition> print
Current partition table (unnamed):
Total disk sectors available: 143358320 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector
0 usr wm 256 30.00GB 62914815
1 backup wm 62914816 30.00GB 125829375
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
7 unassigned wm 0 0 0
8 reserved wm 143358321 8.00MB 143374704

Хм, получилось.

Замечание. Обратите внимание, что при разбиении диска с EFI очень трудно наступить на грабли overlapping. Разделы создаются встык один к другому и без мертвого пространства. Йа-хуууууууу!

Замечание 2. На самом деле overlapping можно вызвать и на EFI. Только при создании слайсов один за другим начиная с нулевого, и при изменении его размера с максимального до меньшего - встык - это будет очень и очень трудно.

Попробуем разметить их в UFS и смонтировать, гулять так гулять:

server5# newfs /dev/rdsk/c0t0d0s0
newfs: construct a new file system /dev/rdsk/c0t0d0s0: (y/n)? y
/dev/rdsk/c0t0d0s0: 62914560 sectors in 10240 cylinders of 48 tracks, 128 sectors
30720.0MB in 640 cyl groups (16 c/g, 48.00MB/g, 5824 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
Initializing cylinder groups:
............
super-block backups for last 10 cylinder groups at:
61938464, 62036896, 62135328, 62233760, 62332192, 62430624, 62529056,
62627488, 62725920, 62824352
server5# newfs /dev/rdsk/c0t0d0s1
newfs: construct a new file system /dev/rdsk/c0t0d0s1: (y/n)? y
/dev/rdsk/c0t0d0s1: 62914560 sectors in 10240 cylinders of 48 tracks, 128 sectors
30720.0MB in 640 cyl groups (16 c/g, 48.00MB/g, 5824 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
Initializing cylinder groups:
............
super-block backups for last 10 cylinder groups at:
61938464, 62036896, 62135328, 62233760, 62332192, 62430624, 62529056,
62627488, 62725920, 62824352
server5# mkdir /tmp/s0
server5# mkdir /tmp/s1
server5# mount /dev/dsk/c0t0d0s0 /tmp/s0
server5# mount /dev/dsk/c0t0d0s1 /tmp/s1
server5# df -h /tmp/s0
Filesystem size used avail capacity Mounted on
/dev/dsk/c0t0d0s0 30G 30M 29G 1% /tmp/s0
server5# df -h /tmp/s1
Filesystem size used avail capacity Mounted on
/dev/dsk/c0t0d0s1 30G 30M 29G 1% /tmp/s1

Так. Диск с EFI можно партиционировать. Хорошая новость.

Финальное замечание. EFI принципиально предназначается для дисков или LUN терабайтных размеров. То, что мы можем использовать UFS и создавать более одного слайса - не везде описано и далеко не все знают.

Не стесняйтесь проверять самостоятельно спорные утверждения.