93699


下記コマンドはどういう意味ですか？

[code]

    $ rpm -Va --nofiles --nodigest
    
[/code]

取り敢えず打ってみたのですが何も表示されなかったので、検索してみました。

>
[code]

>     --nodigest, パッケージのヘッダーやダイジェスト値を検査しない
>     --nofiles, パッケージ内のファイル属性を検査しない
>  
[/code]

[【 rpm 】
RPMパッケージをインストール/アンインストールする](https://xtech.nikkei.com/it/article/COLUMN/20060227/230875/)

良く分からないので、このコマンドで打った内容を取り消したいのですが、どうすればよいですか？

* * *

経緯

[code]

    $ sudo yum update
    
    -//中略
    
    --> 依存性解決を終了しました。
    エラー: パッケージ: uwsgi-plugin-python36u-2.0.17.1-1.ius.el7.x86_64 (ius)
                 要求: uwsgi-plugin-common = 2.0.17.1
                削除中: uwsgi-plugin-common-2.0.16-1.el7.x86_64 (@epel)
                    uwsgi-plugin-common = 2.0.16-1.el7
                次のものにより更新された: : uwsgi-plugin-common-2.0.18-8.el7.x86_64 (epel)
                    uwsgi-plugin-common = 2.0.18-8.el7
    エラー: パッケージ: uwsgi-plugin-python36u-2.0.17.1-1.ius.el7.x86_64 (ius)
                 要求: python36u
                削除中: python36u-3.6.4-1.ius.centos7.x86_64 (@ius)
                    python36u = 3.6.4-1.ius.centos7
                次のものにより不要にされた: : python3-3.6.8-18.el7.x86_64 (updates)
                    見つかりません
     問題を回避するために --skip-broken を用いることができます。
     これらを試行できます: rpm -Va --nofiles --nodigest
    
[/code]

環境  
CentOS Linux release 7.2.1511 (Core)


CC BY-SA 4.0
2023-02-03T04:42:29.193
93693
2023-02-06T01:32:53.193
2023-02-06T01:32:53.193
3060
7886
question
centos
rpm -Va --nofiles --nodigest は何をしている？


まずは、コマンドのオプションを把握します。

[code]

    $ rpm -Va --nofiles --nodigest
    
[/code]

コマンドは`rpm`です。これはわかりますね。次に、`rpm`コマンドが認識するオプションを列挙してみましょう。

  * `-Va`
  * `--nofiles`
  * `--nodigest`

の三つでしょうか？ **いいえ、これは間違いです。**

`rpm`を含めたほとんどのLinuxのコマンドでは伝統なGNU/POSIXのオプション解釈を行います。これはCの`getopt()`とそのGNU拡張である`getopt_long()`に由来します。[`man
3 getopt`](https://linuxjm.osdn.jp/html/LDP_man-
pages/man3/getopt.3.html)と実行すると、どのような規則で解釈を行うかを確認できます(man-pages-
jaパッケージを入れていれば日本語のmanが表示されるはずです)。

細かい規則があるのですが、だいたい次の通りです。(他にも細かい規則や独自の拡張があります)

  * `-`と一つのハイフンと一つ以上の英数字からなるオプションは **短い** オプションです。これらは一文字ずつオプションとして扱われます。また、オプションが引数を取る場合は、それに続く文字を付けることができます。 
    * `-x` → -x という一つのオプション
    * `-abc` → -a -b -c という三つのオプション
    * `-n 42` → -n というオプションが 42 という引数を取るという意味(-nがオプションを取れる場合)
  * `--`と二つのハイフンと一つ以上の英数字からなるオプションは **長い** オプションです。これらはその文字列自体で一つのオプションになります。また、オプションが引数を取る場合は、`=`後に文字を付けます。 
    * `--hoge` → --hoge という一つのオプション
    * `--fuga=42` → --fuga というオプションが 42 という引数を取るという意味
  * `--`と二つのハイフンのみは、オプションの終わりを意味し、その後は通常のコマンドへの引数を表す。(例えば、"-a"と言う名前のファイルを`touch`コマンド作成する場合、`touch -a`ではオプションとして解釈されるため、`touch -- -a`とすることで作成できる)
  * `-`と一つのハイフンのみは、オプションとしては意味はありません。しかし、多くのプログラムで、ファイル名指定する箇所を`-`とすると、標準入出力を意味するようになります。

これらを踏まえて、もう一度、オプションを列挙しましょう。

  * `-V`
  * `-a`
  * `--nofiles`
  * `--nodigest`

先程の違いは、`-Va`と一つのオプションとせずに`-V`と`-a`の二つのオプションに分けたことです。つまりは、

[code]

    $ rpm -V -a --nofiles --nodigest
    
[/code]

と同じと言うことです。これで、やっと`rpm`にどんなオプションが渡されたのかがわかりました。

では、[`man
rpm`](https://linuxjm.osdn.jp/html/rpm/man8/rpm.8.html)を実行しましょう。オプションの意味が全て載っています。

  * `-V`は検査オプションです。`-V`または`--verify`があれば、パッケージを検査するという意味なります。

  * `-a`はインストールさている全てのパッケージを検索するという意味です。これはパッケージ検索のオプションとなっていますが、`-V`ではパッケージ検索と同じオプションが使えて、同じ意味になります。つまり、`-V`と組み合わせると、インストールされている全てのパッケージを検査するという意味に変わります。

  * `--nofiles`はパッケージ内のファイルを検査しないという意味です。`-V`の検査のデフォルトの動作では、指定のパッケージ(RPMファイル)に含まれているファイルが正しくインストールされているか、実際のファイルの所有者やサイズなどを調べます。この`--nofiles`を付けると、このファイルチェックを行わないようになります。

  * `--nodigest`はパッケージやヘッダーのダイジェスト値を検査しないという意味です。デフォルトではパッケージファイルなどのダイジェスト値を求めて、正しいかどうかを調べます。この`--nodigest`を付けると、ダイジェスト値を求めて、チェックすることを行わないようになります。

ダイジェスト値というのは[MD5](https://ja.wikipedia.org/wiki/MD5)、[SHA-1](https://ja.wikipedia.org/wiki/SHA-1)、SHA-256([SHA-2](https://ja.wikipedia.org/wiki/SHA-2)のバージョンの一つ)のようなハッシュ関数をファイル全体に適用することで求める値です。各ファイル`md5sum`や`sha256sum`などのコマンドでも確認できます。ファイルの内容が少しでも違っていれば、ダイジェスト値が大きく異なります。あらかじめ求めていたダイジェスト値と実際のファイルから求められたダイジェスト値を比較することで、ファイルが壊れていないかほぼ正確に判断することができます。(ダイジェスト値は衝突することもあります。また、改善検知にはSHA-256のような安全と言われるハッシュ関数を用いる必要がありますが、ファイル破損検知程度であれば、安全性に不安があるMD5でもまだ十分です。CRCのようなチェックサムでもファイル破損を確認できますが、CRCは誤り修正を可能にすることも目的としており、用途が違います。なお、[xxHash](http://cyan4973.github.io/xxHash/)のように暗号学的ハッシュ関数ではないハッシュ関数もあります。)

これで、だいたい意味がわかったと思います。このコマンドの意味は次の通りです。

「インストールされている全てのパッケージについて検査する。ただし、パッケージ内のファイルについてはチェックしない。また、パッケージ等のダイジェスト値もチェックしない。」

インストールされているファイルのチェックはほぼ全てのファイルをチェックするので非常に時間がかかります。また、ダイジェスト値を求める事も、ファイル全て読み込む必要があるため、これも時間がかかります。では何をチェックするかというと、依存関係が正しいか、パッケージ管理のメタ情報が壊れていないかとかです。ダイジェストを求めなくても、サイズのチェックや存在確認は行う為、単純に別のファイルが置いているとか、ファイルが存在しないということは、検査できます。

`-V`の検査では、問題があったときだけメッセージを表示します。何も表示されない場合は、異常はありません。`--nofiles`を外して実行してみてください。インストール後に変更した設定ファイルなどが、表示される場合があります。(インストール時と違っているなら一概に壊れているとしてはいけません。設定ファイルなどはインストール後から変更があってもおかしくないからです。逆に/usr/bin配下のバイナリについてサイズ違いやMD5違いがあれば、ファイルが壊れている可能性を疑う必要があります。ファイルの検査結果についてて正しく解釈するには、Linuxに関するそれなりの知識が必要です。)

`yum update`の失敗時に`rpm -Va --nofiles
--nodigest`のコマンド実行を進められたのは、エラーの原因として、現在インストールしているパッケージの依存関係が壊れている可能性があるからです(可能性であって、壊れていると確定しているわけではありません)。それをチェックする方法として、`rpm
-Va --nofiles
--nodigest`を試して見てくださいと言っています。日本語訳がややおかしいのでわかりにくいですが、おかしいところが無いかチェックする方法を教えているだけになります。実行しても実行しなくても、それで解決するわけではありません。ただ、実行したときにエラーが表示された場合は、失敗原因の解決に繋がる可能性があると言うだけです。

最後に、このコマンドは検査を実施しているだけで、何かを修正したり、設定を変更したりするものではありません。ですので、「このコマンドで打った内容を取り消したい」と言われても、そもそも変更は何も無いので、何も取り消す物が無いということになります。

まとめ

  * 伝統的なGNU/POSIXのオプション解釈を覚えましょう。Linux/UNIX(Mac含む)で使われるコマンドのほとんどはこのオプション解釈に従っています。自分でオプションを指定する場合も、ドキュメントに書かれているコマンドのオプションを解釈する場合も、必要な知識です。
  * コマンドのオプションはヘルプやmanを確認しましょう。`rpm --help`で簡単なオプションの説明が、`man rpm`でコマンド全体の細かい説明が確認できます。 **インターネットで検索した情報は、古かったり、環境に特有だったりして、そもそも間違っていたり、正確ではない場合があります。** (後述を参照)

最後に、検索で調べて、その内容を引用する場合は **引用元を必ず明記してください**
。`--nodigest`の「パッケージのヘッダーやダイジェスト値を検査しない」は **間違っています** 。正確には、「(読み込み時に)パッケージ
**または** へッダ **の**
ダイジェストを検査しない(。)」(manページより)です。この間違った解説は偶然一緒になると考えられない固有の文面であり、下記のサイトに見られました。

  * <https://xtech.nikkei.com/it/article/COLUMN/20060227/230875/>
  * <https://xtech.nikkei.com/it/article/COLUMN/20070730/278583/>
  * <https://oxynotes.com/?p=6777>
  * <https://wiki.toridge.com/index.php?rpm%E3%81%A8yum>

上のいずれかからの引用かと思われますので、どこからの引用なのか、質問に引用元を追加するようにしてください。


CC BY-SA 4.0
2023-02-04T02:07:35.680
93699
2023-02-04T02:07:35.680
7347
93693
answer


man マニュアルをよく見れば分かりますが、`rpm` コマンドの `--nofiles`, `--nodigest`
はそれぞれ単体で使うオプションではなく、`-V` (`--verify`) と一緒に使って初めて意味のあるオプションです。

そのため、確認すべきは「`-V` (`--verify`) が何をしているのか」であり、マニュアルの説明を読んだり、「yum
検査」などでネットを検索してみる…などが調べる流れになると思います。

[code]

    書式
       パッケージの検索と検査:
    
           rpm {-V|--verify} [select-options] [verify-options]
    
       verify-options(検査オプション)
           [--nodeps] [--nofiles] [--noscripts] [--nodigest]
           [--nosignature] [--nolinkto] [--nomd5] [--nosize]
           [--nouser] [--nogroup] [--nomtime] [--nomode] [--nordev]
    
[/code]

#### 以下蛇足:

> 良く分からないので、このコマンドで打った内容を取り消したいのですが

この考え方は非常に危険です。今回はたまたま検査結果を表示するだけのものでしたが、Linux
コマンドでは誤った操作を簡単には取り消せないものがほとんどです。(単純なファイルの削除然り)

よくわからないコマンドは適当に雰囲気で実行するのではなく、まずマニュアルでどんな動作なのかを確認すべきです。


CC BY-SA 4.0
2023-02-06T01:30:58.187
93725
2023-02-06T01:30:58.187
3060
93693
answer