Linux man page들

Posted at 2010/04/18 00:03 // in Programming // by Daniel
cygwin에선 glibc library man page가 없다.
왜냐면 당연히 cygwin이 linux가 아니므로;; (참고)

ubuntu 소스에서 man page를 가져와서 압축했다.
1.3메가.. posix 맨페이지도, 한글맨페이지도 받아다 압축했다.
 man-pages-3.23
man.tgz

Man pages. 1.3MB

man-ko.tgz

한글 man 페이지. 660KB

man-posix.tgz

POSIX man page - 이게 가장 필요할 듯. POSIX 표준관련 man page다. 1.3메가

cygwin에서 설치및 사용법
자기 홈디렉토리 아래
man 디렉토리를 만들고 그 아래에 man1~man8  디렉토리가 들어가도록 한다.
posix도 마찬가지로 man0p man1p man3p 디렉토리가 man 디렉토리 아래에 가도록 한다.
사용자 삽입 이미지

그리고,
~/.bash_profile에서
다음 구절을 추가하거나 주석 해제한다. 결국 당연히 man path를 추가하는 것임. (참고로 한글 man 페이지는 깔기를 추천하지 않음. 깨져나옴.)
# Set MANPATH so it includes users' private man if it exists
if [ -d "${HOME}/man" ]; then
  MANPATH=${HOME}/man:${MANPATH}
fi
# 한글 man페이지는 ~/man/ko에 깔면 되긴 되는데.. 추천하지 않음. 한글 깨집니다.
if [ -d "${HOME}/man/ko" ]; then
  MANPATH=${HOME}/man/ko:${MANPATH}
fi
사용자 삽입 이미지


크리에이티브 커먼즈 라이센스
Creative Commons License

Xming에서 gnome XDMCP로 데스크탑 실행 - xlaunch파일

Posted at 2009/10/20 14:23 // in Tips/Utility programs // by Daniel
Update: putty에서 gnome 데스크탑 불러오는 것이 잘 안되는군요.
XDMCP로 하는 방법으로 고쳤습니다.
제 환경은 WindowsXP SP3호스트에 VMware로 ubuntu9.04를 깔았습니다.

사용자 삽입 이미지

XDMCP enable로 바꾼다.

/etc/gdm/gdm.conf를 고쳐 XDMCP관련 항목의 Enable을 true로 바꾸고,
$ sudo /etc/init.d/gdm restart  --> gdm을 다시시작해줍니다.
그리고 Xming을 실행해서 XDMCP로 연결합니다.
스크린 번호는 기본이 0 이지만 맘대로 정하고, Open session via XDMCP로 선택
접속할 호스트의 아이피 적어주고
클립보드 설정과 함께 해상도 파라미터 정해주면 됩니다. 해상도는 안하셔도 되긴 됨.
사용자 삽입 이미지사용자 삽입 이미지
사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지



사용자 삽입 이미지


-------------------------------------------------


session.xlaunch

gnome-session을 실행하는 파일. 호스트 IP와 로그인 아이디는 알아서 수정.

Xming을 사용하여 gnome데스크탑을 실행했습니다.
(gnome-session을 실행하면 데스크탑 화면을 실행할 수 있습니다.)
당연히 putty를 썼고 거기에 public key 인증을 했습니다.

로그인할 IP와 아이디는 각자의 설정에 맞게 수정하시면 되구요 해상도 옵션도 주어져있으니 고쳐쓰면 됩니다.
디스플레이번호는 2번으로 해놨습니다. 맘에 드시는 대로 고치셔도 됩니다.
VMware Player 로 돌린 우분투 9.04에서 실행됨을 확인했습니다.
실행 화면입니다.

