일반화하다
version-specific
질문 제목 을 주목해주세요 ! 질문은 ~이야아니요, 어떻게
- Debian 호스트에서 설치된 모든 패키지 목록을 캡처합니다.
- 다른 Debian 호스트에 나열된 패키지의 최신 버전을 설치합니다.
문제는 오히려 어떻게
- 어느 시점에 Debian 호스트에서
- 하나를 캡처팩지도포함하다
- 설치된 각 패키지의 이름
- 현재 설치된 각 패키지의 버전
- ... 추가 데이터가 필요합니다.
- 하나를 캡처팩지도포함하다
- 후속 작업을 위해 나중에 동일한 호스트에서 패키지 매핑을 복원합니다.
- 패키지 맵에 패키지만 설치
- 맵의 각 패키지에 대해 적절한 버전만 설치하세요.
세부 사항
동기 부여
최근에 나는 데비안 컴퓨터 중 하나에서 "대규모 업데이트"(즉, 많은 패키지나 커널과 같은 주요 패키지 또는 둘 다를 포함)를 수행했지만 "완전히" 업데이트되지 않았습니다(즉, 주요 질문 없음). 앞으로 데비안 컴퓨터에 잘못된 업데이트를 적용하면 롤백할 수 있었으면 좋겠습니다.(ㅏ)패키지는 동일한 상자에 배치됩니다.(둘)이전 버전으로. (이전에는 이미지 백업을 해본 적이 없어서 느렸습니다.) 아쉽게도 어떻게 해야 할지 모르겠습니다. 나하다방법을 알아
- Debian 시스템에서 설치된 패키지 세트의 각 패키지 이름 목록을 캡처합니다.
- 다른 상자에서는 목록에 있는 각 패키지의 최신 버전을 설치합니다.
여러 SE를 포함하여 이를 수행하는 방법을 논의하는 많은 웹 페이지에 감사드립니다. 대부분(포함이것,이것, 그리고이것) 다소 복잡한 변경을 수행합니다.
- 지원:
dpkg --get-selections > ${PACKAGE_LIST_FILEPATH}
- 다시 덮다:
dpkg --set-selections < ${PACKAGE_LIST_FILEPATH}
아마도 이 주제에 대한 가장 포괄적이고 가장 스크립트화된 SE는 다음과 같습니다.이것cp -R /etc/apt/sources.list*
: 저장소 목록( 사용 )과 저장소 키( 사용 ) 를 모두 백업하는 것이 권장되는 몇 가지 방법 중 하나이지만 위의 방법 apt-key exportall
도 사용합니다 .dpkg
이 SE백업 및 설치에는 aptitude
(FWIW, 선호하고 의심함 )을 사용하는 것이 좋습니다 .dpkg
이 SEdeborphan
백업하는 것이 좋습니다 .
그러나 위의 어느 것도 패키지를 저장하지 않습니다.버전, 그래서 그 중 어느 것도 내 사용 사례에 맞지 않습니다. (IIUC - 뭔가 놓쳤나요?)
가설
당연히 자신의 장치에서 임의의 파일을 백업하고 필요한 경우 복원할 수 있어야 합니다. 마찬가지로 패키지를 백업/복원할 수 있어야 하며 이를 정기적으로 실행되는 백업 도구에 통합할 수 있어야 합니다. 다행히 패키지 목록 백업/복원은 잘 이해되어 있습니다. bash
백업을 위해 다음 코드를 사용할 수 있습니다
## setup
PACKAGE_LIST_FILENAME='package.list' # see use below
REPO_KEYS_FILENAME='repo.keys' # ditto
DATE_FORMAT="%Y%m%d_%H%M%S"
BACKUP_TIMESTAMP="$(date +${DATE_FORMAT})" # get current timestamp, to the second
# Parent directory of that to which you will backup.
BACKUP_ROOT="/media/$(whoami)/my_backup_drive"
BACKUP_DIR="${BACKUP_ROOT}/backup_${BACKUP_TIMESTAMP}"
echo -e "Backing up to ${BACKUP_DIR}" # debugging
# TODO: check BACKUP_DIR is writable, has sufficient freespace, etc
# ASSERT: all following are subdirs of BACKUP_DIR
ETC_BACKUP_DIR="${BACKUP_DIR}/etc" # backup /etc , typically not large
PKG_BACKUP_DIR="${BACKUP_DIR}/packages"
REPO_BACKUP_DIR="${BACKUP_DIR}/repos" # duplicates some of /etc, but disk is cheap ...
for DIR in \
"${ETC_BACKUP_DIR}" \
"${PKG_BACKUP_DIR}" \
"${REPO_BACKUP_DIR}" \
; do
# make the backup dirs
mkdir -p "${DIR}" # TODO: test retval/errorcode, exit on failure
done
PACKAGE_LIST_FILEPATH="${PKG_BACKUP_DIR}/${PACKAGE_LIST_FILENAME}"
touch "${PACKAGE_LIST_FILEPATH}" # TODO: check that it's writable, exit if not
REPO_KEYS_FILEPATH="${REPO_BACKUP_DIR}/${REPO_KEYS_FILENAME}"
touch "${REPO_KEYS_FILEPATH}" # TODO: check that it's writable, exit if not
## backup
## TODO: for all following: test retval/errorcode, exit on failure
## TODO: give user some progress indication (e.g., echo commands)
deborphan -a --no-show-section > "${PACKAGE_LIST_FILEPATH}" # or other op you prefer
sudo cp -R /etc/apt/sources.list* "${REPO_BACKUP_DIR}/"
sudo apt-key exportall > "${REPO_KEYS_FILEPATH}"
rsync --progress /etc "${ETC_BACKUP_DIR}"
bash
예를 들어 다음 과 같은 코드를 사용하여 복원 할 수 있습니다.
## setup
## (remember to transfer constants used above)
RESTORE_DIR="set this equal to the BACKUP_DIR from which you are restoring!"
ETC_RESTORE_DIR="${RESTORE_DIR}/etc"
PKG_RESTORE_DIR="${RESTORE_DIR}/packages"
REPO_RESTORE_DIR="${PKG_RESTORE_DIR}/repos"
PACKAGE_LIST_FILEPATH="${PKG_RESTORE_DIR}/${PACKAGE_LIST_FILENAME}"
REPO_KEYS_FILEPATH="${REPO_RESTORE_DIR}/${REPO_KEYS_FILENAME}"
## restore
## TODO: test that all following are readable, exit if not
## TODO: for all following: test retval/errorcode, exit on failure
## TODO: give user some progress indication (e.g., echo commands)
rsync --progress "${ETC_BACKUP_DIR}" /etc
# following will overwrite some of /etc restored above
sudo apt-key add "${REPO_KEYS_FILEPATH}"
sudo cp -R "${REPO_RESTORE_DIR}/sources.list*" /etc/apt/
# TODO: CHECK THIS SYNTAX!
# see my question @ https://serverfault.com/questions/56848/install-the-same-debian-packages-on-another-system/61472#comment920243_61472
sudo xargs aptitude --schedule-only install < "${PACKAGE_LIST_FILEPATH}" ; aptitude install
따라서 IIUC에서는 패키지 버전을 처리하기 위해 위의 내용을 확장해야 합니다. 다음 전략을 사용하는 것이 가능할 것 같습니다.
지원
- 패키지 목록 파일 대신 패키지 맵 파일을 작성합니다. 고마워하는로버트 L그리고카스, 이제 데비안 호스트의 패키지 맵 파일을 유용한 형식(한 줄에 하나의 패키지, 각 줄에 {패키지 이름(및 아키텍처, 그러나 여러 개인 경우에만), TAB, 패키지 버전 문자열} 포함)으로 얻을 수 있다는 것을 알았습니다. 그런 다음 액세스할 수 있습니다 그것.
- 패키지 이름 및
awk '{print $1}' < "${PACKAGE_LIST_FILEPATH}"
- 패키지 버전
awk '{print $2}' < "${PACKAGE_LIST_FILEPATH}"
- 패키지 이름 및
- (추가 크레딧)패키지의 원본/현재 버전을 보관합니다
.deb
(예:카스로 표현)에 패키지 이름을 제공하여dpkg-repack
. - (추가 크레딧)보관된 패키지를 로컬 APT 저장소로 변환합니다. 이는 운영 세부정보에 설명되어 있기를 바랍니다.이 데비안 위키 페이지, 하지만 저는 아직도 이것을 알아내려고 노력하고 있습니다.
다시 덮다
용어 사전:
* current
호스트의 이전 상태를 복원하려는 사용자의 시도를 나타냅니다. *는 current PMF
현재 호스트에 대해 생성된 패키지 매핑 파일을 나타냅니다.팩 튜플(키=패키지 이름, 값=패키지 버전)이 현재 설치되어 있습니다. * backup PMF
복원할 패키지 튜플이 포함된 이전 호스트에 대해 생성된 패키지 매핑 파일을 나타냅니다.
- 현재 PMF를 만듭니다.
- "일반적인 수단"을 통해 저장소와 키를 복구합니다(위 참조).
- 백업 PMF를 읽습니다.
- 현재 PMF에는 있지만 백업 PMF에는 없는 각 패키지 튜플의 경우: 패키지를 제거합니다(예:
sudo aptitude remove [package_name]
). - 백업 PMF의 각 패키지 튜플에 대해 지정된 버전의 패키지를 설치합니다(예
sudo aptitude install [package_name]=[package_version]
: ). 감사해요레이 F. 리베이로그리고빅벤 8월aptitude
여러분의 관심 과apt-get
지원 에 감사드립니다install package=version
.- (추가 크레딧)복원된 저장소에 필요한 버전의 패키지가 포함되어 있지 않으면 백업 로컬 APT 저장소에서 설치하십시오.
시험
해!위와 같은 백업이 없는 상자를 수동으로 복원하는 것부터 시작하겠습니다(물론 아직 위와 같은 백업이 없기 때문에).어느상자 :-) 하지만 나는콘솔 분출.
답변1
목표 달성에 도움이 되는 몇 가지 유용한 참고 사항:
다음 명령을 실행하여 설치된 패키지 및 해당 버전 목록을 가져올 수 있습니다.
dpkg-query -W
dpkg-repack
다음 명령을 설치하고 실행하여 현재 설치된 모든 패키지에 대한 .deb 패키지 아카이브를 생성할 수 있습니다:dpkg-query -W | awk '{print $1}' | xargs dpkg-repack
이는 현재 설치된 모든 패키지입니다
dpkg-repack
. 이 아카이브는 복구 프로세스에서 누락된 중요한 부분입니다. 이 아카이브가 없으면 정확히 동일한 패키지 세트를 복구하지 못할 수도 있습니다(특히testing
또는 를 사용하는 경우unstable
).경고:
dpkg-repack
모든 콘텐츠를 현재 콘텐츠로 다시 패키징함(수정되었을 수 있음)구성 파일. 원본 패키지를 원하면/var/cache/apt/archives
Debian 미러에서 .deb 파일을 얻어야 합니다.다음 지침에 따라 .deb 아카이브를 apt-gettable 저장소로 변환할 수 있습니다.https://wiki.debian.org/HowToSetupADebianRepository또는 모두 설치할 수 있습니다
dpkg -iBE *.deb
(또는dpkg -iRBE /path/to/deb/files/
하나의 명령줄에 설치하기에는 너무 많은 경우).제거된 패키지와 같은 세부 정보를 사용
-get-selections
하고--set-selections
보존해야 합니다.
답변2
열심히 노력한 끝에 여러 가지 방법을 조합한 다음과 같은 방법을 생각해냈습니다.
설치된 모든 패키지를 정확한 데비안 이름으로 스냅샷하세요.
dpkg --list | awk '/^ii/ { print $2,$3,$4 ;}'| tr ' ' '_'| tr '\t' '_'| sed 's/$/.deb/g'| sed 's|:amd64||g'| sort -u > dpkg_query_pkgs.txt
적절한 캐시를 정리하고 설치된 모든 패키지를 다시 다운로드하여 여러 버전이 없도록 하세요.
apt-get clean; dpkg -l | grep "^ii"| awk ' {print $2} ' | xargs sudo apt-get -y install --reinstall --download-only
또는 현재 설치된 버전을 명시적으로 전달합니다.
apt-get clean; dpkg --list | awk '/^ii/ { print $2"="$3 ;}'| xargs sudo apt-get -y install --reinstall --download-only ;
아카이브에서 설치된 Deb 스냅샷
ls -1 /var/cache/apt/archives| grep deb|sed 's|\%3a|:|g' | sort -u > apt_archives_pkgs.txt
그런 다음 설치된 debs와 파일을 확인할 수 있습니다
diff -y apt_archives_pkgs.txt dpkg_query_pkgs.txt
이를 통해 dpkg --list에서 정확한 이름을 내보낼 수 있는지 테스트할 수 있으며 해당 이름은 apt 캐시 아카이브의 이름과 일치합니다.
답변3
당신은 그것을 사용할 수 있습니다 apt-clone
:
설치하다
sudo apt install apt-clone
설치된 패키지 이름 및 버전에 대한 참조만 포함하는
apt-clone clone filename
작은 아카이브를 생성하려면 실행하세요 . 또한 나중에 동일한 패키지 구성을 동일한 버전으로 복원하기 위한filename.apt-clone.tar.gz
APT 파일, APT 키링 및 기타 정보도 제공됩니다.sources.list
대상 시스템(백업 목적으로 사용되는 경우 동일한 시스템일 수 있음)에서 실행하여
sudo apt-clone restore filename.apt-clone.tar.gz
시스템 상태를 복원합니다.
추가 팁:
패키지가 포함되어 있습니다.Create Clone을 사용하면
apt-clone clone --with-dpkg-repack filename
복제 아카이브에는 패키지 아카이브에 없는 수동으로 설치된 패키지에 대한 .deb 파일과 패키지 아카이브에 계속 사용할 수 있지만 설치된 패키지에는 없는 .deb 파일도 포함됩니다. 패키지의 .deb 파일입니다.버전. 이러한 .deb 파일은 설치된 파일에서 다시 패키지되므로 원본 .deb 파일을 사용할 필요는 없습니다."버전 불일치".때로는
apt-clone clone
일부 패키지의 버전 불일치에 대한 불만이 있을 수 있습니다. 패키지는 여전히 복제본에 포함되어 있으며 정확히 동일한 버전은 아니지만 복원됩니다. 이 문제를 해결하는지 여부와 방법을 잘 모르겠습니다.장기 백업은 없습니다.이 도구는 복제와 복제본 복원 간의 시간 차이가 작을 때(몇 시간에서 몇 주 정도) 가장 유용합니다. 시스템을 정확한 상태로 복원하려는 경우 장기 시스템 백업에는 적합하지 않습니다. 이는
apt-clone
패키지 이름 및 버전에 대한 참조가 사용되며 일부 패키지 버전이 패키지 아카이브에서 사라지거나 전체 PPA 패키지 아카이브가 사라질 수도 있기 때문입니다.문서.
apt-clone --help
사용 가능한 다른 옵션에 대한 정확한 정보를 제공하지만man apt-clone
약간 오래된 정보입니다.