電源障害後(または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を使用せずに解決策を見つけることでした。
このようなスキームは、コンピューターへのアクセス(データへのアクセス、計算の実行)が必要な場合に役立ちます。ほとんどの場合、コンピューターはオフ状態になって待機します。

Source: https://habr.com/ru/post/J206910/


All Articles