Soru Azure Ubuntu VM için nasıl bir takas oluşturulur?


Bu konuda epeyce yazı okudum, ama yine de doğru yaklaşım hakkında emin değilim:

  1. Bir takas ile birlikte gelmeyen Azure'da oluşturulmuş ve çalışan bir varsayılan Ubuntu 14.04 LTS VM var.

  2. Ek depolama alanı kullanarak yeni bir disk oluşturmak yerine mevcut VM depolama alanını kullanarak bir takas oluşturmak istiyorum.

Okuduğum Mesajlar:

Birçok çözüm tartışıldı, ancak sunucu yeniden başlatmalarında (muhtemelen bulut-init nedeniyle görüntü bölümleme hakkında kendi fikri vardır) devam edecek birini bulamıyorum, birisi bana en iyi uygulama hakkında tavsiyede bulunabilir mi?


8
2018-05-31 09:10


Menşei




Cevaplar:


Linux Agent yüklü olduğunu varsayalım. Yapmanız gereken tek şey /etc/waagent.conf altında takas etkinleştirmek. Bunlar ilgili satırlardır:

ResourceDisk.Format=y                   # Format if unformatted. If 'n', resour$
ResourceDisk.Filesystem=ext4            # Typically ext3 or ext4. FreeBSD image$
ResourceDisk.MountPoint=/mnt/resource   #
ResourceDisk.EnableSwap=y               # Create and use swapfile on resource d$
ResourceDisk.SwapSizeMB=2048            # Size of the swapfile.

Takas oluşturmak için otomatik olarak kaynak diskini (her VM ile birlikte gelir) kullanır. Bunun için bir disk oluşturmaya gerek yok.

Güncelleştirme: Ayrıca swapfile oluşturmak için aşağıdaki adımları uygulamanız gerekir:

umount /mnt
service walinuxagent restart

8
2018-05-31 15:25



Disk tedariki, diğer dağıtımlardan farklı olarak Ubuntu'da Cloud Init tarafından kontrol edilir. Yani hayır, bu işe yaramaz ve hem doc hem de testim bunu doğrular. - bitinn
MS desteğiyle iletişime geçtim ve çözümün belirlendiğini gördüm ResourceDisk.Format, ResourceDisk.EnableSwap ve ResourceDisk.SwapSizeMB. ANCAK önemli adım bir el kitabı yapmaktır sudo service walinuxagent restart swap dosyasını oluşturmak için, sadece yeniden başlatılan sunucu benim için çalışmıyor. - bitinn
Ben hala Cloud Init'in bütün bunları nasıl anladığını soruyorum, çünkü doktorları ve waagent.conf yorumları yanıltıcıdır. - bitinn
Evet. üzgünüm. Aracı yeniden başlatmayı dahil etmeyi unuttu. Ubuntu vm'de test ettim ve sorunsuz çalıştı. Cevabı güncelledim. Cloud-init ile ilgili olarak, ajanın bir ext4 bölümü (/ mnt) içindeki dosyayı oluşturmasından beri swap dosyasının oluşturulmasıyla ilgili hiçbir şey olmadığını düşünmüyorum. Bir takas bölümü oluşturmaz. - Bruno Faria
Azure Gallery görüntüsünden oluşturulan Ubuntu 14.04 LTS VM'de çalışmadı. Bütün adımları yerine getirdikten sonra, swapon -s takas dosyalarının boş listesini hala gösterir. - JustAMartin


Bruno'nun cevabı harika bir başlangıç ​​noktasıdır, ancak sadece yeniden başlattıktan ve önyüklemeden sonra bir dakika daha verdikten sonra çalıştı.

a. İçinde takas etkinleştirme /etc/waagent.confilgili satırlar:

ResourceDisk.Format=y                   # Format if unformatted. If 'n', resour$
ResourceDisk.Filesystem=ext4            # Typically ext3 or ext4. FreeBSD image$
ResourceDisk.MountPoint=/mnt/resource   #
ResourceDisk.EnableSwap=y               # Create and use swapfile on resource d$
ResourceDisk.SwapSizeMB=2048            # Size of the swapfile.

b. Makinenizi yeniden başlatmayı içeren aşağıdakileri root olarak yapın:

umount /mnt
service walinuxagent restart
reboot

c. Önyüklemeden sonra, takasın etkinleştirilmesinden önce biraz zaman alacaktır. İle kontrol edebilirsiniz swapon -s.


2
2017-07-22 22:28





Bunu yapmanın doğru yolu inanıyorum ki, hem bulut-init hem de waagent birlikte 'hoş' oynuyorlar Cloud-Init Azure dokümanları) bu değerleri buna ayarlı tutmaktır

