電源障害後(またはG3状態から)のWake On Lan

Wake-on-LAN(WOL、英語からの翻訳-「ローカルネットワークからの信号」)は、ローカルエリアネットワークを介して特別なバイトシーケンスを送信することにより、コンピューターをリモートでオンにできる技術です。 ウィキ


そして、一つのことではないとしても、すべてがうまくいくでしょう。 電源障害の後、コンピューターの電源は入りません。

同意します、特にあなたがそれから数千キロ離れている場合、これは「楽しい」驚きになります。

1つのソリューションがここに記述されていますが、それはハードウェアとソフトウェアであり、追加のハードウェアなしで実行できます。



HabréのWOLについては、すでに2ページあります 。 したがって、カードにwolを含めることは、この記事では考慮されません。



はじめに



まず、コンピューターの電源が入らない理由を見てみましょう。 これを理解するには、ACPIに目を向ける必要があります。

ACPI-英語 高度な設定と電源インターフェイス)。 ACPIは、状態(特にグローバルデバイスと特定デバイスの両方)を記述します。 ( wiki



画像



2つのグローバルな状態に関心があります。



残念ながら、電源が接続されると、システム自体はG3からG2に移行しません。

したがって、停電後に起動できるようにするには、コンピューターをG3からG2に転送する方法を学ぶ必要があります。



ほとんどの[新しい] BIOSには、[停電後]オプションがあります。 次の3つの値のいずれかを取ることができます。



画像



「オンにする」を選択すると、残っている唯一の質問は、ケースのボタンによるネットワーク要求または通常の開始からではなく、停電後にコンピューターをオンにする方法です。 これらのチェックはinitrdで行います。



Initrd(英語の略。初期RAMディスク、初期初期化用のランダムアクセスメモリ内のディスク)は、Linuxカーネルがブート中に使用する一時ファイルシステムです。 ( wiki_en )( wiki_en


Ubuntu / Debianでのinitrdのファイルの場所は、initramfs-toolsのmanで見つけることができます( Ubuntu Webサイトからオンラインで )。

Centosの場合、すべてが少し異なります-ドラカットがあります。



コンピューターがオンになったことを確認するために、wolパケットを送信した後、pingを実行します。 しかし、WOLパッケージは「魔法」なので、pingも「魔法」にしましょう。 pingのサイズを84ではなく48バイトにします。



フローチャートの形でアイデア全体を合計します。

画像



実装



モジュール


/ etc / initramfs-tools / modulesで、iptablesとネットワークに必要なモジュールを追加します。



ネットワークカードのモジュール


r8169 (    )
      
      





iptablesモジュール


 xt_length iptable_filter ip_tables x_tables
      
      





スクリプト


/ etc / initramfs-tools / scripts / local-topで、checkbootファイルに内容を追加します:



 #!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac [ `cat /proc/cmdline | grep nocheckboot | wc -l` -eq 1 ] && exit 0 iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 48 -j ACCEPT modprobe r8169 ifconfig eth0 192.168.0.2 up sleep 3 C=`iptables -L INPUT -v | grep 'icmp echo-request length 48' | cut -f5 -d' '` [ $C -gt 0 ] && exit 0 poweroff -f exit 0
      
      





そして、それを実行可能にします:



 chmod +x /etc/initramfs-tools/scripts/local-top/checkboot
      
      





スクリプトは上記のフローチャートを実装します。



フック


/ etc / initramfs-tools / hooksで、次の内容のcheckbootファイルを追加します。



 #!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case $1 in prereqs) prereqs exit 0 ;; esac cp /sbin/ifconfig "${DESTDIR}/sbin" cp /sbin/iptables "${DESTDIR}/sbin" cp /lib/libip4tc.so.0 "${DESTDIR}/lib" cp /lib/libip6tc.so.0 "${DESTDIR}/lib" cp /lib/libxtables.so.7 "${DESTDIR}/lib" cp /lib/i386-linux-gnu/i686/cmov/libm.so.6 "${DESTDIR}/lib" mkdir "${DESTDIR}/lib/xtables" cp "/lib/xtables/libipt_icmp.so" "${DESTDIR}/lib/xtables" cp "/lib/xtables/libxt_length.so" "${DESTDIR}/lib/xtables" cp "/lib/xtables/libxt_standard.so" "${DESTDIR}/lib/xtables" exit 0
      
      





そして、それを実行可能にします:



 chmod +x /etc/initramfs-tools/hooks/checkboot
      
      





このファイルは、スクリプトが正しく機能するためにinitrdに追加する必要があるものを示します。

その中で、iptablesおよびifconfigユーティリティをコピーした後、iptablesのライブラリもコピーする必要があります。

リンクライブラリは、 ldd / sbin / iptablesを実行して取得できます。

ただし、このプロセスでは、動的にロードされるモジュールも使用されます。 次のコマンドを実行すると、リストを表示できます。



 # strace iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 48 -j ACCEPT 2>&1 | grep ^open | grep '.so' | grep -v ENOENT | grep -o '"[^"]*"'
      
      





ロードされた他のライブラリを受け取ることができるもの:



 "/lib/xtables/libipt_icmp.so" "/lib/xtables/libxt_length.so" "/lib/xtables/libxt_standard.so"
      
      





initrdを更新する


initrdをアップグレードする前に、安定版を別の名前で/ bootにコピーすることをお勧めします。これにより、スクリプト/フックにエラーが発生した場合でも、システムのロードは難しくありません。

次のコマンドでinitrdを更新します。



 # update-initramfs -u
      
      





グラブ


nocheckbootを使用してgrubに新しい行を追加します。

これを行うには、/ boot / grub / grub.cfgを直接編集して、カーネルへのパラメーター行にnocheckbootを追加して新しい項目を作成するか、/ etc / grub.d / 10_linuxを変更します。 grub.cfgを編集すると起こります。



これを行うには、/ etc / grub.d / 10_linuxを追加します。



  linux_entry "${OS} nockeckboot" "${version}" simple \ "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT} nocheckboot"
      
      





後:



  linux_entry "${OS}" "${version}" simple \ "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}"
      
      





そしてそれから:



 # update-grub2
      
      





打ち上げ



起動スクリプトを記述するだけです。

そして、ここに彼は:



 !#/bin/sh wol -i 192.168.0.255 {MAC} ping -s 20 -c 50 -W 1 192.168.0.2
      
      





ここで、「-c 50」は1秒あたり1パケットの50パケットです。つまり、50秒が「iptablesルールカウンターの確認」に進むすべてのステップの時間です。 「-s 20」は、パケットサイズを48バイトに等しくします。 48-20 = 28バイト-IPおよびイーサネットヘッダー。



結論の代わりに



これですべて、停電による自動車へのアクセスが失われることはなくなりました。

もちろん、ここでもUPSについて話すことができますが、タスクはUPSを使用せずに解決策を見つけることでした。

このようなスキームは、コンピューターへのアクセス(データへのアクセス、計算の実行)が必要な場合に役立ちます。ほとんどの場合、コンピューターはオフ状態になって待機します。



All Articles