Linux Programmer

리눅스의 nvidia 드라이버 설치 본문

컴퓨터 관련/리눅스(유닉스) 일반

리눅스의 nvidia 드라이버 설치

sunyzero 2014. 7. 6. 00:06

* 리눅스에서 엔비디아(nvidia) 그래픽 카드의 드라이버 설치

Last updated on Sat 14 May 2022

리눅스를 공부할 때 vmware, virtualbox를 설치한 뒤에 가상머신으로 리눅스를 설치하고 있는가?

만일 가상머신으로 리눅스를 돌리고 있다면, 중급 이상의 리눅스 실력으로 성장하기 힘들다. 왜냐하면 가상머신은 오류가 발생되지 않도록 vmware, virtualbox에서 호환성이 높은 드라이버를 가상으로 제공하기 때문이다. 그래서 오류 메시지를 경험하지 못하고 리눅스를 사용하게 된다.

그러나 회사나 연구실에서 머신러닝(machine learning)을 위해 CUDA를 사용하거나, 혹은 그래픽 처리를 위해 리눅스를 사용한다면 리눅스를 직접 설치해야만 한다. 허나 직접 설치해보면 가상머신처럼 깔끔하게 설치되지 않는 경우가 많다. 특히 노트북에 리눅스를 설치하면 수많은 오류로 좌절하는 경우가 많다. 하지만 오류를 해결하면서 여러가지 하드웨어 지식을 배울 수 있기 때문에 꼭 가상머신이 아닌 환경에서 리눅스를 설치하고 사용하는 것이 좋다고 생각된다.

이 글은 그 중에서 가장 기초적인 그래픽 카드 드라이버에 대해 설명하는 글이다.

 

리눅스와 궁합이 잘 맞는 그래픽 카드는 nvidia 제품인데, 그 이유는 nvidia사가 직접 리눅스용 그래픽 드라이버를 배포하기 때문이다. 그런데 역설적으로 리눅스 진영에서 가장 욕먹는 회사중 하나가 nvidia다. 그 이유는 그래픽 드라이버의 자세한 스펙을 공개하지 않고 있기 때문이다. 사실 스펙만 공개해준다면 다른 사람들이 만들어도 되고, 개선도 가능한데 말이다. 그래서 리누즈 토발즈는 nvidia를 매우 싫어한다. 이런 얘기는 검색해서 재미 삼아 읽어보면 좋을 것이다.(유튜브에도 nvidia torvals로 검색해보면 해당 영상을 볼 수 있다)

 

사실 nvidia 드라이버를 설치하는 방법은 그렇게 어렵지는 않다. 그리고 이 글은 주로 Redhat 계열(레드햇, CentOS, Fedora, Suse...등)에 해당하는데, debian 및 ubuntu라도 거의 비슷하다. 단지 패키지 설치때 yum 대신에 apt 혹은 apt-get으로 설치해주면 된다. 그리고 데비안 계열은 패키지명이 약간씩 다르므로 그것만 주의하면 된다.

 

설치 작업은 당연히 관리자 계정인 root로 해야만 한다.(su - 명령) ubuntu에서 sudo를 사용한다면 "su -" 대신에 명령어 앞에 sudo 를 붙여서 실행하면 된다.

 

* Fedora를 사용하는 경우에는 rpmfusion에서 제공되는 패키지를 설치하면 편리하다. 페도라의 nvidia 패키지는 커널 업그레이드 할 때마다 자동으로 커널 모듈을 만드는 기능(akmod)이 있기 때문에 편리하다. 하지만 여기서는 직접 빌드하여 설치하는 방법을 먼저 설명하고, 그 다음에 Fedora 패키지 설치 방법을 다룬다. 참고로 목차의 2.1은 직접 빌드 방법. 2.2는 Fedora 패키지 설치하는 방법이다.

 

1. C컴파일러, kernel 패키지 설치 (준비과정)

