라즈베리파이 Arch Linux 고정ip 설정하기

저는 라즈베리파이를 웹서버로 사용할 예정이기에 가벼운 OS를 올리기 위해서 라즈베리파이의 기본 OS가 아닌 Arch Linux를 설치하기로 계획했습니다. 설치는 간단하지만 고정ip 설정에서 이틀정도 허비를 해서 방법을 공유합니다. OS 이미지 다운 및 설치는 산딸기마을 홈페이지를 참조하시면 쉽게 따라할 수 있습니다.

설치 후 우선 netctl 명령어를 통해서 고정ip 설정을 합니다. 특별한 경우가 아닌 이상 인터페이스는 eth0입니다. 혹시 의심스러우면 다음의 명령어 중 하나로 확인해 봅니다.

확인이 끝났으면 netctl에 example 폴더 안에 설정파일 template이 있으므로 이 파일을  netctl 폴더 밑으로 인터페이스 이름으로 복사합니다.

nano로 복사한 파일을 열어서 ip, gateway, dns등을 설정합니다.

파일의 대략적인 설정은 다음과 같습니다.

설정을 마치고 난 후 부팅시에 netctl이 작동하도록 만들기 위해서 다음과 같이 명령어를 칩니다.

설정을 마치면 다음 화면처럼 시스템데몬으로 netctl의 eth0 설정이 링크가 걸립니다.

netctl 설정

여기서 많이 해맸습니다. 이렇게 하면 다 끝인가 하고 부팅을 하거나 netctl start eth0을 해봐도 에러가 떴습니다. 문제는 기본으로 설정되어 있는 dhcpd서비스를 제거해야 하지 않아서 충돌이 난 것입니다. 다음 그림의 빨간 상자 안에 있는 파일을 제거해야 합니다.

networking

이 파일을 제거하고 부팅을 하면 정상적으로 고정 ip 설정이 완료됩니다.

라즈베리파이에 USB 마운트 하기

라즈베리파이에서 USB로 파일을 옮기려고 시도한다면 당연히 윈도우처럼 자동 마운트가 안 된다. 수동으로 하거나  fstab으로 작업을 해야 한다. 구글링으로 간단하게 방법을 찾았기 때문에 뻔한 내용이라 포스팅 안 할까 하다가 한글화(?) 및 리뷰용으로 그래도 남겨둔다. 참고는 다음 사이트에서 했다.

http://www.xappsoftware.com/wordpress/2013/10/28/how-to-mount-your-external-usb-drive-on-the-rasberry-pi-running-raspbian/

일단 내가 사용하는 USB 파일 시스템이 NTFS이라 이걸 지원할 수 있는 모듈을 아래와 같이 깔아야 한다. (Fat32는 기본으로 지원한다고 한다.)

설치 후에 작업은 일반적으로 리눅스에서 파일시스템 잡아서 마운트 하는 것과 동일하다. USB를 꽂았다면 fdsik로 확인할 수 있다. 아래 명령어는 fdisk로 파일시스템을 확인해서  USB가 꽂혀 있을 드라이브명을 “sda” 로 검색하는 것이다.

usb가 안 꽂혀 있으면 당연히 아무런 결과가 나오지 않고 꽂으면 결과가 나오게 된다.

usb fdisk 확인

USB 드라이브를 정상적으로 인식했으므로 이제 USB를 마운트 시킬 폴더를 생성하고 권한을 사용자에게 준다. 나는 mnt 밑에 usb_16gb 폴더를 생성했다.

다 끝났다. 이제 마운트를 하면 끝이다.

마운트를 하기 전에는 폴더를 보면 아무런 하이라이트가 안 되어 있지만 마운트 후에는 폴더에 하이라이트가 되어있는 것을 확인할 수있다. 즉 제대로 USB 드라이브가 마운트 되었다는 뜻이다.

USB 드라이브 마운트 확인

사용을 마쳤으면 언마운트를 해야 한다. 윈도우처럼 함부러 빼면 좋지 않다. ㅠ

매번 마운트하기 귀찮으니 fstab에 등록하면 마운트 작업을 자동화할 수 있다. sudo 로 권한에러가 나면 루트로 바꿔서 작업하면 된다.

 

쓰레드: 동기성과 비동기성

POSIX(포직스) 쓰레드를 이용한 프로그래밍
black ray ban sunglasses
개발하는 과제들이 하나 같이 소켓통신을 기반으로 하다보니 동기화(Syncrhonization)에 대한 이슈가 아주 중요함을 최근 많이 느끼고 있다. 막연하게 프로그램 설계 과정에서 적절하게 프로토콜을 만들어서 통신의 플로우를 잘 관리하면 될 것 같지만, 꼭 구현해야하는 기능들은 동기적으로 작동하기 보다는 비동기적으로 작동되어야 하는 경우가 훨씬 더 크다.
Oakley sunglasses Canada
메인 함수 내에서 비동기적으로 계속 모니터링이 필요한 함수를 구현하려다 보니 쓰레드에 대해서 좀 더 자세히 알아야 겠다는 생각이 들던 차에 랩실 서가에 꽂힌 책 한 권이 눈에 들었다. 제본된  POSIX쓰레드를 이용한 프로그래밍 책이었다. 나중에 검색해 보니 현재 절판되어 있어서 제본한 것 같다. 어제 집에 가는 길에 1~2장을 보면서 그 동안 막연하게 인식하고 있었던 “동기화(Synchronization)”, “비동기성(Asyncrhonization)”에 대한 개념의 본질을 이해할 수 있었다.
discount oakley sunglasses for men

