إعداد Linux للتصوير في Azure

تنبيه

تشير هذه المقالة إلى CentOS، وهو توزيع Linux يقترب من حالة نهاية العمر الافتراضي (EOL). يرجى مراعاة استخدامك والتخطيط وفقا لذلك. لمزيد من المعلومات، راجع إرشادات نهاية العمر الافتراضي CentOS.

ينطبق على: ✔️ أجهزة Linux الظاهرية ✔️ مجموعات مقياس مرنة

تنطبق اتفاقية مستوى خدمة النظام الأساسي Azure (SLA) على الأجهزة الظاهرية (VMs) التي تعمل بنظام التشغيل Linux فقط عند استخدام أحد التوزيعات المعتمدة. بالنسبة للتوزيعات المعتمدة، يوفر Azure Marketplace صور Linux المكونة مسبقا. لمزيد من المعلومات، راجع:

جميع التوزيعات الأخرى التي تعمل على Azure، بما في ذلك التوزيعات المدعومة من المجتمع وغير المعتمدة، لها بعض المتطلبات الأساسية.

تركز هذه المقالة على الإرشادات العامة لتشغيل توزيع Linux على Azure. لا يمكن أن تكون هذه المقالة شاملة، لأن كل توزيع مختلف. حتى إذا كنت تستوفي جميع المعايير التي تصفها هذه المقالة، فقد تحتاج إلى تعديل نظام Linux بشكل كبير لتشغيله بشكل صحيح.

ملاحظات تثبيت Linux العامة

  • لا يدعم Azure تنسيق القرص الثابت الظاهري Hyper-V (VHDX). يدعم Azure VHD الثابت فقط. يمكنك تحويل القرص إلى تنسيق VHD باستخدام Hyper-V Manager أو Cmdlet Convert-VHD . إذا كنت تستخدم VirtualBox، فحدد الحجم الثابت بدلا من الحجم الافتراضي (المخصص ديناميكيا) عند إنشاء القرص.

  • يدعم Azure الأجهزة الظاهرية Gen1 (تمهيد BIOS) وGen2 (تمهيد UEFI).

  • يجب تمكين الوحدة النمطية kernel لجدول تخصيص الملفات الظاهرية (VFAT) في النواة.

  • الحد الأقصى للحجم المسموح به لـ VHD هو 1,023 جيجابايت.

  • عند تثبيت نظام Linux، نوصي باستخدام الأقسام القياسية بدلا من إدارة وحدة التخزين المنطقية (LVM). LVM هو الافتراضي للعديد من التثبيتات.

    سيؤدي استخدام الأقسام القياسية إلى تجنب تعارضات اسم LVM مع الأجهزة الظاهرية المستنسخة، خاصة إذا كان قرص نظام التشغيل متصلاً بجهاز ظاهري آخر مماثل لاستكشاف الأخطاء وإصلاحها. يمكنك استخدام LVM أو RAID على أقراص البيانات.

  • يعد دعم Kernel لتركيب أنظمة ملفات الدالة المعرفة من قبل المستخدم (UDF) ضروريا. في التمهيد الأول على Azure، يتم تمرير تكوين التوفير إلى Linux VM عبر وسائط بتنسيق UDF مرفقة بالضيف. يجب على عامل Azure Linux تحميل نظام ملفات UDF لقراءة تكوينه وتوفير الجهاز الظاهري.

  • لا تدعم إصدارات Linux kernel الأقدم من 2.6.37 الوصول غير الموحد للذاكرة (NUMA) على Hyper-V بأحجام أجهزة ظاهرية أكبر. تؤثر هذه المشكلة بشكل أساسي على التوزيعات القديمة التي تستخدم نواة Red Hat 2.6.32 الأولية. تم إصلاحه في Red Hat Enterprise Linux (RHEL) 6.6 (kernel-2.6.32-504).

    يجب على الأنظمة التي تعمل على نواة مخصصة أقدم من 2.6.37 أو نواة تستند إلى RHEL أقدم من 2.6.32-504 تعيين معلمة numa=off التمهيد على سطر أوامر kernel في grub.conf. لمزيد من المعلومات، راجع Red Hat KB 436883.

  • لا تقم بتكوين قسم مبادلة على قرص نظام التشغيل. يمكنك تكوين عامل Linux لإنشاء ملف تبديل على قرص المورد المؤقت، كما هو موضح لاحقا في هذه المقالة.

  • يجب أن يكون لجميع أقراص VHD على Azure حجم ظاهري محاذاته إلى 1 ميغابايت (1024 × 1024 بايت). عند التحويل من قرص خام إلى VHD، تأكد من أن حجم القرص الخام هو مضاعف 1 ميغابايت قبل التحويل، كما هو موضح لاحقا في هذه المقالة.

  • قم باستخدام أحدث إصدار توزيع وحزم وبرامج.

  • إزالة المستخدمين وحسابات النظام والمفاتيح العامة والبيانات الحساسة والبرامج والتطبيقات غير الضرورية.

