יצירת תמונה של דיסק אחסון מתמיד (persistent disk) מקובץ ISO

אמצעי ההתקנה של אפליקציות ל-Windows מסופקים לעיתים קרובות כקובץ ISO, אבל Compute Engine לא מאפשר לחשוף קובץ ISO ככונן DVD וירטואלי למופע של מכונה וירטואלית.

כדי לגשת לתוכן של קובץ ה-ISO במכונת VM אחת של Windows, אפשר לבצע אחת מהפעולות הבאות:

  • מעתיקים את קובץ ה-ISO למכונה הווירטואלית ומפעילים אותו באופן מקומי. הגישה הזו מתאימה אם אתם צריכים לגשת לתוכן של קובץ ה-ISO רק במכונה וירטואלית אחת.

  • יוצרים Persistent Disk מקובץ ה-ISO ומצרפים את הדיסק במצב קריאה בלבד למכונה וירטואלית אחת או יותר. הגישה הזו מתאימה אם לכמה מכונות וירטואליות נדרשת גישה לתוכן של קובץ ה-ISO.

במאמר הזה נסביר איך ליצור Persistent Disk מקובץ ISO ולצרף את הדיסק במצב קריאה בלבד למכונה וירטואלית אחת או יותר.

לפני שמתחילים

  • אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות. אימות הוא התהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:

    צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:

    המסוף

    כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים Google Cloud ולממשקי ה-API, לא צריך להגדיר אימות.

    gcloud

    1. התקינו את ה-CLI של Google Cloud. אחר כך, מאתחלים את ה-CLI של Google Cloud באמצעות הפקודה הבאה:

      gcloud init

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  • הגדרת אזור ותחום כברירת מחדל.

הכנת קובץ ה-ISO

אם קובץ ה-ISO זמין לכולם דרך HTTP, לא צריך להוריד אותו קודם. כדי להשתמש בקובץ ISO מקומי, אפשר להעלות את קובץ ה-ISO ל-Cloud Storage.

כתובת URL מסוג HTTP

  1. במסוף Google Cloud , לוחצים על הכפתור Activate Cloud Shell מפעילים את Cloud Shell. כדי לפתוח את Cloud Shell.

    כניסה ל Google Cloud מסוף

  2. יוצרים משתנה סביבה לכתובת ה-URL להורדה. כתובת ה-URL יכולה להיות כתובת URL מסוג HTTP או כתובת URL מסוג HTTPS, אבל חייבת להיות אליה גישה אנונימית.

    ISO_URL=https://example.com/big.iso
    

קובץ ISO מקומי

  1. במסוף Google Cloud , יוצרים קטגוריה של Cloud Storage.

    כניסה ל Google Cloud מסוף

  2. מעלים את קובץ ה-ISO.

    ההעלאה יכולה להימשך כמה דקות או כמה שעות, בהתאם לגודל קובץ ה-ISO.

  3. ב-Storage browser, עוברים לאובייקט שהועלה.

  4. בדף Object details, מעתיקים את ה-URI של האובייקט. ה-URI מתחיל ב-gs://.

  5. לוחצים על הלחצן Activate Cloud Shell מפעילים את Cloud Shell. כדי לפתוח את Cloud Shell.

    כניסה ל Google Cloud מסוף

  6. יוצרים משתנה סביבה לכתובת ה-URL להורדה. מחליפים את URI ב-URI שהעתקתם.

    ISO_URL=URI
    

יצירת דיסק שמכיל את התוכן של קובץ ה-ISO

