[Android] boot.img 구성

Android 에서 사용되는 boot.img 는 다음과 같이 구성되어 있다(ICS 기준).
각 구성부는 Page 크기에 맞춰 Align 되어 있다.
– Boot Image Header(1 page) (system/core/mkbootimng/bootimg.h 참고)
 + magic(8 bytes) : ANDROID!
 + kernel size(4 bytes)
 + kernel address(4 bytes)
 + ramdisk size(4 bytes)
 + ramdisk address(4 bytes)
 + second stage size(4 bytes)
 + second stage address(4 bytes)
 + kernel tags physical address(4 bytes)
 + page size(4 bytes)
 + reserved(8 bytes) : Should be 0
 + product name(16 bytes)
 + cmdline(512 bytes)
 + id(32 bytes) : timestamp, checksum, sha1, etc
– Kernel(zImage)
– Ram Disk
– Second stage

[Android] ext4 file system을 위한 빌드 설정 파일

오픈 소스의 Android Build 시스템을 확인해보면 Makefile 에 다음과 같이 system.img 나 userdata.img 등을 만들기 위한 옵션에 따른 처리가 있다.

build/core/Makefile

# #################################################################
# Targets for user images
# #################################################################
INTERNAL_USERIMAGES_EXT_VARIANT :=
ifeq ($(TARGET_USERIMAGES_USE_EXT2),true)
INTERNAL_USERIMAGES_USE_EXT := true
INTERNAL_USERIMAGES_EXT_VARIANT := ext2
else
ifeq ($(TARGET_USERIMAGES_USE_EXT3),true)
INTERNAL_USERIMAGES_USE_EXT := true
INTERNAL_USERIMAGES_EXT_VARIANT := ext3
else
ifeq ($(TARGET_USERIMAGES_USE_EXT4),true)
INTERNAL_USERIMAGES_USE_EXT := true
INTERNAL_USERIMAGES_EXT_VARIANT := ext4
endif
endif
endif

ifneq (true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED))

  INTERNAL_USERIMAGES_SPARSE_EXT_FLAG := -s
endif

# $(1): src directory
# $(2): output file
# $(3): mount point
# $(4): ext variant (ext2, ext3, ext4)
# $(5): size of the partition
define build-userimage-ext-target
  @mkdir -p $(dir $(2))
  $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
          $(MKEXTUSERIMG) $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG) $(1) $(2) $(4) $(3) $(5)
endef
 
ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true)
## generate an ext image
# $(1): output file
define build-systemimage-target
    @echo “Target system fs image: $(1)”
    $(call build-userimage-ext-target,$(TARGET_OUT),$(1),system,$(INTERNAL_USERIMAGES_EXT_VARIANT),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))

endef

$(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE)

        $(call build-systemimage-target,$@)
 

그래서 다음과 같이 ext4 사용, 파티션 사이즈, 그리고 sparse 이미지 여부를 설정해주면 그에 맞는 sytstem.img, userdata.img를 얻을 수 있다.
 

BoardConfig.mk

TARGET_USERIMAGES_USE_EXT4 := true
TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true

BOARD_SYSTEMIMAGE_PARTITION_SIZE := 290979840
BOARD_USERDATAIMAGE_PARTITION_SIZE := 134217728
BOARD_FLASH_BLOCK_SIZE := 4096


ext4 sparse 이미지에 대해서는 system/extras/ext4_utils 의 make_ext4fs 툴의 소스 및 헤더파일을 살펴보면 알 수 있다.
 

[git] 어떤 commit 이 어느 브랜치에 있는지 확인하고 싶을 때

tag로 checkout을 한다던가 하게되면 이게 지금 어느 브랜치에서 나온건지를 알 수 없을 때가 있다. 또는 어느 commit 이 어느 브랜치 상에 있는지를 알고 싶을 때 라던가.. 이럴 때 사용할 수 있는 것이
git-what-branch 스크립트다.

https://github.com/SethRobertson/git-what-branch  

$ git-what-branch –allref <commit sha1 id>

 

[Linux] Shell script 에서 문자열 다루기

참고에 매우 자세히 잘 정리되어 있다. 감사.