إشعار

يزيل الإصدار 21.2 من Cloud-init أو أحدث متطلبات UDF. ولكن بدون تمكين الوحدة النمطية udf ، لن يتم تحميل CD-ROM أثناء التوفير، مما يمنع تطبيق البيانات المخصصة. الحل البديل هو تطبيق بيانات المستخدم. ومع ذلك، على عكس البيانات المخصصة، لا يتم تشفير بيانات المستخدم. لمزيد من المعلومات، راجع تنسيقات بيانات المستخدم في وثائق تهيئة السحابة.

تثبيت وحدات النواة دون Hyper-V

يعمل Azure على مراقب الأجهزة الظاهرية Hyper-V؛ لذلك يتطلب Linux تشغيل وحدات kernel نمطية معينة في Azure. إذا كان لديك جهاز ظاهري تم إنشاؤه خارج Hyper-V، فقد لا تتضمن مثبتات Linux برامج تشغيل Hyper-V في قرص ذاكرة الوصول العشوائي الأولي (initrd أو initramfs)، ما لم يكتشف الجهاز الظاهري أنه يعمل في بيئة Hyper-V.

عند استخدام نظام ظاهرية مختلف (مثل VirtualBox أو KVM) لإعداد صورة Linux، قد تحتاج إلى إعادة إنشاء initrd بحيث تتوفر على الأقل hv_vmbus الوحدات النمطية و hv_storvsc kernel على قرص ذاكرة الوصول العشوائي الأولي. هذه المشكلة المعروفة خاصة بالأنظمة القائمة على توزيع Red Hat المصدر، وربما أنظمة أخرى.

يمكن أن تختلف آلية إعادة بناء صورة initrd أو initramfs، اعتمادا على التوزيع. راجع وثائق التوزيع أو الدعم للإجراء المناسب. فيما يلي مثال واحد لإعادة إنشاء initrd باستخدام mkinitrd الأداة المساعدة:

  1. قم بعمل نسخة احتياطية من صورة initrd الموجودة:

    cd /boot
    sudo cp initrd-`uname -r`.img  initrd-`uname -r`.img.bak
    
  2. إعادة إنشاء initrd باستخدام الوحدات النمطية hv_vmbus و hv_storvsc kernel:

    sudo mkinitrd --preload=hv_storvsc --preload=hv_vmbus -v -f initrd-`uname -r`.img `uname -r`
    

تغيير حجم VHDs

يجب أن يكون لصور VHD على Azure حجم ظاهري يحاذي 1 ميجابايت. عادة ما تتم محاذاة VHDs التي تم إنشاؤها من خلال Hyper-V بشكل صحيح. إذا لم تتم محاذاة VHD بشكل صحيح، فقد تتلقى رسالة خطأ مشابهة للمثال التالي عند محاولة إنشاء صورة من VHD الخاص بك:

