6

デフォルトの Ubuntu 12.04 LTS は、何らかの理由でスワップを作成しません。インストール後に追加する「適切な」方法はありますか?

root@aux3:/root# df -h
使用されたファイルシステムのサイズ アベイルの使用% マウント
/dev/xvda1 8.0G 1.4G 6.3G 18% /
udev 1.9G 12K 1.9G 1% /dev
tmpfs 751M 188K 750M 1% /実行
なし 5.0M 0 5.0M 0% /run/lock
なし 1.9G 0 1.9G 0% /run/shm
/dev/xvdb 394G 79G 296G 21% /mnt

root@aux3:/root# swapon -s
ファイル名
root@aux3:/root# free -m
             キャッシュされた使用済みの空き共有バッファの合計
メモリ: 3750 3730 20 0 75 3433
-/+ バッファ/キャッシュ: 221 3528
スワップ: 0 0 0
root@aux3:/root#

更新:スワップファイルを介して一時的な解決策を見つけました:

(私はまだ「適切な」方法を探しています)

dd if=/dev/zero of=/mnt/swap1 bs=1024 count=4M
mkswap /mnt/swap1
chown root.root /mnt/swap1
chmod 600 /mnt/swap1
swapon /mnt/swap1
4

5 に答える 5

9

私はこの問題を自分で理解するのに 1 日の大部分を費やしました。また、ayurchen のリンクを引き上げるには Google キャッシュ検索が必要だったため、ayurchen の非常に役立つ回答を参考にして、もう少し詳細なウォークスルーを投稿したいと思いました。

スワップ領域とは何ですか? なぜ使用するのですか?

スワップ領域は、実際の物理メモリが混雑し始めたときに、メモリからオブジェクトを格納するために Linux (および他のほとんどのオペレーティング システム) によって使用されるディスク領域です。ディスクは一般にメモリよりも遅いため、Linux は最近使用されていないオブジェクトを最初にスワップに格納し、できるだけ多くをメモリに保持します。一般に、可能であれば、メモリと同じサイズのスワップ スペースを用意することをお勧めします。スワップ領域の詳細については、こちらを参照してください

これはどこに設定すればよいですか?

私も最初に使用した Ubuntu 12.04 LTS AMI は、ストレージ デバイスのサイズと数が異なる可能性があるため、最初はスワップ スペースなしで構成されています。ただし、ほとんどの場合、大容量の無料一時ストレージ デバイスが自動的に付属しています。S3 ストレージはコストによって制限されるため、エフェメラル ドライブはスワップ ファイルに適した場所です。私のものは、質問に記載されているデバイス名と同じ/dev/xvdbですが、インスタンスの起動時にこれを構成できます。

エフェメラル ストレージ ドライブにスワップ領域を設定するにはどうすればよいですか?

スワップ領域は、単一のファイルまたはデバイスのパーティションに設定できます。ファイルはディスク上の隣接していないブロックで表すことができますが、パーティションは隣接するブロックの事前定義されたセットです。ディスクの読み取り/書き込みは高速であるため、読み取りヘッドを長距離移動し続ける必要がないため、パーティションを使用するとパフォーマンスが向上します。(これが、上記の質問がファイルを一時的な解決策として使用することを軽視している理由です。)

Linux には、fdisk、sfdisk、parted など、ディスク パーティションを管理するための多くのプログラムが付属していsfdiskます。シェル スクリプトから必要なすべての引数を受け入れることができるため、 を使用します。インスタンスを「停止」するたびに一時ストレージが失われるため、これは重要です。したがって、インスタンスが開始されるたびに自動的に実行されるスクリプトをファイルに設定します/etc/rc.local

# Unmount the drive in-case it is already mounted. Umount throws an error if
# it wasn't mounted, so we add || : to continue the script in that case
umount /dev/xvdb || :

# Each line below is a partition (4 maximum master partitions for this partition 
# type). Can can generally use the default arguments, supplying only the amount
# of space we want in blocks (512 came out to ~4gb for me), and the partition
# type (82 for swap, 83 for general linux is default). This will create:
# dev/xvdb1 with 1024 blocks
# dev/xvdb2 with the remainder of the disk
sfdisk /dev/xvdb << EOF
,512,82
;
;
;
EOF

