Server 2012 R2 – как удалить файл, который “открыт в системе”?

Вопрос или проблема

Я использую Server 2012 R2 Datacenter Core. Это один из наших хостов Hyper-V. Я управляю им с рабочего места с помощью Hyper-V manager и манипулирую файлами через административную шару.

Я создал виртуальную машину, затем скопировал VHDX в папку Hard Disks. Затем я попытался запустить виртуальную машину с этим VHDX, но (так как это старый образ и запрашивался пароль администратора, которого у меня нет), я решил создать всё с нуля. Я выключил виртуальную машину, удалил диск и попытался удалить VHDX, чтобы создать новый с тем же именем. Я получаю “Действие не может быть завершено, так как файл открыт в System”. Это продолжается уже несколько часов. Изначально я подозревал антивирусное решение, но оно не может так долго сканировать файл объемом 17 ГБ (я думаю).

Теперь, это происходило на системах Win7 раньше, и существует множество методов для принудительного удаления файла. В этом случае, однако, я не могу просто перейти к хосту и загрузить его в автономном режиме или установить SuperKillerFileDeleterUltraGuaranteedBox.

Так как же мне от него избавиться?

P.S. Я также понимаю, что могу просто назвать новый VHDX по-другому – это не обязательно должно совпадать с именем виртуальной машины. Но это просто оскорбительно, и в любом случае, я не могу оставить неиспользуемый 17GB файл на сервере навсегда.

Да, я сталкивался с этим. Очень вероятно, что Hyper-V держит файл. Вам, вероятно, придется остановить службу управления виртуальными машинами Hyper-V, чтобы удалить VHD. Либо это, либо перезагрузить хост Hyper-V. В качестве альтернативы, вы можете проверить, есть ли процесс Virtual Machine Worker Process, соответствующий удаленной виртуальной машине. Если есть, то вы можете убить его, что должно позволить вам удалить VHD.

Вы можете запустить это в Powershell, чтобы увидеть, есть ли идентификатор процесса “GUID”, который соответствует процессу Virtual Machine Worker Process (найдено при правом клике на Virtual Machine Worker Process в диспетчере задач, выбрав “Перейти к деталям” и посмотрев на имя пользователя “GUID”). Если вы найдете соответствующий процесс для удаленной виртуальной машины, то завершите этот процесс и удалите VHD.

Get-WmiObject -Namespace root\virtualization -class msvm_computersystem | select elementname, operationalstatus, processid, name| ft -auto

Нашел это в другом месте (не моя работа, комментарий от techienateafs на spiceworks) и это сработало для меня. Я периодически сталкиваюсь с этим после монтирования и затем размонтирования виртуального диска (через powershell Mount-WindowsImage и Dismount-WindowsImage) из-за неудачи размонтирования.

“Я смог решить проблему, открыв diskmgmt.msc на сервере-хосте. Диск был там указан, клик правой кнопкой и выберите отсоединить. Он запрашивает подтверждение, что у вас правильный файл. В этот момент проводник процессов подтверждает, что файл больше не открыт идентификатором процесса 4 (nt kernel & system) и я могу свободно работать с файлом .vhdx.”

Что ж, это очень неловко для моего первого поста на serverfault… Оказывается, это была моя Система, которая держала файл. Я перезагрузил свой локальный компьютер и вуаля, смог удалить файл. Не могу поверить, что не попробовал это сначала.

Для меня решение было немного другим.
Эта строка решила проблему для меня:
Dismount-DiskImage -ImagePath $vmHardDrive.Path

$vmName="your_VM_Name"
# Отсоединить и удалить диски виртуальной машины
$vmHardDrives = Get-VMHardDiskDrive -VMName $vmName -ErrorAction SilentlyContinue
foreach ($vmHardDrive in $vmHardDrives) {
    Dismount-DiskImage -ImagePath $vmHardDrive.Path
    Remove-VMHardDiskDrive -VMName $vmName -ControllerType $vmHardDrive.ControllerType -ControllerNumber $vmHardDrive.ControllerNumber -ControllerLocation $vmHardDrive.ControllerLocation -ErrorAction SilentlyContinue
    Remove-Item -Path $vmHardDrive.Path -Force -ErrorAction SilentlyContinue
}

