이번에는 php를 설치하고 동작을 확인한 뒤,  DB접근/제어를 위해 RDS 인스턴스를 생성해 보겠습니다.

 

흔히 Apache, Php, Mysql의 앞 글자를 따서 APM이라고 부르는데, 이는 apache로 웹서버를 구축한 뒤 Php로 웹서버와 DB간의 연동 작업을하고

Mysql를 사용하여 데이터베이스를 관리하기 위해 많이 쓰이는 조합입니다.

간단하게 구조도를 살펴보면 아래와 같습니다.

출처: https://hyeonggunlee.wordpress.com/2017/05/17/apmapache-php-mysql-%EB%9E%80/

우리는 apache와 mysql을 확인했으니 이제 php를 설치하고 실행해보겠습니다.

 

우선 아래 명령어로 php설치를 위해 저장소를 추가합니다. php를 처음 설치하는 경우 필요한 명령어입니다.

sudo add-apt-repository ppa:ondrej/php

결과

패키지를 업데이트 해줍니다. 

sudo apt-get update

 

이제 php를 설치합니다.

sudo apt-get install -y php5.6

결과

 

버전을 확인하는 명령어로 확인해보겠습니다.

php -version

 

apache의 index파일이 있는 디렉토리로 이동합니다.

cd /var/www/html/

 

sudo nano 에디터로 index.php파일을 아래 내용으로 생성합니다.

 

인스턴스 퍼블릭 IPv4 IP를 인터넷에 입력하면 index.html파일이 열렸죠? hello world로 내용이 떴었습니다.

IPv4 ip 뒤에 슬래시를 붙이고 index.php를 추가한 뒤 접속해봅니다.

저의 ip는 100.25.139.116이고 뒤에 index.php를 붙였습니다. 아래와 같은 화면이 떠야 정상입니다.

이로써 아파치와 php를 설치했고, 간단하게 이 둘을 연동하는 작업을 해보았습니다. 이 둘만 잘 조작하여 자기가 만들 웹 어플리케이션에

적용하면 하나의 완성 프로그램이 될 것입니다. 

저희는 Mysql까지 설치하여 DB연동을 확인했는데요. 이로써 APM조합으로 웹 앱을 구축할 준비가 모두 끝났습니다.

 

 

저번시간까지 리눅스 기초 명령어들의 사용법에 대해 알아보았습니다.

이번 시간에는 EC2에 MySQL을 설치해보겠습니다. 데이터베이스를 설치함으로써 외부사용자가 EC2의 우분투 환경에 설치된 데이터베이스에

접근하여 데이터를 추가/삭제/수정 등의 작업을 할 수 있게됩니다.

 

아파치로 간단한 웹서버를 구축했고 이제 MySQL과 PHP를 설치하여 APM(Apache Php MySQL)을 구성해보겠습니다.

 

MySQL설치

먼저, 패키지를 업데이트, 업그레이드 해줍니다. 어떤 패키지를 깔더라도 꼭 습관처럼 해주는게 좋습니다.

sudo apt-get update

sudo apt-get upgrade

 

이제 아래 명령어로 MySQL을 설치합니다. 중간에 y/n 옵션이 뜨게되면 y를 누르면 됩니다.

 

설치완료

 

루트 디렉토리에서 etc디렉토리로 가보면 패키지가 설치되었음을 확인할 수 있습니다.

이제 mysql에 접속해보겠습니다. 최초 루트계정으로 접속하기위해 아래 명령어를 입력합니다.

비밀번호는 절대 까먹으시면 안됩니다.. 많이 곤란해질수도...

show databases;를 입력해보면 아래와 같이 초기 디폴트 db가 구성되어있습니다.

저희는 mysql 데이터베이스를 사용합니다.

use mysql; 을 입력하여 mysql 데이터베이스로 이동합니다.

이제 root 유저가 아닌 새 유저를 생성하여 db에 접근해보도록 하겠습니다.

작업 유저를 따로 생성하여 mysql의 작업을 진행한다고 생각하면 됩니다.

 

이제 새 유저를 생성해보겠습니다. 아래 명령어로 유저를 생성해주세요.

오타, 그리고 입력내용을 까먹지 않도록 주의합니다.

 

CREATE USER '아이디'@'로컬/외부 접속' IDENTIFIED BY '비밀번호';

꼴로 작성해주시면 되는데,

만약 CREATE USER 'JOW1025'@'localhost' IDENTIFIED BY 'jow1025'; 로 작성한다면, 

유저 이름: JOW1025

로컬/외부접속 여부: 로컬에서만 접근(외부에서 db접근 불가)

비밀번호: jow1025 가 되고

모든 외부접속을 허용하려면 localhost-> %으로 바꿔주시면됩니다. 저희는 아래꼴로 작성합니다.

CREATE USER 'JOW1025'@'%' IDENTIFIED BY 'jow1025';

 

로컬에서만 db를 다룬다면 우분투에서의 이 작업들이 무의미하므로 외부접속을 허용할 수 있도록합니다.

저는 아이디와 비밀번호를 'cloud'로 통일했습니다.

이제 생성한 계정에 권한을 부여할 차례입니다. 저희는 생성한 계정을 root계정처럼 모든 권한을 부여받아 사용할 것입니다.

어떠한 제한없이 데이터베이스의 모든 기능을 사용할 수 있게됩니다.

 

아래 명령어를 입력합니다.

GRANT ALL PRIVILEGES ON *.* to 'cloud'@'%'; (cloud는 저의 아이디입니다.)

 

아래 명령어로 변경내용을 즉시 적용시켜줍니다.

FLUSH PRIVILEGES;

권한이 잘 설정되었는지 확인해봅니다.

권한에 대한 내용은 메타데이터로 저장되어있고 아래 명령어를 통해 권한이 잘 설정되었는지 확인할 수 있습니다. 

show grants for 'cloud'@'%'; (cloud는 아이디 이름)

설정이 끝났고, exit명령어로 탈출합니다.

이제 실제로 외부에서 이 db에 접근할 수 있도록 mysql의 config파일을 수정해야합니다.

루트 디렉토리-> etc디렉토리->mysql디렉토리-> mysql.conf.d디렉토리로 이동한 뒤 mysqld.cnf파일을 수정합니다.

 