기본으로 C compiler와 make 같은 개발 툴이 설치되어있어야 nvidia 드라이버를 설치할 수 있다. 이미 설치되어있는 경우라면 그냥 넘어가면 되고, 없다면 다음 명령어로 설치해야 한다. 잘 모르겠다면 그냥 한 번 명령을 내려보면 된다. 이미 설치되어 있다면 패키지 관리자가 알아서 스킵한다. (# 는 root 유저의 프롬프트 표시이므로 실제로 입력하는 부분은 아니다.) 

 

1.1 레드햇 계열인 경우 : CentOS, RHEL, Fedora

아래의 명령어를 실행해서 컴파일에 필요한 패키지를 설치한다.

# yum -y install gcc gcc-c++ make binutils libtool autoconf automake patch pkgconfig redhat-rpm-config gettext

 

그 다음에 kernel의 헤더, 개발용 헤더 및 스크립트 패키지를 설치해야 한다. 패키지 이름은 kernel-headers , kernel-devel 이다. 주의할 점은 자신이 사용하는 커널의 버전과 동일해야 한다는 것이다. 그래서 커널 버전을 불러오는 uname -r 명령을 같이 사용한다. 

# yum -y install kernel-devel-$(uname -r)  kernel-headers-$(uname -r)  dkms

 

몇몇 최신 버전의 경우 kernel-headers가 없는 경우가 있어서 에러가 발생할 수도 있다. 특히 Fedora 최신 버전의 경우 알맞은 kernel-headers 패키지가 없을 수도 있는데, 이런 경우에는 아래와 같이 명령한다.

# dnf -y update
# reboot
... 리부팅 후...
# dnf -y install kernel-devel  kernel-headers  dkms

 

 

 

1.2 데비안 계열인 경우 : Debian, Ubuntu, Mint ...

데비안 계열이라면 apt 나 apt-get 혹은 aptitude를 사용한다. 아래는 데비안 계열 명령어이다. 참고로 우분투는 앞에 sudo를 붙여야 한다. (아래 apt 부분에 apt-get 혹은 aptitude를 사용해도 된다. apt나 aptitude가 설치되어있지 않다면 apt-get을 사용하라.)

# apt -y install gcc make linux-headers-$(uname -r) dkms

 

2. 드라이버 설치

드라이버 설치 방법은 앞서 언급한대로 2가지 방식을 설명하도록 하겠다. 

첫번째는 직접 빌드하여 설치하는 방법으로 nvidia에서 공식 배포하는 드라이버를 다운로드하여 설치하는 방법이다. 모든 리눅스에서 사용할 수 있는 방법이므로 큰 문제가 없지만, 커널 버전을 업데이트하면 다시 빌드해야 하는 번거로움이 생긴다. 그래도 가장 보편적인 방법이므로 이를 먼저 설명한다. 

 

두번째는 패키지로 nvidia driver를 설치하는 방법을 추천한다. 리눅스에 어느 정도 익숙하다면 직접 드라이버를 빌드하기보다는 패키지 설치를 주로 한다. 이 방법은 커널 업그레이드 시에 자동으로 커널 모듈을 리빌드 하는 기능도 있으므로 편리하다.

(Fedora 리눅스의 경우 패키지 설치가 간단하므로 뒤에 따로 설명하도록 하겠다. Ubuntu의 경우도 간단하게 PPA 저장소로부터 설치할 수 있다. 이에 대해서는 다른 글도 많으니 여기서는 생략하겠다.)

 

2.1.  직접 빌드하여 설치하기

각 단계를 순서대로 적어두었고, 레드햇 계열과 데비안 계열의 공통인 부분과 다른 부분을 구별해서 설명해두었으니 혼동하지 않도록 주의하자.

 

A. nvidia driver download (공통)

이제 www.nvidia.com 에 접속한 뒤에 linux 드라이버를 받는다. 주의할 점은 32bit, 64bit인지 헷갈리면 안된다. 아래 그림은 64bit 버전을 다운로드 받는 모습이다. 다운로드 받은 파일은 *.run 확장자명을 가지고 있다. 즉 드라이버 파일 자체가 셸 스크립트 실행 파일인 것이다.

nvidia site
nvidia site

 

B. nouveau 비활성화 (공통)

nouveau(누보)는 리눅스에 기본으로 탑재된 nvidia용 그래픽 드라이버인데, 이게 로딩되어있으면 nvidia 드라이버와 충돌이 발생하여 설치가 제대로 되지 않는다. 그래서 nouveau 모듈을 비활성화 하기 위한 작업을 해야 한다. 

 

원래는 커널 모듈 비활성 설정 파일을 /etc/modprobe.d 에 저장해야 하는는데, 사실 nvidia driver 설치 파일을 실행하면 nouveau 때문에 설치할 수 없다고 에러가 발생한 뒤에, disabled 시키기 위한 설정 파일을 만들깝쇼?하고 물어본다. 여기서 Yes하면 /etc/modprobe.d/에 nvidia-installer-disable-nouveau.conf 파일을 자동으로 만들어준다.

 

하지만 설치 과정에서 오류 메시지를 보기 싫거나, 꼭 수동으로 하고 싶은 분을 위해 여기에 적어두겠다. 아래 내용을 그대로 긁어서 실행시키면 된다. (cat 으로 파일에 내용을 넣는 명령이므로 cat 이하의 라인을 그대로 복사해서 붙여넣으면 된다.)

# cat <<HERE > /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 
blacklist nouveau
options nouveau modeset=0
HERE

마지막 라인에서 HERE을 치고 엔터를 치는 순간 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 파일이 생성될 것이다. 그리고 실제로 위 코드를 타이핑 하면 2~3번 행의 타이핑 되는 내용 첫칸에 > 기호가 나올텐데 이는 line이 이어지는 것을 보여주는 것이고 실제로 입력되지는 않으니 위에 적힌 대로 blacklist ... 부분만 치면 된다.

 

설정을 변경한 뒤에는 initramfs (init ram filesystem)를 새로 생성해야 한다. initramfs 생성은 레드햇 계열과 데비안 계열이 서로 다르니, 레드햇 계열은 3.1.을 참고하고, 데비안 계열은 3.2.를 보도록 한다.

 

C.1. nouveau 비활성화 후 initramfs 재생성 : CentOS, Fedora, RHEL (레드햇 계열) 인 경우

아래는 레드햇 계열에서 내리는 명령어이다. 데비안 계열이라면 아래 3.2. 항목을 참고하자.

# cd /boot
# mv initramfs-$(uname -r).img{,_backup}
# dracut
# ls initramfs-$(uname -r).img

 

C.2. nouveau 비활성화 후 initramfs 재생성 : Debian, Ubuntu, Mint .. (데비안 계열) 인 경우

아래는 데비안 계열에서 내리는 명령어이다. 레드햇 계열이면 위 3.1. 항목을 참고하자.

# cd /boot
# mv initramfs-$(uname -r).img{,_backup}
# update-initramfs -u

# ls initramfs-$(uname -r).img

 

D. nouveau 비활성화 후 initramfs 재생성 후 확인 : 데비안, 레드햇 계열 공통

앞서 3.1 혹은 3.2에서 내린 마지막 명령어인 ls initramfs-$(uname -r).img 에서 새롭게 생성된 initramfs-$(uname -r).img 파일 목록이 출력되는 것을 확인한다. 

 

만일 파일이 생성되지 않았다면 어디가 잘못되었는지 확인해야 한다. initramfs-$(uname -r).img 파일이 제대로 생성되지 않았거나 문제가 발생했을때 무턱대고 재부팅을 하면 부팅 실패가 생길 수 있으니 주의하자.

 

문제가 없다면 이제 재부팅을 한다. 재부팅 완료 후에 root로 다시 로그인을 하여 lsmod | grep nouveau 라고 명령하면 커널 모듈 목록에 nouveau 관련 모듈이 출력되지 않을 것이다. 만일 여전히 nouveau 커널 모듈 목록이 출력되면 뭔가 꼬인것이다. 아마도 오타일 가능성이 높으니 위 항목 3에서 설정한 설정 파일을 다시 한 번 천천히 살펴보자.

 

E. 텍스트 모드(init 3 런레벨 or multi-user)로 작동

재부팅을 한 뒤에 CTRL-ALT-F2를 눌러서 콘솔 화면으로 나온뒤에 root로 로그인 하자. 이제 리눅스 버전에 따라 명령이 조금 달라진다.

 

E.1. CentOS 6.x를 사용하는 경우

# init 3

init 3은 구식의 init 기반의 리눅스에서 runlevel 3으로 변경하는 명령어로, 기존 runlevel 5에서 작동중인 X window를 종료시켜준다. X 윈도우가 작동중이면 nvidia 드라이버가 설치되지 않기 때문에 런레벨을 변경하는 것이다.

 

E.2. CentOS 7.x나 Fedora 17 이후인 경우 (혹은 데비안 8.x 이후 Ubuntu 18이후)

# systemctl isolate multi-user.target

새로운 최신의 리눅스 시스템은 과거의 SysV runlevel을 대체하여 systemd를 사용하기 때문에 systemctl 명령으로 X윈도우를 종료해야 한다.

 

간혹 systemctl isolate multi-user.target 명령을 내리면 화면이 먹통이 되는 경우가 있는데, 당황하지 말자. 이는 보통 외장 그래픽을 가지는 데스크탑에서 발생한다. 최근의 CPU는 내장 그래픽 칩을 가지고 있는데, 텍스트 모드에서는 외장 nvidia 그래픽 카드보다 내장 intel 그래픽이 먼저 활성되는 경우가 있다. 따라서 이런 경우에는 모니터 케이블을 내장 그래픽 포트에 꼽아서 확인해보면 될 것이다. 애초에 이런 문제를 겪지 않는 확실한 방법은 BIOS에서 그래픽의 우선 순위를 지정할 수 있다면 외장을 더 높은 순위로 해놓는 방법이 있다.(제품에 따라서 이 BIOS 설정은 없을 수도 있다)

 

E.3. Debian 7.x을 사용하는 경우

# init 1

데비안계열은 싱글모드(1번 런레벨)을 사용하므로 1번 런레벨로 스위칭한다. 

 

F. nvidia driver 설치 파일 실행

이제 다운로드 받은 nvidia 드라이버 설치 파일을 실행한다. 실행파일이 아니므로 실행 권한을 주고 실행해야 한다. 드라이버 설치 파일명이 NVIDIA-Linux-x86_64-331.89.run 인 경우에는 아래와 같은 명령어를 사용하면 된다.

#  chmod +x NVIDIA-Linux-x86_64-331.89.run

#  ./NVIDIA-Linux-x86_64-331.89.run

처음에 라이선스 동의는 Accept 해주고, 그 다음에 계속 Yes 혹은 OK를 누르면 된다.

 

마지막에 자동으로 설정파일을 고칠 것이냐고 묻는데 기본값이 No로 되어있으므로, 그냥 엔터를 치다간 설정 파일이 수정되지 않고 바로 넘어간다. 따라서 마지막에 물어보는 것은 Yes로 바꾼 뒤에 끝내면 된다.

nvidia linux driver installer
nvidia linux driver installer

 

G. nvidia 제어판 실행

터미널에서 nvidia-settings를 실행해서 nvidia가 제대로 인식되고 있는지 확인해보자. (혹은 터미널에서 nvidia-smi를 실행해봐도 된다. nvidia-smi에서 그래픽카드 제품명과 메모리가 제대로 나오면 드라이버가 제대로 작동하는 것이다)

 

PS. 동영상 플레이어는 한국어 자막이 잘 지원되는 bomi-player(구 cmplayer)를 많이 사용하므로 이것으로 nvidia 드라이버 테스트를 해보면 된다. bomi-player가 접속이 원활하지 않은 경우에는 vlc player로 하면 된다.

VLC player : https://www.videolan.org/vlc/download-fedora.html

 

2017년도 이후에는 mpv 플레이어가 훨씬 안정화되고 빨라지면서 대부분의 경우 mpv 플레이어를 사용하도록 권장한다. mpv 플레이어의 속도는 최정상 급이다.

 

2.2. 패키지로 설치하기 (Fedora 리눅스의 경우)

이 방법은 Fedora 리눅스를 사용하는 경우에 좀 더 쉽게 nvidia 드라이버를 설치하는 방법이다. Fedora 리눅스를 사용한다면 이 방법을 추천한다. 먼저 1번 단계의 gcc 나 kernel-devel, kernel-headers는 이미 설치했다고 가정하고 진행하도록 한다.

 

* 원본 URL : https://fedoramagazine.org/install-nvidia-gpu/

 

원본 URL의 내용을 번역하고 약간 살을 붙였다. 이후 설치 작업은 root 유저로 작업하도록 한다.

작업해야 할 것은 3가지이다. 첫째로 kernel-headers와 kernel-devel 최신 패키지를 설치한다. 둘째로는 페도라 워크스테이션용 리파지터리(fedora-workstation-repositories)를 설치한다. 셋째로는 리파지터리 설치 후 config-manager 기능을 이용해서 rpmfusion 저장소의 설정을 활성화 시켜준다. 위 3개의 작업을 실행하기 위한 명령어는 아래의 3행이다.

dnf -y update
reboot
...재부팅 후..

dnf -y install kernel-devel kernel-headers

dnf install fedora-workstation-repositories

dnf -y config-manager --set-enable rpmfusion-nonfree-nvidia-driver

 

준비 작업이 끝나고 난 뒤에 dnf repository-pakcages rpmfusion-nonfree-nvidia-driver info 명령으로 패키지 목록 정보를 확인해본다. 여기서 대략 10여개 이상의 목록이 안나오면 앞서 진행한 설정에서 뭔가 잘못된 것이니 그 다음을 진행하면 안된다.

dnf repository-packages rpmfusion-nonfree-nvidia-driver info

 

목록이 잘 나온다면 "소프트웨어" 앱에서 다음과 같이 프로그램을 설치한다. 참고로 소프트웨어 앱은 "윈도우 키"를 눌러서 software 정도를 타이핑하면 나온다. 실행 후 하단으로 내려가보면 "하드웨어 드라이버" 분류가 보인다.

Fedora - Software App

하드웨어 드라이버에서 Nvidia Linux Graphics ... 를 클릭해서 들어간 뒤에 설치해주면 된다. 설치가 완료된 뒤에는 재부팅한다.

 

설치가 모두 성공적으로 실행된 후에는 재부팅을 해본다. 재부팅후 X윈도우에 로그인해서 터미널에서 nvidia-smi 명령어를 내려보면 nvidia 그래픽 드라이버가 잘 작동하는지 확인할 수 있다.

 

2.2.1. Fedora 커널 업데이트 후 nvidia가 작동하지 않는 경우

간혹 Fedora 커널 업데이트 후에 akmod가 버전에 맞는 nvidia kernel module을 생성하지 못하여 그래픽이 잘 안나오는 경우에는 다음과 같이 작업한다. (이 방법 외에 akmods가 제대로 설치되어있다는 가정하에 akmods만 재컴파일하는 방법도 있다. 이는 아래 Failed to initialize NVML 에러를 해결하는 글에 설명되어있다.)

2020.11.28 - [컴퓨터 관련/리눅스, 유닉스] - Failed to initialize NVML (Fedora 리눅스)

그러면 akmods만 재컴파일하는 경우가 아닌, 아예 nvidia kernel module관련 전부를 재설치하는 방법을 살펴보자. 먼저 현재 커널 버전에 맞는 nvidia kernel module(kmod-nvidia)가 존재하는지 확인해본다.

$ uname -r
5.17.9-300.fc36.x86_64

$ rpm -qa kmod-nvidia*
kmod-nvidia-5.17.5-200.fc36.x86_64-510.68.02-1.fc36.x86_64
kmod-nvidia-5.17.6-300.fc36.x86_64-510.68.02-1.fc36.x86_64

 

위에 보면 현재 커널 버전은 5.17.9-300.fc36.x86_64인데, kmod-nvidia는 5.17.6과 5.17.5만 존재하고 있다. 원래 kmod-nvidia는 따로 설치되는 커널이 아니라 akmod-nvidia가 자동으로 빌드해서 만드는 패키지이므로 akmod-nvidia가 문제가 있는 경우가 많다.

따라서 akmod-nvidia 패키지가 설치되어있는지 확인하고 삭제되어있거나 혹은 깨져있다면 재설치 해준다. 예를 들어 기존의 파일을 삭제하고 재설치하려면 아래와 같이 명령한다. (명령시 관리자으로...)

# dnf remove akmod-nvidia
... 중간에 y 해주거나 아니면 애초에 dnf에 -y 옵션을 추가해서 명령

# dnf install akmod-nvidia

 

akmod-nvidia는 패키지를 빌드하기 때문에 처음 설치 후 X윈도우 작동시에 몇십초에서 2~3분 정도 시간이 걸릴 수 있다. 따라서 반응이 없어도 좀 끈기를 가지고 기다려보자. 아무리 오래 걸려도 5분 이상은 걸리지는 않는다.

모든 작업을 완료하고 로그인이 잘 되었다면 rpm -qa kmod-nvidia* 에 새로운 커널 버전에 맞는 패키지가 자동으로 생성되어있을 것이다. (예를 들어 아래 화면은 kmod-nvidia-5.17.9-300 버전에 맞는 파일이 생성된 화면이다)

$ rpm -qa kmod-nvidia*
kmod-nvidia-5.17.5-200.fc36.x86_64-510.68.02-1.fc36.x86_64
kmod-nvidia-5.17.6-300.fc36.x86_64-510.68.02-1.fc36.x86_64
kmod-nvidia-5.17.9-300.fc36.x86_64-510.68.02-2.fc36.x86_64

만일 5~10분이상 걸려도 화면이 안나오거나 문제가 생겼다면 CTRL-ALT-F5나 F6 정도로 다른 console을 열고 root로 로그인한 뒤에 journalctl -xe 로 확인해보자.

 

2.2.2. 그래픽 화면이 잘 작동하지 않는 경우(grubby로 확인)

간혹 모든 설정을 제대로 했음에도 불구하고 제대로 작동하지 않는 경우가 있다. 이런 경우는 boot loader 설정을 건드린 경우가 대부분이다. 따라서 boot loader인 grub2 설정을 확인하고 수정하는 방법을 알아둘 필요가 있다.

Fedora나 RedHat계열에서는 boot loader를 관리하는 아주 편리한 툴인 grubby가 있다. grubby로 현재 부트 설정을 모두 보려면 grubby --info ALL 로 명령하면 된다. ALL 대신에 0을 넣으면 0번째 커널 버전(가장 최근 커널)을 보여준다.

grubby를 사용하지 않는 경우에는 수동으로 커널 설정을 찾아야 하는데, 커널 설정 파일은 다음과 같다.

/etc/default/grub : 부트 로더인 GRUB의 기본 설정 파일

/boot/loader/entries/*.conf : kernel 버전별 커널 설정 파일 (grubby가 보여주는 설정 ★)

특히 /boot/loader/entries에 존재하는 파일들의 내용을 보면 아래와 같이 되어있다.

# ls /boot/loader/entries/
1dbd4d32815b4ee7bbe3f2a41f9317c8-0-rescue.conf
1dbd4d32815b4ee7bbe3f2a41f9317c8-5.17.5-200.fc36.x86_64.conf
1dbd4d32815b4ee7bbe3f2a41f9317c8-5.17.6-300.fc36.x86_64.conf
1dbd4d32815b4ee7bbe3f2a41f9317c8-5.17.9-300.fc36.x86_64.conf

# cd /boot/loader/entries/
# cat 1dbd4d32815b4ee7bbe3f2a41f9317c8-5.17.9-300.fc36.x86_64.conf
title Fedora Linux (5.17.9-300.fc36.x86_64) 36 (Server Edition)
version 5.17.9-300.fc36.x86_64
linux /vmlinuz-5.17.9-300.fc36.x86_64
initrd /initramfs-5.17.9-300.fc36.x86_64.img $tuned_initrd
options root=/dev/mapper/fedora00-root ro rd.lvm.lv=fedora00/root systemd.unified_cgroup_hierarchy=0 $tuned_params rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nvidia-drm.modeset=1 initcall_blacklist=simpledrm_platform_driver_init systemd.unit=multi-user.target
grub_users $grub_users
grub_arg --unrestricted
grub_class fedora

 

위의 경우 options에 systemd.unit=multi-user.target이 설정되어있기 때문에 부팅하면서 자동으로 그래픽이 로딩되지 않는 것이다. 이런 문제를 없애려면 grubby의 --remove-args 옵션을 사용할수도 있고, 아니면 vim 에디터로 해당 파일을 열어서 해당 부분을 삭제하면 된다.

 

* Ref

https://rpmfusion.org/Howto/NVIDIA

 

* History

2023.09.30 2.2번의 항목 업데이트

2022.05.14 Fedora 커널 업데이트 후 nvidia 커널 모듈, grubby 확인 추가

2019.12.25 글의 목록 생성 및 오타 수정

2019.08.01 Fedora 패키지 설치 방법 추가

2018.01.22 데비안 계열 설정 명령어 추가

2017.10.30 오타 수정

2014.07.06 초안 작성

반응형
Comments