일반화하다

일반화하다

일반화하다

version-specific질문 제목 을 주목해주세요 ! 질문은 ~이야아니요, 어떻게

  1. Debian 호스트에서 설치된 모든 패키지 목록을 캡처합니다.
  2. 다른 Debian 호스트에 나열된 패키지의 최신 버전을 설치합니다.

문제는 오히려 어떻게

  1. 어느 시점에 Debian 호스트에서
    1. 하나를 캡처지도포함하다
      • 설치된 각 패키지의 이름
      • 현재 설치된 각 패키지의 버전
    2. ... 추가 데이터가 필요합니다.
  2. 후속 작업을 위해 나중에 동일한 호스트에서 패키지 매핑을 복원합니다.
    1. 패키지 맵에 패키지만 설치
    2. 맵의 각 패키지에 대해 적절한 버전만 설치하세요.

세부 사항

동기 부여

최근에 나는 데비안 컴퓨터 중 하나에서 "대규모 업데이트"(즉, 많은 패키지나 커널과 같은 주요 패키지 또는 둘 다를 포함)를 수행했지만 "완전히" 업데이트되지 않았습니다(즉, 주요 질문 없음). 앞으로 데비안 컴퓨터에 잘못된 업데이트를 적용하면 롤백할 수 있었으면 좋겠습니다.(ㅏ)패키지는 동일한 상자에 배치됩니다.(둘)이전 버전으로. (이전에는 이미지 백업을 해본 적이 없어서 느렸습니다.) 아쉽게도 어떻게 해야 할지 모르겠습니다. 나하다방법을 알아

  1. Debian 시스템에서 설치된 패키지 세트의 각 패키지 이름 목록을 캡처합니다.
  2. 다른 상자에서는 목록에 있는 각 패키지의 최신 버전을 설치합니다.

여러 SE를 포함하여 이를 수행하는 방법을 논의하는 많은 웹 페이지에 감사드립니다. 대부분(포함이것,이것, 그리고이것) 다소 복잡한 변경을 수행합니다.

  1. 지원: dpkg --get-selections > ${PACKAGE_LIST_FILEPATH}
  2. 다시 덮다: 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에서는 패키지 버전을 처리하기 위해 위의 내용을 확장해야 합니다. 다음 전략을 사용하는 것이 가능할 것 같습니다.

지원

  1. 패키지 목록 파일 대신 패키지 맵 파일을 작성합니다. 고마워하는로버트 L그리고카스, 이제 데비안 호스트의 패키지 맵 파일을 유용한 형식(한 줄에 하나의 패키지, 각 줄에 {패키지 이름(및 아키텍처, 그러나 여러 개인 경우에만), TAB, 패키지 버전 문자열} 포함)으로 얻을 수 있다는 것을 알았습니다. 그런 다음 액세스할 수 있습니다 그것.
    • 패키지 이름 및awk '{print $1}' < "${PACKAGE_LIST_FILEPATH}"
    • 패키지 버전awk '{print $2}' < "${PACKAGE_LIST_FILEPATH}"
  2. (추가 크레딧)패키지의 원본/현재 버전을 보관합니다 .deb(예:카스로 표현)에 패키지 이름을 제공하여 dpkg-repack.
  3. (추가 크레딧)보관된 패키지를 로컬 APT 저장소로 변환합니다. 이는 운영 세부정보에 설명되어 있기를 바랍니다.이 데비안 위키 페이지, 하지만 저는 아직도 이것을 알아내려고 노력하고 있습니다.

다시 덮다

용어 사전: * current호스트의 이전 상태를 복원하려는 사용자의 시도를 나타냅니다. *는 current PMF현재 호스트에 대해 생성된 패키지 매핑 파일을 나타냅니다.팩 튜플(키=패키지 이름, 값=패키지 버전)이 현재 설치되어 있습니다. * backup PMF복원할 패키지 튜플이 포함된 이전 호스트에 대해 생성된 패키지 매핑 파일을 나타냅니다.

  1. 현재 PMF를 만듭니다.
  2. "일반적인 수단"을 통해 저장소와 키를 복구합니다(위 참조).
  3. 백업 PMF를 읽습니다.
  4. 현재 PMF에는 있지만 백업 PMF에는 없는 각 패키지 튜플의 경우: 패키지를 제거합니다(예: sudo aptitude remove [package_name]).
  5. 백업 PMF의 각 패키지 튜플에 대해 지정된 버전의 패키지를 설치합니다(예 sudo aptitude install [package_name]=[package_version]: ). 감사해요레이 F. 리베이로그리고빅벤 8월aptitude여러분의 관심 과 apt-get지원 에 감사드립니다 install package=version.
    • (추가 크레딧)복원된 저장소에 필요한 버전의 패키지가 포함되어 있지 않으면 백업 로컬 APT 저장소에서 설치하십시오.

시험

해!위와 같은 백업이 없는 상자를 수동으로 복원하는 것부터 시작하겠습니다(물론 아직 위와 같은 백업이 없기 때문에).어느상자 :-) 하지만 나는콘솔 분출.

답변1

목표 달성에 도움이 되는 몇 가지 유용한 참고 사항:

  1. 다음 명령을 실행하여 설치된 패키지 및 해당 버전 목록을 가져올 수 있습니다.

    dpkg-query -W
    
  2. dpkg-repack다음 명령을 설치하고 실행하여 현재 설치된 모든 패키지에 대한 .deb 패키지 아카이브를 생성할 수 있습니다:

    dpkg-query -W | awk '{print $1}' | xargs dpkg-repack
    

    이는 현재 설치된 모든 패키지입니다 dpkg-repack. 이 아카이브는 복구 프로세스에서 누락된 중요한 부분입니다. 이 아카이브가 없으면 정확히 동일한 패키지 세트를 복구하지 못할 수도 있습니다(특히 testing또는 를 사용하는 경우 unstable).

    경고: dpkg-repack모든 콘텐츠를 현재 콘텐츠로 다시 패키징함(수정되었을 수 있음)구성 파일. 원본 패키지를 원하면 /var/cache/apt/archivesDebian 미러에서 .deb 파일을 얻어야 합니다.

    다음 지침에 따라 .deb 아카이브를 apt-gettable 저장소로 변환할 수 있습니다.https://wiki.debian.org/HowToSetupADebianRepository또는 모두 설치할 수 있습니다 dpkg -iBE *.deb(또는 dpkg -iRBE /path/to/deb/files/하나의 명령줄에 설치하기에는 너무 많은 경우).

  3. 제거된 패키지와 같은 세부 정보를 사용 -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:

  1. 설치하다sudo apt install apt-clone

  2. 설치된 패키지 이름 및 버전에 대한 참조만 포함하는 apt-clone clone filename작은 아카이브를 생성하려면 실행하세요 . 또한 나중에 동일한 패키지 구성을 동일한 버전으로 복원하기 위한 filename.apt-clone.tar.gzAPT 파일, APT 키링 및 기타 정보도 제공됩니다.sources.list

  3. 대상 시스템(백업 목적으로 사용되는 경우 동일한 시스템일 수 있음)에서 실행하여 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약간 오래된 정보입니다.

관련 정보