출처 : http://blog.kusweet.com/resize-partions-at-linux-%EB%A6%AC%EB%88%85%EC%8A%A4%EC%97%90%EC%84%9C-%ED%8C%8C%ED%8B%B0%EC%85%98-%EC%82%AC%EC%9D%B4%EC%A6%88-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0/

Intro

Partition이라는게 애초의 할당된 용량이 초과한다거나, 혹은 img 파일을 restore하는 바람에 가용 용량을 다 사용하지 못하는 경우가 발생됩니다. 이러한 경우, Resize가 필요한데 이게 생각보다 쉽지 않습니다. 그래서 오늘은, 대표적인 명령어인 parted와 fdisk를 이용하여 파티션을 늘리기를 소개합니다.

오늘 같이 살펴볼 예는 다음과 같습니다.

microSD card(32G)을 img(4G)파일로 덮어 썼습니다. img파일을 제작할 당시에, 사용된 partition 정보가 SD카드에도 그대로 전달되기 때문에 4G로 잡히고 28G는 사용할 수 없게 됩니다.

이런 경우, 어떻게 resize를 할지 알아보겠습니다.

df -h , fdisk -l

먼저, 디스크의 상태를 알 필요가 있습니다. 용량이 어떻게 할당되었는지 알기 위해서는, 다음과 같은 명령어를 이용합니다.

-h 옵션은 human readable format으로, 읽기 쉽게 표현한 형태로 출력하게 됩니다. 현재, linux에 잡혀있는 모든 block storage에 대한 정보를 보여줍니다. 애석하게도 df는 mounted된 block device만 표시합니다. 따라서, umount 상태라면, fdisk를 이용해야 합니다.

오늘 resize를 진행할 parition은 /dev/sdc2입니다. human-readable이 아니기에, mount하여 df로 다시 살펴 보면 다음과 같습니다.

32G짜리 MicroSD가 단 3G로 나타나고 있습니다. 이를 어찌한다…

parted

가장, 간편하게 사용할 수 있습니다. 기본적으로 다음과 같이 접근합니다.

간략하게 사용할 수 있지만, 마지막 2번째 줄을 살펴보면 ext4가 지원되지 않음을 알 수 있습니다. ext4는 parted를 사용할 수 없습니다. 그럼 어떻게 해야 할까요?

fdisk

fdisk를 사용할 차례가 왔습니다. parted 보다 약간 복잡할 뿐이지만, 차근차근 진행하시면 쉽게 사용할 수 있습니다. 다음과 같은 순서로 진행합니다.

  1. fdisk로 partition 정보 변경하기
    1. 기존의 Partition 삭제하기
    2. 새로 Partition 정의하기
    3. 저장하고 종료
  2. e2fsck을 이용하여 file system check하기
  3. resize2fs로 실제 영역 확장하기

적다 보니, 복잡해 보이지만 대충 후루륵 끝낼만한 간단한 일입니다.

파티션이 변경되었기 때문에, 파일시스템의 이상 유무를 점검해야 합니다. 그리고 실제 영역을 반영해야 합니다. 이는 다음의 명령어로 진행합니다.

이로써, resize가 끝났습니다. 정말, 간단하죠.

잘 되었는지 확인할 필요가 있겠죠. mount하여 df를 이용해서 Size를 체크해 보겠습니다.

29G로 정상적으로 resize가 되었습니다.

Closing

간단한 내용이지만, 계속 잊어 먹고 다시 찾는 일이 많아서 정리해 보았습니다. 생각보다 어렵지 않은데, runtime에서 변경하는 일은 어렵습니다. 생각해 보시면, Mount된 상태에서 resize가 되겠어요? live-cd나 다른 컴퓨터에 물려서 변경하는 것이 정신 건강에 좋습니다.

 

저작자 표시
신고

'Linux' 카테고리의 다른 글

Resize partions at Linux – 리눅스에서 파티션 사이즈 변경하기  (0) 2016.10.19
Kernel DHCP Server  (0) 2016.10.04
FUSE 란?  (0) 2016.08.17
서버 성능측정 with sysbench  (0) 2016.07.14
IOzone 을 이용한 Disk 성능 측정법.  (0) 2016.07.13
linux 파티션 설정 변경  (0) 2016.06.29
Posted by 덕쑤

