Дополнение C. Просматриваем состояние дисков Windows Server Core

Windows Server Core (то есть не обладающие полноценным графическим интерфейсом Windows Desktop) приобретают всё большую популярность, например, по причине бесплатности сервера Hyper-V. Однако графические средства удалённого управления такими серверами не всегда демонстрируют стабильность своей работы. Поэтому навыки административных действий с применением PowerShell не лишены смысла. Давайте рассмотрим их на примере задачи определения состояния жизнеспособности физических дисков такого сервера через средства S.M.A.R.T., что потребует от нас и определённых технических приёмов обращения с интерфейсом PowerShell и командной строки в сервере Windows Core.

Запуск PowerShell в Windows Core через RDP

Мы предполагаем, что у вас включён удалённый доступ к терминалу сервера Windows Core. Если нет, то включить его и доступ к нему через межсетевой экран можно следующим образом:


PS > (Get-WmiObject Win32_TerminalServiceSetting -Namespace root\cimv2\TerminalServices).SetAllowTsConnections(1,1)

PS > (Get-WmiObject -Class "Win32_TSGeneralSetting" -Namespace root\cimv2\TerminalServices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(0)

PS > Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
		

Итак, у вас есть доступ к терминалу сервера Windows Core. Как правило, в нём у вас есть два окна командной строки: одно с с запущенным sconfig.exe и второе - окно командной строки (cmd.exe). Здесь вы запросто можете запустить PowerShell из окна cmd.exe через start pwsh. Это команда для запуска PowerShell 7, мы будем работать с ним, если у вас его нет - не волнуйтесь сейчас мы и его установим. Для пояснений почему именно PowerShell 7, отсылаем вас, например, к нашему переводу Книги рецептов автоматизации Windows Server при помощи PowerShell, 4е издание, Томаса Ли (готовится к выходу в свет 5е издание, сейчас доступна в предварительном доступе). Теперь давайте научимся запускать ещё что-нибудь полезное. Если вы в этом окне нажмёте комбинацию клавиш Ctrl-Alt-Del, то у вас появится меню возможных действий, например: Change Password/ Lock/ Sign Out/ Task Manager/ Cancel (см. Рисунок C-1).

 

Рисунок C-1



Перемещая курсор кнопкой стрелки вниз до Диспетчера задач (Task manager) с последующим нажатием на клавишу ввода вы запускаете Диспетчер задач (и да, приложения с наследуемым графическим интерфейсом могут запускаться здесь, в терминальном окне Windows Core). Включив дополнительные подробности (More details) вы получите традиционное окно Диспетчера задач, а из него, скажем, вы можете выполнять запуск приложений. Например, notepad.exe, через Copy&Past которого можно осуществлять файловый обмен или запуск той же самой командной строки (если вы вдруг её закрыли и теперь не знаете что делать).

 

Рисунок C-2



Эти трюки советуем запомнить. Но что делать, если вы работаете с этим терминалом удалённо, скажем через RDP? Теперь Ctrl-Alt-Del у вас отрабатывается в локальном терминале, но у вас в запасе есть комбинация Ctrl-Alt-End, которая при нажатии в окне удалённого терминала отправляет в удалённый терминал сочетание клавиш Ctrl-Alt-Del. Хорошо, но если с удалённым терминалом Windows Core (RDP1) вы в свою очередь работаете из окна RDP удалённого рабочего места (RDP2). То есть когда у вас закрыт удалённый доступ из RDP к терминалу Windows Core и вы осуществляете его через машину- посредника в его локальной сети? Решение есть! В такой локальной машине- посреднике вы вызываете Экранную клавиатуру (On-Screen Keyboard), запуская, через Win-R, например, Run -> osk.exe. Теперь вы можете нажать в Экранной клавиатуре Ctrl-Alt-End или клавишу End после нажатия Ctrl-Alt в Экранной клавиатуре, что вызовет передачу из RDP2 комбинации Ctrl-Alt-Del в RDP1. Эту уловку тоже советуем запомнить.

Установка Chocolatey и PowerShell 7

Процедура установки PowerShell 7, например, описана в нашем переводе Книги рецептов автоматизации Windows Server при помощи PowerShell. Но для наших целей полезно будет установить ещё одно средство управления пакетами - Chocolatey. Из командной строки выполните:


> @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "[System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
		

Для строки PowerShell Windows (или PowerShell Core, если он уже установлен у вас), Проверьте установленную политику при помощи Get-ExecutionPolicy и, если она Restricted, измените её при помощи Set-ExecutionPolicy AllSigned или Set-ExecutionPolicy Bypass -Scope Process, а затем выполните:


> Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
		

Обращаем ваше внимание на тот факт, что приложения такого рода пользуются переменной среды PATH. Хотя сама установка и изменяет её значений в системе (то есть непосредственно в реестре, что можно увидеть исполнив


Write-Host "$((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\' -Name 'PATH').Path); $((Get-ItemProperty -Path 'HKCU:\Environment'  -Name 'PATH').Path)"
		

, в уже запущенном процессе (которым выступает cmd или PowerShell, из которого вы запустили установку Chocolatey) её значение остаётся прежним (в чём можно убедиться запустив PATH из cmd или $env:PATH из PowerShell). К счастью, на этот случай Chocolatey обладает инструментом refreshenv, вызвав который (например, %ProgramData%chocolatey\bin\RefreshEnv.cmd - зависит от места его установки) вы можете обновить переменные текущей среды. Не забывайте про такой ход в дальнейшем!

Теперь, если у вас ещё не установлен PowerShell Core, установите его:


> choco install pwsh
		

Запомним, что запускающим PowerShell Core исполняемым файлом является pwsh.exe, в отличии от powershell.exe для Windows PowerShell.

После установки Chocolatey рекомендуем обновить PowerShell, а именно, для Windows PowerShell:


> choco install powershell -y
> choco upgrade powershell -y
		

Для PowerShell Core:


> choco install pwsh -y
> choco upgrade pwsh -y
		
[Замечание]Замечание

Обратите внимание на то, что различные версии PowerShell обладают различными каталогами:

$env:WINDIR\System32\WindowsPowerShell\v1.0 для Windows PowerShell 5.1

$env:ProgramFiles\PowerShell\6 для PowerShell Core 6.x

$env:ProgramFiles\PowerShell\7 для PowerShell 7.x

Установка PowerShell 7 удаляет установку PowerShell 6.x.

smartmontools

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


PS > Get-Disk | Format-Table -AutoSize
		

Теперь вернёмся к нашей основной задаче данного Дополнения: выяснению состояния дисков. Для этого мы воспользуемся пакетом smartmontools. Он содержит две служебные программы (smartctl и smartd) для контроля и мониторинга систем хранения с использованием технологической системы самоконтроля, анализа и отчётности (S.M.A.R.T.), встроенной в большинство современных дисков ATA/SATA, SCSI/SAS и NVMe. Во многих случаях эти утилиты предупредят об ухудшении состояния и сбое диска. Smartmontools изначально был производным от пакета smartsuite для Linux и фактически поддерживает диски ATA/SATA, SCSI /SAS и NVMe, а также ленточные устройства SCSI/SAS. Он должен работать в любой современной системе Linux, FreeBSD, NetBSD, OpenBSD, Darwin (macOS), Solaris, Windows, Cygwin, OS/2, eComStation или QNX. Smartmontools также можно запускать с одного из множества различных Live CD/DVD. Установка Smartmontools для различных ОС описана на его веб странице, а в Windows сводится к такому вызову из cmd или pwsh:


> choco install smartmontools
		

Для отображения сведений S.M.A.R.T. мы применим ещё один пакет, точнее, коллекцию инструментов PowerShell Markus Fleschutz. Для этого мы сначала скачаем этот пакет, что само по себе не очень привычно для только начинающего работать со стандартным терминалом Server Core, поскольку приходится воспользоваться PowerShell, а именно:


PS > $client = new-object System.Net.WebClient
PS > $client.DownloadFile("https://github.com/fleschutz/PowerShell/archive/refs/tags/v0.5.zip","C:\Foo\v0.5.zip")
		

Здесь первый аргумент - источник, второй - получатель. Имейте в виду, что PowerShell не будет проверять, используется ли уже имя файла. Он будет перезаписывать файл без предупреждения. Теперь надо распаковать этот архив:


PS > Expand-Archive C:\Foo\v0.5.zip -DestinationPath C:\Foo
		

Обращаем ваше внимание на то, что если вы следовали нашим рекомендациям, у вас установлены последние версии PowerShell, но, на всякий случай, напомним как можно проверить установленные версии PowerShell:


PS > $PSVersionTable
		

В частности, $PSVersionTable.PSVersion выводит номер версии PowerShell данной оболочки. Expand-Archive доступен начиная с версий 5+

Для целей отображения S.M.A.R.T. мы воспользуемся сценарием query-smart-data.ps1. Надо только подправить в нём одну ошибку (которая имеет место на момент написания данных строк). Для этого стартуйте приведённым выше способом через запуск из Диспетчера задач notepad.exe и замените $DevInfo++ на $DevNo++, в отмеченном на Рисунке С-3 месте, а затем сохраните его. В противном случае вы получите сведения только о последнем диске из своей системы.

 

Рисунок C-3



Теперь мы можем получить сведения S.M.A.R.T. от своих дисков в файлы SMART-dev1-2022-10-11.json .. SMART-devX-2022-10-11.json, где devX - устройство X ($DevNo), а 2022-10-11 дата получения сведений, через тот же notepad.exe, но есть и более удобное средство для работы с большим числом файлов в алфавитно- графическом интерфейсе.

FileCommander как замена explorer.exe

К сожалению, explorer.exe нельзя запустить в Server Core аналогично тому как мы это сделали c notepad.exe. Здесь нам на помощь может прийти верный продолжатель традиций Norton Commander, FileCommander, который прекрасно работает из окна cmd. Мы скачиваем его описанным ранее способом:


PS > $client = new-object System.Net.WebClient
PS > $client.DownloadFile("https://silk.apana.org.au/pub/fcw/fcw240.zip","C:\Foo\fcw240.zip")
		

Распаковываем уже знакомым нам командлетом:


PS > Expand-Archive "C:\Foo\fcw240.zip" -DestinationPath "C:\bin\fcw"
		

И теперь можем применять его для работы с имеющейся файловой системой, в том числе для редактирования файлов. Если же мы установим ещё и рекомендуемые его автором средства работы с архивами, все такие архивы также станут подвластны FileCommander.

Обращаем ваше внимание также на не первый год пребывающую в стадии отладки версию 2.5, которая обладает функциональными возможностями удалённого управления поверх SSH и существенно упрощает удалённый файловый обмен.

 

Рисунок C-4



Позволим себе несколько советов по настройке FileCommander. Прежде всего рекомендуем отключить в опциях свойства окна QuickEditMode, что позволит пользоваться курсором мышки для навигации по дереву каталогов, а также увеличить размер буфера до 999:

 

Рисунок C-5



Далее в закладке Шрифтов (Fonts) советуем выбрать Lucida Console подходящего вам размера (14 или 16 вполне приемлемо). По F9 переходим в меню Options > Configuration, где прописываем (if any) альтернативные программы просмотра и редактирования файлов и меняем число строк и столбцов (например для современных размеров экранов подходит 40 x 100). Также полезно настроить меню пользователя и отредактировать ассоциации в соответствующих пунктах меню:

 

Рисунок C-6



Все настройки сохраняются по Shift-F9. Обращаем ваше внимание, что у каждого пользователя они свои, а поэтому для работы с правами администратора советуем также выполнить отдельные настройки. Причём, например, с иным размером шрифта. F1 служит хорошим напоминанием об имеющихся богатых функциональных возможностях, например, запоминания под сочетанием Ctrl с числами 0-9 часто применяемых каталогов, Ctrl-J для Copy под Past имени текущего файла, а Ctrl-F всего пути этого файла и т.п. В комплекте поставки имеется и некое руководство (fcw.chm), в которое тоже советуем заглядывать. Кстати, FileCommander доступен для большинства современных ОС.