# Now we format the swap partition:
mkswap /dev/xvdb1

# And the remainder. You can choose amoung the various filesystem types, but
# make sure you have the necessary formatter installed. To check, ls /sbin/mk*
mkfs.ext4 /dev/xvdb2

最後に、マウント情報を に含めることを好みました/etc/fstab。これは、利用可能なさまざまなデバイスを自動的に処理する方法を規定する Ubuntu のシステム ファイルです。また、起動時に実行されます。

/dev/xvdb1      swap    swap    sw,nobootwait      0 0
/dev/xvdb2      /mnt2   ext4    defaults,nobootwait        0 0

nobootwait オプションは、Ubuntu がブート時にハングしないようにするためのものです。回復。"

/mnt2これを mkdir でマウントする予定の場所または場所にフォルダーを作成してください。

これで発生している問題をデバッグするにはどうすればよいですか?

rc.local スクリプトをsudo /etc/rc.local実行して、問題がないかどうかを監視できます。sudo fdisk -l実行後に新しいパーティションが表示されるはずです。問題がなければ、デバイスを でマウントしてみてくださいsudo mount /dev/xvdb1。これにより、fstab に保存した構成が使用されます。それでもうまくいかない場合は、マウント パラメータをいじってみて、それに応じて fstab を調整してください。

于 2013-11-05T05:57:39.407 に答える
3

おそらくあなたはこれを探しています:http://inprvt.com/index.php/blogs/entry/how-to-add-swap-space-on-a-linux-based-ec2-server

2番目のアプローチを参照してください。エフェメラルストレージデバイスを再パーティション化する必要があります。私はこれらの線に沿って/etc/rc.localに何かを置きます:

umount /dev/xvdb # in case it is already mounted
sfdisk /dev/xvdb << EOF
,1024,82
,
;
;
EOF
mkswap /dev/xvdb1 && swapon /dev/xvdb1
mkfs.xfs -f /dev/xvdb2 && mount /dev/xvdb2 /mnt

注意すべき2つのこと:

  • 上記の1024はブロック単位のサイズです(82はLinuxスワップパーティションタイプです)。インスタンスごとにブロックサイズが異なる可能性があるようです(デバイス名と同じように)。したがって、最初に実験するか、sfdiskの出力に基づいて適切なものを計算してください。
  • mkfs.xfsは通常数秒かかります。mkfs.ext4は30分かかる場合があります(1TBボリュームの場合)。選択したファイルシステムに応じたYMMV。
于 2012-12-28T19:56:36.053 に答える
1

最初にセットアップしましたswapspace(ソースからビルドする必要がありました) が、運用環境でメモリをより細かく制御したいので、手動のソリューションにフォールバックすることにしました。

/etc/fstab2 つのインスタンス ブロック デバイスのマウントがas/.inst0およびで既に構成されていると仮定します/.inst1

に次のようなものを追加し/etc/rc.localます。

setup_swap()
{
  for D in /.inst0 /.inst1; do
    findmnt $D || continue
    cd $D || continue
    test -r swapfile || dd if=/dev/zero of=swapfile bs=1M count=12292
    chmod 600 swapfile
    mkswap swapfile
    swapon swapfile
  done
}

setup_swap

このコードは、EC2 インスタンス ストレージ (インスタンスを停止するたびに破棄される、別名 SSD、別名「エフェメラル」) と完全に互換性があり、再起動に適しています。

スワップファイルの作成や有効化にはしばらく時間がかかることに注意してください。:)

于 2016-02-26T01:07:31.857 に答える
1

必要に応じてスワップファイルを作成および削除するスワップスペースデーモンが見つかりました。スワップファイルをエフェメラル ドライブに保存するには、少し調整する必要がありました。

これは私には最もエレガントなソリューションのようです:

DEBIAN_FRONTEND=noninteractive apt-get -y install swapspace
echo 'swappath="/mnt"' >> /etc/swapspace.conf
service swapspace restart
于 2014-02-07T13:00:12.617 に答える
0

起動時にスワップを有効にするには (上記の手順に従ってスワップ ファイルを作成した後)、次のエントリを /etc/fstab に追加します。

/mnt/swap1 swap swap defaults 0 0
于 2013-02-13T22:55:15.940 に答える