ホストとクライアントUbuntu 19.04。 SSHを開く
私の家のLANにSSHサーバーがあり、LANネットワークアドレスを使用してラップトップにインストールしました。週末に休暇を取って、ルーターの外部IPアドレスを介してマウントするようにfstabを変更する必要がありました。
私のルーターはループバックをサポートしていないので、LANにいるときに外部IPを使用することはできません。
私のアプローチはfstabに2つの部分を維持することです。 1つはLAN用、もう1つは外部IP用です。それから私の位置に合わせてfstab行をコメントアウトしました。
もっと良い方法があるのだろうか。
私できる両方のセクションを開いたままにします。nofail
起動プロセスが中断されないようにこのオプションを使用しますが、起動速度が非常に遅くなります。 sshfsオプションを追加してみましたが、ConnectionTimeout=5
起動時間が改善されませんでした。
明らかに、これは重要な問題ではなく、単にオプションの問題です。いくつかの条件付きインストール?あるいは、タイムアウトを設定することは思ったほど簡単ではないかもしれません。
後で:見回した後:
Archemarとmuruの提案に従って、インストールプロセスを案内するフォークを作成するためにsystemd initを調査しています。
私の理論(純粋に文書の読み取りに基づく推測 - 実験なし)は、オプションを介してmount
その--fstab
場所のfstabにコマンドを送信することです。
場所を設定する1つの方法は、ネットワークデバイスIPを読み取ることです。私のLAN DHCPは10.0.0.120を割り当てます。他のIPアドレスは、LAN外のネットワークに接続されているという強力な表示です。完全に信頼できないが重要ではないアプリケーションには十分です。もっと確実な方法があれば、喜んで聞きたいです。
これで、systemdマウントサービスを探して、systemd initでそのサービスを呼び出す場所を見つけるのが困難になりました。
まず見てみましょう/lib/systemd/
。このディレクトリには、主にシステム実行可能ファイルといくつかのディレクトリが含まれています。これらのディレクトリの1つにはsystem-generators
有望なファイルが含まれていますsystemd-fstab-generator
。実行ファイルだと探していますが、推測するconf
この目的のためにファイル。
これまで私が得たものは次のとおりです。後でもう一度投稿します。その間、ヒント、警告、通知をいただきありがとうございます...
答え1
テストする同等の設定はありませんが、設定は次のように機能すると想像しています。
まず、このマウントから配線を外します/etc/fstab
。
その後、以下のように各サービスとインストールに複数のサービスがあります。
内部ネットワークの場合:
/etc/systemd/system/int-ip-check.service
:[Unit] Description=Check for internal network Type=oneshot Requires=NetworkManager-wait-online.service After=NetworkManager-wait-online.service OnFailure=ext-ip-check.service Conflicts=ext-ip-check.service Wants=int-ip.mount Before=int-ip.mount [Service] ExecStartPre=<command to check for internal network> RemainAfterExit=yes [Install] WantedBy=default.target
/etc/systemd/system/int-ip.mount
:[Unit] Documentation=SSHFS mount (internal IP) PartOf=int-ip-check.service [Mount] Where=/some/path What=user@int-ip:/some/path Type=fuse.sshfs Options=noauto,_netdev,...
外部ネットワークの場合:
/etc/systemd/system/ext-ip-check.service
:[Unit] Description=Check for external network Type=oneshot Requires=NetworkManager-wait-online.service After=NetworkManager-wait-online.service Wants=ext-ip.mount Before=ext-ip.mount [Service] ExecStartPre=<command to check for external network> RemainAfterExit=yes
/etc/systemd/system/ext-ip.mount
:[Unit] Documentation=SSHFS mount (external IP) PartOf=ext-ip-check.service [Mount] Where=/some/path What=user@int-ip:/some/path Type=fuse.sshfs Options=noauto,_netdev,...
したがって、注文は次のようになります。
- 両方のマウントポイントは
PartOf
それぞれの検査サービスです。したがって、チェックサービスが停止または再起動されると、インストールも停止または再起動されます。 - 両方のスキャンサービスは独自のマウントを必要とします(したがってそれを開始するとマウントも開始されます)、マウントは開始されるまで開始されません。
- 両方の検査サービスが必要で、後で開始されます
NetworkManager-wait-online
。 Ubuntuでは、特定のネットワークデバイスがオンラインになるまで待つ必要があります。 - サービスが互いに競合していることを確認してください(あるサービスを開始したら別のサービスを停止してください)。
- 最初の検査が失敗すると、別の検査が開始されます。
- 内部ネットワークチェックはデフォルトで有効になっています(
WantedBy=default.target
)。 - どちらのテストも、
RemainAfterExit=yes
スキャンコマンドが終了した後もアクティブな状態を維持して停止しないようにします(この場合は必要ですType=oneshot
)。マウントを停止するには失敗または停止する必要があります。
その後、プロセスは次のようになります。
- ネットワークがオンラインになると、内部IPチェックが開始されます。
- 正常に完了すると、内部インストールが開始され、正常に実行されます(それ以外の場合は停止
PartOf
します)。 - これが失敗すると、外部IPの確認が開始されます。したがって、点検後に外部マウントを稼働させる必要があります。
ネットワークを切り替えると、そのスキャンサービスを開始して他のサービスを削除できます。
ここで依存関係を処理する必要がありますが、これが良い出発点になることを願っています。
1つの潜在的な変更点:andの代わりにorを使用し、Type=oneshot
ネットワークが正しいことを定期的に確認するコマンド(シェルループなど)がある可能性があります。RemainAfterExit
Type=simple
Type=forking
答え2
これをマウントレベルで透過的に実行し、~/.ssh/config
そのレベルで2つの異なるホスト名にネットワークリダイレクトを実行できます。
~/.ssh/config
インストールユーザーの場合:
Match host MyServerAlias exec "<shell command to return true if in local LAN>"
Hostname Local.IP.or.hostname
Host MyServerAlias
Hostname external.hostname
Port <External Port for SSH-Forward on Home Router>
これにより、インストール時にホスト名を1行だけ使用すると、MyServerAlias
SSH層が自動的に正しいSSH URIに接続されます。
Match
一連のシェルコマンドをリンクしてシェルチェーンが返されたときにのみ、次のブロックの行を適用できるキーワードに魔法がありますtrue
。
たとえば、マッチラインでexec "timeout 0.4 nc -z %h %p 2>/dev/null"
MyServerAliasのローカルIPとポートが接続可能かどうかを確認できます。
ssh
以来続けるmatch
。
afuse+sshfs
自動インストーラによる設定システム化されたユーザー単位(または~/.profile経由)はラップトップでの使用に適しています。 (そして遊び心のあるベッドfstab
)