문자열 길이 구하기
${#string}

문자열 추출
${string:position}
${string:position:length}

문자열 조각 삭제
${string#substring}
 string의 앞에서부터 가장 짧게 일치하는 substring 제거
${string##substring}
 string의 앞에서부터 가장 길게 일치하는 substring 제거

${string%substring}
 string의 뒤에서부터 가장 짧게 일치하는 substring 제거
${string%%substring}
 string의 뒤에서부터 가장 길게 일치하는 substring 제거

참고 : 
http://wonylog.tistory.com/192

[Linux] shell 에서 메일 보내기

이용 가능한 SMTP가 있는 경우 shell 에서도 메일을 보낼 수 있다. 쉘 스크립트 상에서 메일을 보내거나 할 때 유용하다. 가장 편한 방법이 sendemail 을 이용하는 것 같다.
다음과 같이 하면 된다. 아래 예제는 무인증 SMTP를 이용할 경우의 예제이다.

$ sendEmail -f “보내는이@메일” -s <SMTP 서버 주소> -t “받는이@메일” -u “메일 제목” -m “메일 내용”

Perl script 를 이용해서도 간편히 보낼 수 있는데, 예제는 다음과 같다.

#!/usr/bin/perl -w
use Net::SMTP;
$smtp = Net::SMTP->new(‘<SMTP 서버 주소>’);
$smtp->mail(‘보내는이@메일’);
$smtp->to(‘받는이@메일’);
$smtp->data();
$smtp->datasend(“To: dasomoli\n”);
$smtp->datasend(“Subject: A simple test mail subject\n”);
$smtp->datasend(“\n”);
$smtp->datasend(“A simple test message\n”);
$smtp->datasend(“A simple test message 2\n”);
$smtp->dataend();
$smtp->quit;

한글 메일을 보내고 싶으면 perl 스크립트로 아래와 같이 MIME::Lite 를 사용하면 된다.

$ sudo apt-get install libmime-lite-perl

#!/usr/bin/perl -w
use MIME::Lite;
### Create a new multipart message:
$msg = MIME::Lite->new(
                From    => ‘보내는이@메일’,
                To      => ‘받는이@메일’,
                Subject => ‘Hangul test’,
                Data    => ‘한글’,
                );
$msg->attr(‘content-type.charset’ => ‘UTF-8’);
### Add parts (each “attach” has same arguments as “new”):
### use Net:SMTP to do the sending
$msg->send(‘smtp’, ‘<SMTP 서버 주소>’, Debug=>1 );

참고 : 
http://nixcraft.com/shell-scripting/11895-shell-script-send-email-via-smtp-username-password.html
http://caspian.dotconf.net/menu/Software/SendEmail/
http://perldoc.perl.org/Net/SMTP.html
http://search.cpan.org/~rjbs/MIME-Lite-3.028/lib/MIME/Lite.pm

[Linux] ioctl을 대체하는 unlocked_ioctl

기존 device driver를 제어하기 위한 방법 중 하나였던 ioctl이 2.6.36 커널부터 unlocked_ioctl 로 대체되었다.
ioctl과 unlocked_ioctl의 차이점은 ioctl이 BKL(Big Kernel Lock)로 보호되었다면, unlocked_ioctl은 BKL이 없다. 따라서 Preemptible 하게 되었으므로, ioctl의 동시성에 대해서 driver 스스로 보호하여야 한다.
driver의 제어를 위해서 ioctl보다는 sysfs를 이용하는 방향으로 가고 있는 듯 하다(http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-May/001852.html).

compat_ioctl은 64비트 시스템에서 32비트 프로세스가 ioctl을 부를 때를 위해서 만들어졌다.

참고 : http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-May/001851.html

한미 FTA 비준동의안 찬성 명단

대한민국과 미합중국 간의 자유무역협정 및 대한민국과 미합중국 간의 자유무역협정에 관한 서한교환 비준동의안 처리 의원 명단 – 투표에 참고하도록 한다.

[한나라당]

찬성(140명)

강길부(울산 울주군)
강명순(비례대표)
강석호(경북 영양군·영덕군·봉화군·울진군)
강성천(비례대표)
강승규(서울 마포구 갑)
고승덕(서울 서초구 을)
고흥길(경기 성남시 분당구 갑)
구상찬(서울 강서구 갑)
권경석(경남 창원시 갑)
권영세(서울 영등포구 을)
권성동 (강원도 강릉시)
권택기(서울 광진구 갑)
김기현(울산 남구 을)
김동성(서울 성동구 을)
김무성(부산 남구 을)
김선동(서울 도봉구 을)
김성동 (비례대표)
김성수(경기 양주시·동두천시)
김성조(경북 구미시 갑)
김성회(경기 화성시 갑)
김세연 (부산광역시 금정구)
김소남(비례대표)
김영선(경기 고양시 일산서구)
김영우(경기 포천시·연천군)
김옥이(비례대표)
김장수(비례대표)
김정권 (경상남도 김해시갑)
김정훈(부산 남구 갑)
김태원(경기 고양시 덕양구 을)
김태호(경남 김해시 을)
김태환(경북 구미시 을)
김학송(경남 진해시)
김학용(경기 안성시)
김형오(부산 영도구)
김호연(충남 천안시 을)

나성린(비례대표)
남경필(경기 수원시 팔달구)
박근혜(대구 달성군)
박대해(부산 연제구)
박민식(부산 북구·강서구 갑)
박보환(경기 화성시 을)
박상은(인천 중구·동구·옹진군)
박순자(경기 안산시 단원구 을)
박준선 (경기도 용인시 기흥구)
박영아(서울특별시 송파구 갑)
박종근(대구광역시 달서구 갑)
박진(서울 종로구)
백성운(경기 고양시 일산동구)
배영식(대구 중구·남구)
배은희(비례대표)
서병수(부산 해운대구·기장군 갑)
서상기(대구 북구 을)
손범규(경기 고양시 덕양구 갑)
손숙미(비례대표)
송광호(충북 제천시·단양군)
신영수(경기 성남시 수정구)
신상진(경기 성남시 중원구)
신지호(서울 도봉구 갑)
심재철(경기 안양시 동안구 을)

안경률 (부산광역시 해운대구 기장군 을)
안상수(경기 의왕시·과천시)
안홍준(경남 마산시 을)
안효대(울산 동구)
원유철(경기 평택시 갑)
원희목(비례대표)
유기준(부산 서구)
유승민(대구 동구 을)
유일호(서울특별시 송파구 을)
유재중 (부산광역시 수영구)
유정복(경기 김포시)
유정현(서울 중랑구 갑)
윤상현(인천 남구 을)
윤석용(서울 강동구 을)
윤영(경남 거제시)
윤진식(충북 충주시)
이두아(비례대표)
이명규(대구 북구 갑)
이범관(경기 이천시·여주군)
이범래(서울 구로구 갑)
이병석(경북 포항시 북구)
이사철(경기 부천시 원미구 을)
이상권(인천 계양구 을)
이상득(경북 포항시 남구·울릉군)
이성헌(서울 서대문구 갑)
이윤성(인천 남동구 갑)
이애주(비례대표)
이영애(비례대표)
이은재(비례대표)
이인기(경북 고령군·성주군·칠곡군)
이정선(비례대표)
이정현(비례대표)
이종구(서울 강남구 갑)
이종혁(부산 부산진구 을)
이주영(경남 마산시 갑)
이진복(부산 동래구)
이철우(경북 김천시)
이춘식(비례대표)
이학재(인천 서구·강화군 갑)
이한구(대구 수성구 갑)
이한성(경북 문경시·예천군)
이해봉(대구 달서구 을)
이혜훈(서울 서초구 갑)
이화수(경기 안산시 상록구 갑)
임동규(비례대표)

장윤석(경북 영주시)
장제원(부산 사상구)
전여옥(서울 영등포구 갑)
전재희(경기 광명시 을)
정갑윤(울산 중구)
정두언(서울 서대문구 을)
정몽준(서울 동작구 을)
정미경(경기 수원시 권선구)
정수성 (경상북도 경주시)
정양석(서울 강북구 갑)
정옥임(비례대표)
정진섭(경기 광주시)
조문환(비례대표)
조원진(대구 달서구 병)
조윤선(비례대표)
조전혁(인천 남동구 을)
조진래(경남 의령군·함안군·합천군)
조해진(경남 밀양시·창녕군)
주광덕(경기 구리시)
주성영(대구 동구 갑)
주호영(대구 수성구 을)
진성호(서울 중랑구 을)
진수희(서울 성동구 갑)
차명진(경기 부천시 소사구)
최경환(경북 경산시·청도군)
최경희(비례대표)
최구식(경남 진주 갑)
최병국(울산 남구 갑)
한기호(강원 철원군·화천군·양구군·인제군)
한선교(경기 용인시 수지구)
허원제(부산 부산진구 갑)
허천(강원 춘천시)
홍일표(인천 남구 갑)
홍준표(서울 동대문구 을)
황우여(인천 연수구)
황진하(경기 파주시)

반대(1명)

황영철(강원도 홍천군 횡성군)

기권(11명)

김광림(경북 안동시)
김성식(서울 관악구 갑)
김성태(서울 강서구 을)
김재경(경상남도 진주시 을)
성윤환(경북 상주시)
신성범(경남 산청군·함양군·거창군)
여상규(경상남도 남해군 하동군)
임해규(경기 부천시 원미구 갑)
정태근(서울 성북구 갑)
정해걸(경상북도 군위군 의성군 청송군)
현기환(부산광역시 사하구 갑)

불참(16명)

권영진(서울 노원구 을)
김용태(서울 양천구 을)
김충환(서울 강동구 갑)
안형환(서울 금천구)
원희룡(서울 양천구 갑)
이군현(경남 통영시, 고성군)
이경재(인천 서구, 강화군 을)
이재오(서울 은평구 을)
장광근(서울 동대문 갑)
정병국(경기 양평군, 가평군)
정의화(부산 중구, 동구)
정희수(경북 영천)
조진형(인천 부평구 갑)
진영(서울 용산구)
홍사덕
홍정욱(서울 노원구 병)

[자유선진당]

찬성(5명)

김용구(비례대표)
이영애(비례대표)
이인제(충청남도 논산시 계룡시 금산군)
이회창(충청남도 홍성군 예산군)
조순형(비례대표)

반대(6명)

권선택(대전광역시 중구)
김낙성(충청남도 당진군)
심대평(충청남도 공주시 연기군)
류근찬(충청남도 보령시 서천군)
이진삼(충청남도 부여군 청양군)
임영호(대전광역시 동구)

불참(7명)

김창수
박선영
변웅전
이명수
이상민
이용희
이재선

[기타]

찬성(6명)

김정 미래희망연대 (비례대표)
김혜성 미래희망연대 (비례대표)
노철래 미래희망연대 (비례대표)
송영선 미래희망연대 (비례대표)
윤상일 미래희망연대 (비례대표)
최연희 무소속 (강원도 동해시 삼척시)

기권(1명)

이용경 창조한국당 (비례대표)

불참

김을동 미래희망연대(비례대표)
정영희 미래희망연대(비례대표)
정하균 미래희망연대(비례대표)

[민주당·민주노동당]

전원 불참

gerrit 프로젝트 Mirroring 하기

gerrit을 사용하면 자기가 access 권한이 있는 프로젝트의 리스트를 ssh를 이용하여 ls-projects 라는 명령을 이용해서 얻어올 수 있다. http://gerrit-documentation.googlecode.com/svn/Documentation/2.2.0/cmd-ls-projects.html 를 참고하면 되는데, 해당 도움말을 보면 이 명령을 이용해서 접근 가능한 모든 Project 를 clone 할 수 있는 쉘 스크립트가 있다.

for p in `ssh -p 29418 review.example.com gerrit ls-projects`
do
  mkdir -p `dirname "$p"`
  git clone --bare "ssh://review.example.com:29418/$p.git" "$p.git" 

done 

이것과 crontab, shell script를 조금 응용하면 계속적으로 업데이트 함으로써 Mirroring 을 할 수 있다.

#!/bin/sh
PLATFORM_HOME=`readlink -e .`
PROJECT_LIST=`ssh -p 29418 review.example.com gerrit ls-projects`
ROOT=”ssh://review.example.com”
DIRNAME=”/usr/bin/dirname”
BASENAME=”/usr/bin/basename”
for PROJECT in $PROJECT_LIST
do
        cd $PLATFORM_HOME;
        echo “——————————————————–“
        echo ” $PROJECT.git”
        if [ -d $PROJECT.git ]; then
                echo “Entering $PROJECT.git”;
                cd $PROJECT.git;
                git remote update
        else
                echo “Cloning $ROOT/$PROJECT.git”;
                PROJECT_DIR=`$DIRNAME $PROJECT`
                mkdir -p $PROJECT_DIR
                git clone –mirror “$ROOT/$PROJECT.git” “$PROJECT.git”
        fi
done

 미러링 사용시에는 받아오기 전에 다음 명령과 같이 설정하여 사용하면 된다.

 git config –global url.”git://<IP>”.insteadOf “git://codeaurora.org”

Linux kernel, ramdisk 사용 및 Android 빌드 시스템에서의 설정

Linux 커널의 경우 램디스크를 여러 종류를 사용하는데 이 중 initramfs/initrd 를 사용하는 경우
CONFIG_BLK_DEV_INITRD 를 설정하고, CONFIG_INITRAMFS_SOURCE 에 root 파일템이 만들어져 있는 디렉토리 경로를 써준다.
Android 빌드 시스템에서는 커널 및 램디스크를 합쳐서 boot.img 를 만들어 사용하는데,
이 때, 사용될 Kernel Command line 을 지정할 수 있다. 이 때 TARGET_NO_KERNEL은 false 여야 한다.
이는 build/core/Makefile 에서 확인할 수 있다. 

BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE))
ifdef BOARD_KERNEL_CMDLINE
  INTERNAL_BOOTIMAGE_ARGS += –cmdline “$(BOARD_KERNEL_CMDLINE)”
endif

이 외에도 Kernel Base address, Page Size 등도 지정할 수 있다.

BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))
ifdef BOARD_KERNEL_BASE
  INTERNAL_BOOTIMAGE_ARGS += –base $(BOARD_KERNEL_BASE)
