1. 개요

현대의 업무 환경은 점점 더 클라우드와 가상화 기술을 중심으로 발전하고 있습니다. 특히, VDI(Virtual Desktop Infrastructure) 환경에서는 사용자의 개인 데이터를 안전하게 관리하고, 필요 시 빠르게 복구하거나 동기화할 수 있는 방법이 필수적입니다.
특히 크롬(Chrome)과 같은 브라우저의 북마크는 사용자 경험에 중요한 요소이지만, VDI 환경에서는 로컬 저장소에 의존하기 때문에 데이터 손실이나 분실 위험이 존재합니다.

이번 포스트에서는 PowerShell 을 활용하여 크롬 북마크 파일을 실시간으로 모니터링하고, NFS(Network File System) 등 외부 스토리지로 자동 동기화하는 방법을 소개합니다. 이를 통해 VDI 환경에서도 안정적으로 북마크를 관리할 수 있습니다.


2. 필요한 이유

VDI 환경에서 크롬 북마크 관리가 중요한 이유는 다음과 같습니다:

  1. 데이터 보호 및 복구 가능성 :
    • VDI 환경에서는 사용자의 개인 설정 및 데이터가 로컬 디스크에 저장되지 않도록 설계되는 경우가 많습니다. 따라서 북마크와 같은 중요 데이터가 분실될 위험이 큽니다.
    • NFS나 SMB와 같은 네트워크 스토리지를 활용하면 데이터를 중앙 집중적으로 관리하고, 언제든지 복구할 수 있습니다.
  2. 사용자 편의성 향상 :
    • 사용자는 여러 디바이스에서 동일한 북마크를 활용할 수 있어 업무 효율성이 크게 향상됩니다.
  3. 관리 효율성 증가 :
    • IT 관리자는 사용자의 북마크를 중앙에서 백업하고, 필요 시 특정 사용자의 데이터를 신속히 복원할 수 있습니다.
  4. 시스템 리소스 최적화 :
    • PowerShell 스크립트는 Windows 이벤트 기반으로 동작하므로 CPU 및 메모리 부하가 매우 낮습니다. 이는 VDI 환경에서 특히 중요합니다.

3. 코드

아래는 크롬 북마크 파일을 실시간으로 모니터링하고, 변경 시 지정된 경로로 자동 복사하는 PowerShell 스크립트입니다.

# PowerShell 콘솔의 출력 인코딩을 UTF-8로 설정
$OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 모니터링할 파일 경로 설정 (환경 변수 사용)
$sourceFilePath = Join-Path -Path $([Environment]::GetFolderPath("LocalApplicationData")) -ChildPath "Google\Chrome\User Data\Default\Bookmarks"
$destinationPath = "\\NFS-Server\SharedFolder\Bookmarks\Bookmarks"  # NFS 스토리지 경로

# 파일이 존재하지 않는 경우 예외 처리
if (-Not (Test-Path $sourceFilePath)) {
    Write-Host "모니터링할 파일이 존재하지 않습니다: $sourceFilePath"
    exit
}

# 대상 경로의 디렉토리 확인 및 생성
$destinationDirectory = Split-Path $destinationPath -Parent
if (-Not (Test-Path $destinationDirectory)) {
    New-Item -ItemType Directory -Path $destinationDirectory | Out-Null
    Write-Host "대상 디렉토리가 생성되었습니다: $destinationDirectory"
}

# FileSystemWatcher 객체 생성
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = Split-Path $sourceFilePath -Parent  # 파일이 위치한 디렉토리
$watcher.Filter = Split-Path $sourceFilePath -Leaf  # 모니터링할 파일 이름
$watcher.IncludeSubdirectories = $false             # 하위 디렉토리 포함 여부
$watcher.EnableRaisingEvents = $true                # 이벤트 감지 활성화

Write-Host "파일 모니터링 시작: $sourceFilePath"

