2012년도 대문 편애한 시각


매일 로또 생각하는 사람의 머리속에 어서오세요.



이제 진짜 블로그 이전한다. 자서전



길고 길었다. 벌써 10개월전에 옴긴다고 있었다. 다만 쉽지않았다. 처음에 그냥 자기자신이 직접 작성하려다가 실패한게 주요인이었다. 

그뒤로 생각을 잠시 거둬 들였다가. 처음 발상을 바꿨다. 많이 이용되는 다른사람이 작성한 보드들(제로보드 같은)을 이용하는것으로 방향을 선회했다. 

새로운 계획은 다음과 같다.

1. pogoplug이용
2. pogoplug에 기존의 외장하드가 아닌 USB메모리 사용.
3. pebble보드 사용
4. 기존 블로그의 게시물 이전

이제 진짜 이전한다. 

rapsberry pi Driver module - 라즈베리 파이 모듈 만들기 linux & C

장히어려웠던 작업이었다.무려 2주일이소모되었다 -_-

그만큼크로스 컴파일에는 세심한 주의가 필요한 작업이다.작업은 크게두가지 이다.한가지는라즈베리파이에서 직접 native환경에서작업을 하는것과 크로스컴파일 환경에서 작업을하는것이다.두가지중에서어느것이 쉽냐고 물어본다면,당연히첫번째 작업이다.

하고나서 문제는 라즈베리 파이의 Wheezy는 /dev/mem가 이미 I/O에 사용되는 물리주소를 선점중이다. 당연히 이짓은 뻘짓이다



1.

먼저라즈베리서 작업을 하는것을 설명하겠다.커널은3.1.9+이다.재미있는점은 나는 2012-07-15에빌드된것 같은 2012-07-15-wheezy-raspbian.img를사용해서 먼저 이미지를 덮어 씌웠다.그렇게라즈베리를 준비시켜주고 라즈베리에 원격접속하거나직접 화면을 보면서 아래의 명령을 입력시켜주자.



$cd /usr/src
$sudo wget -O raspberrypi-linux-3.1.9.tar.gz https://github.com/raspberrypi/linux/tarball/
rpi-patches
$sudo tar xzf raspberrypi-linux-3.1.9.tar.gz
$sudo ln -s /usr/src/raspberrypi-linux-eab45cb /lib/modules/`uname -r`/build
$cd /usr/src/raspberrypi-linux-8fa2e19
$sudo sh -c 'zcat /proc/config.gz > .config'
$sudo sed -i 's/EXTRAVERSION =.*/EXTRAVERSION = +/' Makefile
$wget http://www.grendelman.net/files/raspi/Module.symvers
$sudo cp ~/Module.symvers .
$sudo make oldconfig
$sudo make modules_prepare


대충명령의 개요는 일반적으로 리눅스에 적재되있는소스파일의 디렉토리에 소스파일을 적재시켜주고서oldconfig를사용하고 modules_prepare를사용하는것이다.사실은 Module.symvers를다운받아도 상관이 없고 직접 컴파일해서 복사해도상관없다.나는이것을 두번얻었는데,첫번째는그냥 웹문서를 참고하면서 두번째는 크로스 컴파일을꾸미는 과정에서 과정에서 얻었다.


위의과정이 무사히 끝났다면 이제 기본적인 준비는 완료가된것이다.이제 기본적인helloworld를 시작해보자.아래의문서를 같은 디렉토리에 작성한다.


hello.c

// Defining __KERNEL__ and MODULE allows us to access kernel-level code not usually available to userspace programs.

#undef __KERNEL__

#define __KERNEL__

#undef MODULE

#define MODULE

// Linux Kernel/LKM headers: module.h is needed by all modules and kernel.h is needed for KERN_INFO.

#include <linux/module.h> // included for all kernel modules

#include <linux/kernel.h> // included for KERN_INFO

#include <linux/init.h> // included for __init and __exit macros

static int __init hello_init(void)

{

printk(KERN_INFO "Hello world!\n");

return 0; // Non-zero return means that the module couldn't be loaded.

}