사용자 삽입 이미지
<?xml version="1.0"?>
<XLaunch xmlns="http://www.straightrunning.com/XmingNotes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.straightrunning.com/XmingNotes XLaunch.xsd" WindowMode="Windowed" ClientMode="StartProgram" Program="gnome-session" ClientStart="PuTTY" PathToProtocol="C:\\Program Files\\PuTTY\\" RemoteHost="192.168.136.128" RemoteUser="daniel" Display="2" Clipboard="true" ExtraParams="-screen 0 1280x1024"/>
Update:
으음 문제가 있군요. 이방법을 쓰면 쓰던 도중에 hang되면서 멈춰버리는 현상이 발생.
Xming의 문제인지 뭔지 모르겠습니다. 혹시 문제될까봐 스크린세이버도 껐는데
해결방법 아시는 분 있나요?

http://ubuntu.or.kr/viewtopic.php?p=13071 여기 관련 내용이 있긴한데 (gdm 원격 로그인 허용등)원격으로 gnome-session 실행은 권장 안하는군요.
http://communities.vmware.com/message/1381238 에는 vmware에러도 나오고
XDMCP를 사용하면 어떨지;;
크리에이티브 커먼즈 라이센스
Creative Commons License

리눅스에서 쓸 수 있는 한글 글꼴들

Posted at 2009/10/20 00:59 // in Tips // by Daniel
링크

폰트 리스트 - http://luv4.us/archives/841


일단 현재 사용가능한 글꼴들은
http://luv4.us/archives/841
이 링크에 목록이 있습니다.


찾다 찾다 들어온 링크지만 저는 따로따로 찾아서 설치했네요
저의 경우는 위 목록에 없는 콘솔라스와 맑은고딕과 함께
네이버, 다음, 서울, 아리따, 조선일보 서체를 설치한 상태입니다. (위 링크는 다 설치하고 나서야 찾았네요)
한겨레 결체는 주소가 바뀐 것인지 배포하지 않는 것인지 현재 다운로드 되지 않습니다. 조선일보 서체는 "MAC용 PC용 압축파일"을 받아서 깔면 되구요.

데비안 패키지가 제공되지 않는 경우라면 폰트 파일(*.ttf)을 /usr/share/fonts/truetype 아래에 적당히 복사하면 됩니다.
예를 들어
 $ sudo mkdir /usr/share/fonts/truetype/Custom
 $ sudo cp *.ttf /usr/share/fonts/truetype/Custom/
으로 Custom 디렉토리에 복사하면 되지요.

네이버 사전체는 굴림처럼 쓰기 좋군요.

그리고 다음이나 네이버 코딩 글꼴이 거칠어 보이는 경우는 폰트 설정이 한글일 경우 antialising을 끄게 돼 있기 때문입니다.
제 우분투 9.04 시스템의 경우 /etc/fonts/conf.avail/29-language-selector-ko-kr.conf 에서 특정 크기일 경우 한글 폰트의 antialising을 끄도록 한 부분이 있습니다.
이 부분을 주석처리하면 됩니다.
/etc/fonts/conf.avail/29-language-selector-ko-kr.conf

/etc/fonts/conf.avail/29-language-selector-ko-kr.conf 수정.antialising이 10~22 일 경우에 꺼져있는 것을 볼 수 있다. 맑은고딕, 다음 글꼴등의 최신 글씨체에는 좋지 않아서 수동으로 주석처리했다. (XML문법상 <!-- ~ --> 사이는 주석임)


설치한 폰트들

설치한 폰트들이다. 복사한 이후에는 적용을 위해서 로그오프/재로그인하면 되던데. 로그오프 안하고도 적용하게 하는 방법도 있을 것이다. 본인은 간단히 재로그인으로 반영.



폰트 설정

네이버사전체는 굴림느낌이 난다. 우분투의 경우 /usr/share/fonts/truetype 아래에 ttf 파일들을 복사한 후 시스템->기본설정->모양새에서 글꼴 에서 설정하면 된다.





크리에이티브 커먼즈 라이센스
Creative Commons License

쓰레드별 변수 __thread 사용

Posted at 2009/04/09 13:53 // in Programming // by Daniel

OS가 지원해야 하며 일단 제가 알기로는 Linux(2.6부터) gcc와 MSVC에서 지원되는데요,

