글쓴이 보관물: Kim Minkyu

멘붕없이 RVM과 루비 설치하기

안녕하세요. 이음소시어스 개발팀에서 서버사이드 코딩을 하고 있는 김민규(이터)입니다. 저희 개발팀 블로그의 첫 글에 많은 관심을 가져주셨는데요, 두 번째 글은 딱히 특별한 기술은 아니지만 RVM과 루비 설치법에 대해 한글로 된 문서가 별로 없고, 설치하며 겪은 경험을 공유하면 좋을 것 같아 이 포스트를 작성하게 되었습니다.

RVM이란?

루비 좀 안다고 하는 사람들에게 루비를 어떻게 설치하냐고 물어보면 RVM으로 설치하라는 이야기를 많이 들을 수 있습니다. RVM은 Ruby Version Manager의 약자로, 여러 버전의 루비를 쉽게 관리할 수 있게 해주는 스크립트입니다. 

한 시스템에 여러 버전의 루비를 설치하기는 쉽지 않습니다. 일반적인 리눅스의 패키지 시스템으로 동시에 여러 버전의 루비를 깔면 환경변수 꼬이고 gem 꼬이고 난리도 아니죠. 그렇기 때문에 시스템에 이미 작업하고 있는 프로젝트가 있을 때 새로 릴리즈된 루비 버전을 사용해보기는 쉽지 않습니다. 이미 구버전 루비에서 작업한 기존 프로젝트가 어떻게 될지 모르기 때문이죠. 하지만 rvm을 사용하면 여러 버전의 루비, 심지어 gem도 따로 관리해주기 때문에 새 버전을 써보고 다시 전환하기가 쉽습니다. 여기에 더해 gemset 기능을 사용하면 프로젝트별로 별도의 루비 버전을 사용하는 일도 가능합니다.

rvm의 설치 자체는 홈페이지에 있는 스크립트를 그대로 실행하면 되는 아주 간단한 작업입니다. 다만 몇 가지 주의해야 할 사항들이 있는데 이런 것들을 모른 채 설치하면 메뉴얼대로 작동하지 않고, “분명 시키는 대로 했는데 왜 안돼!” 하고 rvm은 물론 루비는 매우 설정이 거지같은 언어라는 안타까운 편견에 빠지게 됩니다.저도 처음엔 고생 꽤나 했구요…

서버 세팅하다 꼬이거나 CSS를 짜다 보면 이런 기분이 듭니다.

이 포스트는 ubuntu 12.04 64bit 기준으로 작성되었습니다.

RVM 설치하기…전에 하면 안되는 일들!

인스톨 방법을 쓰기 전에, 먼저 잘못된 설치법부터 설명하겠습니다.

이 포스트에서 제일 중요한 내용입니다.
절대, 네버, 무슨 일이 있어도 이렇게 깔지 마세요!

apt-get으로 까는 사람들이 많을 수 밖에 없는 이유

우분투가 rvm이 없으면 이렇게 깔라고 친절하게 인도해줘서 속는 사람들이 너무 많습니다. ㅠㅠ

우분투의 apt는 대부분의 패키지들을 apt-get install 명령어 하나로 한방에 깔 수 있게 해주는 멋진 도구입니다. 그런데 이 rvm을 apt-get으로 깔면 무슨 일이 생기냐구요?

설치 테스트와 트롤링을 위해 준비된 VM들

숙련된 VM의 시범을 한번 보겠습니다.

이 포스트를 작성하는 현재 RVM의 최신 버전은 1.24.7입니다…

낡아도 이렇게 낡을 수가 없습니다…

‘구버전이라도 기능만 잘 돌아가면 되겠지?’ 하고 루비를 깔아보겠습니다.

원래 ruby-1.9.3-pxxx등으로 patch level이 쓰여져야 하는데 1.9.3-에서 끝나네요

잘못된 경로로 찾아가서 루비를 제대로 깔 수도 없습니다.
2.0같은건 아예 리스트에 존재하지도 않아요… ㅠㅠ

‘구버전이니까 업데이트를 하면 되겠지? 업데이트를 해보자!’

 

그냥 포기하고 멀쩡한 버전을 깔아봅니다.

클릭하시면 스택오버플로우 링크로 이동합니다

심지어 멀쩡한 버전을 깔려는데도 얘가 방해를 하고 있어서 치워줘야 합니다.
혹시 apt-get으로 rvm을 까셨다면 싹싹 지워줍니다.

1. 패키지를 apt-get –purge로 날려주고, /usr/share, /etc/ 에 있는 스크립트들을 지워줍니다.

싹싹 지워서, 시스템에 후환(?)이 없도록 합시다.

2. 삭제 후에는 shell을 재실행해 이미 로드된 환경변수들이 다시 사라지도록 해줍니다.

하루빨리 우분투에서 이 거지같은 패키지가 사라졌으면 하는 바람입니다.

RVM 진짜로 설치하기

RVM의 설치에는 두 가지가 있습니다. 잘 읽고 원하는 방법을 골라 설치하세요.