# disabling provisioning turns off all 'Provisioning.*' function
Provisioning.Enabled=n
# this is currently not handled by cloud-init, so let walinuxagent do it.
ResourceDisk.Format=y
ResourceDisk.MountPoint=/mnt

Montaj noktasını değiştirmeyi denedim ancak dokümanların düzgün çalışabilmesi için düzgün çalışmadığı görülüyor.

Ve sonra takas seçeneklerini istediğiniz gibi özelleştirebilirsiniz

# Create and use swapfile on resource disk.
ResourceDisk.EnableSwap=y

# Size of the swapfile.
ResourceDisk.SwapSizeMB=8192

Temel bir yeniden başlatma, yeni takas para cezasını kaldırır

sudo service walinuxagent restart

free -m
             total       used       free     shared    buffers     cached
Mem:          3944        882       3061         44         29        163
-/+ buffers/cache:        689       3255
Swap:         8192          0       8192

1
2018-06-01 04:42





Bu konuda epeyce yazı okudum, ama yine de doğru yaklaşım hakkında emin değilim:   1. Ben bir takas ile gelmiyor Azure, tarafından oluşturulan ve çalışan bir varsayılan Ubuntu 14.04 LTS VM var   2. Ek depolama alanı kullanarak yeni bir disk oluşturmak yerine varolan sanal makine deposunu kullanarak bir takas oluşturmak istiyorum.

Aynı zamanda buna da ihtiyacım vardı (aslında 14.04 yerine 16.04, fakat cevabım her ikisine de uygulanacak).

Okuduğum Mesajlar:

Fakat gördüğüm kadar uzun denemeler okumam gerektiğinde, pes edecektim ... Ama aniden DigitalOcean'ın blogunda çok basit bir makaleyi hatırladım:

Ubuntu'da Takas Nasıl Eklenir 14.04

O kadar basit ki, bunun için bir senaryo bile yazdım (en azından en iyi bölüm için, henüz swappiness ayarları ve diğer gelişmiş şeyler için):

#!/usr/bin/env fsharpi

open System
open System.IO
open System.Net
open System.Diagnostics

#load "InfraTools.fs"
open Gatecoin.Infrastructure

// automation of https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04

let NUMBER_OF_GB_FOR_SWAP = 1

let isThereSwapMemoryInTheSystem (): bool =
    let _,output,_ = Tools.SafeHiddenExec("swapon", "-s")
    (output.Trim().Length > 0)

if (isThereSwapMemoryInTheSystem()) then
    Console.WriteLine("Swap already setup")
    Environment.Exit(0)

let swapFile = new FileInfo(Path.Combine("/", "swapfile"))
if not (swapFile.Exists) then
    Tools.BailIfNotSudoer("Need to use 'fallocate' to create swap file")
    Console.WriteLine("Creating swap file...")
    Tools.SafeExec("fallocate", String.Format("-l {0}G {1}", NUMBER_OF_GB_FOR_SWAP, swapFile.FullName), true)

let permissionsForSwapFile = 600
if not (Tools.OctalPermissions(swapFile) = permissionsForSwapFile) then
    Tools.BailIfNotSudoer("Need to adjust permissions of the swap file")
    Tools.SafeExec("chmod", String.Format("{0} {1}", permissionsForSwapFile, swapFile.FullName), true)

Tools.BailIfNotSudoer("Enable swap memory")
Tools.SafeExec("mkswap", swapFile.FullName, true)
Tools.SafeExec("swapon", swapFile.FullName, true)
if not (isThereSwapMemoryInTheSystem()) then
    Console.WriteLine("Something went wrong while enabling the swap file")
    Environment.Exit(1)

Tools.BailIfNotSudoer("Writing into /etc/fstab")
Tools.SafeHiddenExecBashCommand(String.Format("echo \"{0}   none    swap    sw    0   0\" >> /etc/fstab", swapFile.FullName))

