한류?
2012년 10월 29일 월요일
SEAndroid 공부 자료.
From Tresys.com
SELinux assigns subject and objects a
security context:
Access Control Attributes
root:sysadm_r:sysadm_t[:s0:c0.c128]
type identifier
role identifier
user identifier
Security context is only access control attribute in SELinux
Security Identifier (SID): number represents security context
active within the kernel Standard Linux vs SELinux
Subject (Process) Access Control Attributes
Linux: real and effective user and group IDs
SELinux: security context (user:role:type)
Linux UIDs and SELinux UID are independent
Objects Access Control Attributes
Linux: (files) access modes (rwx r-x r-x) and user and
group IDs
SELinux: security context (user:role:type) More on Security Contexts
Linux and SELinux access controls are orthogonal
each mechanism uses its own access control attributes
two separate access checks; both must pass
A process type is also called a “domain”
though object and subject contexts are identical
Role and user are little used on objects
objects’ role usually “object_r”
Type is most used part of a context (by far) in policies
emphasis on type enforcement in a policy What is a Type?
A type is an unambiguous identifier
created by the policy writer
applied to all subjects and objects and for access decisions
Types group subjects and objects
signifies security equivalence
everything with the same type has the same access
policies have as few or as many types as needed
Type “meaning” created through use
e.g. shadow_t only has meaning because of a policy rules
similar to a programmer giving meaning to variables Type Enforcement Access Control
Access specified between
subject type (e.g., process or domain)
and object type (e.g., file, dir, socket, etc.)
Four elements in defining allowed access
source type(s) aka domain(s)
target type(s) objects to which access allowed
object class(es) classes to which access applies
permission(s) type of access allowed
SELinux prevents access unless explicitly allowed ELinux defines 41 kernel object classes
Each with their own fine-grained permissions
For example, file object class has 20 permissions:
ioctl read write
create getattr setattr
lock relabelfrom relabelto
append unlink link
rename execute swapon
quotaon mounton execute_no_trans
entrypoint execmod
Documentation available at www.tresys.com/selinux
Object Classes and Permissions
key_socket
ipc netlink_nflog_socket rawip_socket unix_stream_socket
filesystem netlink_kobject_uevent_socket process unix_dgram_socket
file netlink_ip6fw_socket passwd udp_socket
fifo_file netlink_firewall_socket packet_socket tcp_socket
fd netlink_dnrt_socket node system
dir netlink_audit_socket netlink_xfrm_socket socket
chr_file netif netlink_tcpdiag_socket sock_file
capability msgq netlink_socket shm
blk_file msg netlink_selinux_socket sem
association lnk_file netlink_route_socket security allow passwd_t shadow_t : file
{ create ioctl read getattr lock write setattr append link unlink rename };
Allows processes with passwd_t domain type read, write, and create access to
files with shadow_t type
Purpose: passwd program runs with passwd_t type, allowing it to change shadow
password file (/etc/shadow)
Shadow password file attributes:
-r-------- root root system_u:object_r:shadow_t /etc/shadow
SELinux assigns subject and objects a
security context:
Access Control Attributes
root:sysadm_r:sysadm_t[:s0:c0.c128]
type identifier
role identifier
user identifier
Security context is only access control attribute in SELinux
Security Identifier (SID): number represents security context
active within the kernel Standard Linux vs SELinux
Subject (Process) Access Control Attributes
Linux: real and effective user and group IDs
SELinux: security context (user:role:type)
Linux UIDs and SELinux UID are independent
Objects Access Control Attributes
Linux: (files) access modes (rwx r-x r-x) and user and
group IDs
SELinux: security context (user:role:type) More on Security Contexts
Linux and SELinux access controls are orthogonal
each mechanism uses its own access control attributes
two separate access checks; both must pass
A process type is also called a “domain”
though object and subject contexts are identical
Role and user are little used on objects
objects’ role usually “object_r”
Type is most used part of a context (by far) in policies
emphasis on type enforcement in a policy What is a Type?
A type is an unambiguous identifier
created by the policy writer
applied to all subjects and objects and for access decisions
Types group subjects and objects
signifies security equivalence
everything with the same type has the same access
policies have as few or as many types as needed
Type “meaning” created through use
e.g. shadow_t only has meaning because of a policy rules
similar to a programmer giving meaning to variables Type Enforcement Access Control
Access specified between
subject type (e.g., process or domain)
and object type (e.g., file, dir, socket, etc.)
Four elements in defining allowed access
source type(s) aka domain(s)
target type(s) objects to which access allowed
object class(es) classes to which access applies
permission(s) type of access allowed
SELinux prevents access unless explicitly allowed ELinux defines 41 kernel object classes
Each with their own fine-grained permissions
For example, file object class has 20 permissions:
ioctl read write
create getattr setattr
lock relabelfrom relabelto
append unlink link
rename execute swapon
quotaon mounton execute_no_trans
entrypoint execmod
Documentation available at www.tresys.com/selinux
Object Classes and Permissions
key_socket
ipc netlink_nflog_socket rawip_socket unix_stream_socket
filesystem netlink_kobject_uevent_socket process unix_dgram_socket
file netlink_ip6fw_socket passwd udp_socket
fifo_file netlink_firewall_socket packet_socket tcp_socket
fd netlink_dnrt_socket node system
dir netlink_audit_socket netlink_xfrm_socket socket
chr_file netif netlink_tcpdiag_socket sock_file
capability msgq netlink_socket shm
blk_file msg netlink_selinux_socket sem
association lnk_file netlink_route_socket security allow passwd_t shadow_t : file
{ create ioctl read getattr lock write setattr append link unlink rename };
Allows processes with passwd_t domain type read, write, and create access to
files with shadow_t type
Purpose: passwd program runs with passwd_t type, allowing it to change shadow
password file (/etc/shadow)
Shadow password file attributes:
-r-------- root root system_u:object_r:shadow_t /etc/shadow
git 패치만들어서 패치하는 방법.
말이 참 웃기다.
git man page 처럼
git man page 처럼
GIT(1) Git Manual GIT(1)
NAME
git - the stupid content tracker
SYNOPSIS
git [--version]
[--exec-path[=GIT_EXEC_PATH]] [--html-path]
[-p|--paginate|--no-pager]
[--no-replace-objects]
[--bare] [--git-dir=GIT_DIR]
[--work-tree=GIT_WORK_TREE]
[--help] COMMAND [ARGS]
git branch
-a --color
리모트랑 우리 브랜치가 컬러풀하게 나온다.
git checkout 브랜치 이름
위에서 나온거 적어 준다. Diff랑 비교한다면 비교할 대상인 두번째 파라미터 되겠다.(원본아님)
git format-patch 원본브랜치
원본 브랜치를 적어 준다.
나온 .patch 파일을
Patch
명령어로 패치를 해 주면 된다.
2012년 10월 28일 일요일
Gmail SMTP서버를 이용한 메일 보내기
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <winsock.h> #pragma comment(lib, "ws2_32.lib") #define cmailserver "gmail-smtp-in.l.google.com" #define cemailto "gonanhack@gmail.com" #define cemailfrom "gonanhack@gmail.com" #define SMTPLog "log.txt" #define cemailsubject "test" #define waittime 30 #define emailmessage "asdfasdfasdfasdfasdfasd" int MailIt(char *mailserver, char *emailto, char *emailfrom, char *emailsubject, char *emailmessage, int maxlen); int main(int argc, char* argv[]) { MailIt(cmailserver, cemailto, cemailfrom, cemailsubject, "asdfsadf", 255); return 0; } int MailIt(char *mailserver, char *emailto, char *emailfrom, char *emailsubject, char *emailmessage, int maxlen) { SOCKET sockfd; WSADATA wsaData; FILE *smtpfile; #define bufsize 300 int bytes_sent; /* Sock FD */ int err; struct hostent *host; /* info from gethostbyname */ struct sockaddr_in dest_addr; /* Host Address */ char line[256+100]; char *Rec_Buf = (char*) malloc(bufsize+1); smtpfile=fopen(SMTPLog,"a+"); if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) { fputs("WSAStartup failed",smtpfile); WSACleanup(); return -1; } if ( (host=gethostbyname(mailserver)) == NULL) { perror("gethostbyname"); exit(1); } memset(&dest_addr,0,sizeof(dest_addr)); memcpy(&(dest_addr.sin_addr),host->h_addr,host->h_length); dest_addr.sin_family= host->h_addrtype; dest_addr.sin_port= htons(25); if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0) { perror("socket"); exit(1); } fputs("Connecting....\n",smtpfile); if (connect(sockfd, (struct sockaddr *)&dest_addr,sizeof(dest_addr)) == -1) { perror("connect"); exit(1); } Sleep(waittime); err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0'; fputs(Rec_Buf,smtpfile); strcpy(line,"helo www.gmail.com\n"); fputs(line,smtpfile); bytes_sent=send(sockfd,line,strlen(line),0); Sleep(waittime); err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0'; fputs(Rec_Buf,smtpfile); strcpy(line,"MAIL FROM:<"); strncat(line,emailfrom,strlen(emailfrom)); strncat(line,">\n",3); fputs(line,smtpfile); bytes_sent=send(sockfd,line,strlen(line),0); Sleep(waittime); err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0'; fputs(Rec_Buf,smtpfile); strcpy(line,"RCPT TO:<"); strncat(line,emailto,strlen(emailto)); strncat(line,">\n",3); fputs(line,smtpfile); bytes_sent=send(sockfd,line,strlen(line),0); Sleep(waittime); err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0'; fputs(Rec_Buf,smtpfile); strcpy(line,"DATA\n"); fputs(line,smtpfile); bytes_sent=send(sockfd,line,strlen(line),0); Sleep(waittime); err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0'; fputs(Rec_Buf,smtpfile); Sleep(waittime); strcpy(line,"To:"); strcat(line,emailto); strcat(line,"\n"); strcat(line,"From:"); strcat(line,emailfrom); strcat(line,"\n"); strcat(line,"Subject:"); strcat(line,emailsubject); strcat(line,"\n"); strcat(line,emailmessage); strcat(line,"\r\n.\r\n"); fputs(line,smtpfile); bytes_sent=send(sockfd,line,strlen(line),0); Sleep(waittime); err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0'; fputs(Rec_Buf,smtpfile); strcpy(line,"quit\n"); fputs(line,smtpfile); bytes_sent=send(sockfd,line,strlen(line),0); Sleep(waittime); err=recv(sockfd,Rec_Buf,bufsize,0);Rec_Buf[err] = '\0'; fputs(Rec_Buf,smtpfile); fclose(smtpfile); #ifdef WIN32 closesocket(sockfd); WSACleanup(); #else close(sockfd); #endif }
우분투 12.04에 안드로이드 빌드
밑에서 소스 받는거 했으니..
받아보자.
http://source.android.com/source/initializing.html
에 있다.
받아보자.
http://source.android.com/source/initializing.html
에 있다.
근데 아래처럼 자바 7깔면 버전 체크 에러 난다.
뭐야 .. ㅡㅡ;
build/core/main.mk
보면 수정 포인트가 두 군데 있는데 아래처럼
java=version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]`\.7[\."SS\')
6을 7로 바꾸어 주면 된다.
빌드 명령은 인터넷에 있는데
아래께 안되면 알아서 찾아서...
make -j4 -mp
난 잘된다.
빌드 로그 들이 스크롤이 잘 되고 잘 끝난다.
그런데 뭐가 만들어진 거지?
touch 로 파일 하나 생성해 뒀는데
find ./ -newer 파일명
하면 생성한 파일 이후에 생성된 파일이 나온다.
out밑에 이것저것 만들어 졌는데... 댄장...
어케 하는 거야... 구글링 좀 해서 정리해봐야 겠다.
그런데 뭐가 만들어진 거지?
touch 로 파일 하나 생성해 뒀는데
find ./ -newer 파일명
하면 생성한 파일 이후에 생성된 파일이 나온다.
out밑에 이것저것 만들어 졌는데... 댄장...
어케 하는 거야... 구글링 좀 해서 정리해봐야 겠다.
256GB USB 팝니다.
요거
팔아요. 일주일도 안썼지만 가격은 15만원.
댓글 달아주삼.
요거
포스팅 하려고 캡쳐하고
어제 아침인가 윈8로 업글 했다.
유료 유틸 좀 깔고 윈7 Look & feel로 변경.
사실 할말이 더 많지만 페북 내용으로 간단한 정보 제공
참... 윈8은 USB에 넣고 했는데 4기가 넣어도 태도 안난다.
리눅스를 못 떠나는 이유
요렇게...
아 어제 리눅스 빠돌이 집에 초대해서 한잔 했는데(안드로이드 마스터 브랜치에 머지하는 친구)... 나도 한때는 그랬지만(지난 10년간) 리눅스 패키지 관리는 예나 지금이나 쓰레기다. 시냅틱이던... apt-get이던 ㅡㅡ;
yum 이던
./configure
make
make install
로 하다가 안되면 의존성 체크하고 소스도 직접 고쳐도 보고... 재미는 있지만 청춘이 멍든다. 우분투가 리눅스계를 거의 통일하다 싶이 하긴 했지만 정말 돈받는 프로그램들은 그럴만한 이유가 있다.
그러나 한편으로는 우분투가 맞다는 생각도 든다. 물타기가 아니고. 리눅스 10년 했다고 생각해보면 버릴 수 있겠는가?
다만 내가 윈도우 진영으로 돌아설 수 밖에 없었던 이유는 한국 관리자들이 오픈 소스 쪽은 조금 안다 싶으면 정말 자기도 할 수 있을거라 생각하고 엔지니어들을 박대 한다는 것이다. 공짜니까... 편하게 찾아보면 쉽게 풀이해서 정리한거 금방 나오니까.
그래서 공부하기 어렵고 비싸고... 뭐 그런 걸 선택하게 된 것이지.
말은 이런데...
결국 job roll이 바뀌고 일하려 하니 하루의 대부분은 리눅스랑 씨름하고 있다.
아아...
자바 7 깔기
http://netwrkspider.blogspot.kr/2012/05/how-to-install-sun-java6-jdk-on-ubuntu.html
Code:
sudo apt-get purge openjdk*
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer
우분투 12.04에 안드로이드 풀소스 가져오기
www.ubuntu.com
에 간다.
64 비트용 12.04 우분투를 받는다.
VMWARE에 깐다.(내껀 7.1x 버전)
다 깔고 나서...
얘를 참조해서 진행한다.
git랑 curl이 없으니
apt-get install로 깔아 준다.
repo init 실행하면 브랜치 정보를 받아오면서 initializing 된다.
이름하고 이메일 물어 본다.
구글 페이지에 4.0.1뭐시기가 예제로 되어 있고 내가 받고 싶은건 4.1대지만.
일단 하나부터 성공하자는 마음에 구글에서 시킨대로 설정하고
repo sync를 하면 소스를 받아온다.
간단하게...
curl이란 유틸과
그걸 이용해서 구글에서 만든 repo 스크립트만 있으면
git를 이용해서 소스를 땡겨온다.
끗.
2012년 10월 27일 토요일
2012년 10월 26일 금요일
길을 잃고...
다른 서버에서 해도 똑같네...
per day per IP가
IP 뿐만 아니라 하루 한도 제한이 있는 것 같다.
미러 서버를 찾고는 있는데 없넹...
카이스트는 뭐하는겨 ㅡㅡ;
,
,
,
심심한 차에 한국 마이크로 소프트 둘러 보다가...
소매용 정품에도 이번 프로모션이 적용되나요?
2012년 10월 26일부터 2013년 1월 31일까지 프로모션 ₩75,000달러(예상 소매 가격)로 지역 판매점에서
정품(DVD)을 구입하여 Windows 8 Pro(윈도우 8 프로)로 업그레이드할
수 있습니다.
비싸네~
방황 끝... 정말이지 멋진 자료 찾다.
성지
http://dalinaum-kr.tumblr.com/post/5904189950/android-make-lunch-or-lunch-make-or-whaever
http://www.iamroot.org/xe/27212
안드로이드 빌드하기
안드로이드 소스를 가져와서 빌드하는 일은 아는 사람에겐 매우 쉽고 모르는 사람에겐 어려운 일입니다. 구글이 repo라는 특이한 도구를 사용하고 있기 때문에 그렇습니다. repo는 구글이 만들었는데, 리누스 토발즈가 만든 DVCS Git을 응용하는 도구입니다. repo가 하는 일을 정리하면 다음과 같습니다.
복수개의 저장소(repository)에서 원하는 버전을 가져와서 지정된 디렉토리에 저장합니다.
예를 들어 platform/bionic.git은 ./bionic/에 저장됩니다.
어떤 저장소가 어떤 디렉토리에 저장될지는 platform/manifest.git에 있는 default.xml 파일 안에 약속이 되어 있습니다.
이 절차를 통해 우리는 빌드에 필요한 모든 파일트리를 얻게 됩니다.
우리가 브랜치를 만들어서 작업할 때 저장소 각각에 브랜치를 만들어서 관리를 해줍니다.
gingerbread 브랜치를 가져와서 saenggangbbang이라는 우리만의 버전을 만들 수 있습니다.
만약 160개가 넘는 저장소에 각각 브랜치를 만들어야 한다고 어떻게 하시겠습니까?
수정한 코드 묶음(패치)을 Android Review 사이트에 올려줍니다.
여러 저장소에서 딱 우리가 수정한 내용만을 묶어 구글에 전송하는 것입니다.
구글의 코드 리뷰와 질의를 통과하면 구글 안드로이드에 우리 코드를 추가할 수 있게 됩니다.
repo가 여러가지 용도로 사용될 수 있지만 이번에는 1번: 복수개의 저장소에서 원하는 버전을
가져오기에만 관심을 가지겠습니다. 우리는 안드로이드를 빌드만 해볼겁니다.
무엇보다 먼저 우리 지금 우분투 리눅스를 쓰고 있는 것이 맞죠? 그렇지 않다면 조금
어렵거나 짜증납니다. 적어도 가상머신에라도 우분투를 설치하시는 것을 추천합니다. 그 다음으로 repo를 구해야겠습니다.
cd /usr/local/bin
wget https://android.git.kernel.org/repo
chmod 755 repo
만약 실패했고 그걸 해결하지 못하셨다면, 안타깝지만 당신에게 지금 이 문서가 적합하지 않은 것 같습니다.
1 다른 공부를 하시는 것을 추천드립니다.
repo에서 사용할 명령어를 알려드리겠습니다.
repo init - repo를 초기화시키는 명령입니다.
repo sync - 최신 코드를 받아오는 명령입니다.
우리는 우선 repo init를 수행하여 초기화한 뒤 앞으로는 repo sync만을 사용할 것입니다. 2
초기화 하는 명령어를 2가지 알려드리겠습니다.
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.4_r1
repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread
1번은 안드로이드 2.3.4_r1 버전을 받겠다는 것이고 2번은 gingerbread의 최신 버전을 받겠다는
것입니다. 2011년 5월 28일 현재 최신 버전은 2.3.4_r1입니다. gingerbread 버전을 받으시면 현재
최신 코드이기 때문에 문제가 있을 수도 있습니다.
먼저 android-2.3.4_r1을 이용해서 2.3.4_r1 버전을 받는 것을 추천합니다.
옵션도 살펴봅시다. -u 옵션은 어떤 저장소에서 전체 소스트리를 가지고 있는 정보가
어느 저장소에 있는지를 알려주는 것입니다. manifest.git 저장소를 통해 전체 소스가 어디에 있고 우리의
어느 디렉토리에 설치해야하는지가 결정됩니다. -b 옵션은 어떤 버전을 선택할 것인지 입니다.
3 선택이 끝나면 이름과 이메일을 알려달라고 합니다. 이 절차에 대한 설명은 생략합니다.
다음으로 실행할 명령어는 이제 아시겠죠?
repo sync
코드를 받아오는데 2~4시간 걸릴겁니다.
컴퓨터가 고장난게 아니니깐 외출하고 오셔도 됩니다.
아니면 운동을 하셔도 됩니다. 몸짱이 되실 시간입니다.
4 만약 하드의 남은 용량이 10기가가 안된다면 에러날테니깐 그냥 컴퓨터 모니터 앞에 계시고요.
빌드에 앞서 설치할 패키지 들이 있습니다.
add-apt-repository "deb http://archive.canonical.com/ lucid partner"
add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
apt-get update
apt-get install sun-java6-jdk
만약에 add-apt-repository가 없으면
apt-get install python-software-properties을 하십시요. 우분투 11버전에서는 없는 경우도 있습니다.
64비트 환경에서는 아래와 같이 입력해주세요.
apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev \
libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev \
lib32readline5-dev lib32z-dev libgl1-mesa-dev
32비트 환경이라면 아래처럼요.5
추천하지는 않습니다만…
apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev \
libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline5-dev \
libz-dev libgl1-mesa-dev
이제 빌드를 수행할 시간입니다. 환경 설정과 빌드가 필요합니다.
. build/envsetup.sh
lunch 1
make
머신에 따라 20분내지 한시간 반이 걸릴 겁니다. 만약에 램이 1기가 이하라면 실패할겁니다.
혹시 가상 머신을 쓰신다면 메모리 사용량을 올려주시고 아니라면 지금 용산에 가세요.
빌드가 끝났다면 에물레이터를 동작시킬 수 있습니다.
cd ~/android/out/target/product/generic
emulator -system system.img -data userdata.img -ramdisk ramdisk.img
에뮬레이터가 떴습니다. 이제 안드로이드의 빌드의 기본을 하신 겁니다.
그 다음은 해당 하드웨어에 대한 커뮤니티를 찾아 길을 확인하십시요.6
--------------------------------------------------------------------------------
이 문제를 어떻게 회피하더라도 다른 문제가 다가올 겁니다.
그 문제는 어떻게 하실 건가요? 사람에겐 누구나 시기가 있는 겁니다.
지금은 그 때가 아닌 것 같고요. 다음 번에 다시 찾아와주세요. ↩
물론 만약 다른 버전을 사용하거나 다른 디렉토리에 repo를 적용하기 위해 repo init를 사용할 수 도 있습니다. ↩
눈치가 빠르신 분은 -b를 보고 브랜치를 의미하는 것인 것을 아셨을 수도 있습니다.
repo의 도움말을 보아 눈치채신 분도 있겠고요. 그럼 gingerbread가 브랜치인 게 이해되는데
android-2.3.4_r1는 왜 태그가 아니라 브랜치인 것에 의문을 가질 수 있습니다.
repo 명령은 브랜치와 태그를 구별하지 않게 설계되었습니다.
하지만 개별 저장소에서 코드를 가져올 때는 gingerbread일 경우 브랜치에서 android-로 시작하는
애들은 태그에서 가져오니깐 걱정하지 않으셔도 됩니다.
그 이유를 아시고 싶으신 분은 manifest.git을 해당 브랜치로 가져와서 파일 내용을 확인해보시면 됩니다. ↩
전설로 전해져 오는 북미 몸짱 소프트웨어 회사 이야기가 있습니다.
빌드 시간이 너무 길어 고민하던 직원을 위해 회사가 헬스 머신을 비치했다는 겁니다.
그 결과 해당 프로젝트가 끝나고 참가자는 모두 몸짱이 되었다더군요. 구글은 우리를 위해 헬스 머신을 사진
않았지만 시간은 충분히 제공하고 있습니다. ↩
예전에 진저브레드를 받았을 때는 32비트 환경에선 진저브레드가 빌드되지 않았습니다. 2.3.4버전이 나온
지금은 빌드가 되는지 모르겠습니다.
구글이 저렇게 환경 설정을 추천한 만큼 빌드될 가능성은 있겠지만 테스트해보지 못해 장담할 수 없습니다. ↩
실제 하드웨어서 띄우고 싶다면 해당 하드웨어 커뮤니티를 찾아서 정보를 더 획득해야합니다.
커널, 부트로더, 안드로이드 빌드에 관련한 여러 이슈들이 있어 그것이 가능한지 방법이 무엇인
지를 나열하기란 어렵고 어쩌면 불가능한 일입니다. ↩
http://dalinaum-kr.tumblr.com/post/5904189950/android-make-lunch-or-lunch-make-or-whaever
http://www.iamroot.org/xe/27212
안드로이드 빌드하기
안드로이드 소스를 가져와서 빌드하는 일은 아는 사람에겐 매우 쉽고 모르는 사람에겐 어려운 일입니다. 구글이 repo라는 특이한 도구를 사용하고 있기 때문에 그렇습니다. repo는 구글이 만들었는데, 리누스 토발즈가 만든 DVCS Git을 응용하는 도구입니다. repo가 하는 일을 정리하면 다음과 같습니다.
복수개의 저장소(repository)에서 원하는 버전을 가져와서 지정된 디렉토리에 저장합니다.
예를 들어 platform/bionic.git은 ./bionic/에 저장됩니다.
어떤 저장소가 어떤 디렉토리에 저장될지는 platform/manifest.git에 있는 default.xml 파일 안에 약속이 되어 있습니다.
이 절차를 통해 우리는 빌드에 필요한 모든 파일트리를 얻게 됩니다.
우리가 브랜치를 만들어서 작업할 때 저장소 각각에 브랜치를 만들어서 관리를 해줍니다.
gingerbread 브랜치를 가져와서 saenggangbbang이라는 우리만의 버전을 만들 수 있습니다.
만약 160개가 넘는 저장소에 각각 브랜치를 만들어야 한다고 어떻게 하시겠습니까?
수정한 코드 묶음(패치)을 Android Review 사이트에 올려줍니다.
여러 저장소에서 딱 우리가 수정한 내용만을 묶어 구글에 전송하는 것입니다.
구글의 코드 리뷰와 질의를 통과하면 구글 안드로이드에 우리 코드를 추가할 수 있게 됩니다.
repo가 여러가지 용도로 사용될 수 있지만 이번에는 1번: 복수개의 저장소에서 원하는 버전을
가져오기에만 관심을 가지겠습니다. 우리는 안드로이드를 빌드만 해볼겁니다.
무엇보다 먼저 우리 지금 우분투 리눅스를 쓰고 있는 것이 맞죠? 그렇지 않다면 조금
어렵거나 짜증납니다. 적어도 가상머신에라도 우분투를 설치하시는 것을 추천합니다. 그 다음으로 repo를 구해야겠습니다.
cd /usr/local/bin
wget https://android.git.kernel.org/repo
chmod 755 repo
만약 실패했고 그걸 해결하지 못하셨다면, 안타깝지만 당신에게 지금 이 문서가 적합하지 않은 것 같습니다.
1 다른 공부를 하시는 것을 추천드립니다.
repo에서 사용할 명령어를 알려드리겠습니다.
repo init - repo를 초기화시키는 명령입니다.
repo sync - 최신 코드를 받아오는 명령입니다.
우리는 우선 repo init를 수행하여 초기화한 뒤 앞으로는 repo sync만을 사용할 것입니다. 2
초기화 하는 명령어를 2가지 알려드리겠습니다.
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.4_r1
repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread
1번은 안드로이드 2.3.4_r1 버전을 받겠다는 것이고 2번은 gingerbread의 최신 버전을 받겠다는
것입니다. 2011년 5월 28일 현재 최신 버전은 2.3.4_r1입니다. gingerbread 버전을 받으시면 현재
최신 코드이기 때문에 문제가 있을 수도 있습니다.
먼저 android-2.3.4_r1을 이용해서 2.3.4_r1 버전을 받는 것을 추천합니다.
옵션도 살펴봅시다. -u 옵션은 어떤 저장소에서 전체 소스트리를 가지고 있는 정보가
어느 저장소에 있는지를 알려주는 것입니다. manifest.git 저장소를 통해 전체 소스가 어디에 있고 우리의
어느 디렉토리에 설치해야하는지가 결정됩니다. -b 옵션은 어떤 버전을 선택할 것인지 입니다.
3 선택이 끝나면 이름과 이메일을 알려달라고 합니다. 이 절차에 대한 설명은 생략합니다.
다음으로 실행할 명령어는 이제 아시겠죠?
repo sync
코드를 받아오는데 2~4시간 걸릴겁니다.
컴퓨터가 고장난게 아니니깐 외출하고 오셔도 됩니다.
아니면 운동을 하셔도 됩니다. 몸짱이 되실 시간입니다.
4 만약 하드의 남은 용량이 10기가가 안된다면 에러날테니깐 그냥 컴퓨터 모니터 앞에 계시고요.
빌드에 앞서 설치할 패키지 들이 있습니다.
add-apt-repository "deb http://archive.canonical.com/ lucid partner"
add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
apt-get update
apt-get install sun-java6-jdk
만약에 add-apt-repository가 없으면
apt-get install python-software-properties을 하십시요. 우분투 11버전에서는 없는 경우도 있습니다.
64비트 환경에서는 아래와 같이 입력해주세요.
apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev \
libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev \
lib32readline5-dev lib32z-dev libgl1-mesa-dev
32비트 환경이라면 아래처럼요.5
추천하지는 않습니다만…
apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev \
libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline5-dev \
libz-dev libgl1-mesa-dev
이제 빌드를 수행할 시간입니다. 환경 설정과 빌드가 필요합니다.
. build/envsetup.sh
lunch 1
make
머신에 따라 20분내지 한시간 반이 걸릴 겁니다. 만약에 램이 1기가 이하라면 실패할겁니다.
혹시 가상 머신을 쓰신다면 메모리 사용량을 올려주시고 아니라면 지금 용산에 가세요.
빌드가 끝났다면 에물레이터를 동작시킬 수 있습니다.
cd ~/android/out/target/product/generic
emulator -system system.img -data userdata.img -ramdisk ramdisk.img
에뮬레이터가 떴습니다. 이제 안드로이드의 빌드의 기본을 하신 겁니다.
그 다음은 해당 하드웨어에 대한 커뮤니티를 찾아 길을 확인하십시요.6
--------------------------------------------------------------------------------
이 문제를 어떻게 회피하더라도 다른 문제가 다가올 겁니다.
그 문제는 어떻게 하실 건가요? 사람에겐 누구나 시기가 있는 겁니다.
지금은 그 때가 아닌 것 같고요. 다음 번에 다시 찾아와주세요. ↩
물론 만약 다른 버전을 사용하거나 다른 디렉토리에 repo를 적용하기 위해 repo init를 사용할 수 도 있습니다. ↩
눈치가 빠르신 분은 -b를 보고 브랜치를 의미하는 것인 것을 아셨을 수도 있습니다.
repo의 도움말을 보아 눈치채신 분도 있겠고요. 그럼 gingerbread가 브랜치인 게 이해되는데
android-2.3.4_r1는 왜 태그가 아니라 브랜치인 것에 의문을 가질 수 있습니다.
repo 명령은 브랜치와 태그를 구별하지 않게 설계되었습니다.
하지만 개별 저장소에서 코드를 가져올 때는 gingerbread일 경우 브랜치에서 android-로 시작하는
애들은 태그에서 가져오니깐 걱정하지 않으셔도 됩니다.
그 이유를 아시고 싶으신 분은 manifest.git을 해당 브랜치로 가져와서 파일 내용을 확인해보시면 됩니다. ↩
전설로 전해져 오는 북미 몸짱 소프트웨어 회사 이야기가 있습니다.
빌드 시간이 너무 길어 고민하던 직원을 위해 회사가 헬스 머신을 비치했다는 겁니다.
그 결과 해당 프로젝트가 끝나고 참가자는 모두 몸짱이 되었다더군요. 구글은 우리를 위해 헬스 머신을 사진
않았지만 시간은 충분히 제공하고 있습니다. ↩
예전에 진저브레드를 받았을 때는 32비트 환경에선 진저브레드가 빌드되지 않았습니다. 2.3.4버전이 나온
지금은 빌드가 되는지 모르겠습니다.
구글이 저렇게 환경 설정을 추천한 만큼 빌드될 가능성은 있겠지만 테스트해보지 못해 장담할 수 없습니다. ↩
실제 하드웨어서 띄우고 싶다면 해당 하드웨어 커뮤니티를 찾아서 정보를 더 획득해야합니다.
커널, 부트로더, 안드로이드 빌드에 관련한 여러 이슈들이 있어 그것이 가능한지 방법이 무엇인
지를 나열하기란 어렵고 어쩌면 불가능한 일입니다. ↩
계속 헤메 해메다. 뭐가 맞는겨?
SEAndroid를 이해하기 위해서는 SELinux를 알아야 한다. 안드로이드 커널이 리눅스 커널을 모체로 하고 있으니까. 잠시 (사실 거의 같다) 암패치 해 주시는 뭐시기 킹께 감사.
SE리눅스는 NSA에서 개발했고 지금은 kernel.org에 속속들이 들어가고 있다. nsa에 커널 2.6대까지 밖에 없어서 중단되었냐고 물어보니까 걍 각 패키지에 녹아 들어가서 거기서 알아서 하고 있다고 한다. 결국 NSA가 만들긴 했지만 수많은 기여자가 열심히 SE 안드로이드를 개발하고 있는 것이다.
SE 리눅스 설정파일 /etc/sysconfig/selinux 에 있다.
켤려면 enforcing 끌려면 disabled.
이정도로 하고 SE Android...
SE Android 는 NSA의 Open Source Project 로 시작 Android의 부족한 Security 부분을 보완
일반적인 Linux의 DAC 방식 대신 MAC 방식 채용
DAC 란 : Discretionary Access Control. 임의적 접근 통제. 객체 접근 시 소유자, 그룹, 접근허가 집합 등에 의거하여 통제.
MAC 란 : Mandatory Access Control. 강제적 접근 통제. 주어진 객체의 보안레벨에 따라 자원접근을 통제.
Policy control 을 통한 process, daemon, app 등의 제한적 권한 설정 가능
Policy 설정에 따라 root 권한도 특정 device 에 접근하지 못하도록 하는 것이 가능
LSM이 약자인 리눅스 시큐리티 모듈은 그럼 언제 활성화 되는가?
DAC를 통과하면(우리가 생각하는 chmod 777권한
rwxrwxrwx... MAC퍼미션을 체크하는데 이 때 가동이 된다.)
Kernel : SELinux feature 의 enable, android binder patch, xattr support feature enable
Bionic : xattr support
Build : make_ext4fs tool 수정
external : libselinux, libsepol, checkpolicy, sepolicy
framework/base : selinux 를 위한 JNI binding 추가
각 daemon 별, 중요 process 별로 policy file 을 가짐.
Application 의 경우 release, media, shared, platform 의 4개의 key 중 하나를 가지며, SE Android 는 이 key 를 기반으로 policy 를 정함.
키 정보
국내 ubuntu 폰트를 외국 엔지니어가 보더니 보더니 영문판으로 다시 밀어버린 사건이 발생했다. 다시 환경 설정이 번거롭더라도 해당 폰트는 도저히 맘에 안 들었나 보다. 뭐, 내가 알고 있는 폰트 설정도 없으니. 안드로이드 메인 브랜치 소스를 한번 받아 보려고 한다. 안드로이드 빌드 환경 설정 http://source.android.com/source/initializing.html 하기 전에 소스 부터 받아보자. http://source.android.com/source/downloading.html 에 있다. 위에 링크나 아래 링크나 다 같은 동네에 있다. cURL을 이용하는 것 같은데 설명은 여기 http://aramjo.blog.me/120169143589 실컷하다가 * [new tag] android-2.0_r1_ -> android-2.0_r1_ * [new tag] android-2.0.1_r1_ -> android-2.0.1_r1_ * [new tag] android-1.6_r2_ -> android-1.6_r2_ * [new tag] android-1.6_r1_ -> android-1.6_r1_ * [new tag] android-1.6_r1.5_ -> android-1.6_r1.5_ * [new tag] android-1.6_r1.4_ -> android-1.6_r1.4_ * [new tag] android-1.6_r1.3_ -> android-1.6_r1.3_ * [new tag] android-1.6_r1.2_ -> android-1.6_r1.2_ * [new tag] android-1.6_r1.1_ -> android-1.6_r1.1_ fatal: remote error: User Is Over Quota 뭐 이딴 에러가 난다. 서버 능력이 딸리나 보다ㅠ 한번 오류가 나오고 나면 계속 에러 난다. File "/home/cer/bin/WORKING_DIRECTORY/.repo/repo/main.py", line 384, in <module> _Main(sys.argv[1:]) File "/home/cer/bin/WORKING_DIRECTORY/.repo/repo/main.py", line 364, in _Main rm -rf .repo/하고 다시 해 주면 된다. fatal: remote error: User Is Over Quota 조금 되는 듯 싶더니 이자식은 꾸준히 나온다 ㅠㅠ 모지모지모지? 구글링 해보니 이런 내용이 있다. https://groups.google.com/forum/#!msg/android-building/_975cuUxVTw/usrfKSHXhe4J -The quota is large enough to clone 3 regular trees per day per IP address, or a full mirror plus a regular tree. If should also be enough to git fetch an entire regular tree per day, and to do at least a no-op repo sync of a full mirror every hour. 일단 내일 해본다... 그런데 미국 시간 기준이야? 한국 시간 기준이야 ㅡㅡ;
피드 구독하기:
글 (Atom)
대학원생의 투고 지도 ④ (완결) — 논문의 수준이란 무엇인가: 사다리와 사분위, 첫 논문 전략
완결편이다. "논문 수준"이라는 말을 해부하고, 에듀테크 석사생의 첫 논문 전략으로 마친다. 학위논문과 학술지 논문은 다른 장르다 먼저 가장 흔한 혼동부터. 학위논문(thesis)은 "내가 연구를 수행할 줄 안다...
-
오늘 테스트 해보고 포스팅 한다. 인터넷을 통해서 현대 오토넷 리얼뷰를 구입했다. 인터넷 보니 천차만별이던데 기본 25만원 하더라. 그런데 2가지가 있었다. 고급형은 HD에 2채널 25만원. 내가 산건 HD 아니고 1채널이...
-
소스는 쉬어 가는 페이지 인가... SELinux에서 SEAndroid가 나왔다. 둘다 NSA 프로젝트이고. 이미 여러 패키지에 흩어져서 사용되고 있다. policycoreutils는 tresys에서 만든 것으로 보인다. ...
-
일단 ssh 프로그램으로 apm 셋팅을 하려고 했으나 apt-get이 계속 파일 위치를 잡지 못했다. (404 not found....) 그래서 구글링 결과 apt의 리스트 변수 목록을 제거하고 새로 업데이트 하는 명령어를 찾음 :)...