The VHD http://<mystorageaccount>.blob.core.windows.net/vhds/MyLinuxVM.vhd has an unsupported virtual size of 21475270656 bytes. The size must be a whole number (in MBs).

في هذه الحالة، قم بتغيير حجم الجهاز الظاهري باستخدام وحدة تحكم Hyper-V Manager أو Cmdlet Resize-VHD PowerShell. إذا لم تكن تعمل في بيئة Windows، فإننا نوصي باستخدام qemu-img لتحويل VHD (إذا لزم الأمر) وتغيير حجمه.

إشعار

هناك خطأ معروف في qemu-img للإصدار 2.2.1 من QEMU وبعض الإصدارات الأحدث التي ينتج عنها VHD منسق بشكل غير صحيح. تم تصحيح المشكلة في QEMU 2.6. نوصي باستخدام الإصدار 2.2.0 أو إصدار سابق، أو استخدام الإصدار 2.6 أو أحدث.

  1. تغيير حجم VHD مباشرة باستخدام أدوات مثل qemu-img أو vbox-manage قد يؤدي إلى VHD غير قابل للتشطيب. نوصي أولا بتحويل VHD إلى صورة قرص أولي باستخدام التعليمات البرمجية التالية.

    إذا تم إنشاء صورة الجهاز الظاهري كصورة قرص أولي، يمكنك تخطي هذه الخطوة. إنشاء صورة الجهاز الظاهري كصورة قرص أولي هو الافتراضي في بعض برامج hypervisors، مثل KVM.

    sudo qemu-img convert -f vpc -O raw MyLinuxVM.vhd MyLinuxVM.raw
    
  2. احسب الحجم المطلوب لصورة القرص بحيث تتم محاذاة الحجم الظاهري إلى 1 ميجابايت. يستخدم qemu-img info البرنامج النصي Bash shell التالي لتحديد الحجم الظاهري لصورة القرص، ثم حساب الحجم إلى 1 ميغابايت التالية:

    rawdisk="MyLinuxVM.raw"
    vhddisk="MyLinuxVM.vhd"
    
    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "$rawdisk" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    
    rounded_size=$(((($size+$MB-1)/$MB)*$MB))
    
    echo "Rounded Size = $rounded_size"
    
  3. تغيير حجم القرص الخام باستخدام $rounded_size:

    sudo qemu-img resize MyLinuxVM.raw $rounded_size
    
  4. قم بتحويل القرص الخام مرة أخرى إلى VHD ثابت الحجم:

    sudo qemu-img convert -f raw -o subformat=fixed,force_size -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

    أو، مع إصدارات QEMU قبل 2.6، قم بإزالة force_size الخيار:

    sudo qemu-img convert -f raw -o subformat=fixed -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

متطلبات نواة Linux

تُساهم برامج تشغيل Linux Integration Services (LIS) لـ Hyper-V وAzure مباشرة في Linux kernel المصدر. يحتوي العديد من التوزيعات التي تتضمن إصداراً حديثاً من Linux kernel (مثل 3.x) على برامج التشغيل هذه المتوفرة بالفعل، أو توفر إصدارات الحمل العكسي من برامج التشغيل هذه مع نواتها.

يتم تحديث برامج تشغيل LIS باستمرار في نواة المصدر مع إصلاحات وميزات جديدة. عندما يكون ذلك ممكنا، نوصي بتشغيل توزيع معتمد يتضمن هذه الإصلاحات والتحديثات.

إذا كنت تقوم بتشغيل متغير من إصدارات RHEL من 6.0 إلى 6.3، فأنت بحاجة إلى تثبيت أحدث برامج تشغيل LIS ل Hyper-V. بدءا من RHEL 6.4+ (والمشتقات)، يتم تضمين برامج تشغيل LIS بالفعل مع النواة، لذلك لا تحتاج إلى حزم تثبيت إضافية.

