hack のためのネタ帳, etc,,,

状況

mount または findmnt コマンドを実行すると /run/cgmanager/fs が 40 行くらい表示される。
systemctl status cgmanager してみると、どうもサービスが failed している。

Ubuntu 18.04 LTS cgmanager failed」でぐぐってみると を見つけたのだが、なんか、 18.04 LTS には cgmanager ってパッケージは収録されてないんだとかなんとか。

この環境は随分前に Ubuntu 16.04 LTS から 18.04 LTS へ do_release_upgrade した環境なんだけど、どうやら 18.04 LTS にないパッケージが多数残っている模様。

そこで、apt が参照しているリポジトリに含まれないパッケージを一掃したいのだが、定番の deborphan では cgmanager を検出してくれない。

解法

Rapid-GPT
「Ubuntu にインストールされているパッケージのうち、/etc/apt/sources.list で指定したリポジトリに含まれないパッケージを一覧表示する方法を教えて下さい。」
と聞いてみたところ
端末で以下のコマンドを実行して、/etc/apt/sources.listで指定されたリポジトリに含まれないパッケージを一覧表示できます。ただし、出力を300文字に制限するのは難しいため、300文字になるまで表示することはできません。

以下のコマンドを実行してください。

```
comm -23 <(dpkg-query -W -f='${Package}\n' | sort) <(grep -Eo '^[^#]+/[^/]+/[^/]+/[^/]+ ' /etc/apt/sources.list | sort -u | xargs -I'{}' curl {} | grep -Eo 'Package:.+' | awk -F' ' '{print $2}' | sort -u) | awk 'NR <=300'
```

このコマンドは以下の処理を行っています:

- dpkg-queryを使ってインストールされたパッケージのリストを表示し、ソートしています。
- /etc/apt/sources.listを使って有効なリポジトリのパッケージリストを表示し、ソートしています。
- commコマンドでインストールされたパッケージとリポジトリのパッケージを比較し、リポジトリに含まれないパッケージの一覧を表示しています。

ただし、このコマンドは出力を300行に制限しています。300文字に制限することはできません。出力を300文字に制限するには、さらにスクリプト編集が必要ですが、それは簡単にはできません。
との回答。

/etc/apt/sources.list の grep 直接 curl に食わせちゃ駄目だろ。

気を取り直して
「Ubuntu で apt が参照しているリポジトリの一覧を表示するコマンドを教えて下さい。」
と聞いてみたところ
以下のコマンドで、APTのリポジトリの一覧を表示でき、出力を`300`文字に制限できます。

```
sudo apt-cache policy | awk '/http/ {print $2 $3}' | sort -u | head -c 300
```
`sudo apt-cache policy`でリポジトリが表示され、`awk`コマンドでリポジトリのURLが抽出され、`sort -u`で重複を排除、`head -c 300`で300文字に制限されます。
との回答。

ということで、以下のようにした。
apt-cache policy|grep http|awk '$0=$2"/dists/"$3"/binary-"$4"/"$5".gz"' | while read i; do curl -s "$i" | gzip -dc; done | grep Package: | awk '$0=$2' | sort > /tmp/list_available
dpkg -l |grep ^ii | awk '$0=$2' |sed -E 's/:.*//g'| sort > /tmp/list_installed
comm -23 /tmp/list_{installed,available}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます