1.
15일전 갑자기 회사 프로젝트 관리용으로 사용하던 레드마인이 멈췄습니다. USB부팅하는 라즈베리파이 서버 만들기에서 소개하였던 라즈베리파이 서버에서 운용하던 시스템입니다. 어렵게 부팅을 해서 확인을 해보니까 디스크 불량으로 보입니다. roots 파티션에 접근하는데 시간이 하세월(何歲月)입니다. fsck 명령어로 파일시스템을 복구해보았습니다.
The phases (passes) performed by the UFS version of the fsck command are:
Initialization
Phase 1 – Check Blocks and Sizes
Phase 2a – Check Duplicated Names
Phase 2b – Check Pathnames
Phase 3 – Check Connectivity
Phase 3b – Verify Shadows/ACLs
Phase 4 – Check Reference Counts
Phase 5 – Check Cylinder Groups
Phase1 단계에서 시간이 걸립니다. 우선 서버를 분해하여 HDD를 테스크탑으로 사용하는 리눅스에 연결하여 같은 명령을 실행하였습니다. 여러번 실패하였지만 다행으로 한번 성공하여 파일시스템에 접근할 수 있었습니다. 이제부터 시작입니다. 우선 Mysql 백업이 우선입니다. 한번도 해보지 않아서 DB를 잘 아는 후배에게 문의했습니다. Mysqld의 경우 버전이 맞거나 비슷하면 관련한 파일을 그대로 복사해서 사용하면 복구가 가능하다고 합니다. 그래서 도전했습니다.
/var/lib/mysql에 있는 모든 파일을 복사해서 별도로 보관하였습니다. 또다른 라즈베리파이에 OS를 설치해서 Mysql을 실행한 후 Redmine Table을 사용할 수 있는지를 확인하였습니다. 솔직히 가장 큰 문제는 root 비밀번호였습니다. 가물가물하여 root 접근이 불가능할 때 mysqldump를 이용하여 백업을 받는 것이 가능한지 몰랐죠. mysqldump 사용법을 읽어보니까 root를 몰라도 redmine 비번만 알아도 가능하였습니다.
MySQL의 대표적인 Logical 백업 프로그램으로서 스토리지 엔진에 상관 없이 백업을 받을 수 있는 tool 입니다.mysqldump 는 기본적으로 dump를 하려고 하는 테이블에 대한 SELECT 권한, dump하려는 view에 대한 SHOW VIEW 권한, dump하려는 trigger에 대한 TRIGGER 권한을 가지고 있어야 합니다. 만약, –single-transaction 옵션을 사용할 수 없는 스토리지 엔진이라면 LOCK TABLES 권한이 추가적으로 필요합니다. 만약, 다른 옵션을 추가적으로 사용한다면 추가적인 다른 권한도 필요하게 됩니다.dump file을 reload하기 위해, 계정은 dump file을 생성했을 때 가졌던 권한을 다 가지고 있어야 합니다.
mysqldump 사용법중에서
redmine 계정을 이용하여 데이타 백업을 받았습니다. 그리고 redmine과 관련한 파일중 Themes, Plugins 및 Files 폴더에 있는 파일도 압축해서 백업을 받았습니다. 처음 해보는 백업이라 시간이 걸렸지만 다행히 큰 문제없었습니다.
2.
이제 라즈베리파이에 OS와 레드마인을 설치할 차례입니다. 예전에 OS를 설치할 때 복잡했는데 이번에도 우여곡절을 겪었습니다.현재 제가 가지고 있는 모델은 Raspberry Pi 3 B+입니다. 요즘 나오는 4 모델이 아닙니다. 어떤 모델이든 시작은 SD카드에 OS를 설치하는 일이 시작입니다.
기본적으로 SD 카드를 이용한 환경이 아니라 SSD/HDD를 이용한 환경을 만들어야 하기 때문에 최근 자료를 확인해보았습니다. SSD/HDD로 부팅하는 방법을 찾아보면 가장 많이 접하는 방법이 있습니다.
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
SD카드에 OS를 설치하고 부팅한 후 위와 같은 명령어를 실행하면 자동으로 SSD/HDD를 이용한 부팅이 가능하다는 이야기입니다.관련한 사이트들이 무척 많습니다. 다만 3 B+에는 적용할 수 없더군요. 어떤 방법을 동원해도 SSD/HDD로 부팅할 수 없었습니다. 주로 사용하는 도구는 BalenEtcher와 PI Imager입니다. 라즈베리파이 재단이 제공하는 X86_archive에서 ISO파일을 다운로드하여 설치를 몇 번했습니다. 보통 정상적인 경우 파티션 둘이 생깁니다. boot 및 roots입니다. 그런데 iso 파일로 설치디스크를 만들여 이런 결과가 나오지 않았네요. 무언가 변화가 있을 것이라고 생각해서 SD카드를 넣고 부팅을 하면 100% 부팅을 하지 못합니다. 또하나 HDD/SDD로 부팅하기 위한 방법을 사용해야 하는데 저는 Three Different Ways To Boot A Raspberry Pi From a USB Drive에 나온 Method #2: Moving The Root File System을 적용했습니다.
제가 설치했던 OS 버전들입니다. 아래 버전들의 경우 정상적인 설치를 하지 못하였습니다. ISO 파일을 열러보면 img로 된 파일과 다릅니다. 용도가 다른 듯 하네요.
2020-02-12-rpd-x86-buster.iso
2019-04-11-rpd-x86-stretch.iso
2018-06-27-rpd-x86-stretch.iso
또다른 배포판도 설치했습니다. Ubuntu MATE for Raspberry Pi에서 제공하는 버전들입니다. Archived에서 확인할 수 있는 ubuntu 16.04, 18.04, 19.04, 20.10도 설치해보았습니다. 의미없는 삽질을 한 것처럼 보이지만 개인적으로 이유가 있었습니다.
이상과 같은 삽질의 시작은 정상적으로 Redmine을 설치한 이후입니다. 최초의 설치환경은 다음과 같습니다. Imager를 실행한 후 OS를 선택하면 아래와 같은 화면이 나옵니다.
이중에서 Raspberry Pi OS(32bit)를 선택하여 설치하였습니다. 부팅을 한 후 [Raspberry Pi Redmine 설치 #3] Apache 설치 및 Redmine 설정를 참고로 하면서 설치하였습니다. OS 환경과 레드마인과 중요한 관계가 있는 Ruby 버전입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ium@raspberrypi:~ $ cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)" NAME="Raspbian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" VERSION_CODENAME=bullseye ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs" ium@raspberrypi:~ $ ruby -v ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [arm-linux-gnueabihf] |
몇 년전 설치할 때 고생했던 기억과 비교하면 무척 쉽게 레드마인을 설치하였습니다. 아마도 Ruby에 대한 이해도가 낮았기 때문으로 보입니다. 최종적으로 mysqldump로 생성한 파일까지 복구한 후 레드마인을 설행하였고 이것저것 클릭했습니다. 너무 쉽게 해결했네…라는 생각이 자만이었습니다. 듣도 보지못한 에러가 발생하였습니다. Ruby 2.7.4 버전이고 Redmine은 redmine-4.2.0 을 설치하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Rendered roles/_form.html.erb (35.5ms) Rendered roles/edit.html.erb within layouts/admin (37.1ms) Completed 500 Internal Server Error in 51ms (ActiveRecord: 6.7ms) ActionView::Template::Error (Tried to load unspecified class: ActiveSupport::HashWithIndifferentAccess): 84: <%= hidden_field_tag "role[permissions_all_trackers][#{permission}]", '0', :id => nil > 85: <= check_box_tag "role[permissions_all_trackers][#{permission}]", 86: '1', 87: @role.permissions_all_trackers?(permission), 88: :class => "#{permission}_shown", 89: :data => {:disables => ".#{permission}_tracker"} %> 90: </td> app/models/role.rb:229:in `permissions_all_trackers' app/models/role.rb:238:in `permissions_all_trackers?' app/views/roles/_form.html.erb:87:in `block in app_views_roles_form_html_erb___376610786332119881_69944433040580' app/views/roles/_form.html.erb:82:in `each' app/views/roles/_form.html.erb:82:in `_app_views_roles__form_html_erb___376610786332119881_69944433040580' app/views/roles/edit.html.erb:4:in `block in app_views_roles_edit_html_erb__4451376381137512519_69944418235820' app/helpers/application_helper.rb:1190:in `labelled_form_for' app/views/roles/edit.html.erb:3:in `_app_views_roles_edit_html_erb___4451376381137512519_69944418235820' lib/redmine/sudo_mode.rb:63:in `sudo_mode' |
Ruby와 관련한 지식이 거의 없고 구글링해도 마땅한 답변이 없는 상태에서 선택할 수 있는 닥치고 환경변경이었습니다. 무식한 방법이지만 딱히 다른 방법이 없었습니다. 이 때문에 앞서 여러가지 OS를 설치할 수 밖에 없었습니다. 최초 실행하였던 레드마인 환경입니다. 가능하면 최초 설치환경에 가깝도록 환경을 만들어서 시험을 하면 가능하지 않을까 하는 생각이었죠.
3.
OS를 설치하면서 생각하지 못했던 변수가 있었습니다. 배포판의 버전이 달라진다고 하여도 Ruby의 버전이 바뀌지 않았습니다. 원하는 Ruby 버전을 설치하여야 하는 일이 발생하였습니다. rvm와 renv와 관련한 자료를 읽어보고 두가지 모두 사용해보았습니다.
우선 renv를 이용하여 Ruby를 선택하는 방법은 Ruby 처음 배우기 : 리눅스에 Ruby 설치하기을 참고하였습니다. RVM을 이용한 방법은 How to Set Up RVM on Debian 10 Buster을 참고하였습니다. 또한 rvm이나 renv를 이용할 경우 passenger와 passenger-install-apache2-module를 이요하여 libapache2-mod-passenger을 설치하여야 합니다. 패키지 설치일 경우 짧은 시간이 필요하지만 passenger-install-apache2-module를 할 경우 온라인으로 소스를 받아서 컴파일까지 하여야 하기 때문에 무척 긴 시간이 필요합니다. Raspberry Pi라 컴파일 시간이 오래 걸리기 때문입니다. 이상에서 언급한 세가지 방법으로 Redmine을 설치하는 안내를 잘 정리하고 있는 글입니다.
How to Install Ruby on Ubuntu 20.04
몇 년전에 redmine을 설치할 때 Passenger가 무엇을 하는지 몰랐습니다. 이번에 이것저것 해보면서 보니까 Passenger는 Apache Tomcat과 같은 WAS가 아닌가 생각했습니다. passenger-install-apache2-module을 이용하여 설치하는 경우 컴파일 과정에서 필요한 환경을 친절히 안내해줍니다. 쉽게 말하자면 하라는 대로 하면 어려움없이 설치가 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Compiling Phusion Passenger(R) works best when you have at least 1024 MB of virtual memory. However your system only has 925 MB of total virtual memory (925 MB RAM, 0 MB swap). It is recommended that you temporarily add more swap space before proceeding. You can do it as follows: sudo dd if=/dev/zero of=/swap bs=1M count=1024 sudo mkswap /swap sudo swapon /swap See also https://wiki.archlinux.org/index.php/Swap for more information about the swap file on Linux. If you cannot activate a swap file (e.g. because you're on OpenVZ, or if you don't have root privileges) then you should install Phusion Passenger(R) through DEB/RPM packages. For more information, please refer to our installation documentation: https://www.phusionpassenger.com/library/install/apache/ Press Ctrl-C to abort this installer (recommended). Press Enter if you want to continue with installation anyway. |
이상과 같은 방식을 OS와 조합하여 설치한 경우들입니다.
Ubuntu 16.04 + Ruby 2.5
Ubuntu 18.04 + Ruby 2.6.6
Ubuntu 20.10 + Ruby 2.7
Debian Stretch + Ruby 2.5
Debian Buster + Ruby 2.6.6
Debian Bullseys + 2.7
기타 등등
문제는 어떤 경우에도 앞서 증상을 해결하지 못하였습니다. 증상도 각각입니다만 마지막 한경에서 issue를 조회하는 부분에서 오류가 발생하였습니다. 다른 것으로 Project와 Setting 메뉴를 선택할 때부터 증상이 나타났는데….
ActionView::Template::Error (Tried to load unspecified class: ActiveSupport::HashWithIndifferentAccess):
솔직히 자포자기 상태로 Mysql을 이용한 복구는 포기하였죠. 대신 최신버전의 Redmine과 과거버전의 Redmine을 병행 가동한 후 Export 기능으로 데이타를 복구할 계획을 세웠습니다. Export할 환경은 Redmine 3.4입니다. 과거데이타를 이용하여 시험을 해보았습니다. 그런데 Export한 결과물을 보니까 이상한 문자입니다. Encoding 오류입니다.
CSV export of different language
결국 CVS도 포기하고 Atom이나 PDF로 Export한 후 필요한 데이타만 한건씩 복구하는 것으로 마침표를 찍었습니다. 두 주동안의 노력이 수포로 돌아가는 순간이었습니다.
4.
위와 같이 최종적으로 결정하고 시스템을 설치한 후 관계자들에게 알렸습니다. 그 사이 혹시나 하는 마음으로 한번도 해보지 않은 환경으로 Redmine을 설치하였습니다. Debian Bullseys + Ruby 2.7은 동일합니다. 다만 Redmine 버번을 4.*이 아닌 5.*으로 하였습니다. 모든 과정을 거친 후 Issue를 선택하니까 …
Ruby라는 언어를 잘 모릅니다. 구글링해보면 유연성과 편리함을 강점으로 하는 언어라고 하네요. Redmine때문에 삽질한 경험으로 보면 편리한 점이 있긴 합니다만 공개 플랫폼에 의지하는 관계로 환경설정이 무척이나 까다롭고 중요함을 느낍니다. 고생하였지만 시스템을 복구해서 무척 다행입니다.
Redmine 5.0이 4.*와 다른 점은 CKEdiotr를 지원하지 않는다는 점입니다. 글쓰기를 위한 에디터로 Textile이 기본이지만 CKeditor Plugin을 많이 사용합니다. 다만 4.*까지만 지원하고 있어서 5.0부터는 기본 에디터를 사용해 합니다. 그래서 과거 데이타를 읽을 때 HTML Tag를 처리하지 못하고 그대로 보입니다.