Ответ или решение

Для удаления файла, который "открыт в системе" на сервере с Windows Server 2012 R2 Datacenter Core, часто бывает недостаточно обычных методов, таких как попытка удаления через проводник или командную строку. В этом контексте важно понимать, что подобные проблемы могут возникать из-за заблокированного доступа к файлу со стороны различных системных служб, таких как Hyper-V. Рассмотрим возможные решения этой проблемы.

Теория

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

Почему это происходит?
  1. Службы Hyper-V: Hyper-V Virtual Machine Management Service может удерживать блокировку на файле, если виртуальная машина не была корректно завершена.
  2. Процессы системы: Процессы Windows или сторонние службы, такие как антивирусные решения, могут временно блокировать файлы на период выполнения операции, такой как сканирование.
  3. Проблемы с дисками: Иногда диск может быть подключён и использован в фоновом режиме, даже если визуально это не видно.

Примеры

Рассмотрим несколько практических решений, которые были предложены различными пользователями:

  1. Перезапуск Hyper-V Managment Service: Это простейший метод, применив который, можно снять блокировку с файла.

    Stop-Service -Name vmms
    Start-Service -Name vmms
  2. Использование PowerShell для завершения процесса:
    Вы можете использовать PowerShell для идентификации и завершения процесса, который удерживает файл:

    Get-WmiObject -Namespace root\virtualization -class msvm_computersystem | select elementname, operationalstatus, processid, name| ft -auto

    Выявив соответствующий процесс, его можно принудительно завершить с помощью Stop-Process -Id <ProcessId>.

  3. Диск в диспетчере устройств:
    Иногда решение может быть тривиальным, как, например, открытие diskmgmt.msc и отключение связанного диска.

  4. Перезагрузка локальной машины:
    На практике может оказаться, что блокировку файла держит ваша собственная система. В таком случае перезагрузка клиентской машины может помочь.

  5. Использование PowerShell для отсоединения и удаления диска:

    $vmName="your_VM_Name"
    $vmHardDrives = Get-VMHardDiskDrive -VMName $vmName -ErrorAction SilentlyContinue
    foreach ($vmHardDrive in $vmHardDrives) {
       Dismount-DiskImage -ImagePath $vmHardDrive.Path
       Remove-VMHardDiskDrive -VMName $vmName -ControllerType $vmHardDrive.ControllerType -ControllerNumber $vmHardDrive.ControllerNumber -ControllerLocation $vmHardDrive.ControllerLocation -ErrorAction SilentlyContinue
       Remove-Item -Path $vmHardDrive.Path -Force -ErrorAction SilentlyContinue
    }

Применение

Теперь, разобрав теорию и примеры, выполним последовательность действий для устранения проблемы:

  1. Проверка активности ресурсов:

    • Убедитесь, что виртуальная машина отключена и все связанные с ней процессы завершены.
  2. Диагностические средства:

    • Используйте Task Manager или Resource Monitor, чтобы проверить, какие процессы держат файл.
  3. PowerShell как инструмент диагностики:

    • Проверьте службы Hyper-V, которые могут удерживать блокировку. Если вы подозреваете, что файл заблокирован одной из таких служб, используйте PowerShell для завершения процесса или переподключения образа.
  4. Перезапуск служб:

    • Перезапустите Hyper-V Service для освобождения системных ресурсов.
  5. Последовательное удаление через PowerShell:

    • Используйте приведенные выше команды для отсоединения диска и проверки его отсутствия в системах учёта службы.
  6. Мониторинг и устранение блокировок:

    • Не забывайте о том, что блокировка может происходить из-за антивирусного сканирования. Убедитесь, что такие процессы завершены.

Эти шаги позволят вам эффективно справляться с ситуацией, когда файл "открыт в системе", и адаптировать подход в зависимости от особенностей вашей инфраструктуры.

Оцените материал
Добавить комментарий

Капча загружается...