「systemctl mask」と「systemctl disable」の違いは何ですか?


35

起動時にプリマスサービスを無効にすることで、Ubuntu GNOME 16.04の起動時間を改善したいと考えています。さまざまなWebサイトでそれを行う方法に関する2つの答えを見つけました。

# systemctl disable plymouth-quit-wait.service 
# systemctl mask plymouth-quit-wait.service 

私はそれらが何をするかを知らない限り、上記のいずれも実行できません。


回答:


52

サービスがの場合、enabledどこかにシンボリックリンクがあります

/etc/systemd/system

ほとんどの場合、どこかにあるユニットファイルに

/lib/systemd/system

役立つのはenable、サービスの場合、作成されたリンクとターゲットの完全なパスが標準出力に出力されることです。

サービスを無効にすると、シンボリックリンクが削除されるため、ユニットファイル自体は影響を受けませんが、次のブート時、systemdの読み取り時にサービスはロードされません/etc/systemd/system

ただし、無効なサービスロードできそれに依存するサービスが開始されると開始されます。enableそしてdisable唯一のconfigure自動起動ユニットの動作、および状態を容易に上書きされます。

マスクされたサービスは、その単位のファイルへのシンボリックリンクであるものです/dev/null。これにより、別の有効なサービスで必要な場合でも、サービスをロードすることが「不可能」になります。

あなたの場合はmaskサービス、シンボリックリンクが作成されたから/etc/systemd/system/dev/null他の場所でそのままオリジナルのユニットファイルを残して、。いつunmaskシンボリックリンクが削除されたサービス。

ただし、これらのコマンドが常に尊重されるわけではないことに気付きました。

ほとんどのサービスをマスクしようとすると失敗します。

$ sudo systemctl mask bluetooth.service
Failed to execute operation: Invalid argument

もちろん、最初にサービスを停止しました。@Anwarは、マスキングは重要でないサービスでのみ可能であることを示唆しています。

自分でマスクしない限り、マスクされたサービスのマスク解除も失敗します(サイレント)。私は信じてへのシンボリックリンクの形を除いて、サービスの任意の場所にはユニットファイルが存在しないため、これは/dev/null、この時点では、/lib/systemd/system

$ file $(locate fuse.service)
/lib/systemd/system/fuse.service: symbolic link to /dev/null
$ sudo systemctl unmask fuse.service
$ systemctl status fuse
● fuse.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

この問題を抱えているのは私だけではありません

実際にマスクされたサービスx11-commonのマスクを解除するには、とへのシンボリックリンクを削除する必要が/dev/nullありましたsudo apt-get install --reinstall x11-common && sudo systemctl daemon-reload。クエリを実行するとsystemctl status x11-common、緑色の丸いサービスが表示され、ユニットファイルはありませんが、ロードされてアクティブ(終了)になっています。

詳細については、Systemctlの使用方法に関するこの記事を参照してください


1
うーん、私は得るsystemctl status x11-common ● x11-common.service Loaded: masked (/dev/null; bad) Active: inactive (dead)。それは悪いですか?しかし、私はUbuntuではなくDebianを使用しています。とにかく、いい説明。ありがとうございました。
ファヒムミサ

@FaheemMithaサービスが必要かどうかわかりません-私のシステムはそれなしでも動作するようです。Debianの経験はありませんが、ごめんなさい!
ザンナ

17

とても簡単です。

  • systemctl startsystemctl stop:問題のユニットをすぐに開始(停止)します。
  • systemctl enablesystemctl disable起動時に自動起動するユニットをマーク(マーク解除)します(ユニット固有の方法、[Install]セクションで説明)。
  • systemctl masksystemctl unmask:問題のユニットを開始するすべての試みを許可しません(許可します)(手動で、またはデフォルトのブートターゲットの依存関係を含む他のユニットの依存関係として)。systemdでの自動起動のマーキングは、デフォルトの起動ターゲットから問題のユニットへの人為的な依存関係を追加することで実装されるため、「マスク」も自動起動を許可しないことに注意してください。

参考文献:systemctl(1)

その他:Lennart Poettering(2011-03-02)。 「オフの3つのレベル」管理者用のsystemd。0pointer.de。



6

要するに、

  • disable起動中にユニットを無効にします。ただし、そのユニットは起動後いつでも開始できます。

  • maskユニットを完全に無効にします。マスクを解除せずに起動することはできません。これは、起動時に失敗することを自動的に意味します。


私は興味がmaskありunmaskます- あなたのために働きますか?(テストしたくない場合は完全に理解しています!)
ザンナ

1
@Zannaはい。それは動作します。私は以前にテストしたことがあります。postgresql@9.5-main.serviceサービス。
アンワー

うーん、なぜそれが私にとってうまくいかないのかを考え出す必要があります。私は私だけではないことを知っている
ザンナ

クリティカルでないサービスで機能する可能性があります。まだ新しいと思います。ところで、あなたの答えはより有益でした。それは役に立ちました
アンワー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.