TLS - Thread Local Storage 라고 불립니다. 시스템콜로 구현되는 것 같더군요.

일단 구현된 내용은 차치하고 사용법은 다음과 같습니다.

 

gcc의 경우만 설명

__thread int my_thread_var;
static __thread int my_static_thread_var;

 

__thread 키워드로 구분되며 이렇게 선언한 변수는 쓰레드마다 가지게 됩니다.

 

관련 내용 링크

Linux 2.6 속으로!

... 또 다른 변화는 TLS (Thread Local Storage) 시스템 호출의 도입이다. 쓰레드 레지스터로 사용될 수 있는 GDT (Global Descriptor Table) 엔트리를 한 개 이상 할당 할 수 있다. GDT는 CPU 기반이고 엔트리는 쓰레드 기반이다.

TLS - Thread Local Storage http://purewell.egloos.com/3398289

* GCC 메뉴얼 보면 TLS가 아니라 TSD(Thread Storage Duration)이라고 표현하였는데 대충 같은 말이다.
이것을 위해 POSIX는 pthread_key_create, pthread_get/setspecific 등 함수를 마련해놨지만 눈만 팽글팽글 돌고, 소스만 지저분해져 보일 것 같다. 귀찮으면 C99, C++98 표준 __thread 키워드를 사용하자.

http://kldp.org/node/78262

~$ /lib/libc.so.6
...
Thread-local storage support included. << 이부분이 보인다면 현재 glibc가 TLS를 지원하는버젼입니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

arm linux 커널에 system call 추가

Posted at 2009/04/01 17:01 // in Programming // by Daniel

http://barriosstory.blogspot.com/2008/03/arm-linux-kernel-system-call.html

먼저 커널의 다음 3 파일을 수정하여 새로운 system call을 추가하자.
1. arch/arm/kernel/calls.S
2. include/asm-arm/unistd.h
3. 해당 system call을 구현 할 부분(따로 분리해서 구현해도 상관없고 기존의 아무 소스 파일에나 구현해도 상관없다. 단지 makefile만 잘 수정해준다면)

 

마지막으로 해당 system call을 사용하는 application을 작성하여야 한다.

 

http://www.4ellene.net/tt/1168

system call 추가 방법
1. vi /usr/src/linux/arch/i386/kernel/entry.S
: system call 번호를 추가
.long SYMBOL_NAME(sys_mysyscall)  // 240

2. vi /usr/src/linux/include/asm-i386/unistd.h
#define __NR_mysyscall      240

3. vi /usr/src/linux/kernel/test.c
#include <linux/kernel.h>

asmlinkage int sys_mysyscall()
{  
    printk("Hello linux\n");
    return 2007;
}

4. vi /usr/src/linux/kernel/Makefile
obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \
        module.o exit.o itimer.o info.o time.o softirq.o resource.o \
        sysctl.o acct.o capability.o ptrace.o timer.o user.o \
        signal.o sys.o kmod.o context.o test.o 

5. vi app.c

#include <asm-i386/unistd.h>
#include <errno.h>

_syscall0( int, mysyscall );

int main()
{
    int i;
    i = mysyscall();

    printf("%d\n", i );
    return 0;
}

6. cc -I/usr/src/linux/include app.c

7. 커널 컴파일

http://kldp.org/node/87344

시스템 콜을 추가하는 하고자 하는데 잘안되네요
시스템 콜 함수까지는 제대로 구현되는 거는 같은데
그것을 test하는 user application이 잘되지 않네요
_syscall2(int, pedagogictime, int, flag, struct timeval *, thetime);

이런식으로 해주고 user application을 작성해서 컴파일 해주면
'__NR_pedagogictime' undeclared라고 나오네요
분명히 include/asm/arch/unistd.h에서 추가해줬는데 말입니다.

그런데 여러 자료를 보니까 include/asm-arm/unistd.h를 변경해준다고 하고
그런데 거기에 include에 가보니까 asm~~이런 것들이 굉장히 많은데
이것들의 차이는 무언가요 제가 맞게 바꾼거는 맞나요??

 

