この質問は abrt-hook-cppがインストールされたコアファイルはどこですか? に関連付けられています。
意図的にクラッシュするプログラムのコアファイルを生成しようとしていましたが、最初はコアファイルの生成がabrt-ccppによって妨げられているように見えました。だから私はvimで手動で/proc/sys/kernel/core_pattern
を編集しようとしました:
> Sudo vim /proc/sys/kernel/core_pattern
ファイルを保存しようとすると、vimが次のエラーを報告しました。
"/proc/sys/kernel/core_pattern" E667: Fsync failed
これは権限の問題だと思ったので、権限を変更しようとしました:
> Sudo chmod 666 /proc/sys/kernel/core_pattern
chmod: changing permissions of '/proc/sys/kernel/core_pattern\': Operation not permitted
最後に、 この投稿 に基づいて、私はこれを試しました:
>Sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'
これはうまくいきました。
作業ソリューションに基づいて、私もこれらを試しましたが、失敗しました:
> echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
-bash: /proc/sys/kernel/core_pattern: Permission denied
>
> Sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
-bash: /proc/sys/kernel/core_pattern: Permission denied
質問:
編集、chmod
ing、およびecho
出力のファイル/proc/sys/kernel/core_pattern
へのリダイレクトがすべて失敗し、記載されているSudo bash...
の呼び出しのみが上書き/編集できたのはなぜですか。ファイル?
質問:
具体的には、上記の失敗した試行でSudo
を呼び出す試行について:なぜ失敗したのですか?私はSudo
がroot権限で後続のコマンドを実行したと思いました。これはLinuxで何でもできると思いました。
Procfsのエントリは、アドホックコードによって管理されます。 /proc/sys
( proc_sys_setattr
)の下のファイルに権限と所有権を設定するコードは、EPERMによる権限と所有権の変更を拒否します。したがって、これらのファイルの権限や所有権を変更することはできません。このような変更は実装されていないため、rootであっても役に立ちません。
非rootユーザーとして書き込もうとすると、アクセス権エラーが発生します。 Sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
を使用しても、root以外のユーザーとして記述しようとしている:Sudo
はecho
をrootとして実行しますが、リダイレクトはSudo
が実行され、そのシェルには昇格された特権がありません。 Sudo bash -c '… >…'
では、リダイレクトはSudo
によって起動され、ルートとして実行されるbashインスタンスで実行されるため、書き込みは成功します。
Rootのみがkernel.core_pattern
sysctlの設定を許可されなければならない理由は、コマンドを指定できることです。これはグローバル設定であるため、このコマンドはどのユーザーでも実行できます。これは実際には、さまざまな程度のすべてのsysctl設定に当てはまります。これらはすべてグローバル設定であるため、rootだけが変更できます。 kernel.core_pattern
は特に危険なケースです。
Ubuntu 18.04では、パターンを次のように更新できます。
Sudo bash -c 'echo "/data/app_crash/%t.%e.core.%p" > /proc/sys/kernel/core_pattern'
/etc/sysctl.conf
を更新して、次の行を追加することもできます。
kernel.core_pattern = /data/app_crash/%t.%e.core.%p
ただし、kernel.core_pattern
または/etc/sysctl.conf
に/etc/sysctl.d/*
を設定する行が他にない場合でも、再起動すると、パターンは再びデフォルト値に設定されます。
$ Sudo sysctl -a | grep kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P
apport
が私が行った変更を上書きしていることがわかりました。 apport
をSudo apt-get remove apport
でアンインストールすると、変更が使用されました。
Ubuntu 16.04 LTSでは、
Sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'
失敗する
No such file or directory
私は走らなければならない
Sudo sysctl -w kernel.core_pattern=/home/user/foo/core.%e.%p