스크롤을 조금 내리다보면 bind-address부분이 있고, 디폴트로 127.0.0.1(본인 ip)로 지정되어있는데 이 경우 로컬환경에서만 db접속을 허용하는 것이므로 아래 문장을 추가하여 모든 외부접속을 허용한다고 선언해줍니다.

bind-address=0.0.0.0

 

변경사항을 적용했으니 mysql을 재시작해줍니다.

sudo service mysql restart

이제 외부 접속을 테스트 해보겠습니다.

 

EC2 콘솔창-> 왼쪽 배너 [네트워크 및 보안]- 보안그룹으로 이동한 뒤 인바운드 규칙 편집에서

MYSQL/Aurora의 유형을 위치무관으로 설정한뒤 추가해줍니다.

 

이제 mysql 툴 (워크벤치, 토드 등)을 실행해봅니다. 

저는 워크벤치가 있어서 workbench로 실행해보겠습니다.

 

워크벤치 홈 화면 중간에 MySQL Connections의 +버튼을 클릭합니다.

Connection Name은 자유롭게 작성하시면됩니다. 저는 mysql이라고 작성했습니다.

Hostname의 ip는 AWS 콘솔창-> EC2에서 해당 인스턴스의 퍼블릭 IPv4주소를 복붙해서 넣어주면됩니다.

Username은 아까 우분투에서 만든 계정 아이디를 작성하면되고 password도 아까 작성한 비밀번호를 그대로 입력합니다.

이 상태에서 Test Connection 버튼을 클릭했을 때 성공적으로 완료가 되어야합니다.

 

연결에서 에러가 났다면 우분투에서 mysql 유저 계정을 생성하고 권한을 부여하는 명령어 단계에서 오류가 난 것입니다. 처음부터 다시 해보시길바랍니다. ( 저도 다시했습니다....)

 

쿼리창에서 show databases;를 입력해봅니다. 잘 뜨는 것을 확인할 수 있습니다.

 

이제 워크벤치에서 데이터베이스를 하나 생성한 뒤 우분투에서 연동이 되었는지 확인해보겠습니다.

저는 jow1025라는 데이터베이스를 하나 생성했습니다.

이제 우분투에서 확인해보겠습니다. 

워크벤치에서 추가한 jow1025라는 이름의 db가 생성된것을 확인할 수 있습니다.

 

 

이번시간에 굉장히 많이 사용되는 명령어들에 대해 더 알아보겠습니다.

1. cat 

2. grep

3. find

4. ps

5. grep과 find, ps의 복합적 사용

 

 

1. cat

cat명령어는 파일의 내용을 출력하는 명령어인데 '>' 와 '>>' 기호를 이용하여 파일의 내용을 다른 파일에 덮어쓰거나 이어붙일 수 있습니다. 

>>기호로 내용을 덧붙일 경우 자동으로 개행처리가 됩니다.

주의할 것은 cat file1 >> file 2일 때 file1내용 뒤에 file2내용이 덧붙여지는 게 아니라 file2 내용 뒤에 file1 내용이 덧붙여진다는 점입니다.

그리고 내용이 덮어쓰기 될 파일과 내용이 덧붙여질 파일이 없더라도 입력함과 동시에 파일이 생기고 동작이 진행됩니다.

아래 결과들을 토대로 쉽게 이해할 수 있습니다.

 

2. grep

grep 명령어는 어떤 문자열에 대해 그 문자열의 내용을 가진 파일/ 내용을 검색해 주는 명령어입니다.

단독으로 쓰기보다 주로 ps나 find 명령어와 같이 쓰입니다. 

형태는 간단합니다. grep ["검색 문자열"] ["파일명"]  

 

문자열을 검색할 파일 명과 파일 내용을 출력하려면 ["파일명"] 부분을 *로 해주면 됩니다.

.txt, .c, .py처럼 형식이 있는 파일에 대해서만 검색 문자열이 담겨있는 어떤 파일의 내용만 출력하려면 *.*를 적어주시면 됩니다.

 

주의: file1과 file1.txt는 서로 다른 파일입니다. *는 모든 파일을 검색하고 파일명/파일 내용까지 출력하고

*.*는  .txt, .c처럼 파일 형식이 있는 파일 중에서만 검색하며 파일 내용만 출력합니다.

 

grep -H ["문자열"] *.* 처럼 H인자를 추가하면 *의 결과처럼 파일명과 내용이 같이 출력됩니다.

grep -H ["문자열"] * 처럼 작성한다면 마찬가치로 파일명과 내용이 같이 출력됩니다.

grep -Hw["문자열"] * 처럼 작성한다면 정확히 검색 문자열과 동일한 문자열이 들어간 파일명/내용만 출력됩니다.

ex) grep -Hw file * => files라는 내용이 담긴 파일은 안뜨고 file이라는 내용만 들어간 파일명/내용만 출력됨

 

아래 명령어 결과들을 천천히 보고 어떻게 다른건지 확인해 보시면 될 것 같습니다.

파일 명과 파일 내용까지 둘다 검색을 필요로 하는경우가 많으니 그냥 *를 붙이는 게 나아보입니다.

3. find 

find 명령어는 어떤 파일이나 디렉토리의 위치를 알려주는 명령어입니다.

주로 많이 사용되는 꼴은 find ./ -name ["파일명or디렉토리명"]꼴입니다.

./는 현재 디렉토리를 의미하고 현재 위치를 기준으로 검색 파일/디렉토리의 위치를 출력합니다.

* 자꾸 불필요한 권한 거부 문구가 뜨는데 저랑 똑같은 증상이라면 무시하거나  앞에 sudo를 붙이면 됩니다.

 

4. ps

ps는 현재 실행중인 프로세스의 목록을 나열하여 출력하는 명령어입니다.

기본적으로 위와 같이 나오고 다른 프로그램을 실행중이라면 저기에 추가로 나열됩니다.

사진에 나오는 PID를 이용하여 해당 프로세스를 종료시킬 수 있습니다.

kill -9 "PID번호"

ex) PID가 12345인 apache 프로세스를 종료시킬 때=> kill -9 12345

 

하지만 ps명령어를 단독으로 사용하진 않고 ps -ef를 많이사용합니다. 