# 파일 잠금 상태 확인 함수
function Is-FileLocked {
    param (
        [string]$filePath
    )
    try {
        $fileStream = [System.IO.File]::Open($filePath, 'Open', 'Read', 'None')
        if ($fileStream) {
            $fileStream.Close()
        }
        return $false
    } catch {
        return $true
    }
}

# 마지막 이벤트 시간 기록
$lastEventTime = Get-Date

# 이벤트 핸들러 정의
$action = {
    $event = $EventArgs
    $changeType = $event.ChangeType
    $filePath = $event.FullPath

    # 이벤트 간격 확인 (예: 1초 이내의 이벤트 무시)
    $currentTime = Get-Date
    if (($currentTime - $lastEventTime).TotalSeconds -lt 1) {
        return
    }
    $lastEventTime = $currentTime

    Write-Host "$(Get-Date): 파일 변경 감지됨 - 유형: $changeType, 경로: $filePath"

    # 파일 잠금 상태 확인 후 복사
    if (Is-FileLocked -filePath $sourceFilePath) {
        Write-Host "파일이 잠겨 있어 복사할 수 없습니다."
    } else {
        try {
            Copy-Item -Path $sourceFilePath -Destination $destinationPath -Force
            Write-Host "파일이 성공적으로 복사되었습니다: $destinationPath"
        } catch {
            Write-Host "파일 복사 중 오류가 발생했습니다: $_"
        }
    }
}

# 이벤트 등록
Register-ObjectEvent -InputObject $watcher -EventName Changed -Action $action
Register-ObjectEvent -InputObject $watcher -EventName Created -Action $action
Register-ObjectEvent -InputObject $watcher -EventName Renamed -Action $action

# 프로그램 종료 방지 (무한 루프)
try {
    while ($true) {
        Start-Sleep -Seconds 1
    }
} finally {
    # 이벤트 해제 및 리소스 정리
    Unregister-Event -SourceIdentifier Changed
    Unregister-Event -SourceIdentifier Created
    Unregister-Event -SourceIdentifier Renamed
    $watcher.Dispose()
    Write-Host "파일 모니터링 종료"
}

4. 결과

위 스크립트는 다음과 같은 장점을 제공합니다:

  1. Windows 이벤트 기반 동작 :
    • FileSystemWatcher를 사용하여 파일 변경 이벤트를 실시간으로 감지하므로, CPU 및 메모리 사용량이 매우 적습니다.
    • VDI 환경에서 리소스 부하를 최소화하면서도 효과적인 동기화를 구현할 수 있습니다.
  2. 중앙 집중식 관리 :
    • NFS 또는 SMB 스토리지를 활용하여 북마크 데이터를 중앙에서 관리할 수 있습니다. 이는 데이터 손실을 방지하고, 필요 시 신속히 복구할 수 있게 합니다.
  3. 자동화 및 투명성 :
    • 사용자가 별도의 조작 없이 북마크가 자동으로 동기화되므로, 사용자 경험을 저하시키지 않습니다.
  4. 확장성 :
    • 스크립트는 크롬 북마크뿐만 아니라 다른 중요한 파일에도 적용할 수 있습니다. 예를 들어, Firefox 북마크나 기타 설정 파일 동기화에도 활용 가능합니다.

5. 결론

VDI 환경에서 크롬 북마크를 안정적으로 관리하기 위해 PowerShell 스크립트를 활용한 실시간 동기화 방법을 소개했습니다. 이 스크립트는 Windows 이벤트 기반으로 동작하므로 시스템 리소스를 효율적으로 사용하며, NFS와 같은 네트워크 스토리지를 활용해 데이터를 중앙에서 관리할 수 있습니다.

이러한 접근 방식은 사용자의 데이터 보호와 IT 관리자의 운영 효율성을 동시에 만족시키는 우수한 사례입니다. 앞으로도 다양한 IT 환경에서 활용 가능한 자동화 스크립트를 지속적으로 연구하고 공유하겠습니다.

감사합니다! 😊

'Programming > 업무 EXCEL' 카테고리의 다른 글

[엑셀][EXCEL] 조건부 서식 & IF 조건절 활용  (0) 2021.11.06
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기