pactree 를 사용한 연쇄 의존성(?) 검증.

A 를 설치하려하면, B 가 설치되고, B 는 C 를 요구하고, C 는 D 가 없으면 안된다고 하고..

이른바 ‘의존성(Dependency)’ 은 리눅스계에서 양날검과 같은 존재다. 이게 있음으로 꾸러미를 통해 설치가 편해졌지만, 반대로 이로 인해 복잡한 문제가 생기기도 한다.
그 고민은 개발자(Developer, Packager)들의 몫이고..


일개 사용자에 불과한 내겐 가끔, 궁금증이 뭉실 뭉실 떠오를 때가 있긴 하다. 이 의존성 관계를 좀 더 일목요연하게 알 수는 없을까?
물론, pacman 선택사항에서 확인을 할 순 있다.

% pacman -Sii pipewire     
저장소             : extra
이름               : pipewire
버전               : 1:0.3.58-1
설명               : Low-latency audio/video router and processor
아키텍처           : x86_64
URL                : https://pipewire.org
라이선스           : MIT  LGPL
모음들             : 없음
다음을 제공        : libpipewire-0.3.so=0-64
다음에 의존        : alsa-card-profiles  libdbus-1.so=3-64  libglib-2.0.so=0-64  libncursesw.so=6-64  libsndfile.so=1-64  libudev.so=1-64
                     libusb-1.0.so=0-64  libasound.so=2-64  libsystemd.so=0-64  libbluetooth.so=3-64  libsbc.so=1-64  libldacBT_enc.so=2-64
                     libfreeaptx.so=0-64  libfdk-aac.so=2-64  libopus.so=0-64  liblilv-0.so=0-64  libwebrtc_audio_processing.so=1-64
선택 의존성        : pipewire-docs: Documentation
                     pipewire-session-manager: Session manager
                     pipewire-alsa: ALSA configuration
                     pipewire-jack: JACK support
                     pipewire-pulse: PulseAudio replacement
                     gst-plugin-pipewire: GStreamer plugin
                     pipewire-zeroconf: Zeroconf support
                     pipewire-v4l2: V4L2 interceptor
                     pipewire-x11-bell: X11 bell
                     realtime-privileges: realtime privileges with rt module
                     rtkit: realtime privileges with rtkit module
다음이 요구        : fluidsynth  gamescope  gnome-remote-desktop  gst-plugin-pipewire  helvum  lib32-pipewire  mpd  muffin  mutter  mutter6  obs-studio
                     pipewire-jack  pipewire-media-session  pipewire-pulse  pipewire-v4l2  pipewire-x11-bell  pipewire-zeroconf  qpwgraph
                     telegram-desktop  weston  wireplumber  xdg-desktop-portal  xdg-desktop-portal-wlr
다음의 선택 의존성 : chromium  electron  electron17  electron18  electron19  google-chrome  google-chrome-dev  qmmp  qt5-webengine  qt6-webengine  sdl2
다음과 충돌        : 없음
다음을 대체        : 없음
다운로드 크기      : 1748.06 KiB
설치된 크기        : 8444.79 KiB
꾸러미 만든이      : Jan Alexander Steffens (heftig) <heftig@archlinux.org>
빌드 날짜          : 없음
MD5 합             : 1eedf0f270b561bd2b3900a5be42e89b
SHA-256 합         : eef06ae577cecbe03119747b980335157e0dcd9a7aef58034ff2552d2b4ed54f
서명들             : 3B94A80E50A477C7

(‘다음에 의존’은 ‘Depends’, ‘다음이 요구’ 는 ‘Required by’ 의 우리말 번역이다.)

pipewire 는 fluidsynth 를 비롯, wireplumber 등등이 요구하고 있다. 다시 말해, wireplumber 를 설치하려고 하면, 꾸러미 관리자는 wireplumber 가 의존하고 있는 꾸러미인 pipewire 가 있는지 확인한 후, 없다면 pipewire 를 먼저 설치한다.

