Làm cách nào để tạo một trao đổi cho Azure Ubuntu VM?


9

Tôi đã đọc khá nhiều bài viết về điều này, nhưng tôi vẫn không chắc chắn về cách tiếp cận chính xác, giả sử:

  1. Tôi có máy ảo Ubuntu 14.04 LTS mặc định được tạo bởi và chạy trên Azure, không đi kèm với trao đổi

  2. Tôi muốn tạo một trao đổi bằng cách sử dụng bộ lưu trữ VM hiện có, thay vì tạo một đĩa mới bằng cách sử dụng bộ nhớ bổ sung

Bài viết tôi đã đọc:

Nhiều giải pháp đã được thảo luận nhưng dường như tôi không thể tìm thấy một giải pháp nào sẽ tồn tại trong quá trình khởi động lại máy chủ (có lẽ do đám mây có ý tưởng riêng về phân vùng hình ảnh), ai đó có thể tư vấn cho tôi cách thực hành tốt nhất không?

Câu trả lời:


8

Giả sử rằng bạn đã cài đặt Linux Agent. Tất cả bạn phải làm là để cho phép trao đổi dưới /etc/waagent.conf. Đây là những dòng có liên quan:

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.

Nó sẽ tự động sử dụng đĩa tài nguyên (đi kèm với mọi VM) để tạo trao đổi. Không cần phải tạo đĩa cho nó.

Cập nhật : Bạn cũng cần thực hiện các bước bên dưới để tạo tệp hoán đổi:

umount /mnt
service walinuxagent restart

Việc cung cấp ổ đĩa được kiểm soát bởi Cloud init trên Ubuntu, không giống như các bản phân phối khác. Vì vậy, không, điều này không hoạt động, và cả doc và thử nghiệm của tôi đều xác nhận nó.
bitinn

2
Tôi đã liên hệ với bộ phận hỗ trợ của MS và tìm thấy giải pháp là thiết lập ResourceDisk.Format, ResourceDisk.EnableSwapResourceDisk.SwapSizeMB. NHƯNG bước quan trọng là làm một hướng dẫn sudo service walinuxagent restartđể tạo tệp hoán đổi, vì chỉ cần khởi động lại máy chủ không hoạt động đối với tôi.
bitinn

Tôi vẫn đang hỏi về cách Cloud init tìm hiểu tất cả những điều này, bởi vì các bình luận doc và waagent.conf của họ bị sai lệch.
bitinn

Vâng Tôi xin lỗi. quên bao gồm các đại lý khởi động lại. Tôi đã thử nghiệm trên Ubuntu vm của tôi và làm việc mà không gặp vấn đề gì. Tôi đã cập nhật câu trả lời. Về cloud-init, tôi không nghĩ nó có liên quan gì đến việc tạo ra tệp hoán đổi vì tác nhân tạo tệp trong phân vùng ext4 (/ mnt). Nó không tạo ra một phân vùng trao đổi.
Bruno Faria

2
Không hoạt động trên Ubuntu 14.04 LTS VM, được tạo từ hình ảnh Thư viện Azure. Sau khi thực hiện tất cả các bước, swapon -svẫn hiển thị danh sách trống các tệp hoán đổi.
JustAMartin

2

Câu trả lời của Bruno là một điểm khởi đầu tuyệt vời, nhưng nó chỉ hoạt động sau khi tôi khởi động lại và cho nó thêm một phút sau khi khởi động.

a. Cho phép trao đổi trong /etc/waagent.conf, các dòng có liên quan:

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. Thực hiện như sau với quyền root, bao gồm khởi động lại máy của bạn:

umount /mnt
service walinuxagent restart
reboot

c. Sau khi khởi động, nó vẫn sẽ mất một thời gian trước khi trao đổi thực sự được kích hoạt. Bạn có thể kiểm tra nó với swapon -s.


1

Tôi tin rằng cách đúng đắn để làm điều này sao cho cả đám mây khởi xướng và người chơi trò chơi 'tốt đẹp' cùng nhau (từ tài liệu Azure-init Azure ) là giữ các giá trị này được đặt thành này

# 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

Tôi đã thử thay đổi điểm gắn kết nhưng có vẻ như nó không hoạt động chính xác nên các tài liệu có thể chính xác về các giá trị

Và sau đó bạn có thể tùy chỉnh các tùy chọn trao đổi theo ý muốn

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

# Size of the swapfile.
ResourceDisk.SwapSizeMB=8192

Một khởi động lại cơ bản nhặt lên tiền phạt trao đổi mới

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

0

Tôi đã đọc khá nhiều bài viết về điều này, nhưng tôi vẫn không chắc chắn về cách tiếp cận chính xác, giả sử: 1. Tôi có một máy ảo Ubuntu 14.04 LTS mặc định được tạo bởi và chạy trên Azure, không đi kèm với trao đổi 2. Tôi muốn tạo một trao đổi bằng cách sử dụng bộ lưu trữ VM hiện có, thay vì tạo một đĩa mới bằng cách sử dụng bộ nhớ bổ sung

Tôi cũng cần điều này (thực ra là 16.04 thay vì 14.04, nhưng câu trả lời của tôi sẽ áp dụng cho cả tôi nghĩ).

Bài viết tôi đã đọc:

Nhưng khi tôi thấy tôi phải đọc những bài luận dài mà bạn chỉ ra, tôi sẽ bỏ cuộc ... Nhưng đột nhiên tôi nhớ ra một bài viết rất đơn giản trên blog của DigitalOcean:

Cách thêm hoán đổi trên Ubuntu 14.04

Thật đơn giản đến nỗi tôi thậm chí đã viết một kịch bản cho nó (ít nhất là cho phần hay nhất, chưa phải là cài đặt swappiness và các nội dung nâng cao khác):

#!/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))

Để các công việc trên hoạt động, sudo apt install fsharptrước tiên bạn cần phải có (ít nhất Ubuntu 16.04 có fsharp trong kho, không chắc chắn về 14.04).

Ngoài ra, bạn cần InfraTools.fstập tin này :

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())

Nhiều giải pháp đã được thảo luận nhưng dường như tôi không thể tìm thấy một giải pháp nào sẽ tồn tại trên các máy chủ khởi động lại

Phần làm cho câu trả lời của tôi hoạt động thông qua khởi động lại máy chủ là tệp ghi vào / etc / fstab.

Điểm hay của giải pháp này là nó sẽ hoạt động trong Azure, DigitalOcean, YouNameIt, ...

Thưởng thức!


2
"Thật đơn giản" theo sau là 50 dòng mã có vẻ hơi oxymoron!
kqw

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.