Single User Install

  • 설치한 유저에게만 RVM이 깔립니다.
  • 설치한 RVM은 당연히 ‘그 유저’만 쓸 수 있고, 다른 유저가 사용할 수 없습니다.
  • RVM은 설치한 유저의 홈 디렉토리의 .rvm폴더 ($HOME/.rvm)에 설치되고,
    RVM으로 설치하는 ruby와 모든 gem들도 $HOME/.rvm에 저장됩니다.
  • 여러 유저가 각각 Single User Install을 하면 모든 ruby와 gem들은 별도로 저장됩니다.
    시스템 공용으로 사용하는 것은 rvm install에서 루비를 설치하기 위해 설치한 라이브러리뿐입니다.
  • root계정으로 Single User Install을 할 수 없습니다.
    root permission을 가진 상태면 자동으로 multi user 인스톨을 하므로,
    root계정에만 rvm을 깔아서 쓰는 것은 불가능하진…않은데 이 포스트에서는 다루지 않습니다.
    root 계정에만 rvm Single user Install로 설치하기

Multi User Install

  • /usr/local/rvm/ 에 모든 rvm, ruby, gem이 설치됩니다.
  • 한 유저가 설치한 루비, 또는 gem은 시스템 전체에 공유됩니다.
  • 시스템의 모든 유저가 rvm, rvm으로 설치한 루비와 gem을 사용 가능합니다.
  • rvm그룹의 유저만 새 루비 또는 gem을 설치할 수 있습니다.

자 고르셨나요? 그럼 따라해 봅시다.

Single User Install 방법

1. root가 아닌 일반 유저로 아래 명령을 실행합니다. (\ 오타 아닙니다!!)

2. 쉘을 껐다 켜거나 rvm스크립트를 현재 쉘에 로드해줍니다.

끝! 쉽죠?

Multi User Install 방법

1. root가 아닌 일반 유저로 아래 명령을 실행합니다. (\ 오타 아닙니다!!)

bash 앞에 sudo만 붙여주면 됩니다. 와!

실제로 root로 설치해 봤을때 특별히 이상한 점은 찾지 못했는데,
rvm 문서를 보면 root와 일반 유저의 환경변수 차이 때문에
root로 직접 깔지 말고 일반 유저에서 sudo를 써서 사용하라고 합니다.
시키는 대로 하는게 편하겠죠?

2. 그 다음 RVM을 사용할 유저들을 rvm 그룹에 추가합니다.

그룹에 추가를 안해주면 /usr/local/rvm에 write권한이 없어서 루비 설치가 불가능합니다

일반 유저는 /usr/local/rvm에 write권한이 없기 때문에 rvm 그룹에 추가해서 권한을 부여해야 합니다.
이게 없으면 rvm install등을 할 때 권한이 없다고 죽어버려요.

3. 쉘을 껐다 켜거나
(쉘을 껐다 켤 수 없는 상황이면) 그룹 권한을 재로드하고, rvm스크립트를 현재 쉘에 로드해줍니다.

이번에는 그룹 권한도 다시 로드 해야해서 좀 귀찮습니다.
그래서 쉘을 그냥 껐다 켜는게 편해요.

축하합니다! RVM 설치가 끝났습니다!

RVM으로 Ruby 설치하기

sudo같은거 붙일 필요도 없고 붙여서도 안됩니다.
이 과정에서 permission denied가 뜨면 대부분 그룹 문제이기 때문에
id를 쳐서 유저가 rvm 그룹인지 확인해보세요.

이미지가 너무 길어서 잘 안보이는데 끝에 보면 1001(rvm) 이렇게 써있습니다 ㅠㅠ
그룹에 추가했는데도 없으면 쉘을 재실행하거나 위에서 알려준 커맨드로 그룹 권한을 재로드해보세요.

설치 도중 sudo권한이 필요하면 알아서 물어봅니다.

설치 중 시스템 업데이트가 필요해 sudo권한이 필요한 경우가 있는데, 이 경우엔 알아서 물어봅니다.
rvm커맨드에 따로 먼저 sudo를 붙여야 하는 경우는 전혀 없으니,
혹시 permission denied가 뜨면 그룹을 먼저 확인해주세요.

네, 이제 루비 코딩을 시작하시면 됩니다!

TroubleShooting

Q: 루비 스크립트에서 sudo권한이 필요한데, sudo를 쓰면 rvm을 찾을 수 없다고 나오네요. 어쩌죠?

Single User Install에서 볼 수 있는 현상인데, rvm은 우리의 로그인 쉘에 로드되는 스크립트이기 때문에 root에는 깔려있지 않고 깔려 있다 하더라도 그 스크립트를 로드하지 않습니다 ㅠㅠ

sudo 대신 rvmsudo를 사용하면 현재 쉘의 루비를 가지고 sudo권한으로 실행할 수 있습니다.

Q: sudo -s,  su [username]등으로 유저를 바꾸고 그 유저의 rvm을 쓸 수 없나요?

sudo -s, su [username]은 로그인 쉘이 아니라 스크립트를 로드하지 않습니다.
su – [username] 으로 하면 그 유저의 로그인 쉘을 띄우기 때문에 그 유저의 rvm을 쓸 수 있습니다.

Q: 이미 시스템 루비가 있는데 지워야 하나요?

rvm 경로가 $PATH의 가장 앞에 붙기 때문에 시스템 루비는 남아있어도 상관없습니다.

 

이상, 한국에 루비 사용자가 한 명이라도 늘기를 바라는 이터였습니다.