위에서는 2개만 나왔는데 아래를 보면 굉장히 많은 프로세스가 돌고 있는것을 알 수 있습니다.

PID는 프로세스의 id, PPID는 해당 프로세스의 부모 프로세스를 의미합니다.

 

 

5. grep, find, ps의 복합적 사용 예시

grep과 find, ps명령어는 단독으로는 많이 안쓰이고 이 3가지 명령어들과 주로 조합하여 사용됩니다.

명령어는 모두 다루었고 조합하여 사용될 뿐이므로 간단하게 몇가지 예제를 통해 의미를 알아보셨으면 좋겠습니다.

 

1) 검색할 문자열과 관련된 프로세스의 목록 찾기

딱히 출력될만한 작업을 하지 않아서 저번에 깔아놓은 apache를 검색해보겠습니다.

ps -ef | grep apahe (apache라는 문자열과 관련된 프로세스 )

아파치 웹서버 프로세스가 돌아가고 있음을 의미합니다. 아파치 프로세스를 kill 하면 아파치 웹서버가 다운될 것입니다.

 

2) 확인하고자 하는 글자가 포함된 파일 찾기

sudo find ./ -name "*" | xargs grep -n "file1"을 입력하니 

file1문자열이 포함된 파일명/내용과 문자열 "file1"과 관련된 몇가지 명령어 히스토리 기록도 보여주는 것 같습니다.

 

 

 

 

 

라즈베리파이에서 opencv로 실시간으로 스트리밍하는 코드에서 자꾸 오류가 나서 검색해봤더니

 

나오지도않고 많이 애를 먹었는데 생각보다 간단했기에 정리해봤습니다.

이 오류 때문에 단순히 카메라 자원을 쓰는것 자체가 불가능 했었는데요..

오류 문구는 아래와 같습니다. 저와 비슷하게 오류문구가 떴다면 한번 확인해보셨으면 좋겠습니다~~

 

[ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_gstreamer.cpp (1901) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Cannot identify device '/dev/video-1'. [ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_gstreamer.cpp (990) open OpenCV | GStreamer warning: unable to start pipeline [ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_gstreamer.cpp (577) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created [ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_v4l.cpp (833) createBuffers VIDEOIO(V4L2:/dev/video0): failed mmap(921600): errno=19 (No such device) [ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_v4l.cpp (890) open VIDEOIO(V4L2:/dev/video0): can't open camera by index Traceback (most recent call last): File "/home/pi/ll.py", line 43, in observe() File "/home/pi/ll.py", line 18, in observe cv.imshow("VideoFrame", frame) cv2.error: OpenCV(4.5.1-dev) /home/pi/opencv/modules/highgui/src/window.cpp:404: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'

 

 

저의 경우 스트리밍 성능을 비교하기 위해 mjpeg-streamer, uv4l 패키지를 깔았는데요.

결과적으로 uv4l이 백그라운드 프로세스로 계속 열려있었고 카메라 자원을 점유하고 있는데

제가 계속 카메라 자원을 요청하고있었기에 발생한 출동 문제였습니다.

상단 오류 문구의 can't open camera by index가 그 증거이구요.

 

일단 사전에 카메라가 잘 연결되었는지, 장치가 등록되어있는지 확인해야합니다.

아래 명령어로 확인했을 때 detected, supported가 둘다 1이 떠야합니다.

vcgencmd get_camera

 

그리고 웹캠은 잘 모르겠으나 rpi cam ( v2모듈 등등)을 사용하고 계시다면 기본적으로

카메라 자원이 0번(video0)으로 등록이 되어있을 텐데 이 부분도 확인해야합니다.

 

ls /dev/video* 또는 ls /dev/video* -l 명령어로 video0이 뜨는지 확인해야합니다.

안뜬다면 카메라 재연결 + 리부트 해보시길 바랍니다.

 

이제 다음 단계입니다. 아래 순서대로 한번 확인해보시면 될 것 같네요.

 

1. 프로세스 확인 ps 명령어 혹은 ps -ef 

2. 사용하지 않는 카메라 스트리밍관련 서버 패키지 프로세스 kill

3. 그래도 안되면? 스트리밍 패키지가 데몬으로 부팅시마다 계속 실행 중인지 확인-> 있다면 해제

chkconfig --list 명령어로 확인하면 될 것 같습니다

(이 부분에서 제가 사용하지 않는 uv4l이 데몬으로 돌아가고 있어서 문제가 발생하였습니다.)

4. 확인 차 리부트 + 실행= 완료

 

**2021-07-06 추가 수정 사항 ***

videocapture함수의 인자를 -1또는 0으로 지정하여 프리뷰 화면을 이용하려 할 때 동시에 스트리밍을 하려고할 때 (mjpg streamer, uv4l, gstreamer등등) 자원선점 오류로 실행에 에러가 발생합니다.

이것은 카메라 자원을 동시에 두 군데에서 요청하기 때문에 발생하는 자연스러운 오류이며 위의 캡처본 같은 오류가 발생할 수 있습니다. 따라서 별도로 스트리밍 서버를 실행시켜놓고 파이썬 코드에서 opencv를 이용한 이미지 처리를 할 때 videocapture()함수 인자에 0또는 -1이 아닌 스트리밍 서버의 주소를 불러와야합니다. 프레임이 끊기는 문제에 대한 해결책은 좀 더 고민한 뒤 업로드 하겠습니다.

 

 

 

이번 시간에는 저번시간에 이어서 추가로 많이 쓰이는 명령어들과 상대경로, 절대경로에 대해 학습해보겠습니다.

 

1. 절대경로와 상대경로

2. 사용자 별 권한 부여(읽기,쓰기, 실행)

3. 사용자 스위칭 & 권한 변경

 

절대경로와 상대경로

 

1. 절대경로

저번시간에 cd 명령어로 경로를 변경할 수 있음을 알았는데, 절대경로가 무엇일까요?

절대경로란, 최상위 디렉토리에서 목표 디렉토리까지 이르는 모든 경로를 말합니다.

이 때 최상위 디렉토리란 ' / ' 을 의미합니다. 맨 왼쪽에 슬래시가 달려있죠.

말그대로 모든 경로를 기술한 것이므로 위치를 이동할 때 cd 명령어에 최상위~목표 디렉토리까지 경로를 적어주면됩니다.

이 때, pwd로 확인한 절대경로는 맨 앞에 최상위 디렉토리 표시(/) 가 붙는다는 것을 꼭 기억해주세요.

절대경로는 어렵지 않고 최상위 디렉토리~그냥 목표 디렉토리까지의 경로를 써주기만 하면됩니다.

아래 결과로 설명을 마치겠습니다. 

*현재 위치가 /home/ubuntu/a/b일 때 cd a/ 명령어는 /home/ubuntu/a을 의미하는게 아니라 /home/ubuntu/a/b/a를 의미합니다!! 주의하세요.

2. 상대경로 

상대경로는 현재 자신의 위치를 기준으로 나타낸 경로입니다.

최상위, 현재, 상위, 홈 디렉토리에 대해 다음과 같이 나타낼 수 있습니다. 외워주시면 됩니다.

아래 명령어들은 cd와 같이 쓰입니다.

1) 최상위 디렉토리의 위치: / 

2) 현재 디렉토리의 위치: ./ or .

3) 현재 위치의 상위 디렉토리의 위치: ../ or ..

4) 홈 디렉토리의 위치: ~ or ~/

2,3,4 번에서 뒤의 슬래쉬를 생략해서 자주 씁니다. 저렇게도 쓸 수 있구나 정도로 참고만 하시기 바랍니다.

 

아래 결과를 토대로 충분히 학습할 수 있도록 합니다.

 

사용자 별 권한 부여(읽기, 쓰기, 실행)

 

저번시간에 ls -l 명령어를 사용했을 때 아래처럼 drwxrxr-x, -rw-rw-r-- 꼴로 나오는 것을 확인 할 수 있었는데요.

저 영어 표시가 각각 a디렉토리와 hi 파일에 허용된 권한을 의미합니다.

짝대기(-)는 파일, d는 디렉토리를 의미합니다.

맨 첫번 째 기호가 파일/디렉토리를 나타내고 나머지 아홉자리를 각각3자리씩 끊어서 각각

사용자(user)/그룹(group)/기타(other)의 권한을 의미하는데요.

3자리가 r,w,x(읽기권한, 쓰기 권한, 실행 권한)으로 나눠져있고 각 알파벳은 이진수로 이루어져 있습니다.

 

 

출처: https://mamu2830.blogspot.com/2019/09/rwx.html

어떤 파일의 권한이 -r-xrw-rwx일 때 어떻게 해석할 수 있을까요?

=> 파일의 소유자는 읽기+실행, 그룹은 읽기+쓰기, 기타사용자는 읽기+쓰기+실행 권한이 있음을 의미합니다.

  

파일/디렉토리의 rwx의 권한은 chmod 명령어로 변경할 수 있습니다.

아까 위에서 살펴본 a디렉토리와 hi 파일의 rwx권한을 변경해 보겠습니다.

명령어에서 사용자/그룹/기타 유저는 u/g/o로 나타내고 권한을 추가할 경우는 +, 뺄 경우는 -로 표기합니다.

간단한 예제를 통해 확인해 보겠습니다.

 

"a 디렉토리의 권한을 변경하되 유저의 읽기,실행 권한을 빼고 기타 사용자의 쓰기 권한을 부여하기"

=> chmod u-r,u-x,o+w a(디렉토리명)

 

 

"hi 파일의 권한을 변경하되 각 그룹별로 없는 권한들을 모두 부여하기"

=> chmod u+x,g+x,o+w,o+x hi(파일명)

 

하지만 이렇게 영어로 일일이 작성해주는건 매우 번거롭습니다.

위에서 살펴본대로 r=4, w=2, x=1로 총 7이므로 이를 이용하여 숫자로 변경해주는게 간단합니다.

 

"a 디렉토리의 권한을 변경하되 사용자 그룹의 쓰기 권한을 제거하고 기타 유저의 읽기 권한을 제거하기"

=> 유저는 그대로 -w-(0+2+0=2), 그룹은 r-x (4+0+1=5), 기타는 -wx (0+2+1=3) 이므로 chmod 253 a 로 입력하면 됩니다.

 

 

사용자 스위칭과 권한변경

 

이번엔 기본 사용자(ubuntu)에서 다른 유저로 스위칭하고 스위칭된 유저에게 특정파일의 수정 권한을 ubuntu(사용자)로 넘겨주는 작업을

해보겠습니다. 불필요할 것 같으신 분들은 여기서 마치시면 됩니다.

 

새 계정을 만들어 주기 위해 다음과 같이 입력해줍니다. 저는 jow1025라는 이름으로 유저를 만들었습니다.

sudo adduser 이름(jow1025)

패스워드만 입력해주고 나머지 옵션(인적사항)들은 그냥 엔터 눌러주시면 됩니다.

 유저를 생성했으니 새 유저로 접근해보겠습니다. 

"su 이름(jow1025)" 명령어를 입력하면 아래와 같이 나오는데, 문제는 프롬프트의 맨 앞의 ubuntu-> jow1025로 변경되었을 뿐 ls로 파일목록을 보니 이름만 바뀌었을 뿐 모든 파일/권한은 여전히 ubuntu에 있음을 알 수 있습니다.

 

홈디렉토리도 새로 바꾸고 jow1025만의 권한을 갖게 하려면 "su" 가 아닌 "su -l "명령어를 입력해야합니다.

"su -l jow1025"

 

그럼 아래와 같이 홈디렉토리도 jow1025으로 되어있고 새 유저여서 아무런 파일도 없는 것을 알 수 있습니다.

exit명령어로 빠져나온다음 새로 입력하면 아래와 같이 나오게 됩니다.

 

새로 만든 hello.txt 파일의 소유자/그룹의 권한이 jow1025로 바뀐 것을 알 수 있습니다.

이제 이 hello.txt의 파일의 소유자/그룹을 ubuntu로 바꿔봅시다. 소유자/그룹의 변경은 chown명령어를 사용합니다.

 

권한을 변경하는 작업이므로 루트 계정만 진행할 수 있기 때문에 앞에 sudo를 붙여주고 아래와 같이 입력합니다.

소유자와 그룹을 모두 ubuntu로 바꿔주겠습니다.

 

sudo chown ubuntu:ubuntu hello.txt

 

권한을 바꿔준 뒤 jow1025가 파일의 내용을 수정하려고하면 파일의 권한이 ubuntu로 넘어갔기 때문에 permission denied 오류가 뜹니다.

삭제할 때도 같은 권한거부 문구가 뜰것 같았는데 정말 삭제할 건지만 한번 더 물어보네요. 

 

jow1025사용자가 hello.txt파일을 만들고 파일의 소유자/그룹을 ubuntu로 바꾸고 난 후 jow1025가 파일을 수정하려고 할 때와 삭제할 때 각각 어떤 문구가 출력되는지 알 수 있습니다.

 

아래: jow1025가 만든 파일의 소유자/그룹을 ubuntu로 바꿔주는 과정+ jow1025가 파일을 삭제하려고 할 때

아래: jow1025가 파일의 내용을 hello로 바꾸려고 할 때 권한 거부

 

 

 

 

 

 

저번에 mjpeg-streamer을 이용한 스트리밍 방법에 대해 알아보았습니다.

라즈베리파이를 이용한 스트리밍 방법으로 mjpeg-streamer, uv4l, motion, VLC 등 다양한 방법들이 존재하고

각 방법마다 장단점이 있기에 이번시간에 UV4L을 이용한 스트리밍 방법에 대해 알아보겠습니다.

 

V4L2는 리눅스에서 카메라를 이용한 영상 획득과 출력 장치의 제어를 위한 API, 드라이버 프레임워크를 가리키며, USB 웹캠, TV 튜너장치등을 지원하는 소프트웨어입니다.

 

이제 설치와 실행단계를 진행하겠습니다.

 

1. 파이카메라 설정

 1) 라즈베리파이 보드에 연결한 뒤 "vcgencmd get_camera" 명령어로 잘 연결되었는지 확인합니다.

 2) sudo nano /etc/modules를 입력한 뒤 bcm2835-v4l2(알파벳L)를 추가해줍니다.

 (라즈베리파이가 부팅 될 때 마다 bcm2835-v4l2모듈을 로드하게됩니다.)

