Systemdインストールデバイスとsystemctl呼び出しを使用して、次のコマンドシーケンスを表現したいと思います。
# mount /some/path /some/mountpoint -o ro
# mount /some/mountpoint -o remount,rw
# touch /some/mountpoint/foo # placeholder for write action
# mount /some/mountpoint -o remount,ro
概念的な問題は、systemd.mount(5)がマウントポイントで実行されることです。セルは完全なパスを systemctl に渡してアクティブになるため、同じマウントポイントに複数のセルをインストールすることはできません。テンプレートは取り付け装置には適していません。
それでは、どのように機能しますか?可能ですか?
答え1
インストールデバイスの代わりにサービスデバイスを使用する
mountコマンドを使用する簡単な使い捨てサービスデバイスは、私の再マウントユースケースに適しています(あなたのユースケースにも効果があると思います)。
通常、マウントがすでに定義されており、/etc/fstab
fstabエントリがsystemdによって自動的に生成されることを考慮すると、<mountpoint>.mount
2つのアプローチがあります。
- インストールユニットの代わりに標準サービスユニットに戻り、インストールコマンドを直接制御するだけです。
- systemdオーバーライドを試してみますか? (テストされておらず、実行可能とは見なされません)
- デバイスをマウントするには厳しい要件があります。つまり、マウントポイントに基づいてデバイス名を指定します。したがって、同じマウントポイントに対して2つの別々のマウントデバイスを実行することは不可能かもしれません(質問で言及されています)。
- したがって、fstabで生成された元のマウントデバイス定義を上書きして2回実行しないと仮定すると、再マウントすると機能しない可能性があります。
- 試してみると、まだインストールされていないアイテムに再インストールオプションが適用されるため、元のインストールが失敗する可能性があります。
はい
同様のものが必要で、systemdを使用してユニットタイプをインストールしようとしたときに、次の問題に遭遇しました(マウントポイントに基づいてユニットファイル名を定義していないため):
Where= setting doesn't match unit name. Refusing.
より多くのスペースを持つデータディレクトリにバインドマウントを実行したが、親マウントポイントにnosuidとnodevが設定されている場合は、/ var / lib / lxcにlxcのsuidおよびdev権限を追加する必要があります。
サービス単位ファイル/etc/systemd/system/lxc-remount.service
:
[Unit]
Description=Remount the /var/lib/lxc folder with suid and dev privileges
Requires=var-lib-lxc.mount
After=var-lib-lxc.mount
Before=lxc.service
[Service]
Type=oneshot
ExecStart=/bin/mount -o remount,rw,suid,dev,relatime,discard,data=ordered /var/lib/lxc
[Install]
WantedBy=lxc.service
これを効果的に実行するコマンド:
$ sudo systemctl daemon-reload
$ sudo systemctl enable lxc-remount.service
Created symlink from /etc/systemd/system/lxc.service.wants/lxc-remount.service to /etc/systemd/system/lxc-remount.service.
$ sudo systemctl start lxc-remount.service
答え2
これは技術的にsystemd
この機能は、マウントユニットの上部に実装できます。だから、単に「いいえ」と答えることはできません。このアプローチにはいくつかの欠点がある。
一方、コマンドを使用して再インストール部分を実行すると、「systemdを使用したデバイスのインストール」を除くすべての要件を満たすことができますmount
。人々は通常systemd
このコマンドを使用するのが好きですmount
。たとえば、一時マウント解除ファイルシステムを使用している場合、システムumount
マウントデバイスはとマークされますinactive
。mount
ファイルシステムを手動でマウントすると、systemdはそのための一時マウント単位を生成します。 (ユニットを作成しません。文書)。
だから実際にmount
再インストール操作を実行するには、このコマンドを使用することをお勧めします。
この質問を読んでいて、このmount
コマンドを使用しないでください他の理由がある場合は、新しい質問をしてその理由を指定してください。そのような理由がわからない場合は、実際に次の方法を使用しないことをお勧めします。これは教育目的にのみ使用されます。
Options=
取り付け単位の設定を変更したら、systemctl reload
取り付け単位を変更する必要があります。
に含まれているファイルを使用してこれを実行できるため、/run/systemd/system/
ディスク構成を編集する必要はありません。システムが途中でクラッシュしても、古い構成が残る危険はありません。
しかし、それほど「きれい」ではありません。それでも危険があります。注文する途中で中断され、古い構成が残っている可能性があります。二つplace - カーネルのマウント状態と systemd のマウント状態です。それにもかかわらず、それを使用するときの最初の問題は残りますmount
。しかし、これは最初の問題を解決し、2番目の問題は忘れる可能性があることを意味します。その後、2番目の質問は後で多くの混乱を引き起こす可能性があります。
参考までに、挿入ファイルを作成するかユニットファイルを編集するときは、インストールユニットを再ロードする前に新しい値を取得するために実行する必要がありますsystemctl daemon-reload
。Option=
2番目の問題は次のとおりです。少なくともまだ使用をお勧めしません。 systemctl daemon-reload
少し重い仕事です:-)。運が悪いと、望ましくない副作用が発生する可能性があります。ある時点では、個々の単位ファイルを再ロードするためにいくつかのコードが追加されましたが、利用可能な機能で文書化されたことを見たことがありません。
(また、特別なユニットディレクトリの1つが /run/systemd/system.control/
「dbus APIを使用して作成された一時的な設定」として説明されていることを確認しました。これは、リソース制御設定やその他の設定の変更を追跡するために使用されると思います。で、変更を使用して作成されましたsystemctl --runtime set-property
。
答え3
なぜスクリプトを使用しないのですか?編集できるようにシステムの一時停止をどのように設定しますか?
私の考えでは、次のスクリプトがあなたにとってとても良いと思います。
#!/bin/bash
mount /some/mountpoint -o remount,rw
bash
# do some editing
# touch /some/mountpoint/foo # placeholder for write action
exit the shell/ctrl-d
mount /some/mountpoint -o remount,ro