fstabのsshfs:異なるネットワーク上で同じサーバーアドレスを指定する

fstabのsshfs:異なるネットワーク上で同じサーバーアドレスを指定する

ホストとクライアント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

その後、以下のように各サービスとインストールに複数のサービスがあります。

  1. 内部ネットワークの場合:

    /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,...
    
  2. 外部ネットワークの場合:

    /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,...
    

したがって、注文は次のようになります。

  1. 両方のマウントポイントはPartOfそれぞれの検査サービスです。したがって、チェックサービスが停止または再起動されると、インストールも停止または再起動されます。
  2. 両方のスキャンサービスは独自のマウントを必要とします(したがってそれを開始するとマウントも開始されます)、マウントは開始されるまで開始されません。
  3. 両方の検査サービスが必要で、後で開始されますNetworkManager-wait-online。 Ubuntuでは、特定のネットワークデバイスがオンラインになるまで待つ必要があります。
  4. サービスが互いに競合していることを確認してください(あるサービスを開始したら別のサービスを停止してください)。
  5. 最初の検査が失敗すると、別の検査が開始されます。
  6. 内部ネットワークチェックはデフォルトで有効になっています(WantedBy=default.target)。
  7. どちらのテストも、RemainAfterExit=yesスキャンコマンドが終了した後もアクティブな状態を維持して停止しないようにします(この場合は必要ですType=oneshot)。マウントを停止するには失敗または停止する必要があります。

その後、プロセスは次のようになります。

  1. ネットワークがオンラインになると、内部IPチェックが開始されます。
  2. 正常に完了すると、内部インストールが開始され、正常に実行されます(それ以外の場合は停止PartOfします)。
  3. これが失敗すると、外部IPの確認が開始されます。したがって、点検後に外部マウントを稼働させる必要があります。

ネットワークを切り替えると、そのスキャンサービスを開始して他のサービスを削除できます。

ここで依存関係を処理する必要がありますが、これが良い出発点になることを願っています。

1つの潜在的な変更点:andの代わりにorを使用し、Type=oneshotネットワークが正しいことを定期的に確認するコマンド(シェルループなど)がある可能性があります。RemainAfterExitType=simpleType=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行だけ使用すると、MyServerAliasSSH層が自動的に正しいSSH URIに接続されます。

Match一連のシェルコマンドをリンクしてシェルチェーンが返されたときにのみ、次のブロックの行を適用できるキーワードに魔法がありますtrue

たとえば、マッチラインでexec "timeout 0.4 nc -z %h %p 2>/dev/null"MyServerAliasのローカルIPとポートが接続可能かどうかを確認できます。

ssh以来続けるmatch

afuse+sshfs自動インストーラによる設定システム化されたユーザー単位(または~/.profile経由)はラップトップでの使用に適しています。 (そして遊び心のあるベッドfstab

Matchこのキーワードに関する詳細情報を含むブログ投稿は次のとおりです。

関連情報