إذا كانت هناك حاجة إلى kernel مخصصة، فإننا نوصي بإصدار kernel حديث (مثل 3.8+). بالنسبة للتوزيعات أو الموردين الذين يحافظون على نواة خاصة بهم، تحتاج إلى دعم برامج تشغيل LIS بانتظام من نواة المصدر إلى نواة مخصصة.

حتى إذا كنت تقوم بالفعل بتشغيل إصدار kernel حديث نسبيا، نوصي بشدة بتعقب أي إصلاحات مصدرية في برامج تشغيل LIS ونسخها احتياطيا حسب الحاجة. يتم تحديد مواقع ملفات مصدر برنامج تشغيل LIS في ملف MAINTAINERS في شجرة مصدر Linux kernel:

    F:    arch/x86/include/asm/mshyperv.h
    F:    arch/x86/include/uapi/asm/hyperv.h
    F:    arch/x86/kernel/cpu/mshyperv.c
    F:    drivers/hid/hid-hyperv.c
    F:    drivers/hv/
    F:    drivers/input/serio/hyperv-keyboard.c
    F:    drivers/net/hyperv/
    F:    drivers/scsi/storvsc_drv.c
    F:    drivers/video/fbdev/hyperv_fb.c
    F:    include/linux/hyperv.h
    F:    tools/hv/

يجب أن تتضمن النواة النشطة للجهاز الظاهري التصحيحات التالية. لا يمكن أن تكون هذه القائمة كاملة لجميع التوزيعات.

عامل Azure Linux

يقوم عامل Azure Linux (waagent) بتوفير جهاز ظاهري Linux في Azure. يمكنك الحصول على أحدث إصدار أو الإبلاغ عن المشاكل أو إرسال طلبات السحب في مستودع Linux Agent GitHub.

فيما يلي بعض الاعتبارات لاستخدام عامل Azure Linux:

  • يتم إصدار عامل Linux بموجب ترخيص Apache 2.0. توفر العديد من التوزيعات بالفعل حزم .rpm أو .deb للعامل. يمكنك بسهولة تثبيت هذه الحزم وتحديثها.
  • Azure Linux Agent يتطلب Python v2.6+.
  • يتطلب العامل أيضا الوحدة النمطية python-pyasn1 . توفر معظم التوزيعات هذه الوحدة النمطية كحزمة منفصلة ليتم تثبيتها.
  • في بعض الحالات، قد لا يكون عامل Azure Linux متوافقا مع NetworkManager. يقوم العديد من الحزم (.rpm أو .deb) التي توفرها التوزيعات بتكوين NetworkManager كتعارض مع الحزمة waagent . في هذه الحالات، سيقوم العامل بإلغاء تثبيت NetworkManager عند تثبيت حزمة عامل Linux.
  • يجب أن يكون Azure Linux Agent عند الحد الأدنى للإصدار المدعوم أو أعلى.

إشعار

تأكد من تمكين الوحدات النمطية udf و vfat . سيؤدي تعطيل الوحدة النمطية udf إلى فشل التزويد. سيؤدي تعطيل الوحدة النمطية vfat إلى فشل كل من التوفير والتمهيد. يمكن للإصدار 21.2 من Cloud-init أو أحدث توفير الأجهزة الظاهرية دون الحاجة إلى UDF إذا كان كلا الشرطين موجودين:

  • لقد قمت بإنشاء الجهاز الظاهري باستخدام مفاتيح SSH العامة وليس كلمات المرور.
  • لم تقدم أي بيانات مخصصة.

