IT World 2008. 05 No.12 Focus Interview Best Practice Open Mind
2008. 05 No.12 Contents Special Editorial Best Practice 04 08 12 16 20 22 24 28 30 Insight 34 36 40 42 46 Tech Guide 50 56 62 News & Trend 66 71 75 2008: 05 03
Special Editorial 04
2008: 05 05
Best Practice 08 전라북도교육정보과학원 - 300개 학교 홈페이지 웹호스팅 및 공개SW 전문 인력 양성 기반 마련 전라북도교육정보과학원은 교수학습도움센터 구축을 위해 통합 웹 서버 구축에 필요한 공개SW 서버 OS를 도입하고, DBMS 역시 공개SW 기반으로 구축했다. 또한 데이터센터를 꾸려 각 학교 홈페이지 호스팅을 제공, 효율적 운영이 가능하도록 했다. 12 경동정보대학 - 공개SW 기반 홈페이지 재구축으로 안정적 관리 가능 경동정보대학은 공개SW 기반의 홈페이지 재구축으로 대구 경북 지역의 최고 대학으로 거듭나기 위해 노력 중이다. 하드웨어 및 공개SW 도입 후 홈페이지 재구축으로 안정적이고 고급화된 기술지원 업무가 가능해졌고 실무담당자의 업무부담이 경감됐다. 16 지렉스소프트 - 온라인 게임 삼국제왕전 공개SW 기반으로 개발 지렉스소프트의 MMORPG 삼국제왕전 은 유닉스 계열의 공개SW FreeBSD 를 기반으로 개발ㆍ운영되고 있다. 기획 단계부터 공개SW를 선택한 지렉스소프트는 비용절감과 자체 개발인력의 기술력 축적이라는 두 마리 토끼를 잡을 수 있었다. 20 McClair Mortgage - 리눅스 이용자들을 고객으로 얻고 개발 유연성까지 획득 미국 미시건 주 McClair Mortgage와 Citizens First Wholesale Mortgage는 윈도 프로그램을 유닉스/리눅스 플랫폼으로 성공적으로 포팅했다. 이를 통해 전체 고객 수에서 2%에 해당하는 리눅스 이용자 신규 고객들을 유치할 수 있었다.
22 24 28 30
Round Up! 08
2008: 05 09
10
Interview 2008: 05 11
Round Up! 12
2008: 05 13
14
Interview 2008: 05 15
Round Up! 16
2008: 05 17
18
Interview - 1 Interview - 2 2008: 05 19
Round Up! 20
2008: 05 21
Round Up! 22
2008: 05 23
Round Up! 24
2008: 05 25
26
2008: 05 27
Best Practice E S B T COMPANY 28
Interview 2008: 05 29
Best Practice E S B T COMPANY 30
2008: 05 31
Insight 34 36 40 42 46
Insight Blog&OpenSource Software 34
2008: 05 35
Insight 36
2008: 05 37
38
2008: 05 39
Insight 40
2008: 05 41
Insight 42
2008: 05 43
44
2008: 05 45
46
2008: 05 47
TechGuide 50 Let's Try - 누구나 쉽게 배우는 임베디드 리눅스 56 Open Guru - Step by Step 커널 프로그래밍 강좌 62 Useful Tips - 막힌 벽을 뚫어라 Linux Tips & Tricks
Tech Guide 50
2008: 05 51
52
2008: 05 53
54
2008: 05 55
Tech Guide struct inode { struct hlist_node i_hash; struct list_head i_list; struct list_head i_sb_list; struct list_head i_dentry; unsigned long i_ino;... uid_t i_uid; gid_t i_gid; dev_t i_rdev; 56
... unsigned int i_blkbits; unsigned long i_blksize; unsigned long i_version; unsigned long i_blocks; unsigned short i_bytes; unsigned char i_sock;... struct inode_operations *i_op; struct file_operations *i_fop; /* former i_op default_file_ops */ struct super_block *i_sb; struct file_lock *i_flock; struct address_space *i_mapping; struct address_space i_data;... /* These three should probably be a union */ struct list_head i_devices; struct pipe_inode_info *i_pipe; struct block_device *i_bdev; struct cdev *i_cdev;... unsigned long i_state; unsigned long dirtied_when; /* jiffies of first dirtying */ unsigned int i_flags; atomic_t i_writecount; void *i_security; union { void *generic_ip; } u; }; static struct inode *alloc_inode(struct super_block *sb) { static struct address_space_operations empty_aops; static struct inode_operations empty_iops; static struct file_operations empty_fops; struct inode *inode; if (sb s_op alloc_inode) inode = sb s_op alloc_inode(sb); else inode = (struct inode *) kmem_cache_alloc(inode_cachep, SLAB_KERNEL); if (inode) { struct address_space * const mapping = &inode i_data; inode i_sb = sb; inode i_blkbits = sb->s_blocksize_bits; inode i_flags = 0; atomic_set(&inode i_count, 1); inode i_sock = 0; inode i_op = &empty_iops; inode i_fop = &empty_fops; inode i_nlink = 1; atomic_set(&inode i_writecount, 0); inode i_size = 0; inode i_blocks = 0; inode i_bytes = 0; inode i_generation = 0; #ifdef CONFIG_QUOTA memset(&inode i_dquot, 0, sizeof(inode i_dquot)); #endif inode i_pipe = NULL; inode i_bdev = NULL; inode i_cdev = NULL; inode i_rdev = 0; inode i_security = NULL; inode dirtied_when = 0; if (security_inode_alloc(inode)) { 2008: 05 57
if (inode i_sb s_op destroy_inode) inode i_sb s_op destroy_inode(inode); else kmem_cache_free(inode_cachep, (inode)); return NULL; } mapping a_ops = &empty_aops; mapping a_ops = &empty_aops; mapping host = inode; mapping flags = 0; mapping_set_gfp_mask(mapping, GFP_HIGHUSER); mapping assoc_mapping = NULL; mapping backing_dev_info = &default_backing_dev_info; } /* * If the block_device provides a backing_dev_info for client * inodes then use that. Otherwise the inode share the bdev's * backing_dev_info. */ if (sb s_bdev) { struct backing_dev_info *bdi; bdi = sb s_bdev bd_inode_backing_dev_info; if (!bdi) bdi = sb s_bdev bd_inode i_mapping backing_dev_info; mapping backing_dev_info = bdi; } memset(&inode u, 0, sizeof(inode u)); inode i_mapping = mapping; } return inode; 58
static struct address_space_operations rkfs_aops = {.readpage = rkfs_readpage,.writepage = rkfs_writepage,.prepare_write = rkfs_prepare_write,.commit_write = rkfs_commit_write } 2008: 05 59
rkfs_root_inode i_op = &rkfs_iops; // set the inode ops rkfs_root_inode i_mode = S_IFDIR S_IRWXU; rkfs_root_inode i_fop = &rkfs_fops; static struct inode_operations rkfs_iops = { lookup: rkfs_inode_lookup } static struct file_operations rkfs_fops = { open: rkfs_file_open, read: &generic_file_read, readdir: &rkfs_file_readdir, write: &generic_file_write, release: &rkfs_file_release, fsync: simple_sync_file } struct dentry * d_alloc_root(struct inode * root_inode) { struct dentry *res = NULL; if (root_inode) { static const struct qstr name = {.name = "/",.len = 1 }; } res = d_alloc(null, &name); if (res) { res d_sb = root_inode i_sb; res d_parent = res; d_instantiate(res, root_inode); } } return res; 60
mnt mnt_sb = sb; mnt mnt_root = dget(sb s_root); mnt mnt_mountpoint = sb s_root; mnt mnt_parent = mnt; mnt mnt_namespace = current namespace; 2008: 05 61
Tech Guide Linux Tips & Tricks Linux Tips & Tricks 62
2008: 05 63
64
News&Trend 66 71 75
News Trend 66
2008: 05 67
News Trend 68
News Trend 2008: 05 69
News Trend 70
Special Report 2008: 05 71
72
2008: 05 73
74
News Trend 2008: 05 75
News Trend 76
2008: 05 77
Epilogue 78
Digilog Essay