static void __exit hello_cleanup(void)

{

printk(KERN_INFO "Cleaning up module.\n");

}

module_init(hello_init);

module_exit(hello_cleanup);







Makefile

obj-m := hello.o

KDIR := /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

all:

$(MAKE) -C $(KDIR) M=$(PWD) modules


전부파일작성을 완료하였다면.아래와 같이명령을 입력하자.


$sudo insmod hello.ko

$sudo rmmod hello


그리고나서dmesg명령을실행시켜주면 확인이 가능하다.


$dmesg

.

.

.

[ 2042.460603] Hello world!

[ 2092.632882] Cleaning up module.



[crosstool-ng] 크로스 컴파일러를 만드는 스크립트, raspberry pi croos compiler linux tools man


이번에 커널공부를 하면서 정작 책만보고 실제적인 코드를 살펴보거나 컴파일을 실행하지는 않았다. 직접 커널 컴파일을 하거나 코드를 살펴보기 위해서 이후에 과거 책들이 설명했던 방법대로 /usr/src 디렉토리에 포함된 커널코드를 직접 살펴보거나 컴파일 하는것도 방법일수도 있었다.

그렇지만, 과거에 그런 흉내를 내다가 몇번이나 리눅스를 다시설치하고 개발환경을 다시 설정하는 노다가끝에 그것은 이제그만 하기로 하고 저번에 사뒀던 raspberry pi를 활용하기로 했다.

그렇지만, 이게 웬걸 갑자기 크로스 컴파일러가 동작을 안한다... 자꾸만 파일이 없다는 메세지만 출력된다. 결국에는 리눅스를 다시 설치하지만 동작이 안됬다. 삽질의 결과 결국에는 64비트 호스트컴퓨터, 그러니까 사용하는 우분투가 설치된 노트북에  ia32-libs 가 설치 안된 것이었다.

그문제는 아래의 명령으로 해결이 되었지만, 그전에 진행했던 크로스 컴파일러 만들기를 계속진행하여 완성하였다.


#sudo apt-get install ia32-libs


+crosstool-ng

crosstool-ng는 그때동안 여러사람을 골탕먹였던, 크로스 컴파일러 구축을 쉽게 하기위한 스크립트로 이루어진 프로그램이다.
프로그램의 구동을 위해서 대략적으로 필요한 호스트의 다른 툴들은 대략 다음과 같다. 사용자에 따라서는 더추가될수 있다. 
나중에 나오는 ./configure의 메세지에 따라서 추가로 설치해주면 된다.

-perf
-gawk
-curl
-svn

이제 본격적으로 진행하자, 먼저 croostool-ng에서 프로그램을 다운받자, 본인은 1.15.0버젼으로 진행하였다. 또한 참고했던것은 나를 좀 힘들게한적이 있었던 이름이 chris라고 생각되는 어느 개발자의 블로그를 참조하였다.



#./configure
#./ct-ng menuconfig



위의 명령이 입력이 입력되었을때 낯설지 않을지도 모르는 창이뜬다. 아래부터 설명에서 각각 번호가 있는데, menuconfig의 메인메뉴에서 보이는 메뉴들을 이름이다. 메인메뉴에 있는 옵션들을 찾아서 설정해주면 된다.




1) Paths and misc options



Paths and misc options 메뉴에 들어간다. Try features marked as EXPERIMENTAL 를 y를 누르든지 enther를 누르든지 간에 설정해준다.

그리고, 끝이 Prefix directory로 명시된 메뉴에 에서 설치되는 디렉토리를 써줘야한다. 그냥 좋을대로 써줬는데, 에러걸린  아픈기억이... 
또한 Working directory가 끝에 써진 메뉴에 실제로 파일들이 컴파일될 디렉토리를 명시해 줘도 좋다. 

최상위로 설치되는 디렉토리를 설정해 주는것이므로   혹시라도 ${CT_TARGET}같은 특수문자가 포함된 쉘의 변수를 막지웠다가는 큰일난다.


