
外部USBドライブをマウントしようとしているスクリプトでサービスの起動中にエラーが発生しました。
sudo:有効なuidは0ではありません。 /usr/bin/sudoは、「nosuid」オプションが設定されているファイルシステムにあるか、root権限を持たないNFSファイルシステムにありますか?
(マウント操作は同期的である必要があるため、サービスの外部に配置するだけではExecStartPre
十分ではありません。成功したサービスを開始するには、マウントが厳密な依存関係である必要があります。ルール:何らかの理由でマウントが失敗するとサービスは開始されません。を処理します)。
ユーザーコンテキストで実行される私のサービス構成は次のとおりですadmin
。
### Editing /etc/systemd/system/[email protected]/override.conf
### Anything between here and the comment below will become the new contents of the file
[Service]
ExecStartPre=/usr/local/bin/mount-sync-drive.sh
### Lines below this comment will be discarded
### /lib/systemd/system/[email protected]
# [Unit]
# Description=Syncthing - Open Source Continuous File Synchronization for %I
# Documentation=man:syncthing(1)
# After=network.target
# StartLimitIntervalSec=60
# StartLimitBurst=4
#
# [Service]
# User=%i
# ExecStart=/usr/bin/syncthing serve --no-browser --no-restart --logflags=0 --home=/media/pi/MyBook/.config/syncthing
# Restart=on-failure
# RestartSec=1
# SuccessExitStatus=3 4
# RestartForceExitStatus=3 4
#
# # Hardening
# ProtectSystem=full
# PrivateTmp=true
# SystemCallArchitectures=native
# MemoryDenyWriteExecute=true
# NoNewPrivileges=true
#
# # Elevated permissions to sync ownership (disabled by default),
# # see https://docs.syncthing.net/advanced/folder-sync-ownership
# #AmbientCapabilities=CAP_CHOWN CAP_FOWNER
#
# [Install]
# WantedBy=multi-user.target
...そして私のスクリプトは次のとおりです。
#!/bin/bash
exec &>> /var/log/syncthing.log
echo ""
date
# Check if /dev/sda1 is already mounted
if ! grep -qs '/dev/sda1' /proc/mounts; then
# Mount /dev/sda1 to /media/pi/MyBook
echo "Mounting /dev/sda1 to /media/pi/MyBook"
sudo mount -v /dev/sda1 /media/pi/MyBook
fi
スクリプトを手動で実行すると、admin
ドライブが正しくマウントされます。
pi@RPI:~ $ mount | grep sda1
pi@RPI:~ $ sudo -u admin /usr/local/bin/mount-sync-drive.sh
mount: /dev/sda1 mounted on /media/pi/MyBook.
pi@RPI:~ $ mount | grep sda1
/dev/sda1 on /media/pi/MyBook type ext4 (rw,relatime)
内容は次のとおりですsyncthing.log
。
Wed 22 Feb 15:57:43 AKST 2023
Mounting /dev/sda1 to /media/pi/MyBook
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
Wed 22 Feb 15:57:44 AKST 2023
Mounting /dev/sda1 to /media/pi/MyBook
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
Wed 22 Feb 15:57:45 AKST 2023
Mounting /dev/sda1 to /media/pi/MyBook
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
Wed 22 Feb 15:57:46 AKST 2023
Mounting /dev/sda1 to /media/pi/MyBook
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
以下はサービス開始エラーです(journalctl
追加情報は公開されていません)。
pi@RPI:~ $ sudo systemctl status [email protected]
● [email protected] - Syncthing - Open Source Continuous File Synchronization for admin
Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/[email protected]
└─override.conf
Active: failed (Result: exit-code) since Tue 2023-02-21 17:23:14 AKST; 33s ago
Docs: man:syncthing(1)
Process: 959 ExecStartPre=/usr/local/bin/mount-sync-drive.sh (code=exited, status=1/FAILURE)
CPU: 53ms
Feb 21 17:23:14 RPI systemd[1]: [email protected]: Scheduled restart job, restart counter is at 4.
Feb 21 17:23:14 RPI systemd[1]: Stopped Syncthing - Open Source Continuous File Synchronization for admin.
Feb 21 17:23:14 RPI systemd[1]: [email protected]: Start request repeated too quickly.
Feb 21 17:23:14 RPI systemd[1]: [email protected]: Failed with result 'exit-code'.
Feb 21 17:23:14 RPI systemd[1]: Failed to start Syncthing - Open Source Continuous File Synchronization for admin.
mount
私が間違っている場合は訂正してください。しかし、エラーメッセージに記載されているすべての可能性を排除したと思います。
1. ファイルシステムの /usr/bin/sudo には 'nosuid' オプションが設定されています。
pi@RPI:~ $ mount | grep nosuid
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,size=186292k,nr_inodes=819200,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,nosuid,nodev,noexec,relatime)
configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=93144k,nr_inodes=23286,mode=700,uid=1000,gid=1000)
2. NFS ファイルシステムがあり、root 権限を持たないファイルシステムの /usr/bin/sudo:
pi@RPI:~ $ df -T /usr/bin/sudo
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/root ext4 30343244 4241732 24811444 15% /
admin
次のコマンドを使用してsudoersファイルに追加してvisudo
再起動しました。
admin ALL=(ALL) NOPASSWD: /bin/mount
非常に奇妙なことは、うまく機能する別の同様のシステムがあることです。すべての設定を確認して再確認しましたが、同じです。
これは何を意味し、どのようにsudo: effective uid is not 0
解決しますか?
- 編集する -
@ajgringo619
コメントの質問によると:
pi@RPI:~ $ sudo -lU admin
Matching Defaults entries for admin on RPI:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_keep+=NO_AT_BRIDGE, env_keep+="http_proxy
HTTP_PROXY", env_keep+="https_proxy HTTPS_PROXY", env_keep+="ftp_proxy FTP_PROXY", env_keep+=RSYNC_PROXY, env_keep+="no_proxy NO_PROXY"
User admin may run the following commands on RPI:
(ALL : ALL) ALL
(ALL) NOPASSWD: /bin/mount
- 編集する -
roaima
コメントの質問によると:
pi@RPI:~ $ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 178432 Jan 14 04:29 /usr/bin/sudo
答え1
あなたのスクリプトは、if ! grep -qs '/dev/sda1' /proc/mounts; then
各インスタンスに対してこのスクリプトを実行する問題を解決するためのものだと思います[email protected]
。他のインスタンスが実行中または以前に実行されている場合は、マウントがすでに存在するため、この確認が必要です。それ以外の場合はExecStartPre=
失敗します。
sudo
私の他の答えはスクリプトからそれを削除する方法を説明していますが、別の解決策はmount
スクリプトをsystemdの組み込み単位に置き換えることです。
単位は次のように簡単です。
# /etc/systemd/system/media-pi-MyBook.mount
[Mount]
What=/dev/sda1
Where=/media/pi/MyBook
その後、オーバーライドに入れないでください。
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStartPre=/usr/local/bin/mount-sync-drive.sh
これにより、サービスを実行する前にマウントを使用して実行できます。
# /etc/systemd/system/[email protected]/override.conf
[Unit]
Requires=media-pi-MyBook.mount
After=media-pi-MyBook.mount
これでカスタムスクリプトを削除できます。
これにより、デバイスのアンマウント時期を制御でき、追加の確認なしにテンプレートのすべてのインスタンスにインストールが存在することを確認するなど、さまざまな問題が解決されます。
削除するには、簡単に実行するとすべてのサービスが自動的に停止しますsudo systemctl stop media-pi-MyBook.mount
。Requires=
これは、特にテンプレートインスタンスの数が多い場合、スクリプトを作成するのがより困難です。
追加の詳細:
私が推奨するオーバーライドで[email protected]/
はなく、[email protected]/
テンプレートのすべてのインスタンスに依存関係があることを意味します。syncthing@
syncthing@admin
答え2
状態確認から始めてください。
systemctl show [email protected] | grep -E 'ProtectSystem|NoNewPrivileges'
おそらくNoNewPrivileges
活性化されているでしょう。その結果、プロセスがルートになることができないため、sudo
実行できません。
このような場合は、この設定を無効にする必要があります。私の答えを見るrsyncd サービス ProtectSystem=off が無効です。、類似しているが重複しない、これらの値を変更する方法の完全なガイドライン
答え3
sudo
スクリプト呼び出しには適用できません。その目的は、対話型ユーザーを認証することです。
これを防ぐには、スクリプトを再作成する必要がありますsudo
。スクリプトはsudo
1行でのみ機能しますが、他の行は多くの操作を実行しないため、root
この行に権限を拡張することは無理ではありません。
man systemd.service
説明「特殊実行可能プレフィックス」。これらのプレフィックスを使用してExecStartPre=
動作を変更できます。+
特にフル権限でスクリプトを実行することに興味があります。
プラグインの+
スクリプトパスの前に以下を追加します。
[Service]
ExecStartPre=+/usr/local/bin/mount-sync-drive.sh
sudo
その後、スクリプトから削除できます。
#!/bin/bash
exec &>> /var/log/syncthing.log
echo ""
date
# Check if /dev/sda1 is already mounted
if ! grep -qs '/dev/sda1' /proc/mounts; then
# Mount /dev/sda1 to /media/pi/MyBook
echo "Mounting /dev/sda1 to /media/pi/MyBook"
mount -v /dev/sda1 /media/pi/MyBook
fi
ボーナスポイント:ここでたくさんのログインをします。実行する操作はmount
すでに標準出力として印刷されているため、echoコマンドは少し重複しています。また、改行と日付をエコーします。デフォルトでは、デバイスはすべての標準出力とスクリプト日付を自動的に記録します。したがって、ログを使用することを選択した場合、yopuはそれらを削除してスクリプトを簡素化できます。
#!/bin/bash
if ! grep -qs '/dev/sda1' /proc/mounts; then
mount -v /dev/sda1 /media/pi/MyBook
fi
その後、次を使用して出力を確認できます。
$ sudo journalctl -u syncthing*
Feb 21 17:23:14 RPI systemd[1]: Started [email protected] - Syncthing - Open Source Continuous File Synchronization for admin
Feb 21 17:23:14 RPI mount-sync-drive.sh[1234]: mount: /dev/sda1 mounted on /media/pi.