endif
BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
ifdef BOARD_KERNEL_PAGESIZE
  INTERNAL_BOOTIMAGE_ARGS += –pagesize $(BOARD_KERNEL_PAGESIZE)
endif

TARGET_BOOTIMAGE_USE_EXT2 를 true로 하면 ext2 파일시스템의 boot image를 만드는 것 같다.

ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true)
tmp_dir_for_image := $(call intermediates-dir-for,EXECUTABLES,boot_img)/bootimg
INTERNAL_BOOTIMAGE_ARGS += –tmpdir $(tmp_dir_for_image)
INTERNAL_BOOTIMAGE_ARGS += –genext2fs $(MKEXT2IMG)
$(INSTALLED_BOOTIMAGE_TARGET): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES)
    $(call pretty,”Target boot image: $@”)
    $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) –output $@
else # TARGET_BOOTIMAGE_USE_EXT2 != true
$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
    $(call pretty,”Target boot image: $@”)
    $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) –output $@
    $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw)
endif # TARGET_BOOTIMAGE_USE_EXT2

예제)

TARGET_NO_KERNEL := false
BOARD_KERNEL_BASE := 0x30000000
BOARD_KERNEL_PAGESIZE := 4096
BOARD_KERNEL_CMDLINE := console=ttyFIQ0 no_console_suspend