2)Target options

말그대로 타겟이 되는 시스템의 아키텍쳐 선택이다. 딴거 없고 보이는대로 raspberry pi는 arm기반 제품이니 arm설정하고,32bit,little-endian을 설정한다.

처음에 봤던 메인메뉴로 돌아간다.


3) Operating System


역시 별거 없다. 위사진과 같이 Target OS (linux)로 설정해주면 된다. 커널 버젼은 3.3.4로 했다. 


4) Binary utilities 


위 그림과 같이 세팅했다. 취향에 맞게 하면 될듯...

5)C compiler

역시나 별거 없다. 그림대로 맞춰주면 된다. 다만, Linaro로 맞춰주는것을 권한다. 이유는 Linaro가 협회이름으로 Soc기반의 오픈소스 표준협회의 표준을 맞추는것이라고 생각되기 때문... 취향에 따라서 C++정도 선택해줄수도 있다. 서버 프로그램들중에서 C++이 많이 사용되는 편이기 때문이다. 한예로 telnet...




  
6)C-library

특이점은 eglibc가 기본으로 설정되있다는것.. 딱히 이제 없다. 커널과 마찬가지로  EXIT로 빠져나와서 저장한다.

7)build



#./sudo ct-ng build

이제 위의 명령으로 빌드해주면 된다. make아니다. 절대로... 자칫하다가 에러의 원인이 될수있다. 
시간은 대충 30~40분 정도 된다. 




어셈블리어 기초+참고문서(Assembly tutorial)와 소개 linux & C

소개

주로 커널에서 사용되서 참고하려고 어셈블리어에 대해서 알아봤었기에 문서를 남김니다.
기존에 사용되던, 프로그래밍 언어와 많이 다른 어려움이 있습니다. 어려움이라면 다음과 같습니다.

1) 컴파일러에 따른 문법차이
2) 하드웨에서의 문법차이
3) 어셈블리어의 어려움

기존에 사용되던, 프로그래밍 언어와 다르게 문서화가 많이 되지못한 이유가 아마도 1),2)가 아닐까 생각됩니다. 실제로 두가지 이유로 관련서적도 드문편이고 문서화도 많이 되지않았나 생각됩니다. 실제로 AT&T나 ITEL,ARM에서 문법의 차이는 크게 있지는 않지만 조금씩 다릅니다. 

대부분에서는 인라인함수로 사용되는걸로 생각되며 아래의 참조문서를 찾으면 대충 어떤것인지는 짐작이 갈것입니다.




참조문서:
Linux Assembly HOWTO (한국어): 기본적인 사용법을 소개한 문서의 번역본입니다. linux/unix환경에서의 코딩법에 초점을 맞춘 온라인 문서입니다.


Inline Assembly(한국어) : Joinc에서 제공되는 문서입니다. 부록으로 소개된것입니다.

ARM소개문서(한국어): ARM에서 제공하는 문서입니다. 역시나 한단원으로서 소개를 하고있습니다. 커널에서 사용되는 몇가지 특이사항에 대해서 서술하고 있습니다.

서버&커널 종류는 많지만 같은것들? linux & C

(같은 종류의 프로그램들은 비슷하면서 다르다)


많은 종류의 컴퓨터 시스템이 존재하고 프로그램수와 종류또한 많다. 특히나 프로그램수는 시스템의 종류보다 훨신 많다. 그렇다면, 프로그램들은 각각 완전히 다른 형식이나 알고리즘을 사용할까? 비슷한면도 있고 다른면이 있겠지만 종류별로 나눠본다면 너무나 유사한 프로그램 종류가 있다. 

그중에서 대표적이라면 커널과 서버 프로그램이다. 이둘은 각각의 일정한 형식을 지니고 있다.

먼저 서버프로그램은 기본적으로 다중 사용자를 지원해야 하므로 자식프로세스를 생성할수밖에 없는 위치에 있다. 이것은 fork를 이용하지 않고, thread를 이용한다 한들 마찬가지이다. 또한, 부모프로세느는 데몬프로세스로 전환 시키는것이 일반적이다. 
거기다가, 네트워크서버라면 당연히 C언어에서 select함수를 이용할수밖에 없다. 오오 그것은 운명.

