
Plex Unlocker
Docker에서 실행 중인 Plex Media Server — 공식 plexinc/pms-docker 이미지와 커뮤니티 lscr.io/linuxserver/plex 이미지 모두 — 에 네이티브 systemd 설치와 동일한 LD_PRELOAD-on-the-PMS-exec 메커니즘을 사용하여 패치합니다. 이유와 문제 해결 방법은 최상위 README 및 전체 가이드 docs/DOCKER.md를 참조하세요.
프로젝트 루트에서:
# Official image (plexinc/pms-docker)
docker build -f docker/Dockerfile.plexinc -t plex-crack:plexinc .
# Community image (lscr.io/linuxserver/plex)
docker build -f docker/Dockerfile.linuxserver -t plex-crack:lsio .
첫 번째 빌드는 zig 0.13.0과 선택한 Plex 베이스 이미지를 다운로드합니다. 이후 빌드는 src/, third_party/, build.sh가 변경되기 전까지 캐시된 레이어를 재사용합니다. PMS 업데이트에 걸쳐 재현 가능성이 필요하면 --build-arg PLEX_BASE_IMAGE=...로 베이스를 고정하세요.
# plexinc (no PUID/PGID; the image runs PMS as the upstream 'plex' user)
docker run -d --name plex --network=host \
-v /srv/plex/config:/config \
-v /srv/plex/data:/data \
plex-crack:plexinc
# linuxserver (honor PUID/PGID so /config and /data chown correctly on first start)
docker run -d --name plex --network=host \
-e PUID=$(id -u) -e PGID=$(id -g) \
-e TZ=America/Los_Angeles \
-v /srv/plex/config:/config \
-v /srv/plex/data:/data \
plex-crack:lsio
그런 다음:
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:32400/identity # -> 200
이미 실행 중인 Plex 컨테이너가 있고 이미지를 재빌드하거나 컨테이너를 다시 만들고 싶지 않다면, plex-docker-patch.sh가 동일한 패치를 라이브 컨테이너에 적용합니다. docker build가 필요 없고 원본 이미지는 그대로이며, 원본 컨테이너와 볼륨이 보존됩니다. uninstall을 통해 되돌릴 수 있습니다(s6 run 파일의 .orig 사본이 유지됩니다).
# Default container name: "plex"
./docker/plex-docker-patch.sh install
# Custom container name
./docker/plex-docker-patch.sh install my-plex
# Revert (restores the s6 run file from its .orig)
./docker/plex-docker-patch.sh uninstall my-plex
# Status
./docker/plex-docker-patch.sh status my-plex
이 스크립트는 컨테이너 내부의 s6 run 파일 내용을 읽어 베이스 이미지(plexinc vs LSIO)를 자동 감지하므로 두 경우 모두 동일한 .so와 wrapper.sh를 사용합니다. 호스트에 Zig가 있어야 하며(스크립트가 build.sh를 호출함), 이미 존재하는 build/plexmediaserver_crack.so가 있으면 재사용됩니다.
docker build 흐름) — 반복 배포, 멀티 호스트, CI/CD, 불변 이미지에 가장 적합합니다. 패치된 이미지를 커밋하여 배포하면 됩니다.plex-docker-patch.sh — 건드리고 싶지 않은 실행 중인 컨테이너를 일회성으로 패치할 때 가장 적합합니다. 라이브 컨테이너의 파일시스템을 수정하며 uninstall을 통해 완전히 되돌릴 수 있습니다.docker-compose, 시그니처 드리프트, scripts/readbitset.py를 사용한 검증, uninstall 및 문제 해결에 대해서는 ../docs/DOCKER.md를 참조하세요.
더 자세한 진단(PMS exit 127, glibc vs musl ABI, LSIO /config 소유권, PMS 업데이트 시 시그니처 드리프트)은 ../docs/DOCKER.md를 참조하세요.
| File | Purpose |
|---|
Dockerfile.plexinc | 멀티 스테이지 빌드 → 패치된 plexinc/pms-docker |
Dockerfile.linuxserver | 멀티 스테이지 빌드 → 패치된 lscr.io/linuxserver/plex |
wrapper.sh | 컨테이너 내 실행기(env → 마지막 LD_PRELOAD → exec PMS) |
plex-docker-patch.sh | 실행 중인 컨테이너용 제자리 패처(install / uninstall / status) |
| 증상 | 예상 원인 | 첫 번째 확인 |
|---|
install이 ERROR: docker not on PATH 오류를 표시함 | docker CLI가 설치되지 않았거나 사용자가 docker 그룹에 없음 | docker version (현재 사용자로 실행해야 함) |
install이 could not find s6 svc-plex run file 오류를 표시함 | 업스트림 이미지가 s6 레이아웃을 변경함 | docker exec <name> ls -la /etc/s6-overlay/s6-rc.d/svc-plex/ /etc/services.d/plex/ — 출력과 함께 이슈를 열어 주세요 |
install은 성공하지만 .so가 /proc/$PID/maps에 없음 | PMS가 127로 종료됨(로더 실패) | docker logs <name> | tail -50 — 대개 glibc .so가 들어간 경우이므로 build.sh로 재빌드하세요 |
install 후 status가 PATCH IS NOT ACTIVE를 표시함 | run 파일이 다시 쓰이지 않았거나(예: 읽기 전용 레이어) 컨테이너가 재시작되지 않음 | docker exec <name> cat /etc/s6-overlay/s6-rc.d/svc-plex/run — exec .../plex-crack-wrapper.sh가 출력되어야 함 |
uninstall이 no run.orig found 오류를 표시함 | .orig가 삭제되었거나 run 파일이 백업된 적이 없음(예: 이전 버전의 스크립트를 실행한 경우) | 수동으로 복원: docker cp <upstream-image>:/etc/s6-overlay/s6-rc.d/svc-plex/run <name>:/etc/s6-overlay/s6-rc.d/svc-plex/run |