http://www.fotopedia.com/items/flickr-522878837

“동기화”를 사전적인 개념으로 이해하면 동시에 무언가를 맞추어 진행 한다는 점이 핵심이다.  이런 의미에서 동기화는 메모리에 데이터를 주고 받을 때에 아주 중요하다. 메모리와 디바이스 간의 타이밍이 맞아야 적절하게 작동하기 때문이다. 즉 메모리의 클럭 타이밍과 디바이스의 클럭 타이밍이 싱크로나이즈 팀의 통일된 동작 처럼 일치해야 한다는 말이다.
nike air max 95
그런데 문제는, 소프트웨어 입장에서 (쓰레드나 멀티 프로세스 기반의 프로그래밍을 할 때) 동기화의 개념이 다소 차이가 난다. 이 때에는 동시에 같이 진행한다기 보다는, 서로 간의 시작과 끝이 꼭 맞아야 한다는 의미를 가진다. 따라서 소프트웨어 관점에서 동기화는 동시에 Job들이 진행될 수 없다. 이와 반대로 비동기화는 동시에 여러 Job들이 실행될 수 있다는 의미를 지니게 된다. 핵심은, 여러 Job들이 동시에 진행 될 수 있다는 맥락이 동기화와 비동기화에 대한 개념을 혼동시키는 것이다.
ray ban sunglasses Poland
쓰레드의 사용의 관점에서 볼 때, 쓰레드도 사용여부에 따라 동기적으로 쓸 수도 있고 비동기적으로 쓸 수 도 있다. 다만 쓰레드가 가지는 기능을 활용하는 측면에서 비동기적으로 사용하는 것이 일반적일 것이다.
ray ban sunglasses review
프로그램 상에서 아무리 여러 쓰레드를 돌리면서 수 많은 Job들을 효율적으로 처리한다고 하더라도 반드시 동기화가 필요한 지점이 생길 수 밖에 없다. 따라서 개발 할 때에 동기화될 부분과 비동기적으로 처리할 부분을 명확히 구분할 필요가 생기는 것이다. 그러면 자연스럽게 뮤텍스나 세마포어에 대한 이야기가 나올 수 밖에 없는 것이다. 이 부분은 이제 차츰 읽어가면서 또 생각해 보아야 겠다.

 

리눅스 시스템 프로그래밍 강의 요약 1

시스템 프로그래밍?
일반적으로 우리가 작성하는 고등레벨의 프로그램은 실제 많은 라이브러리를 참조하여 컴파일 된다. 예를 들어 간단한 C프로그래밍을 짤 때에 이 프로그램은 표준 라이브러리를 참조하고, 표준 라이브러리 가운데 커널의 API를 사용할 경우 시스템 호출을 하게 된다. 결국 일반 사용자는 직접 커널의 API를 호출하지 않고 시스템이나 응용프로그램을 통해 호출한다.  이와 같이 커널이 제공하는 API를 활용하여 프로그래밍 하는 것을 시스템 프로그래밍이라 한다.
ray ban imitation sunglasses
시스템호출(System Call)
시스템 호출은 일반 사용자가 커널의 함수를 직접 사용하지 않고 위임하는 방식이다. 시스템 호출을 사용하는 것을 가능하게 하는 것은 Trap 메커니즘으로 Trap은 디바이스가 요청하는인터럽트와 같은 개념이지만 시스템 호출이 요청하는 인터럽트를 구분하기 위해서 Trap이라고 표현한다. 운영체제마다 다양한 시스템 호출을 정의할 수 있지만 일반적으로 POSIX라는 표준에 의해서 시스템 호출을 통일한다.
nike air jordan 16
시스템 호출과 관련된 함수들은 크게 아래 5가지 부류로 구분 가능하다.

  1. 프로세스 제어
  2. 파일 조작
  3. 주변장치 조작
  4. 정보관리
  5. 통신

파일 입출력 함수

  • int open(const char *pathname, int flags, [mode_t mode]);
  • int create(const char *pathname, mdoe_t mode);
  • int close(int filedes);
  • ssize_t read(int filedes, void *buffer, size_t n);
  • ssize_t write(int filedes, const void *buffer, size_t n);
  • off_t lseek(int filedes, off_t, int start_flag);
  • int fcntl(int file des, int cmd, …);

air jordan retro 10
파일 디스크립터(File Descriptor) 참조링크1, 참조링크2
보통 파일에 접근하기 위해서 OS는 파일에 관련된 정보를 저장하는 자료구조를 할당하는데 파일 디스크립터는 OS가 할당한 이 자료구조를 가리키는 정수로 된 정보이다. 파일디스크립터 가운데 각각 0번은 표준 입력, 1번은 표준 출력, 2번은 표준오류로 기본 셋팅되어 있다.