여기에 더불어서 기본적으로 다른 종류의 프로그램들이 거치는 기본중에 기본들도 따르면서 피할수없게 비슷해진다. 


커널또한 마찬가지이다. 여러커널이 있지만, 기본적인 구조는 거의 완벽하게 동일할수밖에 없다. 인터럽트 금지시키고 부트로더로 부터 정보를 받고 확인한다음에 페이지를 생성하고 하드웨어적인 인터럽트들에 대한 루틴을 생성하는 등의 작업은 순서또한 일반적으로 다른형식을 따르기가 힘들다. 따라서 뒤도 안돌아보고 정해진 형식을 따라야 하는것이다.



(잉여인간으로 생각될수있지만..)


여기까지 본다면 프로그래머가 돈만받고 아무것도 안하는 사람으로 생각되겠지만, 역시나 현실은 다르다. 서버같은 경우에는 각각의 목적에 맞는 프로토콜의 요청을 받고 수행하는 과정이 필요로 하고, 일정한 형식을 따르지만 그에 따라서 수행하는 동작또한 생각해야 한다. 서버같은 경우에는 단적으로 kill signal을 처리한답시고 바로 죽게 만들면 멋진 좀비프로세스가 만들어진다.

커널또한 마찬가지다. 과정과정속에서 당연히 해야될 작업들을 수행하기전에 각각의 arch에 맞는 사전준비가 필요로 하고 확인작업이 필요로 하다.  


결론적으로 종류에 따라서 비슷할줄은 모르겠지만, 세심한 주의와 노동으로 각각의 프로그램이 만들어 질수있는것이다. 






P.S:강형이 만날적마다 글올리라고 해서 침묵을 깨고서 올려봄 ㅇㅅㅇ


이글루스 바이바이 할거임 편애한 시각

아주 오랜 기간동안 사용했지만, 과거와 현재를 비교해보면 나도 변했고, 이글루스도 변했다. 애초에 예전에 오덕질할때 좋았던 사람들과 의견교류를 활성하게 하기위해서 만든거지만, 그들은 거의 대부분 떠났다. 사실은 그때에 그만 두었어야 한다. 지금은 그당시와 많이 다르다.

SNS의 보급으로 정말로 손쉽게 자신의 의견을 오만방에 퍼뜨릴수있고, 한편으로 너무나 쓰레기같은 생각을 인간들이 많다는것 또한 확인하였다. 이곳도 예외는 아니다. 맛집블로거도 그런 쓰레기중에 하나다. 글을 쓰면서도 짜증이 솟아오른다.

이곳도 예외는 아니었다. 보면서 얼굴을 찡그리게 하는 인신공격을 너무나 많이 봐왔고, 트위터로 따지만 팔로워(?)같은 이웃을 급격하게 늘려서 자신의 존재를 주목받고 싶어하는 사람들도 너무나 많다. 예전에 댓글이 귀하다고 했던가? 씨발진짜 좆같다.

그렇지만, 정말로 부족한 솜씨이지만 누군가 보면 웃을만한 일들을 적기도 하고, 개인적으로 누군가에게 하고 싶은 이야기도 적어보고 싶었다.

내가 변한점은 pogoplug를 이용하여 Web서버기능을 사용할수 있다는 점이고, 또한 도메인또한 소유하고 있다는 점이다. 뿐만 아니라 지난 시간동안 기술력이 많이 늘어서 전문적으로 배우지도 않았고, 전공도 아니지만 부족하게나마 나만의 웹사이트를 구축할수있는 능력이 있다는것이다.

아마도 구축하는데 시간이 꽤나 소유되겠지만, 안녕을 고할수 있다. 이제는 쓰레기들하고 안만날수있다.



[Arch Linux] 리눅스 메일이 안보내여지는자여 postfix를 설치하라 linux tools man