2. 버전 세팅(주의)

uv4l을 사용하기 위해 버전에 따라 apt 키(인증키)를 추가해주는 작업입니다.

대부분 rpi OS Lite버전이나 buster버전을 사용하기 때문에 이 방법으로 설명하겠습니다.

그 외 다른 버전의 OS이라면 아래 링크를 참고해주세요.

www.linux-projects.org/uv4l/installation/

 

Installation for ARM (Raspberry Pi) – (advanced) Projects

How to install or upgrade UV4L on Raspbian Wheezy, Raspbian Jessie, Raspbian Stretch, Raspbian Buster (Raspberry PI OS) for Raspberry Pi IMPORTANT! Packages for Raspbian Wheezy and Raspbian Jessie are no longer maintained, consider to upgrade your system t

www.linux-projects.org

 1) 이제 아래 명령어를 입력해줍니다.

 curl https://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add - 

 주의: https -> http로 작성하면 나중에 에러납니다 ㅠㅠ 이거때문에 힘들었네요;

 맨 아랫줄에 OK가 나와야합니다. 아래 사진은 에러가 난 경우입니다. (s 하나 빼먹어서 에러가 난다고?...)

 

 2) sudo nano /etc/apt/sources.list에 아래 문장을 입력한 뒤 저장합니다. (두 번 째 줄 추가)

 3) sudo apt-get update 명령어로 패키지를 업데이트 해줍니다.

 아래 처럼 나온다면 1) 단계에서 잘못된겁니다.

3. UV4L 설치

 1) sudo apt-get install uv4l uv4l-raspicam 명령어를 입력합니다.

 2) 부팅 시 드라이버가 로드 될 수 있도록 아래 명령어를 입력합니다.

 sudo apt-get install uv4l-raspicam-extras

4. 시작, 종료하기

 1) 스트리밍 서버 패키지 설치단계로, 아래 명령어를 입력합니다. 이제 웹에서 스트리밍을 볼 수 있습니다.

 sudo apt-get install uv4l-server uv4l-uvc uv4l-xscreen uv4l-mjpegstream uv4l-dummy uv4l-raspidisp

 

 2) sudo service uv4l_raspicam restart 명령을 입력하여 서비스를 시작합니다.

  "/etc/uv4l/uv4l-raspicam.conf" 파일에서 높이, 너비 등의 여러 설정을 변경할 수 있습니다.

 

 3) 웹 브라우저에 https://ip:8080"을 입력하면 아래 화면이 나타납니다.

 4) 해상도를 조절하기 위해 톱니바퀴 모양(control panel)을 클릭합니다.

 * default 해상도는 1920*1080으로, 너무 해상도가 높으면 화면이 끊길 수 있습니다.

 해상도를 640*480으로 맞추고 포맷을 MJPEG로 맞춘뒤 상하반전을 위해 vertical mirror를 enable로 변경했습니다.

 이제 맨 아래 apply버튼을 클릭해줍니다.

 5) 스트리밍 화면 출력

 http://라즈베리파이주소:8080/stream/video.mjpeg 명어를 실행해보면 스트리밍 화면이 뜹니다!

 원래 많이 끊기는건지 와이파이 연결상태가 안좋아서 그런건지.... 해상도를 낮췄는데도 많이 끊겼습니다.

 6) 스트리밍 종료

 uv4l은 ps 명령어를 입력해도 프로세스가 안떠서 sudo pkill uv4l 명령어로 종료합니다.

 

이로써 uv4l을 이용한 스트리밍 실습이 끝났습니다~

 

 

저번시간에 EC2 인스턴스 생성 및 원격 접속 툴(Tera Term, 테라텀)을 이용하여 우분투에 접속해보았습니다.

저희가 생성한 EC2 인스턴스 OS의 운영체제가 우분투 이므로 (리눅스 파생) 간단한 리눅스 명령어에 대해 복습해보고

  추가로 웹서버구축을 위해 아파치2를 설치해보도록 하겠습니다.

 

우선 테라텀으로 인스턴스의 ip로 입장합니다.

