2012년 2월 22일 수요일

Embedded Debian Project 에서 제공하는 유용한 개발 도구 설치하기

Emdebian에서 제공하는 패키지는 다음과 같은 것들이 있다. 현재 시냅틱 패키지에서 검색되는 내용들이다.

emdebian-crush
emdebian-archive-keyring
emdebian-grip
emdebian-grip-server
libdebian-packages-compare
multistrap
emdebian-tdeb

* toolchain
설치하기 위해서 source.list에 emdebian.org를 추가하거나 /etc/apt/source.list.d/밑에 emdebain.list 파일을 다음의 내용을 갖도록 생성해야한다.

deb http://www.emdebian.org/debian testing main

#deb http://www.emdebian.org/debian unstable main
#deb http://www.emdebian.org/debian squeeze main

현재 나의 시스템은 wheezy이기 때문에 위와 같이 설정한다.
나중에 squeeze가 아니어서 발생하는 문제점이 있기 때문에 좀 귀찮은 것이 있다.


그리고 패키지 정보를 갱신한다.

# apt-get update

gpg 어쩌구 저쩌구 하면서 에러를 내뱄는다. 그레서 keying에 해당하는 것을 설치해 보았다.

# apt-get install emdebian-archive-keyring

그리고 다시 패키지 정보를 갱신해 보았다. 된다.

그럼 armel에 해당하는 architecture관련 사항들을 패키지 캐시에서 검색해보자.

# apt-cache search armel


asterisk-prompt-fr-armelle - French voice prompts for Asterisk by Armelle Desjardins
debian-installer-6.0-netboot-armel - Debian-installer network boot images for armel
installation-guide-armel - Debian installation guide for armel
icedtea-6-jre-cacao - Alternative JVM for OpenJDK, using Cacao
icedtea-6-jre-jamvm - Alternative JVM for OpenJDK, using JamVM
icedtea-7-jre-jamvm - Alternative JVM for OpenJDK, using JamVM
cpp-4.3-arm-linux-gnueabi - The GNU C preprocessor
cpp-4.4-arm-linux-gnueabi - The GNU C preprocessor
g++-4.3-arm-linux-gnueabi - The GNU C++ compiler
g++-4.4-arm-linux-gnueabi - The GNU C++ compiler
gcc-4.3-arm-linux-gnueabi - The GNU C compiler
gcc-4.4-arm-linux-gnueabi - The GNU C compiler
gcc-4.4-base-armel-cross - The GNU Compiler Collection (base package) (for cross-compiling)
libc-bin-armel-cross - Embedded GNU C Library: Binaries (for cross-compiling)
libc-dev-bin-armel-cross - Embedded GNU C Library: Development binaries (for cross-compiling)
libc6-armel-cross - Embedded GNU C Library: Shared libraries (for cross-compiling)
libc6-dev-armel-cross - Embedded GNU C Library: Development Libraries and Header Files (for cross-compiling)
libgcc1-armel-cross - GCC support library (for cross-compiling)
libgcc1-dbg-armel-cross - GCC support library (debug symbols)
libgfortran3-armel-cross - Runtime library for GNU Fortran applications
libgfortran3-dbg-armel-cross - Runtime library for GNU Fortran applications (debug symbols)
libgmp3-dev-armel-cross - Multiprecision arithmetic library developers tools (for cross-compiling)
libgmp3c2-armel-cross - Multiprecision arithmetic library (for cross-compiling)
libgmpxx4ldbl-armel-cross - Multiprecision arithmetic library (C++ bindings) (for cross-compiling)
libgomp1-armel-cross - GCC OpenMP (GOMP) support library
libgomp1-dbg-armel-cross - GCC OpenMP (GOMP) support library (debug symbols)
libmpfr-dev-armel-cross - multiple precision floating-point computation developers tools (for cross-compiling)
libmpfr4-armel-cross - multiple precision floating-point computation (for cross-compiling)
libmudflap0-4.4-dev-armel-cross - GCC mudflap support libraries (development files)
libmudflap0-armel-cross - GCC mudflap shared support libraries
libmudflap0-dbg-armel-cross - GCC mudflap shared support libraries (debug symbols)
libobjc2-armel-cross - Runtime library for GNU Objective-C applications
libobjc2-dbg-armel-cross - Runtime library for GNU Objective-C applications (debug symbols)
libstdc++6-4.3-dbg-armel-cross - The GNU Standard C++ Library v3 (debugging files)
libstdc++6-4.3-dev-armel-cross - The GNU Standard C++ Library v3 (development files)
libstdc++6-4.3-pic-armel-cross - The GNU Standard C++ Library v3 (shared library subset kit)
libstdc++6-4.4-dbg-armel-cross - The GNU Standard C++ Library v3 (debugging files)
libstdc++6-4.4-dev-armel-cross - The GNU Standard C++ Library v3 (development files)
libstdc++6-4.4-pic-armel-cross - The GNU Standard C++ Library v3 (shared library subset kit)
libstdc++6-armel-cross - The GNU Standard C++ Library v3 (for cross-compiling)
linux-libc-dev-armel-cross - Linux support headers for userspace development (for cross-compiling)
tzdata-armel-cross - time zone and daylight-saving time data (for cross-compiling)
zlib1g-armel-cross - compression library - runtime (for cross-compiling)
zlib1g-dev-armel-cross - compression library - development (for cross-compiling)

