Обычно, предотвратить назначение буквы требуется, когда структура разделов создается вручную для применения настроенного образа Windows или восстановления резервной копии.
ℹ Эта статья про разметку GPT. Разметке MBR отведено место на полях, поскольку она постепенно выходит из употребления в клиентских ОС Microsoft.
[+] Сегодня в программе
- Получение сведений о разделе
- Присвоение разделу служебных свойств
- Получение доступа к служебному разделу
- Получение доступа путем изменения свойств
- Получение доступа без изменения свойств — дубль 1
- Получение доступа без изменения свойств — дубль 2
- Документация
- Бонус: ускоренный ввод команд diskpart
- Заключение
Получение сведений о разделе
Программа установки Windows автоматически создает структуру разделов со всеми надлежащими свойствами. Однако многие инструкции по diskpart ограничиваются лишь созданием разделов и форматированием. После чего, например, раздел восстановления может автоматически получать букву и мозолить глаза в файловом менеджере. С другой стороны, чтобы из-под Windows поковыряться в служебном разделе, нужно назначить ему букву.
В diskpart команда detail partition
выводит тип и атрибут раздела, а также сопутствующие свойства. На картинке раздел со средой восстановления.
Похожий набор сведений можно вывести в PowerShell.
Get-Disk -Number 0 | Get-Partition -Number 4 | fl Type, GptType, IsHidden, NoDefaultDriveLetter Type : Recovery GptType : {de94bba4-06d1-4d40-a16a-bfd50179d6ac} IsHidden : True NoDefaultDriveLetter :
Здесь свойство Type
переводит на английский язык значение GUID из свойства GptType
. Однако командлет Get-Partition не выводит свойство Required
. А к NoDefaultDriveLetter
я еще вернусь.
Присвоение разделу служебных свойств
Допустим, в разметке GPT я создал вручную раздел восстановления. Необходимо, чтобы он выглядел идентично разделу, который создает программа установки Windows.
Секрет в присвоении разделу правильного идентификатора и служебного атрибута! Это предотвращает выдачу буквы диска. Заодно включается защита от дурака, препятствующая удалению раздела из оснастки управления дисками — в контекстном меню есть только справка.
Здесь M
и N
обозначают номер диска и раздела соответственно. Наряду с атрибутом GPT задается идентификатор раздела.
diskpart select disk M list partition select partition N REM GPT set id=de94bba4-06d1-4d40-a16a-bfd50179d6ac gpt attributes=0x8000000000000001 REM MBR REM set id=27 override
В этих командах:
- Идентификатор
de94bba4-06d1-4d40-a16a-bfd50179d6ac
обозначает раздел восстановления Microsoft. Ему соответствует свойствоHidden
. - Атрибут
0X8000000000000001
– это сочетание атрибутов0x8000000000000000
(не присваивать букву диска) и0x0000000000000001
(обязательный раздел). Второй атрибут также отражается в сведениях о разделе — свойствоRequired
.
Результат выполнения команд:
detail partition Partition 4 Type : de94bba4-06d1-4d40-a16a-bfd50179d6ac Hidden : Yes Required: Yes Attrib : 0X8000000000000001 Offset in Bytes: 255535874048
В PowerShell командлетом Set-Partition такого же результата не добиться. Опять же, потому что не реализовано присвоение свойства Required
.
Get-Disk -Number 0 | Get-Partition | where PartitionNumber -eq 4 | Set-Partition -IsHidden $True -GptType "{de94bba4-06d1-4d40-a16a-bfd50179d6ac}"
Результат команды нагляднее покажет diskpart:
Partition 4 Type : de94bba4-06d1-4d40-a16a-bfd50179d6ac Hidden : Yes Required: No Attrib : 0X4000000000000000
Очевидно, параметр -IsHidden $True
устанавливает атрибут 0X4000000000000000
.
В разметке GPT с помощью diskpart можно также заблокировать присвоение буквы диска на уровне тома.
diskpart list volume select volume N REM отключить присвоение буквы диска attributes volume set nodefaultdriveletter REM включить присвоение буквы диска REM attributes volume clear nodefaultdriveletter
Поскольку раздел восстановления располагается на выделенном ему томе, эта операция эквивалентна присвоению атрибута 0x8000000000000000
разделу. И да, атрибут раздела принимает именно такое значение после выполнения операции над томом. В PowerShell у Set-Partition параметр -NoDefualtDriveLetter
работает на уровне раздела.
Получение доступа к служебному разделу
Есть два пути: с изменением служебных свойств и без оного.
Получение доступа путем изменения свойств
Можно избавиться от свойств служебного раздела, тем самым получая возможность присвоения буквы и простого доступа в файловом менеджере. Для этого нужно задать идентификатор базового раздела ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
и установить атрибут GPT со значением 0
.
Здесь M
, N
и L
обозначают номер диска, раздела и тома соответственно.
diskpart select disk M list partition select partition N REM GPT set id=ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 gpt attributes=0X0000000000000000 REM MBR REM set id=07 override list volume select volume L assign letter=R
Если не задавать букву явно, Windows автоматически присвоит ее после перезагрузки. Строго говоря, для доступа к диску можно обойтись без смены идентификатора. Но тогда точно придется задавать букву диска вручную и не рассчитывать на опции управления диском в diskmgmt.msc.
В PowerShell командлет Set-Partition не сможет снять атрибут 0X0000000000000001
(свойство Required
). Да и прочие операции придется делать в два приема — сначала сменить ID, а потом уже делать раздел не скрытым и способным получить букву диска.
Получение доступа без изменения свойств — дубль 1
Этот способ я позже изложил в канале Telegram.
Получение доступа без изменения свойств — дубль 2
И еще один способ я показал в канале Telegram.
Документация
- PARTITION_INFORMATION_GPT structure — все ID и атрибуты разделов в разметке GPT
- diskpart set id — справка по команде и некоторые ID для разделов в разметках MBR и GPT
- diskpart gpt – справка по команде и атрибуты в разметке GPT
- diskpart attributes volume – справка по команде
- Get-Partition и Set-Partition – справка по командлетам
Бонус: ускоренный ввод команд diskpart
В рамках работы над этой статьей появился пост в канале Telegram.
Заключение
Статья появилась после очередного вопроса в чате инсайдеров. Срыва покровов тут нет, но систематизировать информацию и вычленить ключевые аспекты было полезно. Так, я знал, где документация и какие параметры с атрибутами оттуда брать. Но связь между ними и некоторыми сведениями о разделе в diskpart я четко уяснил только в рамках подготовки статьи.
Наконец, было любопытно взглянуть на реализацию в PowerShell, поскольку модуль Storage помимо прочих функций вобрал в себя и возможности diskpart. В итоге для обсуждаемой задачи я бы предпочел именно diskpart. У него больше возможностей, понятнее документация и нагляднее вывод сведений о разделе.
Обсуждение завершено.