「Qtの応用 - Systemd」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == サービスとは、PCの起動時に自動的に実行され、バックグラウンドで仕事をするために待機するソフトウェアのことである。<br> <br> 一般的に、サービスはグラフィカルユーザインターフェースを持たず、ユーザの操作無しに動作する。<br> 最もよく知られているサービスは、Web、メール、データベース等のサーバで、Apache、MySQL等がある。<br…」)
 
(文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…)
 
(同じ利用者による、間の7版が非表示)
34行目: 34行目:
== Systemdライブラリのインストール ==
== Systemdライブラリのインストール ==
==== ライセンス ====
==== ライセンス ====
Systemdライブラリのライセンスは、LGPL v2.1以降、または、 GPL 2.0である。<br>
Systemdライブラリのライセンスは、LGPL 2.1以降、または、 GPL 2.0で利用可能である。<br>
<br>
<br>
==== パッケージ管理システムからインストール ====
==== パッケージ管理システムからインストール ====
  # RHEL
  # RHEL
44行目: 45行目:
<br>
<br>
==== ソースコードからインストール ====
==== ソースコードからインストール ====
Systemdのビルドに必要なライブラリをインストールする。<br>
sudo zypper install meson ninja python3-Jinja2 glib2-devel dbus-1-devel p11-kit-devel libarchive-devel pcre2-devel libcurl-devel libcap-devel \
                    libmount-devel libfdisk-devel libblkid-devel libdw-devel libpwquality-devel passwdqc-devel libkmod-devel libbpf-devel \
                    zlib-devel liblz4-devel libzstd-devel xz-devel libbz2-devel \
                    pam-devel libgnutls-devel libopenssl-devel libopenssl-1_1-devel libcryptsetup-devel libgcrypt-devel libgpg-error-devel \
                    qrencode-devel libiptc-devel libidn2-devel libmicrohttpd-devel \
                    libxkbcommon-devel libfido2-devel tpm2-0-tss-devel libseccomp-devel libacl-devel audit-devel \
                    libapparmor-devel  # AppArmorを使用する場合
                    libselinux-devel  # SELinuxを使用する場合
                    xen-devel          # Xenを使用する場合
