Linux | PowerShell

[Ubuntu] apt upgrade 롤백(취소하기)

항상 빌드중 2023. 11. 1. 17:06
반응형

시작

서버에 온갖 삽질과 샛팅을 끝내고 `apt upgrade`를 시키는 도중 쌔한 느낌이 들어 'apt upgrade 후 부팅안됨'을 검색하니 예상과 같이 그런 사례가 종종 있었다 바로 폭풍 `ctrl + c` 키를 눌렀지만 돌이킬 수 없었다.

`apt upgrade` 명령 같은 경우에는 최신 버전으로 올려주기 때문에 특정 패키지가 삽질한 결과를 물거품 만들 수 있기 때문에 다시 롤백시키려고 한다.

참고

https://www.cyberciti.biz/howto/debian-linux/ubuntu-linux-rollback-an-apt-get-upgrade/

아무 생각없이 `apt upgrade` 명령어를 쳐버린 내 불찰 후다닥 서칭해서 찾았다.

1. 기록 탐색

`/var/log/apt/history.log` 파일을 탐색하여 내가 마지막으로 쳤던 명령어에 대해 추적한다.

`Commandline`에 내가 쳤던 `apt` 명령어가 있으며 거기서 Start-Date 줄은 전부 복사한다.

Start-Data: 2023-11-01     13:36:40

그리고 `Install:` 줄이 몇번째 줄인지 확인한다.

보통 이런 형식으로 되어있다.

Start-Date: 블라블라
Commandline: apt upgrade
Request-By: 블라블라
Install: 블라블라

Ubuntu 버전별로 조금 다른것 같으며 나는 3번째 줄에있다(0번부터 시작해서). 기억하자

2. 임시파일 생성

위 기억과 복사한 내용을 토대로 명령줄을 작성한다.

grep -A 3 'Start-Data: 2023-11-01     13:36:40 | tail -1 >/tmp/packages.txt

`grep -A [숫자]` 에는 `Install` 항목이 몇번째 줄에 있는지

'Start-Data: 2023-11-01     13:36:40' 항목에는 복사한 시간을 넣어준다.

그럼 `/tmp/packages.txt` 에는 `Install: 블라블라` 항목만 남겨졌을것이다.

2.1. 문자열 치환

거기서 `Install:` 부분만 지워줄 것이다.

sed -i 's/Install://' /tmp/packages.txt

2.2. 문자열 치환 2

줄바꿈 양식을 넣어준다. 순차적으로 입력한다.

tr ',' '\n' < /tmp/packages.txt | sed '/automatic)/d' | awk '{ print $1}' > /tmp/final.packages.txt
wc -l /tmp/final.packages.txt

그럼 `/tmp/final.packages.txt`에는 아래와 같이 나와있어야 된다.

예시)
libmaa3:amd64 ant:amd64 libmimic0:amd64 dc:amd64 libparse-yapp-perl:amd64 gir1.2-clutter-1.0:amd64 libjna-java:amd64 python-egenix-mxbeebase:amd64 libxkbcommon-x11-0:amd64 libmpeg2-4:amd64 libopencv-core2.4:amd64 libdvdread4:amd64 libhunspell-1.3-0:amd64 fonts-lobster:amd64 libtotem-plparser18:amd64 libodbcinstq4-1:amd64 jed-common:amd64 .... .. ... xfonts-cyrillic:amd64 postgresql:amd64 db5.3-util:amd64 libopencore-amrnb0:amd64 firebird2.5-examples:amd64 libboost-random1.54-dev:amd64 libtbb2:amd64 libwxgtk2.8-0:amd64 libc6-x32:amd64 magicfilter:amd64

3. 삭제 작업

위에 작성한 `/tmp/final.packages.txt` 파일을 토대로 삭제 명령어를 진행한다

`sudo su` 명령어로 root로 로그인해서 사용한 기준으로 작성

# 변수p 에 final.packages.txt 내용 삽입
p="$(</tmp/final.packages.txt)"

# 변수p 내용을 가지고 삭제 작업
apt --purge remove $p

apt clean

apt autoremove

참고로 출처는 `apt-get` 명령어였다.

`apt`와 `apt-get`의 큰 차이점은 설치/삭제 시 이쁘게 보여주냐 마냐 차이이다.

반응형
댓글수2