Virtual Box에서 내부 내트워크와 외부 네트워크와의 통신 문제 해결…

학교 과제문제때문에 Virtual Box로 다음과 같은 네트워크를 구성하였다.

사용자 삽입 이미지
 net0 이 바로 Virtual Box에서 구성한 Bridge 구성이고, 나머지 net1 과 net2 는 실습을 위한 내부 네트워크 이다.

 이 네트워크를 구축할 때, 나는 공유기를 사용하고 있었다.

 그리고 라우팅 테이블을 수정해서 모든 노드가 서로 통신이 가능하게끔 하였다.

 그런데 문제가 발생했다.

 바로 외부 네트워크(인터넷)의 연결 부분이었다.

 MyNote, Debian_0, Debian_Another 은 인터넷이 가능하였다. 하지만, Debian_1, Debian_2 은 인터넷이 되지 않았던것….

 이상한 일이었다.

 심지어 인터넷이 안되는 두개의 호스트는 공유기로의 ping도 되지 않았다. 공유기와 같은 네트워크에 있는 net0 에 있는 모든 노드와는 통신이 되는데, 유독 공유기와는 연결이 되지 않았다.

 이유는 다음과 같았다.

 바로 공유기에서 문제가 있었다.

 공유기에서의 라우팅 셋팅을 하지 않았던 것.

 당연한 것이다. 하지만….. 나름 공유기를 믿고 있었는데…자동으로 라우팅 테이블을 작성할 줄 알았던 것이다.(너무 바랬다….)

 공유기에서의 static routing table을 다음과 같이 수정하니 인터넷과 통신이 매우 잘 되었다.

사용자 삽입 이미지
 게이트웨이 192.168.1.7 의 주소는 Debian_0 의 주소이다.

리눅스가 부팅하기까지…..

 컴퓨터에 전원을 넣은 순간부터, 리눅스가 부팅을 완료하기까지는 참으로 여러가지 일들이 컴퓨터 내부에서 일어난다.

 lilo 혹은 grub의 구동에서 부터 커널의 로딩까지…

 다음의 링크에 이에 관한 상세한 설명이 담겨있다.

http://kldp.org/KoreanDoc/html/Boot_Process-KLDP/index.html

Virtual Bax 에서 브릿지 구성 이용하기..

 리눅스에서 돌아가는 훌륭한 가상머신 Virtual box!

 하지만 NAT 구성을 사용할 경우 웬일인지 호스트에서 게스트로의 Ping 과 ssh, telnet 접속이 되지 않았다..

 그래서 브릿지 구성을 통하여 문제를 해결했다.

 먼저 임의의 디렉토리에 다음의 스크립트를 작성한다.

startup.sh (Language : perl)
  1. #!/bin/sh
  2.  
  3. brctl addbr br0
  4.  
  5. ifconfig eth0 0.0.0.0
  6. #ifconfig wlan0 0.0.0.0
  7.  
  8. # for wireless lan
  9. #brctl addif br0 wlan0
  10.  
  11. # for wired lan
  12. brctl addif br0 eth0
  13.  
  14. # If you have a dhcp-server uncomment this line
  15. dhclient3 br0
  16. #dhcpcd br0 -A
  17.  
  18. # If you have a static IP uncomment the following lines and
  19. # change the IP accordingly to ypur subnet
  20. #ifconfig br0 192.168.1.110 up
  21. #route add default gw 192.168.1.1
  22.  
  23. # Change your username accordingly
  24. tunctl -t tap0 -u pchero
  25. tunctl -t tap1 -u pchero
  26.  
  27. # Now add the tap-device to the bridge
  28. ifconfig tap0 up
  29. ifconfig tap1 up
  30. brctl addif br0 tap0
  31. brctl addif br0 tap1
  32.  
  33. route add -net 192.168.10.0 netmask 255.255.255.0 br0
  34. route add -net 192.168.100.0 netmask 255.255.255.0 br0
  35.  

 위의 스크립트 파일 구성은 브릿지 네트워크를 사용하는 가상 머신이 두개일 때 사용하는 스크립트이다.

 만약 세개 이상이 필요하다면 원하는 숫자만큼 tap 인터페이스를 늘리고 br0에 붙여서 사용하면 된다.

 다음은 종료시 사용하는 스크립트이다.