متطلبات نظام Linux العامة

  1. قم بتعديل سطر تمهيد kernel في GRUB أو GRUB2 لتضمين المعلمات التالية، بحيث يتم إرسال كافة رسائل وحدة التحكم إلى المنفذ التسلسلي الأول. يمكن أن تساعد هذه الرسائل دعم Azure في تصحيح أي مشكلات.

    GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0"
    

    نوصي أيضا بإزالة المعلمات التالية إذا كانت موجودة:

    rhgb quiet crashkernel=auto
    

    التمهيد الرسومي والهادئ غير مفيد في بيئة سحابية، حيث تريد إرسال جميع السجلات إلى المنفذ التسلسلي. يمكنك ترك crashkernel الخيار مكونا إذا لزم الأمر، ولكن هذه المعلمة تقلل مقدار الذاكرة المتوفرة في الجهاز الظاهري بمقدار 128 ميغابايت على الأقل. قد يكون تقليل الذاكرة المتوفرة مشكلة لأحجام الأجهزة الظاهرية الأصغر.

  2. بعد الانتهاء من تحرير /etc/default/grub، قم بتشغيل الأمر التالي لإعادة إنشاء تكوين GRUB:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  3. أضف وحدة Hyper-V النمطية ل initramfs باستخدام dracut:

    cd /boot
    sudo cp initramfs-<kernel-version>.img <kernel-version>.img.bak
    sudo dracut -f -v initramfs-<kernel-version>.img <kernel-version> --add-drivers "hv_vmbus hv_netvsc hv_storvsc"
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

    أضف الوحدة النمطية Hyper-V ل initrd باستخدام mkinitramfs:

    cd /boot
    sudo cp initrd.img-<kernel-version>  initrd.img-<kernel-version>.bak
    sudo mkinitramfs -o initrd.img-<kernel-version> <kernel-version>  --with=hv_vmbus,hv_netvsc,hv_storvsc
    sudo update-grub
    
  4. تأكد من تثبيت خادم SSH وتكوينه للبدء في وقت التمهيد. هذا التكوين هو عادة الافتراضي.

  5. قم بتثبيت Azure Linux Agent.

    Azure Linux Agent مطلوب لتوفير صورة Linux على Azure. توفر العديد من التوزيعات العامل كحزمة .rpm أو .deb. عادة ما تسمى WALinuxAgent الحزمة أو walinuxagent. يمكنك أيضا تثبيت العامل يدويا باتباع الخطوات الواردة في دليل عامل Azure Linux.

    إشعار

    تأكد من تمكين الوحدات النمطية udf و vfat . ستؤدي إزالتها أو تعطيلها إلى فشل التوفير أو التمهيد. يزيل الإصدار 21.2 من Cloud-init أو أحدث متطلبات UDF.

    قم بتثبيت عامل Azure Linux و cloud-init والأدوات المساعدة الضرورية الأخرى عن طريق تشغيل أحد الأوامر التالية.

    استخدم هذا الأمر ل Red Hat أو CentOS:

    sudo yum install -y WALinuxAgent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    استخدم هذا الأمر ل Ubuntu/Debian:

    sudo apt install walinuxagent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    استخدم هذا الأمر ل SUSE:

    sudo zypper install python-azure-agent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    ثم قم بتمكين العامل و cloud-init على جميع التوزيعات:

    sudo systemctl enable waagent.service
    sudo systemctl enable cloud-init.service
    
  6. لا تنشئ مساحة مبادلة على قرص نظام التشغيل.

    يمكنك استخدام عامل Azure Linux أو cloud-init لتكوين مساحة التبديل عبر قرص المورد المحلي. يتم إرفاق قرص المورد هذا بالجهاز الظاهري بعد التوفير على Azure. قرص المورد المحلي هو قرص مؤقت وقد يتم إفراغه عند إلغاء توفير الجهاز الظاهري. توضح الكتل التالية كيفية تكوين هذه المبادلة.

    إذا اخترت عامل Azure Linux، فقم بتعديل المعلمات التالية في /etc/waagent.conf:

    ResourceDisk.Format=y
    ResourceDisk.Filesystem=ext4
    ResourceDisk.MountPoint=/mnt/resource
    ResourceDisk.EnableSwap=y
    ResourceDisk.SwapSizeMB=2048    ## NOTE: Set this to your desired size.
    

    إذا اخترت cloud-init، فقم بتكوين cloud-init للتعامل مع التوفير:

    sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-auto/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
    

    لتكوين cloud-init لتنسيق وإنشاء مساحة تبديل، لديك خياران:

    • قم بتمرير تكوين cloud-init في كل مرة تقوم فيها بإنشاء جهاز ظاهري من خلال customdata. نوصي بهذا الأسلوب.
    • استخدم توجيه cloud-init في الصورة لتكوين مساحة التبديل في كل مرة يتم فيها إنشاء الجهاز الظاهري.

    إنشاء ملف .cfg لتكوين مساحة التبديل باستخدام cloud-init:

    sudo echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
    sudo cat > /etc/cloud/cloud.cfg.d/00-azure-swap.cfg << EOF
    #cloud-config
    # Generated by Azure cloud image build
    disk_setup:
      ephemeral0:
        table_type: mbr
        layout: [66, [33, 82]]
        overwrite: True
    fs_setup:
      - device: ephemeral0.1
        filesystem: ext4
      - device: ephemeral0.2
        filesystem: swap
    mounts:
      - ["ephemeral0.1", "/mnt/resource"]
      - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
    EOF
    
  7. تكوين cloud-init للتعامل مع التزويد:

    1. تكوين waagent cloud-init:

      sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
      sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
      sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
      

      إذا كنت تقوم بترحيل جهاز ظاهري معين ولا تريد إنشاء صورة معممة، فقم بتعيين Provisioning.Agent=disabled في تكوين /etc/waagent.conf .

    2. تكوين وحدات:

      sudo echo "Adding mounts and disk_setup to init stage"
      sudo sed -i '/ - mounts/d' /etc/cloud/cloud.cfg
      sudo sed -i '/ - disk_setup/d' /etc/cloud/cloud.cfg
      sudo sed -i '/cloud_init_modules/a\\ - mounts' /etc/cloud/cloud.cfg
      sudo sed -i '/cloud_init_modules/a\\ - disk_setup' /etc/cloud/cloud.cfg
      
      
    3. تكوين مصدر بيانات Azure:

      sudo echo "Allow only Azure datasource, disable fetching network setting via IMDS"
      sudo cat > /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg <<EOF
      datasource_list: [ Azure ]
      datasource:
         Azure:
           apply_network_config: False
      EOF
      
    4. قم بإزالة ملف التبديل الموجود إذا قمت بتكوين ملف:

      if [[ -f /mnt/resource/swapfile ]]; then
      echo "Removing swapfile" #RHEL uses a swap file by default
      swapoff /mnt/resource/swapfile
      rm /mnt/resource/swapfile -f
      fi
      
    5. تكوين تسجيل cloud-init:

      sudo echo "Add console log file"
      sudo cat >> /etc/cloud/cloud.cfg.d/05_logging.cfg <<EOF
      
      # This tells cloud-init to redirect its stdout and stderr to
      # 'tee -a /var/log/cloud-init-output.log' so the user can see output
      # there without needing to look on the console.
      output: {all: '| tee -a /var/log/cloud-init-output.log'}
      EOF
      
  8. قم بتشغيل الأوامر التالية لإلغاء توفير الجهاز الظاهري.

    تنبيه

    إذا كنت تقوم بترحيل جهاز ظاهري معين ولا تريد إنشاء صورة معممة، فتخط خطوة إلغاء التوفير. سيؤدي تشغيل الأمر waagent -force -deprovision+user إلى جعل الجهاز المصدر غير قابل للاستخدام. تهدف هذه الخطوة فقط إلى إنشاء صورة معممة.

    sudo rm -f /var/log/waagent.log
    sudo cloud-init clean
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    

    في VirtualBox، قد ترى رسالة خطأ بعد تشغيل waagent -force -deprovision تقول [Errno 5] Input/output error. رسالة الخطأ هذه ليست هامة، ويمكنك تجاهلها.

  9. قم بإيقاف تشغيل الجهاز الظاهري وقم بتحميل VHD إلى Azure.

الخطوات التالية

إنشاء جهاز ظاهري يعمل بنظام Linux من قرص مخصص باستخدام Azure CLI