혹시 arch디렉토리가 없지 않나요?
인텔칩을 사용한다면 include/asm-i386/unistd.h 파일을 수정해주세요.
저 파일에

#define __NR_eventfd            323
#define __NR_pedagogictime            324
#ifdef __KERNEL__

#define NR_syscalls 325

라고 굵은 글씨로 되어 있는 부분을 입력해주시면 됩니다.

asm-???? 들은 각 CPU별로 어셈블리어가 다르기 때문에 CPU별로 나뉘어 있는 것입니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

addr2line 사용법

Posted at 2009/03/31 15:37 // in Tips/Utility programs // by Daniel

addr2line은 PC값으로 프로그램의 수행 라인을 찾아주는 프로그램입니다.

예를 들어

$ addr2line -e FFT 0000abe0
-->
/home/danielsong/examples/splash2/codes/kernels/fft_pthread/fft.c:341

이런 식으로 나옵니다.

또는 줄줄이 입력할 수 있는데, 파일을 리디렉션 해서 쓸 수 있습니다.

$ cat trace.txt | addr2line -e FFT
-->

/home/danielsong/examples/splash2/codes/kernels/fft_pthread/fft.c:459
/home/danielsong/examples/splash2/codes/kernels/fft_pthread/fft.c:459
/home/danielsong/examples/splash2/codes/kernels/fft_pthread/fft.c:467
/home/danielsong/examples/splash2/codes/kernels/fft_pthread/fft.c:468
...

kldp의 addr2line man page에서는 이와 같이 나옵니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

함수의 리턴 주소 알아내기

Posted at 2009/03/23 11:16 // in Programming // by Daniel

프로파일링이나 함수 래핑으로 lock등의 작업을 가로채서 로깅할 때 호출한 쪽의 PC값을 알고 싶을 경우가 있습니다.

현재실행되는 함수 입장에서 보면 리턴 주소이죠

이 때 쓸 수 있는 함수가 gcc의 builtin함수로 __builtin_return_address() 입니다.

__builtin_return_address(level)

여기서 level은 call stack 에서 몇번째를 리턴할 것인지에 대한 값입니다.

__builtin_return_address(0) 하면 현재함수의 리턴주소가 나옵니다.

__builtin_return_address(1) 하면 나를 호출한 함수의 리턴주소가 나옵니다...

예제 코드를 짜봤습니다.

#include <stdio.h>
#include <stdlib.h>

int my_func1()
{
    void *addr;
    addr = __builtin_return_address(0);
    printf("1's caller %p\n",addr);
    printf("hello 1\n");
}
int my_func0()
{
    void *addr;
    printf("hello 0\n");
    addr = __builtin_return_address(0);
    printf("0's caller %p\n",addr);
    my_func1();
}

int main(void)
{
    printf("backtrace test\n");
    printf("main: %p\n", (void *)main);
    printf("my_func0: %p\n", (void *)my_func0);
    printf("my_func1: %p\n", (void *)my_func1);
    my_func0();
    return 0;
}


이 소스코드를 컴파일해서 objdump해보면

080483d1 <my_func0>:
...
80483fc:   e8 a3 ff ff ff          call   80483a4 <my_func1>
8048401:   c9                      leave
8048402:   c3                      ret

08048403 <main>:
...

804845c:   e8 70 ff ff ff          call   80483d1 <my_func0>
8048461:   b8 00 00 00 00          mov    $0x0,%eax
...

이와 같이 호출하게 되어있고

실행해보면

backtrace test
main: 0x8048403
my_func0: 0x80483d1
my_func1: 0x80483a4
hello 0
0's caller 0x8048461
1's caller 0x8048401
hello 1

이렇게 나옵니다. call 바로 다음 주소--리턴 주소가 나오지요.

이외에도 몇가지 builtin함수들이 있습니다.

예를 들어 __builtin_frame_address(level)은 프레임 포인터를 반환합니다.