כדי להעתיק את התוכן של קובץ ה-ISO לדיסק חדש, יוצרים מכונה וירטואלית זמנית ואז יוצרים תמונה מהדיסק:

  1. ב-Cloud Shell, מציינים את השם שרוצים להקצות לדיסק החדש:

    DISK_NAME=iso
    
  2. יוצרים דיסק חדש שאליו מעתיקים את התוכן של קובצי ה-ISO:

    gcloud compute disks create $DISK_NAME \
      --size=10GB \
      --zone=$(gcloud config get-value compute/zone)
    

    אם קובץ ה-ISO גדול מ-9GB, צריך להשתמש בדיסק גדול יותר.

  3. יוצרים סקריפט לטעינה בזמן ההפעלה של המכונה הווירטואלית הזמנית. הסקריפט לטעינה בזמן ההפעלה מבצע את הפעולות הבאות:

    1. מפרמטים את הכונן המשני באמצעות מערכת הקבצים NTFS.
    2. מורידים את קובץ ה-ISO מכתובת ה-URL של ה-HTTP או של Cloud Storage שציינתם.
    3. מבצעים Mount לקובץ ה-ISO ומעתיקים את התוכן שלו לדיסק המשני.
    cat << "EOF" > startup.ps1
    
    $DownloadDirectory = 'c:\download\'
    $ErrorActionPreference = 'Stop'
    $MetadataUrl = 'http://metadata.google.internal/computeMetadata/v1/instance'
    
    $DownloadUrl = (Invoke-RestMethod `
        -Headers @{"Metadata-Flavor" = "Google"} `
        -Uri "$MetadataUrl/attributes/iso")
    
    mkdir $DownloadDirectory\Source -Force
    
    Write-Host '== Formatting secondary disk... ===' -ForegroundColor Black -BackgroundColor Yellow
    Set-Disk -Number 1 -IsOffline $false
    Clear-Disk -Number 1 -RemoveData -Confirm:$false -ErrorAction SilentlyContinue
    Initialize-Disk -Number 1 -PartitionStyle MBR
    New-Partition -DiskNumber 1 -UseMaximumSize -DriveLetter D -IsActive |
    Format-Volume -FileSystem 'NTFS' -Confirm:$false
    
    Write-Host '== Downloading ISO... =============' -ForegroundColor Black -BackgroundColor Yellow
    if ($DownloadUrl.StartsWith('gs:')) {
        & gcloud storage cp $DownloadUrl "$DownloadDirectory\Source\image.iso" | Out-Default
    }
    else {
        Import-Module BitsTransfer
        Start-BitsTransfer -Source $DownloadUrl -Destination "$DownloadDirectory\Source\image.iso"
    }
    
    Write-Host '== Mounting ISO... ================' -ForegroundColor Black -BackgroundColor Yellow
    Mount-DiskImage -ImagePath "$DownloadDirectory\Source\image.iso" -StorageType ISO
    
    Write-Host '== Copying ISO contents... ========' -ForegroundColor Black -BackgroundColor Yellow
    Copy-Item 'e:\*' 'd:\' -Force -Recurse -PassThru `
        | Where-Object { -Not $_.PSIsContainer } `
        | Set-ItemProperty -Name IsReadOnly -Value $False
    
    Write-Host '== Completed. =====================' -ForegroundColor Black -BackgroundColor Yellow
    Invoke-RestMethod `
        -Headers @{'Metadata-Flavor'='Google'}  `
        -Method PUT  `
        -Uri "$MetadataUrl/guest-attributes/vm/ready" `
        -Body true
    EOF
    
  4. יוצרים מכונה וירטואלית של Windows Server 2019 שמשתמשת בסקריפט לטעינה בזמן ההפעלה ובדיסק שיצרתם קודם:

    gcloud compute instances create iso-copier \
        --machine-type=n1-standard-2 \
        --image-family=windows-2019-core \
        --image-project=windows-cloud \
        --disk=name=$DISK_NAME,auto-delete=no \
        --metadata=enable-guest-attributes=true,iso=$ISO_URL \
        --metadata-from-file=windows-startup-script-ps1=startup.ps1 \
        --scopes=https://www.googleapis.com/auth/devstorage.read_only
    

    הפעלת המכונה הווירטואלית נמשכת כ-2 דקות. בהתאם לגודל של קובץ ה-ISO, יכולות לחלוף עוד 5 עד 15 דקות עד להשלמת פעולת העתקת הקובץ. כדי לעקוב אחרי ההתקדמות, מריצים את הפקודה הבאה:

    gcloud compute instances tail-serial-port-output iso-copier \
        --zone=$(gcloud config get-value compute/zone)
    
  5. מחכים שהמכונה הווירטואלית תסיים להריץ את הסקריפט לטעינה בזמן ההפעלה:

    until gcloud compute instances get-guest-attributes iso-copier \
        --zone=$(gcloud config get-value compute/zone) \
        --query-path=vm/ready > /dev/null 2>&1
    do
        sleep 5 && echo waiting for VM to finish...
    done
    
  6. מכבים ומוחקים את המכונה הווירטואלית:

    gcloud compute instances delete iso-copier \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    

    שימו לב שהדיסק המשני לא נמחק כי הוא הותקן עם הפרמטר auto-delete=no.

הדיסק מוכן לשימוש. אתם יכולים לצרף את הדיסק במצב קריאה-בלבד למכונה וירטואלית אחת או יותר באותו אזור.

כדי לשתף את הדיסק בין אזורים, יוצרים תמונה

כדי שהתוכן של קובץ ה-ISO יהיה זמין באזורים או בתחומים אחרים, צריך ליצור תמונה של Compute Engine:

  1. מ-Cloud Shell, יוצרים תמונה מהדיסק שיצרתם בקטע הקודם:

    gcloud compute images create $DISK_NAME \
        --source-disk=$DISK_NAME \
        --source-disk-zone=$(gcloud config get-value compute/zone)
    

הסרת המשאבים

כדי להימנע מעלויות נוספות אחרי שתסיימו את התהליך, תוכלו למחוק את המשאבים שיצרתם:

  1. מוחקים את הדיסק:

    gcloud compute disks delete $DISK_NAME \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    
  2. מוחקים את התמונה:

    gcloud compute images delete $DISK_NAME
    

המאמרים הבאים