stop.sh (Language : perl)
  1. #!/bin/bash
  2.  
  3. # Biring the interfaces down
  4. ifconfig tap0 down
  5. ifconfig tap1 down
  6. ifconfig br0 down
  7. #ifconfig br1 down
  8. brctl delif br0 tap0
  9. brctl delif br0 tap1
  10. #brctl delif br1 tap1
  11. brctl delbr br0
  12. #brctl delbr br1
  13.  
  14. # Now setup your network-interface again
  15. # for dhcp uncommnet the following line
  16.  
  17. # for wired lan
  18. dhclient3 eth0
  19.  
  20. # for wireless lan
  21. #dhclient3 wlan0
  22.  
  23. # For a static IP uncommnet the following lines and change them accordingly
  24. #ifconfig eth0 192.168.10.100
  25. #route add default gw 192.168.10.1 dev eth0
  26.  

 이렇게 만들어진 스크립트를 사용하기 위해서는 다음의 작업들이 더 필요하다.

 먼저 네트워크 세팅에서 호스트 네트워크로 변경한다.

 그런 다음, 호스트 인터페이스 설정에서 설정 프로그램에 startup.sh, 종료 프로그램에 stop.sh, 인터페이스 이름에 설정한 tap0, tap1 을 설정한다. 다음은 설정 예이다.

gksudo /home/pchero/virtual_box/starttun.sh
gksudo /home/pchero/virtual_box/stop.sh

 앞쪽에 붙어있는 gksudo 는 root의 권한으로 사용하기 위한 명령이다.

 ….하지만 나의 경우는 이상하게 gksudo 로 설정을 해도 되지 않았다. 일일이 하나씩 스크립트를 수동으로 실행을 시켜야 되었다..

 왜그럴까….;;;