좀 많다. 다 파악하지는 못하겠지만 컴파일러, 라이브러리 등이라고 파악된다. 그 중 눈에 띄는 것이 있는데 다음 패키지이다.

"installation-guide-armel - Debian installation guide for armel"

설치하는데 필요한 도움글이 되겠다. 우선 설치해서 살펴보자.

# apt-get install installation-guide-armel

설치되고 실행하거나 읽어볼 내용에 대한 아무런 연관고리가 없어서 설치된 파일을 찾아 보았다.

"/var/lib/doc-base/documents/installation-guide-armel-en"에 있었다.

Document: installation-guide-armel-en
Section: Debian/Installation
Title: Debian Installation Guide for ARM in English
Author: Debian Installer team
Abstract: Manual describing how to install a Debian system
 using the Debian Installer.

Format: HTML
Index: /usr/share/doc/installation-guide-armel/en/index.html
Files: /usr/share/doc/installation-guide-armel/en/*.html

Format: pdf
Files: /usr/share/doc/installation-guide-armel/en/install.en.pdf.gz

Format: text
Files: /usr/share/doc/installation-guide-armel/en/install.en.txt.gz

그럼 해당 파일을 참고해서 살펴 보았다. 해당 내용은 그냥 데비안 설치 도움글이다. 일반적인 도움글로 데이안이 무엇인가?에서 시작해서 CD에서 설치하는 법 서버 설정법 등이다. 지우자.

# apt-get remove installation-guide-armel

그럼 다시 되돌아 가서 다음 링크의 내용들을 충실히 따라해서 toolchain과 라이브러리를 설치하자.


우선 설치해야 하는 파일은 g++이다.

# apt-get install g++-4.4-arm-linux-gnueabi

위와 같이 하면 의존성 문제가 발생한다.

libgmp3c2패키지가 없다고 생기는 문제점인것 같다.

emdebian에서 추천하는 debian 버전은 squeeze인데

내 것이 wheezy여서 생기는 문제 인것 같다.

그래서 수동으로 설치해 주어야 한다.

시스템은 i386머신이기 때문에 다음 파일을 다운 받았다.

http://packages.debian.org/squeeze/i386/libgmp3c2/download

다른 머신은 다음 사이트에서 해당 머신에 해당하는 파일 다운 받아야 한다.

http://packages.debian.org/squeeze/libgmp3c2

그리고 설치는 다음과 같이 한다.

# dpkg -i libgmp3c2_4.3.2+dfsg-1_????.deb

그리고 나서 다시 설치하면 정상적으로 설치된다.

# apt-get install g++-4.4-arm-linux-gnueabi

설치된 파일은 /usr/bin/arm-linux-gnueabi-gcc에 존재하게 된다.

그럼 버전을 확인해 보자.

/usr/bin# arm-linux-gnueabi-gcc -v


Using built-in specs.
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.4.5 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-sjlj-exceptions --enable-checking=release --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --build=i486-linux-gnu --host=i486-linux-gnu --target=arm-linux-gnueabi --with-headers=/usr/arm-linux-gnueabi/include --with-libs=/usr/arm-linux-gnueabi/lib
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8)

위와 같다.

그럼 다음으로 넘어 가자.

다시 한번 기억할 것이 작업하는 시스템의 debian 버전은 wheezy이다.

다른 버전은 위에 경로로 가서 해당 시스템에 따라 조금씩 변경해야 할 것들이 있다.

다음에 설치할 것들은 arm-linux-gnueabi-gcc에 필요한 cross 라이브러리를 설치하기 위한

xapt를 설치해야 한다.

# apt-get install xapt

그리고 다음의 패키지들을 설치하자.

# xapt -a armel -m libfoo-dev


그럼 cross 시스템의 gdb를 설치하자.

# apt-get install gdb-arm-linux-gnueabi binutils-arm-linux-gnueabi

휴우 위의 두게 는 아직 패키지 없음으로 나온다.

라이브러리와 gdb는 나중에 다시 해보아야 겠다.

2012년 2월 16일 목요일

USB to RS485/RS422 with protection circuit and Isolation housing

http://www.kisansystem.kr/index/shop/item.php?it_id=1263307062
http://www.eleparts.co.kr/front/productdetail.php?productcode=035011001000000074

합리주의 혹은 중용의 도

중용과 합리주의 이 둘의 언급 순서를 어떻게 해야 할지 먼저 생각하게 된다. 이 둘은 울림은 개인적으로 비슷하게 느껴지지만, 아직은 중용 보다는 합리주의라는 말이 가슴에 와 닿는 말이다. 아무튼 같다고는 할 수 없지만 이 둘은 공통된 부분을 공감하며 살아간다는 일들이 왠만히 부지런하지 않으면 쉬운 일이 아닌 것 같다. 당연히 지켜져야 할 일들이 짜증나게 사소한 것들에서 부터 추상적인 담론까지 챙기지 못한다면 못된 사람들의 꽃노름에 휘둘이기에 쉽다. 너무나도 혼잡하다. 개인적인 내적 탐구도 힘든데 외부적으로 바른 길을 찾는 길도 힘들다.

2012년 2월 14일 화요일

AVR development environment with eclipse in debian

* install "eclipse"
# apt-get install eclipse-cdt

* install "AVR-plugin"
Execute "eclipse" -> Help -> Install New Software... -> Add -> type "AVR Plugin" in Name tab and insert "http://avr-eclipse.sourceforge.net/updatesite/" in Location tab -> install "AVR Eclipse Plugin"

*install "C99 LC Parser" in eclipse

* install gcc-avr, task-c-devel, gcc-doc, gcc-4.2 avr-libc, binutils-avr, and avrdude, avrdude-doc libftdi1
# apt-get install gcc-avr task-c-devel, gcc-doc, gcc-4.2, avr-libc, binutils-avr avrdude avrdude-doc libftdi1


2012년 2월 12일 일요일

미국 일하러 가기 준비

* 보통 연봉 : 5만달러 (현재 시점 6천만원)

* H1비자는 세금 25%

* 9시 출근 5시 퇴근

* Silver Spring에 위치한 Lado라는 학교와 University of Maryland 의 어학 연수프로그램, 전자는 회화위주의 사설 교육기간 Beltsville에서 차로 15분 정도거리 후자는 차로 13분 정도의 거리이다.

* 가정용 공구 : 몽키 스패, 펜치, 프라이어, 니퍼, 롱노즈프라이어, 망치, 드라이버 +,- x 대소너, 육각렌치

* 전기 장판 : 110, 220 겸용 http://itempage3.auction.co.kr/DetailView.aspx?ItemNo=A594372381&frm3=V2 한일 전기요 대형 180x 135

* 주거지
rollins park
http://www.rollinspark.net/floorPlans.php
congressional tower
http://www.congressionaltowers.net/
mira mont
http://www.southernmanagement.com/miramont/
https://www.southernmanagement.com/miramont/apply/

* 이민가방
http://www.brightonmall.co.kr/mall/index.php

* 인터넷 전화기 준비 (LG U+ 070, 기본 요금: 2200원)

[번역] Chrome 브라우져의 cache 영역을 ram으로

다음 문서는 Chrome의 cache영역을 ram disk(/dev/shm)밑으로 설정하고 전원이 꺼질때 유실되는 데이터를 하드 디스크로 복사하고 부팅시 복사된 하드 디스크의 데이터를 다시 ramdisk 밑으로 복사하는 과정을 거치는 노력을 하였다.

출처 : http://www.anders.bennehag.com/blog/2010/putting-chromes-cache-in-the-ram/
Chrome 웹 브라우져는 속도를 향상하는 방향으로 변화하고 있다. 그러나 지속적인 디스크 읽기와 쓰기로 내 Laptop 컴퓨터의 배터리와 하드드라이브를 소모하게된다.

다행이도 리눅스는 Ram으로 Mount 폴더를 가지고 있다. 이건 읽고 쓰는 작업이 하드 디스크에 영향을 미치지 않는다는 것을 의미한다. (실제로 내 Laptop의 디스크보다 2배정도 빠르다) 단점은 전원을 끄게되면 데이터가 사라지게 된다. 이 폴더는 통상 /dev/shm으로 불린다. 나는 이 폴더를 Chrome 브라우져의 cache로 사용하고자 한다.  그러나 나는 컴퓨터의 전원을 끌때 환경 설정, 확장 프로그램, 그리고 저장된 데이터의 잃어 버릴 준비가 되어 있지 않다. 그래서 나는 Ram으로 mount된 /dev/shm에 있는 폴더를 디스크로 복사하는 스크립트를 작성하였다. 그리고 이 스크립트는 Crome이 종료 될 때마다 실행된다.


이것은 Chrome의 cache를 Ram으로 설정하는 것이다.

# mkdir /dev/shm/.personal_synced # The folder in ram
# mkdir ~/.personal_synced # The mirrored folder on disk

매 시간마다 실행되는 간단한 스크립트를 작성하였다. (나는 좀더 쉬운 방식으로 작성되어 질 수 있다고 생각한다. 하지만 나는 아직 bash에 초보자 이다.)


#!/bin/bash
# Sync the ramdisk to harddrive

foldername=”.personal_synced”
ramdisk=”/dev/shm/”$foldername
harddisk_copy=”/home/anders/”
backup=”/home/anders/”$foldername”.old”

# Remove the old backup
echo “removing $backup”
rm -fr “$backup”
# Make a copy of the old one
echo “Copies the latest backup $harddisk_copy$foldername”
mv -f “$harddisk_copy$foldername” “$backup”
# Copy from ram
echo “Copies $ramdisk to harddrive, $harddisk_copy”
cp -R “$ramdisk” “$harddisk_copy”


나는 이 sync 스크립트가 Chrome이 종료 될때 실행되기를 원한다. 먼저 나는 나는 전원이 종료될때 실행되도록 시도하였다. 다음 스크립트는 Chrome이 종료될때 Ram 디스크를 동기화하는 것이고 난 그져 이 스크립트를 가지고 /usr/bin/google-chrome에 있는 symbolic link를 대체하였다.

#!/bin/bash
# Start Chrome with cache in the ram

/opt/google/chrome/google-chrome -user-data-dir=”/dev/shm/.personal_synced/google-chrome” “$@” && /home/anders/Scripts/syncRamdisk

소실된 모든 것들은 컴퓨터가 부팅될때 디스크 폴더의 것들을 복사하는 스크립트가 보상한다.

# The synced folder
cp -R /home/anders/.personal_synced /dev/shm/
chown -R anders /dev/shm/.personal_synced

# The chrome cache. I don’t want to sync this so it’s placed outside .personal_synced
mkdir /dev/shm/google-chrome
chown anders /dev/shm/google-chrome

그리고 단순히 시작 프로그램에 이 스크립트를 추가하였다.  System->Preferences에 해당하는 곳에 하면 된다.

Chrome의 cache를 우리의 자동 synced  폴더로 이동하자.

.config/google-chrome-folder를 synced 폴더로 이동하고 symbolic link로 대체함으로써 작업은 완벽해 졌다. (나는 또한 cache를 ramdisk로 옮겼으나 synced 폴더를 그렇게 하지 않았다. 나는 cache를 유지하는데 필요한 공간과 소비 시간에 아무런 변화점을 보지 못했다.)

# mv ~/.cache/google-chrome /dev/shm/google-chrome
# ln -s /dev/shm/google-chrome ~/.cache/google-chrome

# mv ~/.config/google-chrome /dev/shm/.personal_synced/
# ln -s /dev/shm/.personal_synced/google-chrome ~/.config/google-chrome

주의 사항들:

/dev/shm/는 모두에 의해서 읽기가 가능하다. 이 폴더에 어떤 것을 넣는 것은 매우 안전한 작업은 아니다.

추가작업: 나는 스크립트를 약간 수정하였다. root 소유의 폴더에서 문제점이 발생하였다.




2012년 2월 9일 목요일

/dev/shm 무엇에 쓰는 물건인가?

POSIX 기반의 공유 메모리를 위한 파일 시스템으로 응용프로그램들이 데이터 공유를 위해서 잠시 사용하기는 용도로 규정되어 있는 것으로 보인다. 문제는 이 파일 시스템이 메모리를 저장 공간으로 사용하기 때문에 저장및 읽기 속도는 빠르지만 hibernation상태로 진입하게 될때 처럼 전원이 차된되는 경우 데이터를 유실할 가능성이 있다. 그래서 swap영역을 사용하도록 규정되어 있다고 언급된다. 그레서 shm의 데이터는 hibernation상태로 진입할때 하드 디스크영역에 해당하는 swap영역에 데이터를 저장한다고 여겨진다.

2012년 2월 8일 수요일

RAM upgrade 후 (2g -> 4g) tmpfs의 용량 바꾸기

tmpfs로 mount된 /dev/shm의 용량은 ram의 용량이 2g였을 때의 설정을 그대로 가지고 있다.

# df -h /dev/shm

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           760M  1.1M  759M   1% /run/shm

음. ram이 2g 였었지만 비디오 카드가 사용하던 용량이 300M정도 였었음을 감안하면 얼추 맞는것 같다. 90M가 모자르지만 맞다고 하자.

그럼 용량을 바꾸어보자. 

# vi /etc/fstab

어라 /dev/shm의 mount 정보가 없다.

좀더 찾아 보니 초기화 스크립트로 옮겨 갔다.

# ls /etc/rcS.d
README      S09checkfs.sh S17nfs-common
S01mountkernfs.sh     S10mountall.sh S18mountnfs.sh
S02udev      S11mountall-bootclean.sh S19mountnfs-bootclean.sh
S03mountdevsubfs.sh   S12mountoverflowtmp S20console-screen.sh
S04bootlogd      S13ifupdown-clean S21kbd
S05keyboard-setup     S13pppd-dns S22console-setup
S06hdparm      S13procps S23alsa-utils
S06hostname.sh      S13udev-mtab S23bootmisc.sh
S06hwclockfirst.sh    S13urandom S23fuse
S07checkroot.sh       S13x11-common S23lm-sensors
S08hwclock.sh      S14ifupdown S24stop-bootlogd-single
S08module-init-tools  S15networking
S08mtab.sh      S16rpcbind

여기서 S03mountdevsubfs.sh에 해당 내용이 들어 있다.

        # Mount a tmpfs on /run/shm
        if [ ! -d /run/shm ]
        then
                mkdir --mode=755 /run/shm
                [ -x /sbin/restorecon ] && /sbin/restorecon /run/shm
        fi

        if [ yes = "$RAMSHM" ] || read_fstab_entry /run/shm tmpfs; then
                domount "$MNTMODE" tmpfs shmfs /run/shm tmpfs "-onosuid,nodev$SHM_OPT"
        else
                chmod "$SHM_MODE" /run/shm
        fi

        # Migrate early, so /dev/shm is available from the start
        if [ "$MNTMODE" = mount_noupdate ] || [ "$MNTMODE" = mount ]; then
                run_migrate /dev/shm /run/shm ../run/shm
        fi

음..  잘 모르겠다 용량 설정하는 내용이 없다. 아마도 SHM_OPT라는 변수에 있을 것 같다.
여기(/lib/init/tmpfs.sh)에 다있네

#
# Set tmpfs vars
#에

# Set defaults for /etc/default/tmpfs, in case any options are
# commented out which are needed for booting.  So that an empty or
# outdated file missing newer options works correctly, set the default
# values here.

TMPFS_SIZE=20%
TMPFS_MODE=755

RUN_SIZE=10%
RUN_MODE=755

LOCK_SIZE=5242880 # 5MiB
LOCK_MODE=1777

SHM_SIZE=
SHM_MODE=1777

TMP_SIZE=
TMP_MODE=1777

# Source conffile
if [ -f /etc/default/tmpfs ]; then
    . /etc/default/tmpfs
fi

RUN_OPT=
[ "${RUN_SIZE:=$TMPFS_SIZE}" ] && RUN_OPT=",size=$RUN_SIZE"
[ "${RUN_MODE:=$TMPFS_MODE}" ] && RUN_OPT="$RUN_OPT,mode=$RUN_MODE"

LOCK_OPT=
[ "${LOCK_SIZE:=$TMPFS_SIZE}" ] && LOCK_OPT=",size=$LOCK_SIZE"
[ "${LOCK_MODE:=$TMPFS_MODE}" ] && LOCK_OPT="$LOCK_OPT,mode=$LOCK_MODE"

SHM_OPT=
[ "${SHM_SIZE:=$TMPFS_SIZE}" ] && SHM_OPT=",size=$SHM_SIZE"
[ "${SHM_MODE:=$TMPFS_MODE}" ] && SHM_OPT="$SHM_OPT,mode=$SHM_MODE"

TMP_OPT=
[ "${TMP_SIZE:=$TMPFS_SIZE}" ] && TMP_OPT=",size=$TMP_SIZE"
[ "${TMP_MODE:=$TMPFS_MODE}" ] && TMP_OPT="$TMP_OPT,mode=$TMP_MODE"

아 잘 모르겠다. 시간을 두고 살펴봐야지.

2012년 2월 7일 화요일

RAMDISK, ramfs, 그리고 tmpfs사이에 생기는 혼동!

이후의 글은 다음 링크를 참조하였다.
http://www.linuxfordevices.com/c/a/Linux-For-Devices-Articles/Introducing-initramfs-a-new-model-for-initial-RAM-disks/
ramdisk와 ramfs의 차이

initrd같은 ramdisk는 ram 기반 block device이다. 이건 disk같이 mount되고 포멧된 고정된 크기의 메모리 공간을 의미한다. 이것은 ramdisk의 내용들은 일정한 형식을 갖는 형태로 되어 있어야 하고 특별한 도구(mke2fs, losetup)로 준비되어야한다. 그리고 모든 block device들과 같이 실행시 데이터를 해석하기 위해서 filesystem 드라이버가 필요하다. 이건 또한 낭비되는 공간(ramdisk가 꽉차지 않으면, 나머지메모리는 어떠한 것으로 사용될 수 없다.)이나 공간 제한(ramdisk가 꽉 채워졌지만 나머지 메모리 공간이 여유가 있더라도, 포멧없이 ramdisk의 확장은 불가능하다.)인위적인 크기 제한을 의미한다.

그러나 ramdisk들은 실제로 caching 때문에 많은 공간을 낭비한다. Linux는 block device를 쓰거나 읽기 위한 모든 파일과 디렉토리 entry를 cache로 처리하도록 고안되어져 있다. 그레서 Linux는 ramdisk에 쓰거나 읽게된 데이터를 "page cache"나 "dentry cache"로 복사한다. ramdisk의 아랫쪽 부분은 block device처럼 다루어 진다.

몇년 후 Linus Torvalds는 잘정리된 아이디어를 가졌다. 리눅스의 cache시스템이 filesystem처럼 mount되어 진다면 어떨까?하는... cache에 파일을 유지하고 시스템이 재시동하거나 지워질때까지 절대 지우지 안으면 어떨까? Linus는 "ramfs"이라 불리는 cache 시스템을 둘러싸는 작은 껍데기를 작성하였다. 다른 커널 개발자들은 "tmpfs"이라 불리는 개선된 버전을 만들었다. (이것은 데이터를 swap 공간에 저장할 수 있고 모든 가용 메모리를 다 소비하기 전에 공간이 다 채워지는 mount 지점의 크기를  제한한다. tmpfs의 예는 Initramfs이다.

이러한 ram 기반 filesystem들은 자동적으로 그들이 가지고 있는 데이터의 크기에 맞게 작아지거나 커진다. ramfs에 파일을 추가하거나 있는 파일의 용량을 키우는 작업은 자동적으로 더 많은 메모리를 할당한다. 그리고 파일을 지우거나 줄이는 작업은 그 메모리를 되돌려준다. 현시점에서 block device가 없기 때문에 block device와 cache사이에 어떠한 복사도 없다. cache에서의 복사는 데이터의 단순한 복사이다. 모든 훌룡한 부분들은 새로운 코드들이 아니다. 그러나 기존의 Linux caching 코드들을 위한 새로운 응용프로그램은 매우 단순하고 극도록 잘 검증된 기반구조에 기초한다.

root file system으로 initramfs을 사용하는 시스템은 filesystem으로 해석될 block device가 없기 때문에 하나의 filesystem 드라이버만으로 구현된 커널이면 안된다. 그져 메모리에 파일이 존재하게된다.

이 둘의 차이는  가상적인 disk와 filesystem의 차이이다. 서로 다른 차원에서 형성된 개념으로 비교가 불가능하다. 예를 들어 이야기 하자면 시스템의 RAM의 한부분을 RAMDISK로 사용하고 파일 시스템을 ramfs으로 포멧한다라고 하면 이해가 되려나?

이후의 내용은 다음 링크의 내용을 참조 하였음

http://www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/

ramfs과 tmpfs의 차이

기본적으로 tmpfs과 ramfs는 몇가지 세세한 사항을 제외하고 거의 동일하다.

ramdisk는 동적으로 공간을 할당한다. 그레서 ramfs에 데이터를 쓰는 작업은 시스템에서 사용가능한 메모리의 크기를 넘어가지 않도록 해야한다. 이야기 해보자면 여러분이 시스템에 2G의  RAM을 가지고 있고 1G의 ramfs을 생성하고 /tmp/ram의 지점에 mount되어 있다고 하자. /tmp/ram의 전체 크기가 1G를 상회할 때도 여전히 데이터를 저장할 수 있다. 시스템은 1G를 넘는 데이터 저장 행위를 멈추지 못한다. 그러나 시스템의  RAM의 전체 크기 2G를 넘는 데이터 저장을 하게 되면 시스템은 멈추고 RAM에는 더이상 데이터를 저장할 공간이 없어지게 된다.

tmpfs은 동적으로 공간을 할당하지 않는다. tmpfs을 mount할 때 설정한 용량을 넘어서서 데이터 저장을 허용하지 않는다. 그레서 데이터를 쓰는 작업이 용량이 넘지 않도록 신경쓰지 않아도 된다. 하지만, 용량을 넘어서는 작업을 하게되면 “No space left on device”라는 메시지를 내보낸다.

tmpfs은 swap을 사용한다. (swap은 파일 시스템의 swap 디스크를 일컷는다.)

ramfs은 swap을 사용하지 않는다.

ramfs과 tmpfs의 단점

ramfs과 tmpfs의 단점은 시스템이 재시동하거나 멈추게 될 때 다 지워지게 된다. 그레서 주기적으로 disk에 저장하는 작업을 해주어야 한다. 시스템이 재시동할 때 ramfs과 tmpfs의 데이터를 disk에 저장하는 작업을 할 수 있지만 시스템이 멈출때는 이러한 추가적인 도움을 받을 수 없다.

Table: Comparison of ramfs and tmpfs


Experimentation                   Tmpfs              Ramfs
허용량이상의 데이터 쓰기    에러 메시지      쓰기 작업 허용
고정된 총 용량                    고정된 총크기   변동적인 총 크기
Swap 디스크 사용                사용                무사용
휘발성 저장                         예                   예


여러분이 데이터를 쓰는 작업을 좀 더 빠르게 하자고 한다면, 시스템 주의사항을 제공하는 tmpfs이 좀더 낳다.


RAM 업그레이드 후 Debian (wheezy) 시스템의 자원 사용 현황

먼저 gnome-system-monitor에서  보여준 결과는 다음과 같다.


실행한 프로그램은 rythmbox, crome(active 30 tabs), virtualbox, 관리자 터미널,  libreoffice등이다. 평소에 사용하는 조합이다. 가장 큰 가변 요인은 virtualbox의 램 사용률이다 설정은 1G로 설정해 놓았지만, 실제 그렇지는 않는 것 같다. 유동적으로 나눠 쓰는 모양인지 모르겠다. 아무튼 살펴본 봐는 위와 같다.

swap 파일 시스템은 전혀 사용하지 않는다.  CPU는 어쩔 수 없지만 메모리는 1G정도 여유가 있는 것 같다. 그레서 crome의 cache 저장용으로 ramdisk나 tmpfs을 만들어서 사용해야 겠다.

우선 ramdisk와 tmpfs의 차이점에 대해서 살펴 봐야 겠다. 둘다 RAM을 디스크로 사용하는 기법인 것 같은데 구체적인 구현이 다른 것 같다. 그리고 둘을 지원하는지 살펴 보아야 겠다. 이것 당장 해 보았다.

tmpfs을 지원하는지 살펴보기
# grep tmpfs /proc/filesystems
nodev tmpfs
nodev devtmpfs

RAMDISK를 지원하는지 살펴보기
#  dmesg | grep RAMDISK
[    0.000000] RAMDISK: 36cc6000 - 3765b000

음. tmpfs이나 RAMDISK는 지원하는것 같다. 아래 출력은 이미 사용중이라는 생각이 들긴하지만 자세히 무엇을 의미하는지 모르겠다. 용량으로 살펴 볼땐 그래픽 모듈이 사용하는 것 같긴하다.


다음은 RAMDISK 만드는 법이다.
http://shibuvarkala.blogspot.com/2009/09/howto-create-ramdisk-in-ubuntu-debian.html
http://www.techtach.org/using-and-mounting-a-ram-disk-in-ubuntu-the-easy-way
http://securfox.wordpress.com/2009/03/14/how-to-create-a-ram-disk/

Ubuntu나 Fedora 배포판의 Firefox나 Crome에서 RAM을 cache로 설정하는 법
http://www.linuxreaders.com/2011/01/11/firefox-chrome-cache-on-ram-drive-fedora-ubuntu/

인터넷 전화기(LG U+ 070) 준비


새것으로 구매하려고 하였으나 매달 행사로 나오는 물건들도 따지고 보면 많은 손해를 보도록 되어 있다.
삼년약정에 공유기 대여비 추가 부담.
그러니 행사가 아닌 물건은 도대체 누가 사는 것인지 궁금하다.

중고로 물건을 샀다. 평균가격이 3만원이었다만 여기저기 전화하고 그러는게 귀찬아 그냥 4만원짜리 샀다.
인내심을 시험하는 ARS 전화를 거쳐 중고기계를 사용한다는 사정 설명과 귀찮은 개인정보 동의 같은 것들.

그래서 결론은 월 2200원에 설치비 11000원이 든단다.
이놈의 설치비 라는 것은 전화한통으로 해결되는 mac주소 불러주는 것을 이야기하는 것이 었다.

음. 근데 동작을 안한다. MAC주소 받아 적는데 착오가 있었거나 뭔가 전산 착오라고 유추한다.
어쨌든 월요일에 설치기사가 온단다. 기다려 보자.

* mylg070로 기본 SSID가 설정되어 있는것 해제하여 다른 공유기를 사용하기
http://clien.career.co.kr/cs2/bbs/board.php?bo_table=lecture&wr_id=41561

2012년 2월 6일 월요일

Suspend to Ram에 생긴 그간의 문제 해결

그 동안 debian wheezy의 hibernation은 잘 동작하였다.
그러니 suspend에 필요한 기본적인 동작들은 완벽하다.
하지만 Suspend to Ram에서 복구하는 기능은 마우스 커서가 살아있는 상태에서
멈춰서 버린다. 그래서 Ctrl+Alt+F1으로 관리자 터미널을 띄워서 재부팅하였다.
그리고 /var/log/pm-suspend.log의 기록들을 확인해 보았다.
다음과 같은 실패 항목들이 나타난다.


/etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success.
Running hook /usr/lib/pm-utils/sleep.d/55NetworkManager suspend suspend:
Having NetworkManager put all interaces to sleep...Failed.

/usr/lib/pm-utils/sleep.d/55NetworkManager suspend suspend: success.
Running hook /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend:
Failed to connect to wpa_supplicant - wpa_ctrl_open: No such file or directory

자세한 내용들을 찾아 보려고 googling을 해보았지만, 시원한 해결책은 없었다.
그져 네트워크 문제라고 유추해 볼 뿐이다.

네트워크의 가장 기초적인 설정을 살펴 보았다. 다음과 같이 되어있었다.


# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
#NetworkManager#iface eth0 inet dhcp

#auto wlan0
#iface wlan0 inet dhcp
# wpa-ssid networkname
# wpa-psk password

아. 이 모든 것들은 필요에 따라 조금씩 수정해 보왔던 내 탓이다.
그래도 잘 동작했었다. 가끔씩 resume이 안되었을 때가 있었지만.
그리고 suspend to Ram은 잘 사용하지도 않는다.

그래서 다시 되돌려 놓았다. 문제되는 NetworkManager와 wpa-ssid, wpa-psk항목들을 제외하고, 그러니 되돌아 왔다.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
#NetworkManager
iface eth0 inet dhcp

auto wlan0
#iface wlan0 inet dhcp
# wpa-ssid networkname
# wpa-psk password

이로써 Suspend to Ram도 잘 동작하였다.

2012년 2월 3일 금요일

미래에 대처하는 나의 자세

나는 불안정하고
때로는 위로 받고 싶다.

가끔은 이런게 모자라 정체되곤한다.
그래서 바보가 되곤한다.

그래도 계속 가야한다.
그러니 가끔 멍하게 지내야한다.