댓글을 달아 주세요

Kernel DHCP Server

Linux 2016.10.04 16:54 |

출처 : http://egloos.zum.com/iryna7/v/2811423


DHCP SERVER는 다양한 방식으로 이용이 되고 있지만 KERNEL상에서 DHCP  서버 역할을 하는 프로그램의 제작 방법을 알아 봅니다. 원래 사용 목적은 VPN tunnel interface를 위하여 제작되었지만 나름 필요 하신분이 있으실것 같아 블로그에 게시합니다.

실제 패킷은 KERNEL상에서 동작되는것은 아니고 사용자 영역에 복사되어 패킷을 디코딩하여 커널 패킷을 작성하여 전송되는 방식입니다. 즉, 실질 적인 모든(이더넷 프레임 포함) 데이터는 KERNEL영역이 아닌 사용자 영역에서 처리가 이루어 지는것입니다.

kernel_user

 

DHCP 패킷의 구성 :

 

DHCPD

 

DHCPC

기타

1

 

<---------------

DISCOVER

클라이언트측 전송 요청

2

OFFER

--------------->

 서버측 할당 IP 정보 전송

3

 

<---------------

REQUEST

클라이언트측 확정 요청

4

ACK

--------------->

 서버측 할당 IP 확정 전송

DHCP은 보통 Discover / Offer / Request / Acknowledge등으로 구성이 되는데 모든 패킷은 UDP 형태로 전송이 되며 각각의 목적에 맞게 전송되는 데이터 타입이 존재하거나 존재하지 안거나 합니다. 예를 들면 최초 DHCP 요청의 경우에는 1,2,3,4의 형태로 전송이 되지만 이미 한번 받았던 DHCP IP가 존재할경우에 클라이언트는 3번 부터 시도를 하게 됩니다. 물론 서브측에서는 3번의 요청이 들어와도 IP가 이미 사용되어질때에는 NAK 패킷을 전송하고 클라이언트는 재 시도를 하게끔 합니다.

자세한 DHCP의 동작 원리는 RFC1531 / RFC1541 / RFC2131 을 참조 하시면 알수 있습니다. 여기서는 언급하지 안도록 하겠습니다.

#헤더 프레임설 명

1

Ethernet HeaderSRC/DST의 MAC 정보

2

IP HeaderSRC /DST의 IP정보및 길이등

3

UDP Header전송 데이터의 프로토콜및 길이등

4

PAYLOAD실제 정송되는 DHCP 패킷

 

DHCP Discover :

데이터는 Ethernet Header부터 검증을 하여 정확히 DHCP 브로드캐스팅 패킷인지 파악하여 해당 MAC에게 OFFER 패킷을 전송할수 있어야만 합니다. 특히 헤더 부분의 길이를 조작하여 다양한 공격 패킷들이 존재하니 주의를 하셔야만 합니다. DHCP OPTION에 해당되는 부분은 옵션번호+길이+값과 같은 형태로 존재하니 이를 바탕으로 파싱을 하여야만 합니다.

 프레임 설명
1Ethernet HeaderSRC : 00:0B:82:01:FC:42 
DST : FF:FF:FF:FF:FF:FF
브로드케스트
2IP HeaderSRC : 0.0.0.0 
DST : 255.255.255.255
 
3 PROTOCOL : UDP(17) 
4 SRC PORT : 68 
DST PORT : 67
 
5 ID : 0x3D1D클라이언트측 XID
    

해당 패킷은 Wireshrak 샘플입니다.

0000   00 0b 82 01 fc 42 00 08 74 ad f1 9b 08 00 45 00  .....B..t.....E.
0010   01 48 04 45 00 00 80 11 00 00 c0 a8 00 01 c0 a8  .H.E............
0020   00 0a 00 43 00 44 01 34 22 33 02 01 06 00 00 00  ...C.D.4"3......
0030   3d 1d 00 00 00 00 00 00 00 00 c0 a8 00 0a c0 a8  =...............
0040   00 01 00 00 00 00 00 0b 82 01 fc 42 00 00 00 00  ...........B....
0050   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0060   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0070   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0080   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0090   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00a0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00b0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00c0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00d0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00e0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00f0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0100   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0110   00 00 00 00 00 00 63 82 53 63 35 01 02 01 04 ff  ......c.Sc5.....
0120   ff ff 00 3a 04 00 00 07 08 3b 04 00 00 0c 4e 33  ...:.....;....N3
0130   04 00 00 0e 10 36 04 c0 a8 00 01 ff 00 00 00 00  .....6..........
0140   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0150   00 00 00 00 00 00                                ......