터미널창이 너무 작아서 작업하기 힘드므로 상단의 설정-> 터미널-> 터미널 크기를 적절히 조절해줍니다.

글꼴은 설정-> 글꼴에서 바꿀 수 있습니다. 저는 consolas체로 변경했습니다.

 

이제 잠시 우분투의 시스템 디렉토리의 구조를 알고 넘어가겠습니다.

리눅스의 파일 시스템 구조(디렉토리)는 기본적으로 아래와 같은 트리 형태로 구성되어있습니다.

최상단이 루트 디렉토리고 그 아래에 있는 디렉토리는 일반 유저가 사용할 수 있는 디렉토리입니다.

리눅스(Linux)에서 특정 명령을 실행하거나 파일에 접근하기 위해서는 루트(root) 권한이 필요한데,

일반 사용자(유저)가 root 권한을 사용하기 위해서 su, sudo 등의 명령어를 사용합니다.

 

일반 사용자는 루트 권한이 없으므로 특정 작업들에 대해서는 루트 권한으로의 변경이 필요합니다.

 

처음 우분투를 켰을 때는 일반 사용자로 되어있고 최초 root 계정을 생성하기위해 비밀번호를 설정해야하는데,

아래 명령어로 루트 계정의 비밀번호를 설정해줍니다.

sudo passwd root

(명령어 입력 후 비밀번호 설정+확인의 단계를 거칩니다.)

 

일반 유저에서 루트계정으로 전환하기 위해 많이 사용하는 명령어는 다음과 같습니다.

1. su - 

2. su

3. su - root

3개중에 아무거나 편한 명령어를 사용하면 됩니다. 루트계정에서 일반 계정으로 다시 넘어오려면 "exit"를 입력하면 됩니다.

 

위 사진을 보면,일반 계정은 "사용자 이름"@ip :~$" 으로, 루트 계정은 "root@ip:~#" 형식으로 프롬프트에 뜨게됩니다.