관련 포스트 :

gcc 컴파일 옵션으로 커스텀 프로파일 해서 실행 트레이스 뽑기

크리에이티브 커먼즈 라이센스
Creative Commons License

wubi-ubuntu installer 가 뭔가 했더니

Posted at 2009/03/18 01:22 // in Tips/Utility programs // by Daniel

Wubi Logo

우분투 인스톨러라 돼 있는데

뭔가 했지요

이번에 노트북에 설치해보니까

WUBI란 ubuntu 리눅스를 윈도우의 ntfs 위에서 돌리도록 세팅해주는 프로그램입니다.

image


설치하면 해 주는 일은

1) C또는 D 드라이브(NTFS)에 가상 이미지 파일을 만들어서 디스크로 사용하게 만든다.

2) 윈도우의 부트로더에 ubuntu로의 부팅을 메뉴로 넣어준다.

3) 이 메뉴를 선택하면 NTFS상의 이미지 파일을 파일시스템으로 인식하여 부팅을 하게 한다.

입니다.

그래서 파티션을 건드리지 않고 단지 윈도우 부트로더에 메뉴를 추가하는 것으로 듀얼부트가 됩니다.

일단 부트되고나면 파티션이 윈도우용인 NTFS 파티션 위에 한 파일을 가상으로 EXT3 디스크로 쓰는 것 뿐 일반적인 리눅스 시스템과 동일합니다.

아이디어 괜찮네요

단점은

1. NTFS위에서 한 파일을 가상으로 디스크로 잡는 거라서 파일시스템 오버헤드(속도)가 좀 있음. NTFS->EXT3로 쓰기 때문입니다.

2. 파일(디스크이미지)이 뻑나면 복구가 일반적인 방법으로 안됨

이랍니다.


그리고

비스타에서 아직 문제 있음.

현재 있는 8.04도 그렇고 8.10도 그렇고

비스타에서 문제는

1. WUBI 실행하고 설치시 office IME랑 충돌나서 죽어버림.

실행하자마자 죽어버리는데 IME옵션에서 Microsoft IME로 바꿔주면 안죽습니다.

설치 이후에는 어차피 듀얼부트니까 상관없구요.

2. 설치하고 나면 부트로더에 메뉴가 추가돼야 되는데 안돼있습니다.

그래서 수동으로 부트메뉴를 설치해야 함. http://stardust99.blogspot.com/2009/02/wubi-install-on-windows-vista-sp1.html 에서 가져왔습니다.

1. 먼저 IME를 Office 2007 IME 대신 Microsoft IME로 바꾼다.
2. Vista에서 Kubuntu를 설치한다. 원래라면 여기서 설치가 끝나고 모든게 해피하게 되어야 하나, 나의 경우는 그렇지 않았다. 부트메뉴에 아무것도 나타나지 않았고, Windows Vista로만 부팅이 되었다.
3. EasyBCD를 다운받아서 깔고, Linux/Wubi를 고르면 NeoGrub을 깔면서 Grub을 사용할 수 있다.
4. 그.러.나. 이 버전의 Grub은 root ()/ubuntu/disks와 같은 것을 처리하지 못한다. 설정 파일을 살펴보면 c:\NST\NeoGrub.mbr을 통해 부팅을 시키는 것을 알 수 있는데, 이것을 wubildr.mbr로 바꿔치기를 한다. wubildr.mbr은 c:\에 있다.
4. wubildr.mbr을 c:\NST\NeoGrub.mbr에 Overwrite한다.
5. c:\ubuntu\disks\boot\grub\menu.lst를 c:\NST\menu.lst로 복사한다.
(install의 경우 c:\ubuntu\disks\install\boot\grub\menu.lst이던가 하는 것을 복사해주면 될 것이다.)

다시 설명하면 EasyBCD를 설치하고 grub을 부트메뉴에 설치, 설치한 .mbr 파일을 ubuntu용으로 교체, menu.lst파일 찾아서 복사해줌. ubuntu\disks\install\boot\grub\menu.lst 를 복사하면 되더군요.