lxr 설치하기

http://lifeseed.tistory.com/tag/glimpse 에 있는대로만 하면 된다. 글쓴이에게 감사를..

정리하자면,
1. glimpse 설치
1.1. wget http://webglimpse.net/trial/glimpse-latest.tar.gz
1.2. tar xvfz glimpse-latest.tar.gz
1.3. ./configure && make && sudo make install

2. lxr 설치
2.1. sudo apt-get install lxr
 기본 설치는 /usr/share/lxr 에 된다.
2.2. sudo vi /etc/apache2/sites-available/default 후 다음 내용 추가

    Alias /lxr “/usr/share/lxr”
    <Directory “/usr/share/lxr”>
        Options All
        AllowOverride All
    </Directory>

2.3. sudo cp /usr/share/lxr/blurb.html /usr/share/lxr/index.html

3. lxr 환경 설정
3.1. sudo vi /usr/share/lxr/lxr.conf
3.1.1. 나의 경우 대부분 archtechture로 arm 을 쓰므로 다음처럼 고친다.

# Define typed variable “a”.  First value is default.
variable: a, Architecture, (arm, i386, alpha, m68k, mips, ppc, sparc, sparc64)

3.1.2. base url 도 localhost 대신 ip 를 사용하자.

# Define the base url for the LXR files.

baseurl: http://<IP ADDRESS>/lxr/http/

3.1.3. version 명으로 된 디렉토리 아래 바로 소스를 둘 것이므로 다음처럼 고친다.

# The source is here.
sourceroot: /usr/share/lxr/source/$v/
srcrootname: Linux

3.1.4. glimpse 를 위처럼 설치했다면 경로가 다르므로 이것도 고치자.

# Glimpse can be found here.
glimpsebin: /usr/local/bin/glimpse
 

4. 소스 코드 복사 및 DB 구축
4.1. sudo mkdir /usr/share/lxr/source/<VERSION>
4.2. sudo cp 소스 /usr/share/lxr/source/<VERSION>
4.3. cd  /usr/share/lxr/source
4.4. sudo echo ‘<VERSION>’ >> ./versions
4.5. sudo echo ‘<VERSION>’ >> ./defversion
4.6. cd <VERSION>
4.7. sudo genxref ./
4.8. sudo glimpseindex -H ./ fileidx xref
4.9. sudo chmod 644 .glimpse_*
4.10. sudo chmod 644 fileidx
4.11 sudo chmod 644 xref

5. http://<IP ADDRESS>/lxr/http 접속.