AVR 마이크로컨트롤러 입출력 포트 특징

 * AVR 마이크로컨트롤러 입출력 포트 특징

 – 6개의 8비트 I/O 포트와 1개의 5비트 I/O 포트로 구성되어 있다.
 – 출력포트의 버퍼는 많은 유입전류와 유출전류를 사용(최대 40mA)할 수 있다.
 – 모든 포트 핀은 개별적으로 내부 풀업 저항을 사용할 수 있다.
 – 모든 I/O핀은 VCC와 GND 사이에 다이오드를 접속하여 포트를 보호한다.
 – Read-Modify-Write기능을 가지고 있어, 비트 단위의 포트 설정이 자유롭다.
 – 각 포트에 대한 데이터 출력용 레지스터(PORTx)와 데이터 입출력 방향 지정용 레지스터(Data Direction Register : DDRx), 그리고 입력용 레지스터 (PINx)를 가지고 있다.

 * AVR 마이크로컨트롤러는 입출력 포트를 제어하기 위해서, DDxn, PORTxn, PINxn의 3개의 레지스터를 사용한다.

 * DDRx 레지스터
 – 입출력의 방향설정을 하기 위한 레지스터이다. DDRA ~ DDRG 레지스터의 입출력포트에 대응하는 해당 비트에 1을 쓰면 그 해당 핀이 출력으로, 0을 쓰면 입력으로 설정된다. 초기값을 0으로 설정되어 있다. 비트별로 만약 포트 A의 비트3를 출력으로 설정하려면 DDRA = 0x08로 하면 되고, 포트 A를 전부 출력으로 설정하려면 DDRA = 0xff로 하면 된다.

 * PORTx 레지스터
 – 데이터를 출력하기 위한 레지스터이다. DDRx의 값을 세팅하여 출력으로 설정된 경우 출력을 원하는 데이터값을 PORTx 레지스터에 넣어주면 된다. PORTx 레지스터는 읽기와 쓰기가 모두 가능하다. 비트별로 설정하려면 PORTx = 1의 형태로 하면 된다( x는 A ~ G). 만약 포트 B의 비트3에 1을 출력하려면 PORTB = 0x08로 하면 된다.

 * PINx 레지스터
 – 데이터 입력용 레지스터이다. 입출력 핀이 입력으로 설정된 경우 PINx 레지스터에 해당하는 값을 읽으면 된다. 해당 핀의 값을 읽어 들인다. 읽기만 가능하며 쓰기는 금지되어 있다. 비트별로 읽어 들이려면 PINx를 사용하면 된다. 비트별로 만약 포트C의 비트3값을 읽어 들여 led3라는 비트값에 할당하려면 led3 = (PINC & 0x08)로 하면 된다.

 * ATMega128 마이크로콘트롤러는 6개의 8비트 입출력 포트와 1개의 5비트 입출력 포트로 구성되어 있다. 출력 포트들은 임베디드 시스템을 설계할 때 그 용도에 맞게 적절히 기능을 부여하게 된다. 시스템에서 요구되는 기능에 따라 내장할 주변 소자들과 외부 인터페이스를 결정하고, 그 주변 소자와 외부 인터페이스들을 마이크로컨트롤러의 각 입출력 포트에 적절히 배분하여 연결해 주어야 한다. 예를 들어 UART 인터페이스를 필요로 하는 외부 인터페이스는 포트 D나 포트 E의 UART 포트에 연결하면 되고, PWM 제어가 필요한 모터는 포트 B의 PWM 포트에, AD변환이 필요한 센서등은 포트 F의 ADC 포트에 연결하면 된다. 만약 외부에 대용량의 메모리를 붙여야 한다면 포트 A, 포트 C, 포트 G에 있는 외부 메모리 연결 포트를 사용해야 한다.

 * 포트 A(PA7 ~ PA0 : 핀 44 ~ 51)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 외부 메모리를 둘 경우에는 주소버스(A7-A0)와 데이터버스(D7-D0)로 사용된다. 이때 어드레스 버스와 데이터 버스를 구분하기 위해서는 ALE 신호를 사용한다. 다음은 외부 메모리를 둘 경우 각 핀 역할을 정리한 것이다.
 * 포트 A의 부가기능
 PA7 : AD7(외부 메모리 인터페이스 주소와 데이터 비트 7)
 PA6 : AD6(외부 메모리 인터페이스 주소와 데이터 비트 6)
 PA5 : AD5(외부 메모리 인터페이스 주소와 데이터 비트 5)
 PA4 : AD4(외부 메모리 인터페이스 주소와 데이터 비트 4)
 PA3 : AD3(외부 메모리 인터페이스 주소와 데이터 비트 3)
 PA2 : AD2(외부 메모리 인터페이스 주소와 데이터 비트 2)
 PA1 : AD1(외부 메모리 인터페이스 주소와 데이터 비트 1)
 PA0 : AD0(외부 메모리 인터페이스 주소와 데이터 비트 0)

 * 포트 B(PB7 ~ PB0 : 핀 10 ~ 17)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, GPIO로 사용되지 않을 경우에는 타이머/카운터나 SPI용 단자 혹은 PWM 단자로도 사용된다. 다음은 특수용도로 사용될 경우 포트 B의 각 핀의 기능을 정리한 것이다.
 * 포트 B의 부가기능
 PB7 : OC2/OC1C(출력비교 또는 타이머/카운터2의 PWM 출력, 또는 출력비교와 타이머/카운터2의  PWM출력 C)