이 때 물결 표시는 홈 디렉토리의 위치( 기본: /home/ubuntu)를 의미하고 달러($)는 일반 계정, 샵(#)은 루트 계정을 나타냅니다.

#: 루트계정, $:일반계정, ~:홈 디렉토리

홈 디렉토리는 /home/사용자명 으로 되어있고 특별이 건드린게 없다면 /home/ubuntu로 되어있습니다.

 

이제 간단하게 쉽고 많이 사용되는 명령어들을 배워보도록 하겠습니다.

1. cd : 디렉토리 이동

 - cd ~: 홈 디렉토리로 이동

 - cd: 홈 디렉토리로 이동

 - cd .. : 직전 디렉토리로 이동

 

2. ls: 파일, 디렉토리 목록 출력

 - ls -l : 파일, 디렉토리에 대한 상세 정보 출력

3. pwd: 현재 디렉토리의 절대경로 출력

4. mkdir, rmdir: 디렉토리 삭제

5. touch: 빈 파일 생성, 주로 nano 편집기 사용

6. cat: 파일 내용 출력

* cat file1 > file2: file1의 내용이 file2에 복사(덮어쓰기)됩니다.

* cat file1 >> file2: file1의 내용이 file2의 내용 뒤에 덧붙여집니다.

7. mv: 파일 이동, 파일/디렉토리 이름 변경

8. clear: 터미널 창 깨끗이 지우기

이정도만 알고 실행결과를 하나씩 적용해보았습니다. 이정도는 기본으로 사용하실줄 알아야합니다!

맨 아래 ls- l 의 결과로 "ubuntu ubuntu" 라고 나오는건 d1디렉토리를 일반사용자가 수정할 수 있음을 의미합니다. 루트 계정만 허용할 때는 root root 라고 뜨게되요.

 

이제 다시 본론으로 돌아와서, EC2를 이용해 웹서버를 구축하기위해 아파치2를 설치해보겠습니다.

아파치는  웹에서 정적인 컨텐츠(css,html 등)을 제공해주는 웹서버라고 생각하시면됩니다.

쉽게 생각해서 인터넷 웹서비스 사용을 위한 서버입니다. 이게 없으면 인터넷 웹서비스를 이용할 수 없죠,,

 

이제 아파치2를 설치해봅시다.

 

패키지를 설치하기 전에 항상 아래 두 명령어를 선행으로 실행하는 습관을 가집시다!! 

 

1. apt-get update: 설치 가능한 패키지들과 버전 정보를 업데이트

2. apt-get upgrade: 설치한 패키지들을 최신 버전으로 업그레이드

 

나중에 골치 아픈 일이 생길 수 있어요.(패키지 버전 충돌, 버전 오류 등) 그 때 되면 패키지를 통째로 지워버리고 재설치 해야될 수도 있습니다.

 

이제 설치해보도록 하겠습니다. 아래 명령어를 입력해주세요. 

sudo apt-get install apache2

설치가 완료되었으면 파일이 존재하는 디렉토리로 이동합니다. 기본적으로 아파치를 실행하기 위한 index파일은  /var/www/html 디렉토리에 저장됩니다!

설치파일이 아닌 index파일입니다.  cd /var/www/html 로 가보면 index파일이 존재합니다.

아파치 설치 후 웹 브라우저에 본인의 퍼블릭 http프로토콜 ip를 입력하면 아래와 같은 그림이 뜨는데 아래 페이지는 index.html파일로 코딩된 페이지입니다.

* http ip: EC2 생성 때 http 프로토콜 ip를 "사용자 무관"으로 추가하셨죠?

웹 브라우저에 접속할 ip는 아래 그림 속 박스가 가리키는 ip를 입력하면됩니다.

 index.html파일을 들어가보시면 html,css,js 등의 언어로 웹 페이지가 코딩되어있습니다.

그럼 이제 index.html을 다른 파일명으로 바꿔볼까요? index_org.html명으로 바꾸고 다시 브라우저를 켜보면 아래처럼 떠야합니다.

주의: 단순히 mv 명령어로 바꿔주면 실행이 안됩니다.  Permission denied라고 뜨는거 보이시죠?

해당 작업이 루트계정에서만 수정이 가능하기 때문에 ls- l 명령어를 보면 아래처럼 "root root" 라고 뜨죠.

각각 유저의 이름은 "root", 속한 그룹의 이름은 "root"인데, 그룹에 대해서는 다음에 살펴보겠습니다. 

권한이 root에 있으므로 루트 계정으로만 제어가 가능하기 때문에 명령어 앞에 sudo를 붙여줍니다.

이제 저희가 직접 index파일을 꾸며서 원하는 컨텐츠를 웹 브라우저에 띄워보도록 하겠습니다.

nano index.html 명령어로 이동하여 아래와 같이 코딩하고 저장합니다.

웹브라우저를 새로고침해볼까요? 아래 결과가 나와야 정상적으로 실습이 진행된 것입니다.

이로써 이번시간에 EC2 인스턴스로 웹서버 구축의 기초 실습과 기본 명령어 사용법에 대해 알아보았습니다.

 

 

 

 

학교 수업시간에 배운 AWS 개념들을 복습하기 위해 작성하는 글입니다.

 

AWS 가입은 어렵지 않으므로 스킵하고 오늘은 AWS educate가입 및 EC2를 생성해보겠습니다.

 

AWS 프리티어 가입과 educate 가입의 차이점으로는 교육자로부터 AWS Educate 가입 초대를 받은 학생에게는 신용 카드 결제 없이 지정된 분량의 AWS 클라우드 리소스에 무료로 액세스할 수 있는 AWS Educate Starter 계정이 제공됩니다. 이 계정은 대부분의 AWS 클라우드 서비스에 대한 액세스를 제공하지만, 종료 후 개인적인 휴대를 허용하지 않습니다. 

 

즉, 교육용으로 가입하게 되면 Free-tier 계정보다 넓은 범위의 서비스 혜택을 누릴 수 있습니다.

 

이제 가입단계부터 알아보겠습니다. 

AWS Educate가입하기

일단 aws educate홈페이지에 접속합니다. (aws홈페이지가 아닙니다.)

aws.amazon.com/ko/education/awseducate/

 

AWS Educate

클라우드 진로 클라우드 진로 클라우드 진로를 통해 업계 선두의 클라우드 커리어에 요구되는 최고의 클라우드 기술에 대해 알아보세요. 기계 학습 과학자에서 애플리케이션 개발자에 이르기

aws.amazon.com

가입을 누르고 신분을 정하는데, 저는 학생이기 때문에 학생으로 가입했습니다.  기본적인 인적사항을 적으면 되고 본인의 교육기관리스트가 up되어 있는지 확인합니다. 학생으로 가입하는 분들은 인증을 거쳐야 하기 때문에 반드시 학교 메일로 가입해야합니다.

 

Submit 버튼을 누르면 아래 두 선택지가 나오게 되는데 기존에 이미 AWS 계정이 있는 분들은 위의 체크박스를 체크하고 AWS 12자리코드를 입력하면됩니다.

코드는 AWS홈페이지-> 내 계정에서 쉽게 확인할 수 있습니다.

 

AWS에 가입하게되면 비자카드로 1달러를 자동 결제 하는데, 카드 계좌 등의 문제로 계정을 생성하지 못했을 경우 아래 체크박스를 체크하여 진행할 수 있습니다.

여기까지 진행이 완료되면 가입한 메일로 확인 메일이 오게됩니다. 메일 속 링크를 클릭하면됩니다.

그리고 바로 다른 메일이 오는데, 아래 이미지 속 Click here를 클릭하여 새 암호를 설정합니다. 

가입을 마치고 aws educate 사이트에 들어가게 되면 아래와 같은 초기화면이 나타납니다.

저는 교수님의 클래스룸 초대 메일을 통해 아래 사진 속에서   My Classrooms 배너가 나타났지만 초기 가입만 마친 상태에서는 뜨지 않는게 정상입니다.

 

학생으로 가입하신 분들은 아마 교수자나 강의자를 통해 초대 메일을 받게될 텐데, 아래와 같이 메일이 도착합니다.

아래 AWS Educate를 클릭하면 위 초기화면이 나타나고 My Classrooms 배너가 나타난 것을 확인할 수 있습니다.

My classrooms을 클릭하면 본인이 초대된 클래스 그룹(Course Name)이 뜨고 Accept Invitation을 클릭합니다.

 

다음 화면에 나타나는 파란색 "Go to classrooms" 버튼까지 눌러줍니다.

그럼 다음 화면이 뜨게되고 aws콘솔을 눌러줍니다. (aws 홈페이지에 로그인되어있으면 로그아웃해야합니다.

콘솔창이 뜬다면 정상적으로 접속이 된 것입니다. 상단의 계정명이 굉장히 긴 것을보아 educate 전용 콘솔창임을 알 수 있습니다.

 

이제 AWS의 서버 EC2를 생성해보도록 하겠습니다.

 

EC2 의 개념과 기능

EC2는 Elastic Compute Cloud의 약자로, 가상 서버 기능을 제공하는 클라우드 서비스입니다.  

AWS의 물리적 서버를 가상화 기술을 이용하여 사용자들이 사용할 수 있고 물리적인 서버없이 클라우드를 통해 필요한 리소스를 요청하여 사용할 수 있습니다.

 

EC2의 주 기능은 다음과 같습니다. 

1. 인스턴스: 가상 컴퓨팅 환경

2. AMI: 서버에 필요한 소프트웨어로 구성된 탬플릿

3. EBS: 가상디스크(하드 디스크에 해당)

4. 인스턴스 스토어 볼륨: 임시 데이터를 저장하는 스토리지 볼륨으로 인스턴스 종료시 삭제됨

 

명칭과 설명이 바로 와닿진 않지만 앞으로 계속 학습할 예정이므로 다음 그림을 통해 대략적으로나마 이해하고 넘어가도록합니다.

 

EC2 인스턴스는 가상 컴퓨팅 환경을 의미한다고 했죠? EC2 인스턴스 유형 및 표기법을 간단하게 알고 넘어가겠습니다.

인스턴스는 다음과 같이 표기합니다. 

애플리케이션 요구에 따라 인스턴스 패밀리, 세대 및 크기가 결정됩니다.

1. 인스턴스 패밀리: M, T, C, X, R, IO, I, D, G, P, F

2. 인스턴스 세대: 인스턴스 패밀리에 따라 1~5세대

3. 인스턴스 크기: 인스턴스 패밀리 및 세대에 따라 다양한 크기 제공

 

EC2 인스턴스 스토리지는 크게 인스턴스 스토어, EBS로 구성되어 있는데 인스턴스 스토어는 별도 추가 비용이 필요없는 임시 스토리지고 EBS는 별도의 비용이 발생하는 영구 스토리지입니다.

 

EC2 인스턴스도 프로세스처럼 수명주기를 가지며 주요 상태는 실행중, 정지됨, 종료됨 상태로 나눌 수 있습니다.

아래그림을 참고하면 좋을 것 같습니다.

간략하게 EC2가 무엇인지 알아보았고 이제 EC2를 직접 생성해보겠습니다.

 

EC2 생성하기

aws educate 홈페이지에서 아까 접속했던 콘솔창으로 이동합니다.

왼쪽 목롱겡서 인스턴스를 누르면 아래와 같이 화면이 뜹니다. 저는 이미 인스턴스를 하나 만들어놔서 목록이 있지만 처음인 경우 아무것도 나타나지않습니다.

인스턴스를 만들기 위해 오른쪽 상단의 인스턴스 시작 버튼을 눌러줍니다.

1단계로 Amazon Machine Image(AMI)선택 창이 뜨는데 1단계는 운영체제를 선택하는 단계로, 크게 Linux와 Window 중에 선택할 수 있습니다. AMI는 서버에 필요한 운영체제와 여러 소프트웨어들이 적절히 구성된 탬플릿을 의미합니다.   저희는 우분투 18.04LTS버전을 이용하도록합니다.

 

2단계는 인스턴스 유형 선택 단계로, 인스턴스의 CPU, 메모리, 스토리지, 네트워킹 용량의 여러가지 구성을 필요한 만큼 선택하는 단계를 의미합니다.

프리티어라면 디폴트 상태로 놔두고 넘어갑니다.

3, 4단계도 디폴트 상태를 유지하고 다음을 눌러줍니다.  

5단계는 태그 추가로, 어떤 인스턴스를 만들고 어떤 용도, 누가 관리하는 지 등의 설명 기능이라고 볼 수 있는데 저는 키-값을 "Name" -"Server"로 입력했습니다. 

6단계는 보안 그룹 생성단계로, 권한과 관련된 것을 지정하는 단계입니다. 네트워크를 통해 누가 인스턴스에 접속 가능한지, 어떤 접속방식을 허용할지 등의 보안설정이 가능합니다. 디폴트는 SSH접속 허용이고 [소스] 에서 내 IP를 클릭 시 해당 웹페이에 접속한 IP가 자동선택됩니다.  SSH로 EC2의 우분투에 접근하고 누구나 HTTP프로토콜로 웹서버에 접근할 수 있도록 하기위해 다음과 같이 설정해주고 넘어가도록합니다. 

 

7단계는 본인이 설정한 기능들을 검토하고 문제가 없다면 넘어갑니다. 그럼 이제 다음과 같은 화면이 나타난다.

이 단계는 누군가 본인의 인스턴스에 접근하는 것을 막고 인스턴스에 접근할 때 인증을 받기 위해 사용하는 키를 발급받는 단계입니다.

새 키 페어생성을 누르고 키페어 이름을 설정하고 키 페어 다운로드를 누르면 .pem 파일이 다운되는데, 이 키를 잘 갖고 있어야합니다.

이제 인스턴스 시작을 누르면 다음과 같이 인스턴스가 시작되는것을 확인할 수 있습니다.

다음과 같이 새로 생성한 인스턴스가 잘 실행중임을 확인할 수 있습니다.

이제 ssh원격 연결로 접속해보겠습니다. 원격 접속 툴은  putty가 많이 쓰이나 몇몇 오류가 발생되기도 하여 이번시간에는 tera term을 씁니다.

아래 링크에서 다운받으면 됩니다. tera-term.softonic.kr/

 

Tera Term

개인 컴퓨터 용 오픈 소스 에뮬레이션 소프트웨어

tera-term.softonic.kr

모든 설치옵션을 건들지 말고 그대로 설치를 하고 실행시키면 아래와 같은 창이 뜨는데

인스턴스를 만들고나서 클릭해보면 아래창이 뜨는데 퍼블릭 ipv4주소를 위에 적어주고 확인을 누릅니다.

그럼 다음과 같은 창이 뜨는데 사용자 이름은 ubuntu로 초기설정 되있기 때문에 입력하고 아까 발급받은 키로 인증받기위해 Authentication methods에서 RSA/DSA/ECDSA/ED25519키 옵션을 누르고 아까 저장한 .pem파일을 업로드합니다.

이제 그럼 다음과 같은 화면이 뜨는데. 잘 접속이 된 것입니다. 이 때 주의할 사항으로 아래 사진과 다르게 아무런 반응없는 검은 색 화면만 유지된다면 연결이 잘못된 것이므로 인스턴스가 실행 중인지, IP는 잘 설정되었는지를 확인해야합니다.

 

 

기본적인 연결까지 모두 완료되었는데, 한가지 주의할 점이 있습니다. 예를들어 한 지정 장소에서 계속 EC2 인스턴스를 사용한다면 문제가 없지만,

집이나 학교 등 여러 장소에서 EC2에 접속하려면 테라텀으로 원격 접속 하기 전에 인바운드 규칙에서 Ip를 조정해야합니다.

 

왼쪽 배너에서 인스턴스를 클릭하면 생성한 인스턴스 목록들이 나오는데, 스크롤바를 오른쪽으로 밀어서  사용할 인스턴스의 보안그룹을 확인합니다.

이제 왼쪽 배너에서 보안그룹을 선택하고  열리는 창에서 방금 확인한 보안그룹의 ID를 클릭합니다.

 

아래 창에서 인바운드 규칙 편집 버튼을 누르고

SSH의 설정  IP를 내 지정 IP로 바꿔준뒤 저장하고 다시 인스턴스 목록으로 들어갑니다.

이제 다시 아래 창에서 퍼블릭IP주소를 테라텀에 입력해서 입장하면 정상적으로 연결됨을 확인할 수 있습니다.

+ Recent posts