DHCP Offer :



데이터는 전송시에는 반드시 해당 패킷의 길이를 정확히 계산해서 전송해주어야만 합니다.



전체 전송되는 패킷의 구조 :



struct udp_dhcp_packet {
  struct ethhdr eth;
  struct iphdr ip;
  struct udphdr udp;
  struct dhcp_packet_ data;
} __attribute__((packed));



UDP Length :



UDP Length = UDP Header Length + DHCP PAYLOAD Length
packet.udp.len = htons(sizeof(packet.udp) + sizeof(struct dhcp_packet_));



IP Length :



IP Length = IP Header + UDP Header + DHCP PAYLOAD Length
packet.ip.tot_len = htons(sizeof(struct udp_dhcp_packet) - sizeof(struct ethhdr) );



여기서 주의 할점은 IP 길이는 반드시 UDP Header및 DHCP PAYLOAD부분 패킷을 구성한 후에 계산해야 한다는 점입니다.









































































 프레임 설명
1Ethernet HeaderSRC : 00:08:74:AD:F1:9 

DST : 00:0B:82:01:FC:42
 
2IP HeaderSRC :192.168.0.1 

DST : 192.168.0.10
 
3 PROTOCOL : UDP(17) 
4 SRC PORT : 67 

DST PORT : 68
 
5 ID : 0x3D1D클라이언트가 전송해준 XID
  DHCP SERVER : 192.168.0.1

DHCP CLIENT : 192.168.0.10
 



해당 패킷은 Wireshrak Offer 샘플입니다.



0000   00 0b 82 01 fc 42 00 08 74 ad f1 9b 08 00 45 00  .....B..t.....E.
0010   01 48 04 45 00 00 80 11 00 00 c0 a8 00 01 c0 a8  .H.E............
0020   00 0a 00 43 00 44 01 34 22 33 02 01 06 00 00 00  ...C.D.4"3......
0030   3d 1d 00 00 00 00 00 00 00 00 c0 a8 00 0a c0 a8  =...............
0040   00 01 00 00 00 00 00 0b 82 01 fc 42 00 00 00 00  ...........B....
0050   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0060   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0070   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0080   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0090   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00a0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00b0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00c0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00d0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00e0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00f0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0100   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0110   00 00 00 00 00 00 63 82 53 63 35 01 02 01 04 ff  ......c.Sc5.....
0120   ff ff 00 3a 04 00 00 07 08 3b 04 00 00 0c 4e 33  ...:.....;....N3
0130   04 00 00 0e 10 36 04 c0 a8 00 01 ff 00 00 00 00  .....6..........
0140   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0150   00 00 00 00 00 00                                ......



시간이 나는데로 좀더 자세한 구성을 적어 올리겠습니다.

저작자 표시
신고

'Linux' 카테고리의 다른 글

Resize partions at Linux – 리눅스에서 파티션 사이즈 변경하기  (0) 2016.10.19
Kernel DHCP Server  (0) 2016.10.04
FUSE 란?  (0) 2016.08.17
서버 성능측정 with sysbench  (0) 2016.07.14
IOzone 을 이용한 Disk 성능 측정법.  (0) 2016.07.13
linux 파티션 설정 변경  (0) 2016.06.29
Posted by 덕쑤

댓글을 달아 주세요

FUSE 란?

Linux 2016.08.17 18:00 |

http://guswnsla1223.tistory.com/75

저작자 표시
신고

'Linux' 카테고리의 다른 글

Resize partions at Linux – 리눅스에서 파티션 사이즈 변경하기  (0) 2016.10.19
Kernel DHCP Server  (0) 2016.10.04
FUSE 란?  (0) 2016.08.17
서버 성능측정 with sysbench  (0) 2016.07.14
IOzone 을 이용한 Disk 성능 측정법.  (0) 2016.07.13
linux 파티션 설정 변경  (0) 2016.06.29
Posted by 덕쑤

댓글을 달아 주세요

티스토리 툴바