PB6 : OC1B(출력비교 또는 타이머/카운터1의  PWM출력 B)
PB5 : OC1A(출력비교 또는 타이머/카운터1의 PWM 출력 A)
PB4 : OC0(출력비교 뚀는 타이머/카운터0의 PWM 출력)
PB3 : MISO(SPI 버스 마스터 입력/종속 출력)
PB2 : MOSI(SPI 버스 마스터 출력/종속 입력)
PB1 : SCK(SPI 버스 직렬 클럭)
PB0 : /SS(SPI 종속 선택 입력)

 * 포트 C(PC7 ~ PC0 : 핀 35 ~ 42)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 외부메모리를 둘 경우에는 주소버스(A15 ~ A8)로 사용된다. 다음은 외부 메모리를 둘 경우 각 핀 역할을 정리한 것이다.
 * 포트 C의 부가기능
 PC7 : AD7(외부 메모리 인터페이스 주소 비트 15)
 PC6 : AD6(외부 메모리 인터페이스 주소 비트 14)
 PC5 : AD5(외부 메모리 인터페이스 주소 비트 13)
 PC4 : AD4(외부 메모리 인터페이스 주소 비트 12)
 PC3 : AD3(외부 메모리 인터페이스 주소 비트 11)
 PC2 : AD2(외부 메모리 인터페이스 주소 비트 10)
 PC1 : AD1(외부 메모리 인터페이스 주소 비트 9)
 PC0 : AD0(외부 메모리 인터페이스 주소 비트 8)

 * 포트 D(PD7 ~ PD0 : 핀 25 ~32)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 타이머용 단자 혹은 외부인터럽트 단자로도 사용된다. 다음은 특수용도로 사용될 경우 각 핀의 기능을 정리한 것이다.
 * 포트 D의 부가기능
 PD7 : T2(타이머/카운터2 클럭 입력)
 PD6 : T1(타이머/카운터1 클럭 입력)
 PD5 : XCK1(USART1 외부 클럭 입/출력)
 PD4 : IC1(타이머/카운터1 입력 캡쳐 트리거)
 PD3 : INT3/TXD1(외부 인터럽트3 입력 또는 USART1 전송 핀)
 PD2 : INT2/RXD1(외부 인터럽트2 입력 또는 USART1 수신 핀)
 PD1 : INT1/SDA(외부 인터럽트1 입력 또는 TWI 직렬 데이터)
 PD0 : INT0/SCL(외부 인터럽트0 입력 또는 TWI 직렬 클럭)

 * 포트 E(PE7 ~ PE0 : 핀 2 ~ 9)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 타이머용 단자, 외부인터럽트, 아날로그 비교기, USART용 단자로도 사용된다. 다음은 특수용도로 사용될 경우 각 핀의 기능을 정리한 것이다.
 * 포트 E의 부가기능
 PE7 : INT7/IC3(외부 인터럽트 7입력 또는 타이머/카운터3 입력 캡쳐 트리거)
 PE6 : INT6/T3(외부 인터럽트 6입력 또는 타이머/카운터3 클럭 입력)
 PE5 : INT5/OC3C(외부 인터럽트 5 입력 또는 타이머/카운터3의 출력 챕쳐와 PWM 출력 C)
 PE4 : INT4/OC3B(외부 인터럽트 4 입력 또는 타이머 카운터 3의 출력 챕쳐와 PWM 출력 B)
 PE3 : AIN1/OC3A(아날로그 비교 반대입력 또는 타이머/카운터3의 출력 비교와 PWM 출력 A)
 PE2 : AIN0/XCK0(아날로그 비교 입력 또는 USART0 외부 클럭 입/출력)
 PE1 : PD)/TXD0(프로그램 데이터 출력 또는 UART0 전송 핀)
 PE2 : PDI/RXD0(프로그램 데이터 입력 또는 UART0 수신 핀)

 * 포트 F(PF7 ~ PF0 : 핀 54 ~ 61)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, AD변환기 혹은 JTAG 인터페이스용 단자로도 사용된다. 다음은 AD 변환이나, JTAG용도로 사용될 경우의 각 핀 역할을 정의한 것이다.
 * 포트 F의 부가기능
 PF7 : ADC7/TDI(ADC 입력 채널 7 또는 JTAG Test Data Input)
 PF6 : ADC6/TDO(ADC 입력 채널 6 또는 JTAG Test Data Output)
 PF5 : ADC5/TMS(ADC 입력 채널 5 또는 JTAG Test Mode Select)
 PF4 : ADC4/TCK(ADC 입력 채널 4 또는 JTAG Test Clock)
 PF3 : ADC3(ADC 입력 채널 3)
 PF2 : ADC2(ADC 입력 채널 2)
 PF1 : ADC1(ADC 입력 채널 1)
 PF0 : ADC0(ADC 입력 채널 0)

 * 포트 G(PG4 ~ PG0, 핀 19, 18, 43, 34, 33)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 외부 메모리 접속을 위한 스트로브 신호용, RTC(Real Time Counter) 타이머용 발진기 단자로도 사용된다.
 * 포트 G의 부가기능
 PG4 : TOSC1(RTC 오실레이터 타이머/카운터 0)
 PG3 : TOSC2(RTC 오실레이터 타이머/카운터 0)
 PG2 : ALE(외부메모리에 주소 래치 인에이블)
 PG1 : RD(외부메모리에 스트로브 읽기)
 PG0 : WR(외부메모리에 스트로브 쓰기)