크리에이티브 커먼즈 라이센스
Creative Commons License

Ubuntu에서 하드디스크 사양 보기

Posted at 2009/02/03 12:26 // in Tips // by Daniel

그 용도로만 쓰는 건 아니지만 smartmon이 있습니다. (hdparm으로 못보는 LVM 으로 설정된 디스크도 잘 보이네요)

# apt-get smartmontools

# smartctl -a /dev/sda

하면 됩니다.

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital Caviar RE Serial ATA series
Device Model:     WDC WD5000YS-70VJB1
Serial Number:    ........................
Firmware Version: 00.0HPG0
User Capacity:    500,107,862,016 bytes
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   7
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Tue Feb  3 12:24:00 2009 KST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
...

 

http://www.howtoforge.com/checking-hard-disk-sanity-with-smartmontools-debian-ubuntu

크리에이티브 커먼즈 라이센스
Creative Commons License

scponly를 이용해서 sftp만 제공하고 chroot로 다른 디렉토리 접근 막기

Posted at 2009/01/22 15:56 // in Tips // by Daniel

http://ubuntuforums.org/showthread.php?t=451510 (원출처 포스트)

http://geekzine.org/2007/09/28/easy-sftp-and-chroot-sftp-with-scponly/

항상 실패했었는데 좋은 패키지가 있군요

외부 사용자에게 셸은 안주고 sftp만 제공해서 다운로드/업로드만 되게 하고 싶을 때가 있습니다. ftp는 보안상 피하고 싶구요.

그때 잘 쓸 수 있겠네요.

간단하게 설명하면 (데비안/우분투 기준입니다)

1. scponly 패키지를 설치한다.

2. 거기서 제공하는 스크립트로 chroot jail을 만들고 사용자를 추가한다.

끝.

입니다.

자세한 설명은 위 링크에 돼 있구요

제가 한 스샷과 함께 보면,

1. scponly 패키지 설치

$ sudo apt-get install scponly

이러면 됩니다.

테스트로 일단 테스트할 사용자를 만들었다 치고

그 사용자의 shell을 scponly로 바꿔줍니다.

$ sudo chsh -s /usr/bin/scponly username

그리고 sftp 해보기

$ sftp username@서버

image

2. Chroot로 경로 제한해주기

chroot로 안해주면 sftp로 서버의 모든 경로를 다 이동해다닐 수 있습니다.

꼭 해줘야겠죠.

$ sudo dpkg-reconfigure -plow scponly

해줍니다. 그러면 뭐라뭐라 경고가 뜰텐데. chroot쓸라면 꼭 suid를 세팅 해야 하기 때문입니다. yes를 선택

image

그리고 제공된 스크립트를 압축 풀어서 실행해줍니다.

$ cd /usr/share/doc/scponly/setup_chroot
$ sudo gunzip setup_chroot.sh.gz
$ sudo chmod +x setup_chroot.sh
$ sudo ./setup_chroot.sh

실행하면 새로 추가할 사용자 이름, chroot 경로등을 물어보고 셋업해줍니다.

image

암호까지 입력했으면 이제 셋업 된 겁니다.

접속해봅시다 ^^

우분투에선(저는 8.04) 잘 되는데 제 VM(데비안) 오류가 나네요

아항~ 보니깐 dev/null이 없어요. 아마 데비안의 버전에서 스크립트 버그인 듯.

$ mkdir /home/scponly/dev
$ mknod -m 666 /home/scponly/dev/null c 1 3

이렇게 하니 접속 되네요.

image

그리고 유저 이름이 긴 경우인 것 같은데 winscp에서 에러메시지 같은게 납니다.(제가 테스트한 데비안 버전의 경우)

이 때는 제공된(/usr/share/doc/scponly/group.c)를 빌드해서 카피해주면 되나봐요. 그러나 쓰는 데 문제 없는 거 같아서 놔뒀습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License