Yukarıdaki çalışmak için, yapmanız gereken sudo apt install fsharp İlk önce (en azından Ubuntu 16.04, depolarda fsharp var, 14.04'ten emin değil).

Ayrıca buna ihtiyacınız var InfraTools.fs dosya:

open System
open System.IO
open System.Net

namespace Gatecoin.Infrastructure

module Tools =

    let HiddenExec (command: string, arguments: string) =
        let startInfo = new System.Diagnostics.ProcessStartInfo(command)
        startInfo.Arguments <- arguments
        startInfo.UseShellExecute <- false

        // equivalent to `>/dev/null 2>&1` in unix
        startInfo.RedirectStandardError <- true
        startInfo.RedirectStandardOutput <- true

        use proc = System.Diagnostics.Process.Start(startInfo)
        proc.WaitForExit()
        (proc.ExitCode,proc.StandardOutput.ReadToEnd(),proc.StandardError.ReadToEnd())

    let HiddenExecBashCommand (commandWithArguments: string) =
        let args = String.Format("-c \"{0}\"", commandWithArguments.Replace("\"", "\\\""))
        HiddenExec("bash", args)

    let SafeHiddenExecBashCommand (commandWithArguments: string) =
        let exitCode,stdOut,stdErr = HiddenExecBashCommand commandWithArguments
        if not (exitCode = 0) then
            Console.Error.WriteLine(stdErr)
            Console.Error.WriteLine()
            Console.Error.WriteLine("Bash command '{0}' failed with exit code {1}.", commandWithArguments, exitCode.ToString())
            Environment.Exit(1)
        exitCode,stdOut,stdErr

    let Exec (command: string, arguments: string, echo: bool) =
        let psi = new System.Diagnostics.ProcessStartInfo(command)
        psi.Arguments <- arguments
        psi.UseShellExecute <- false
        if (echo) then
            Console.WriteLine("{0} {1}", command, arguments)
        let p = System.Diagnostics.Process.Start(psi)
        p.WaitForExit()
        p.ExitCode

    let ExecBashCommand (commandWithArguments: string, echo: bool) =
        let args = String.Format("-c \"{0}\"", commandWithArguments.Replace("\"", "\\\""))
        if (echo) then
            Console.WriteLine(commandWithArguments)
        Exec("bash", args, false)

    let SafeHiddenExec (command: string, arguments: string) =
        let exitCode,stdOut,stdErr = HiddenExec(command, arguments)
        if not (exitCode = 0) then
            Console.Error.WriteLine(stdErr)
            Console.Error.WriteLine()
            Console.Error.WriteLine("Command '{0}' failed with exit code {1}. Arguments supplied: '{2}'", command, exitCode.ToString(), arguments)
            Environment.Exit(1)
        exitCode,stdOut,stdErr

    let SafeExec (command: string, arguments: string, echo: bool) =
        let exitCode = Exec(command, arguments, echo)
        if not (exitCode = 0) then
            Console.Error.WriteLine("Command '{0}' failed with exit code {1}. Arguments supplied: '{2}'", command, exitCode.ToString(), arguments)
            Environment.Exit(1)
            failwith "unreached"
        ()

    let SafeExecBashCommand (commandWithArguments: string, echo: bool) =
        let args = String.Format("-c \"{0}\"", commandWithArguments.Replace("\"", "\\\""))
        if (echo) then
            Console.WriteLine(commandWithArguments)
        SafeExec("bash", args, false)

    let FirstElementOf3Tuple (a, _, _) = a
    let SecondElementOf3Tuple (_, b, _) = b

    let SimpleStringSplit (str: string, separator: string): string list =
        List.ofSeq(str.Split([|separator|], StringSplitOptions.RemoveEmptyEntries))

    let SplitStringInLines (str: string): string list =
        SimpleStringSplit(str,Environment.NewLine)

    let CommandWorksInShell (command: string): bool =
        let exitCode =
            try
                Some(FirstElementOf3Tuple(HiddenExec(command,String.Empty))
            with
                | :? System.ComponentModel.Win32Exception -> (); None
        if exitCode.IsNone then
            false
        else
            true

    let BailIfNotSudoer(reason: string): unit =   
        if not (CommandWorksInShell "id") then
            Console.WriteLine ("'id' unix command is needed for this script to work")
            Environment.Exit(2)
            ()

        let _,idOutput,_ = HiddenExec("id","-u")
        if not (idOutput.Trim() = "0") then
            Console.Error.WriteLine ("Error: needs sudo privilege. Reason: {0}", reason)
            Environment.Exit(3)
            ()
        ()

    let OctalPermissions (file: FileInfo): int =
        let output = SecondElementOf3Tuple(SafeHiddenExec("stat", String.Format("-c \"%a\" {0}", file.FullName)))
        Int32.Parse(output.Trim())

Birçok çözüm tartışıldı ancak sunucu yeniden başlatmalarında kalıcı olacak bir şey bulamıyorum.

Cevabımı sunucu yeniden başlatmalarıyla yapan kısım, / etc / fstab dosyasına yazılmasıdır.

Bu çözümün en iyi yanı, Azure, DigitalOcean, YouNameIt, ...

Keyfini çıkarın!


0
2017-07-07 04:32



"Çok basit" ve ardından 50 satırlık kod bir oksimron gibi görünüyor! - guaka