<br>
[https://github.com/systemd/systemd SystemdのGithub]にアクセスして、ソースコードをダウンロードする。<br>
[https://github.com/systemd/systemd SystemdのGithub]にアクセスして、ソースコードをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
ダウンロードしたファイルを解凍する。<br>
50行目: 62行目:
<br>
<br>
Systemdをビルドおよびインストールする。<br>
Systemdをビルドおよびインストールする。<br>
  mkdir build && cd build
  meson --prefix=<Systemdのインストールディレクトリ> -Dmode=release build
  ninja -C ./build -j $(nproc)
../configure --prefix=<Systemdのインストールディレクトリ>
  ninja -C ./build install
  make -j $(nproc)
  make install
<br><br>
<br><br>


== サンプルコード ==
== サンプルコード ==
<code>QProcess</code>クラスやD-Busを使用せずに、Systemdを利用してSSHデーモンを起動する場合は、Systemdのライブラリを使用する必要がある。<br>
<code>QProcess</code>クラスを使用せずに、Systemdを利用してSSHデーモンを起動する場合は、Systemdのライブラリを使用する必要がある。<br>
<br>
<br>
以下の例では、Systemdのライブラリを使用してSSHデーモンを起動している。<br>
以下の例では、Systemdのライブラリを使用してSSHデーモンを起動している。<br>
# <code>sd_booted</code>関数を使用して、システムがSystemdで起動されているかどうかを確認する。
# <code>sd_bus_open_system</code>関数を使用して、システムバスへの接続を開く。
#: 0を返す場合は、Systemdで起動されていることを示す。
#: 戻り値が負の値の場合は、接続に失敗したことを示す。
#: 0以外を返す場合は、Systemdで起動されていないことを示す。
# <code>sd_bus_call_method</code>関数を使用して、SystemdのD-Busインターフェイスを介してsshd.serviceを起動する。
#: <br>
#: 関数の引数には、バスの接続、D-Busサービス名、D-Busオブジェクトのパス名、インターフェイス名、メソッド名、入力引数、出力引数、起動するサービス名とモードを指定する。
# Systemdで起動されている場合は、<code>sd_service_start</code>関数を使用して、sshd.serviceを起動する。
#: 戻り値が負の値の場合は、サービスの起動に失敗したことを示す。
#: 0を返す場合は、サービスの起動に成功したことを示す。
#: サービスの起動に成功した場合は、成功メッセージをデバッグ出力に表示している。
#: 0以外を返す場合は、サービスの起動に失敗したことを示す。
# <code>sd_bus_unref</code>関数を使用して、バスの接続を閉じる。
#: エラーメッセージを表示して、プログラムを終了する。
# Systemdで起動されていない場合は、エラーメッセージを表示して、プログラムを終了する。
<br>
<br>
このサンプルコードを実行するには、libsystemd-devパッケージがインストールされている必要がある。<br>
このサンプルコードを実行するには、Systemdライブラリがインストールされている必要がある。<br>
また、適切な権限でプログラムを実行する必要がある。<br>
また、適切な権限でプログラムを実行する必要がある。<br>
<br>
<br>
<u>※注意</u><br>
<u>※注意</u><br>
<u>この方法は、Systemdが利用可能なシステムでのみ動作する。</u><br>
<u>この方法は、Systemdが利用可能なシステムでのみ動作する。</u><br>
<br>
* QMakeを使用する場合
<syntaxhighlight lang="make">
# .proファイル
CONFIG    += link_pkgconfig
PKGCONFIG += libsystemd
</syntaxhighlight>
<br>
* CMakeを使用する場合
<syntaxhighlight lang="cmake">
# Package Configの使用
find_package(PkgConfig REQUIRED)
# Systemdライブラリの使用
pkg_check_modules(SYSTEMD REQUIRED libsystemd)
## Systemdライブラリのバージョンを指定する場合
#pkg_check_modules(SYSTEMD REQUIRED libsystemd >= <バージョン>)
target_include_directories(<your_target> PUBLIC
    # ...略
    ${SYSTEMD_INCLUDE_DIRS}
)
target_link_libraries(<your_target>
    # ...略
    ${SYSTEMD_LIBRARIES}
)
</syntaxhighlight>
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  #include <QCoreApplication>
  #include <QCoreApplication>
  #include <QDebug>
  #include <QDebug>
  #include <systemd/sd-daemon.h>
  #include <systemd/sd-bus.h>
   
   
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
86行目: 124行目:
     QCoreApplication a(argc, argv);
     QCoreApplication a(argc, argv);
   
   
     // Systemdライブラリを使用してSSHデーモンを起動
     // Systemdを使用してSSHデーモンを起動
     int ret = sd_booted();
    sd_bus *bus = nullptr;
     if (ret == 0) {
     int ret = sd_bus_open_system(&bus);
       qDebug() << "Running under systemd.";
     if (ret < 0) {
      qDebug() << QString("システムD-Busの接続に失敗: %1").arg(strerror(-ret));
      return -1;
    }
    ret = sd_bus_call_method(bus,
                            "org.freedesktop.systemd1",
                            "/org/freedesktop/systemd1",
                            "org.freedesktop.systemd1.Manager",
                            "StartUnit",
                            nullptr,
                            nullptr,
                            "ss",
                            "sshd.service",
                            "replace");
    if (ret < 0) {
       qDebug() << QString("SSHサービスの開始に失敗: %1").arg(strerror(-ret));
      sd_bus_unref(bus);
   
   
      ret = sd_service_start("sshd.service");
      if (ret == 0) {
          qDebug() << "sshd serviceを開始";
      }
      else {
          qDebug() << QString("sshd serviceの開始に失敗: %1").arg(strerror(-ret));
          return -1;
      }
    }
    else {
      qDebug() << "Not running under systemd.";
       return -1;
       return -1;
     }
     }
    qDebug() << "SSHサービスの開始に成功";
    sd_bus_unref(bus);
   
   
     return a.exec();
     return a.exec();
110行目: 158行目:
<br><br>
<br><br>


{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]

2024年10月14日 (月) 11:01時点における最新版

概要

サービスとは、PCの起動時に自動的に実行され、バックグラウンドで仕事をするために待機するソフトウェアのことである。

一般的に、サービスはグラフィカルユーザインターフェースを持たず、ユーザの操作無しに動作する。
最もよく知られているサービスは、Web、メール、データベース等のサーバで、Apache、MySQL等がある。

また、ハードウェアの検出やUSBメモリの自動統合(マウント)等もサービスによって行われる。

サービスには、システム起動時に関連するタスクやハードウェアに関連するタスクを行う"内部サービス"と、
その後にユーザがインストールするサービス(通常は全てのサーバサービスを含む)の2種類がある。

技術用語やコンピュータ用語では、サービスは伝統的にデーモンと呼ばれている。
そのため、サーバコンポーネントであるsshdやmysqldのように、サービスを表すプログラムの最後の文字として"d"が用いられることが多い。

一方、Systemdは、システムおよびセッションマネージャ(initシステム)であり、
コンピュータの起動プロセスからシャットダウンまでの全動作時間にわたって、システム上で動作するすべてのサービスを管理する役割を担っている。

プロセスは常に(可能な限り)並行して起動され、起動プロセスを可能な限り短くする。
ここで、.serviceで終わる設定ファイルを作成して、Systemdが制御・監視するプロセスに関するコードを保持する場合をSystemd Service Unitファイルと呼ぶ。

Systemdには、サービス、タイマ、マウントポイント、ソケット、スワップスペース、デバイス等のユニットが存在する。
そのため、Systemdは管理用の設定の全てをファイルから取得する。

Systemdの用語では、これらを"ユニット"と呼び、システム全体に適用されるユニットと各ユーザ領域にのみ適用されるユニットがある。

ユニットには、サービスを開始するためのサービスユニットや、ある時点でのアクションを(繰り返し)実行するためのタイマユニット等、様々な種類がある。

各タイプのユニットファイルに共通しているのは、iniファイルに似た構造をしていることである。
ユニットファイルは、いくつかのセクション(多くの場合、3セクション)で構成されている。

Systemdではセクションと呼ばれ、その中に一連のキーと値のペア(Systemdではディレクティブと呼ばれる)が格納されている。


Systemdライブラリのインストール

ライセンス

Systemdライブラリのライセンスは、LGPL 2.1以降、または、 GPL 2.0で利用可能である。

パッケージ管理システムからインストール

# RHEL
sudo dnf install systemd-devel

# SUSE
sudo zypper install systemd-devel


ソースコードからインストール

Systemdのビルドに必要なライブラリをインストールする。

sudo zypper install meson ninja python3-Jinja2 glib2-devel dbus-1-devel p11-kit-devel libarchive-devel pcre2-devel libcurl-devel libcap-devel \
                    libmount-devel libfdisk-devel libblkid-devel libdw-devel libpwquality-devel passwdqc-devel libkmod-devel libbpf-devel \
                    zlib-devel liblz4-devel libzstd-devel xz-devel libbz2-devel \
                    pam-devel libgnutls-devel libopenssl-devel libopenssl-1_1-devel libcryptsetup-devel libgcrypt-devel libgpg-error-devel \
                    qrencode-devel libiptc-devel libidn2-devel libmicrohttpd-devel \
                    libxkbcommon-devel libfido2-devel tpm2-0-tss-devel libseccomp-devel libacl-devel audit-devel \
                    libapparmor-devel  # AppArmorを使用する場合
                    libselinux-devel   # SELinuxを使用する場合
                    xen-devel          # Xenを使用する場合


SystemdのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf systemd-<バージョン>.tar.gz
cd systemd-<バージョン>


Systemdをビルドおよびインストールする。

meson --prefix=<Systemdのインストールディレクトリ> -Dmode=release build
ninja -C ./build -j $(nproc)
ninja -C ./build install



サンプルコード

QProcessクラスを使用せずに、Systemdを利用してSSHデーモンを起動する場合は、Systemdのライブラリを使用する必要がある。

以下の例では、Systemdのライブラリを使用してSSHデーモンを起動している。

  1. sd_bus_open_system関数を使用して、システムバスへの接続を開く。
    戻り値が負の値の場合は、接続に失敗したことを示す。
  2. sd_bus_call_method関数を使用して、SystemdのD-Busインターフェイスを介してsshd.serviceを起動する。
    関数の引数には、バスの接続、D-Busサービス名、D-Busオブジェクトのパス名、インターフェイス名、メソッド名、入力引数、出力引数、起動するサービス名とモードを指定する。
    戻り値が負の値の場合は、サービスの起動に失敗したことを示す。
    サービスの起動に成功した場合は、成功メッセージをデバッグ出力に表示している。
  3. sd_bus_unref関数を使用して、バスの接続を閉じる。


このサンプルコードを実行するには、Systemdライブラリがインストールされている必要がある。
また、適切な権限でプログラムを実行する必要がある。

※注意
この方法は、Systemdが利用可能なシステムでのみ動作する。

  • QMakeを使用する場合
 # .proファイル
 
 CONFIG    += link_pkgconfig
 PKGCONFIG += libsystemd


  • CMakeを使用する場合
 # Package Configの使用
 find_package(PkgConfig REQUIRED)
 
 # Systemdライブラリの使用
 pkg_check_modules(SYSTEMD REQUIRED libsystemd)
 
 ## Systemdライブラリのバージョンを指定する場合
 #pkg_check_modules(SYSTEMD REQUIRED libsystemd >= <バージョン>)
 
 target_include_directories(<your_target> PUBLIC
    # ...略
    ${SYSTEMD_INCLUDE_DIRS}
 )
 
 target_link_libraries(<your_target>
    # ...略
    ${SYSTEMD_LIBRARIES}
 )


 #include <QCoreApplication>
 #include <QDebug>
 #include <systemd/sd-bus.h>
 
 int main(int argc, char *argv[])
 {
    QCoreApplication a(argc, argv);
 
    // Systemdを使用してSSHデーモンを起動
    sd_bus *bus = nullptr;
    int ret = sd_bus_open_system(&bus);
    if (ret < 0) {
       qDebug() << QString("システムD-Busの接続に失敗: %1").arg(strerror(-ret));
       return -1;
    }
 
    ret = sd_bus_call_method(bus,
                             "org.freedesktop.systemd1",
                             "/org/freedesktop/systemd1",
                             "org.freedesktop.systemd1.Manager",
                             "StartUnit",
                             nullptr,
                             nullptr,
                             "ss",
                             "sshd.service",
                             "replace");
    if (ret < 0) {
       qDebug() << QString("SSHサービスの開始に失敗: %1").arg(strerror(-ret));
       sd_bus_unref(bus);
 
       return -1;
    }
 
    qDebug() << "SSHサービスの開始に成功";
 
    sd_bus_unref(bus);
 
    return a.exec();
 }