바로전에 게시물에서 포고플러그의 ip주소를 메일로 전달시킨다고 하였는데, 문제는 mail이 전달이 안된다. 이유는 /sbin/sendmail이 없다고 한다.


(Arch Linux의 메세지)



이것은 우분투 사용할때도 문제이기도 했다. 우분투에서 mailx만 설치하면 끝나는것이지만, 메일관련 프로토콜설정 때문에 이거 되돌릴수 없는거 아닌지 하는 생각과 함께,  메일프로토콜을 배우기 귀찮았다... 맨처음에 리눅스배울때에 CentOS는 그런거 없더만...
이제는 반드시 해결해야할 문제로 돌변했다.

지금에 와서는역시나 해결법은 구글링... 해외포럼에서는 해결법이 2가지로 나뉘는데, Sendmail이라는 그러니까, 『메일서버를 설치해서 .conf파일변경과 여타의 작업들을 하느냐』 아니면 『postfix를 설치하느냐』로 나뉜다.

postfix가 더 쉬우므로 postfix당첨. 애초에 postfix가 SendMail을 쉽게 이용하게 만든것이니 더쉽다. 
방법은 아크리눅스를 업데이트시켜주고 postfix를 설치해주면 그만이다.



#pacman -Syu
#pacman -S postfix




다음에 에러가 발생되는데 restart 대신에 수동으로 postfix를 정지시켜주고 재시동걸어주면 mail이 작동된다.


#/etc/rc.d/postfix stop
#/etc/rc.d/postfix start


오늘은 여기까지...


DMZ 설정에 관해서 linux tools man



가정이나 기타장소에서 통신업체에서 공급하는 네트워크망을 사용하는 사람으로서 가정에서 홈서버를 구축하려고 했다. 문제는 다른 여러 플랫폼이 통신망을 사용하기때문에 공유기를 사용할수밖에 없고 이는 홈서버의 외부망 접속을 막는 거대한 장애물이었다. 아마도 나같은 사람이 있을거라고 생각한다.

그리고, 보통은 포트포워딩을 추천받지만 공유기가 구식인지 설정을 제대로 못받는 관계로 조금 다른방법을 사용하기로 했다. 
바로 DMZ설정이다.


위와 같이 외부에 연결하고자 하는 플랫폼의 NAT_IP를 DMZ설정에 입력하게 된다. 이렇게되면 외부에서 공유기가 할당받은 공인IP로 접속하면, 해당 NAT_IP를 가진 플랫폼에 접속하게 된다.

문제는 혹시라도 시간이지나서 통신업체에서 다른 IP를 공유기에 배당하는것이 문제가 되지만, 걱정없다는... shell명령으로 시간마다 계속적으로 메일로 IP주소 보내주게 하면 된다는...  






[Raspberry Pi toolchain] 라즈베리파이 툴체인 linux tools man

라즈베리파이에서 debian wheezy-arm6 버젼을 사용한다면 크로스 컴파일에 대해서 크게 생각하지 않을줄 모른다. 문제는 이것이 200Line을 돌파하면서 발생하는데 컴파일속도가 많이 느리다.

따라서 툴체인을 사용해서 크로스 컴파일을 생각할수밖에 없었고 아래의 git명령으로 툴체인을 다운받으면 된다. 문제는 몇가지 버젼의 컴파일러를 제공하는것으로 보여 그중하나를 가지고 실행했지만 helloworld가 실패를 하면서 알수없게 되버렸다.

여기에는 제공되는 컴파일러중에서  tools/arm-bcm2708/arm-bcm2708-linux-gnueabi 위치에 있는 컴파일러를 사용하면 될거 같다. 역시나 이것또한 몸으로 익힌것이라 이유를 물어보면...

다만 해외에서는 그냥 대충하더만 커널까지 컴파일했다고하는데, 그쪽은 어떻게 했는지 잘모르겠다. 호스트시스템이 다른가?



#git clone https://github.com/raspberrypi/tools.git

1 2 3 4 5 6 7 8 9 10 다음