그런데..
의존성이란게 꾸러미 두서너개 사이로만 얽혀있는게 아니기 때문에, 내 컴퓨터에 설치된 pipewire 가 도대체 어떤 경로로 들어와 자리를 잡게 되었는지.. pacman 결과로만 파악하기는 쉽지가 않다.

그리하여 나온게 바로 pactree. -r 을 주면, 내가 원하는 결과를 쉽게 확인할 수 있다.

% pactree pipewire -r            
pipewire
├─fluidsynth
│ ├─gst-plugins-bad
│ │ └─kamoso
│ │   └─kde-multimedia-meta
│ │     └─kde-applications-meta
│ └─minuet
│   └─kde-education-meta
│     └─kde-applications-meta
├─gst-plugin-pipewire
├─pipewire-pulse
│ ├─pavucontrol-qt
│ ├─plasma-pa
│ │ └─plasma-meta
│ └─pulseaudio-alsa
├─pipewire-v4l2
├─wireplumber
│ ├─gst-plugin-pipewire
│ ├─kwin
│ │ └─plasma-workspace
│ │   ├─kdeplasma-addons
│ │   │ └─plasma-meta
│ │   ├─kget
│ │   │ └─kde-network-meta
│ │   │   └─kde-applications-meta
│ │   ├─khotkeys
│ │   │ └─plasma-meta
│ │   ├─plasma-browser-integration
│ │   │ └─plasma-meta
│ │   ├─plasma-nm
│ │   │ └─plasma-meta
│ │   ├─plasma-pa
│ │   ├─plasma-vault
│ │   │ └─plasma-meta
│ │   ├─plasma-wayland-session
│ │   ├─powerdevil
│ │   │ └─plasma-meta
│ │   ├─systemsettings
│ │   │ ├─kgamma5
│ │   │ │ └─plasma-meta
│ │   │ ├─kinfocenter
│ │   │ │ ├─plasma-disks
│ │   │ │ │ └─plasma-meta
│ │   │ │ └─plasma-meta
│ │   │ ├─plasma-desktop
│ │   │ │ └─plasma-meta
│ │   │ ├─plasma-firewall
│ │   │ │ └─plasma-meta
│ │   │ ├─plasma-thunderbolt
│ │   │ │ └─plasma-meta
│ │   │ └─sddm-kcm
│ │   │   └─plasma-meta
│ │   └─telepathy-kde-desktop-applets
│ │     └─telepathy-kde-meta
│ │       └─kde-network-meta
│ ├─pipewire-alsa
│ ├─pipewire-pulse
│ └─pipewire-v4l2
└─xdg-desktop-portal
  ├─flatpak
  └─krfb
    └─kde-network-meta

여기서 원흉(?)을 알 수 있다.
pipewire 는 wireplumber 가 요청했고, wireplumber 는 kwin 이, kwin 은 plasma-workspace 가 초청했고, plasma-workspace 는 kdeplasma-addons 가, 그리고 최종보스, 즉 kdeplasma-addons 를 부른 흉수는 plasma-meta 였다.
물론, plasma-meta 설치 명령은 내가, 내 손으로 직접 내렸었다. 이게 연쇄반응을 불러 일으키며 수많은 꾸러미들이 자동 설치가 되었다!!

pactree <꾸러미> 는 하향으로 연관성 관계를 보여준다. -r 을 붙이면 상향. 따라서, 이게 왜, 어떻게 설치됐을까를 알아보려면 -r 을 붙이면 된다.
위 최종보스(?)인 plasma-meta 로 실험해보면, pactree plasma-meta 는 꼬리에 꼬리를 문, 연관된 꾸러미들의 향연을 볼 수 있다.

반대로, pactree plasma-meta -r 을 하면 결과가 없다. 이걸 요구하는 꾸러미는 없다는 뜻.


그런데 한가지 궁금증.
왜 kwin 은 pipewire 가 아닌 wireplumber 를 요구할까? pipewire 가 더 상위개념인데도 불구하고..?? 원래 의존성 설계는 이렇게 하는건가?

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.