반응형

두 개의 텍스트 파일에 각각 아래와 같이 데이터가 있는 경우,


 number.txt

alphabet.txt 

1

2

3

4

5

6

A

B

C

D

E

F


두 파일을 열(column)을 추가하는 형태로 이어붙여야 할 때가 있다. 즉,


1    A

2    B

3    C

4    D

5    E

6    F


이런 형태의 파일을 만들고 싶을 때, paste 명령을 쓰면 된다.


$ paste number.txt alphabet.txt


열 간의 기본 구분자는 탭 문자 '\t'로 되어 있다.

만약 두 열 간에 구분자를 다르게 주고 싶으면 -d 옵션으로 명시한다.


// 공백으로 구분할 때

$ paste -d ' ' number.txt alphabet.txt


// 쉼표로 구분할 때 (csv 파일 포맷)

$ paste -d , number.txt alphabet.txt


참고로 paste 명령 왼쪽에 있는 파일의 라인 수가 오른쪽 파일보다 짧더라도 구분자 문자를 먼저 추가한 다음 내용이 붙기 때문에 구분자를 기준으로 하면 각 column이 독립적으로 데이터를 유지할 수 있다.


 number.txt

alphabet.txt 

1

2

3

4

5

6

A

B

C

D

E

F

G
H
I
J
K


예를 들어 위의 두 파일을 paste로 이어붙이면,


1    A

2    B

3    C

4    D

5    E

6    F

G

H

I

J

K


이렇게 숫자 밑에 알파벳이 오지 않도록 column을 유지하며 붙는다.



반응형
블로그 이미지

Bryan_

,
반응형

Host OS: Ubuntu 14.04 (amd64)

Linux Container template: ubuntu



우분투 데스크탑과 우분투 서버에서는 문제가 없었지만, 우분투 템플릿으로 Linux Container (LXC)를 새로 생성하고 나서 새로운 패키지를 추가하려고 하면 add-apt-repository 명령이 없다고 에러 메세지가 나온다.


이 때 먼저 software-properties-common 패키지를 설치하고 나면 add-apt-repository를 쓸 수 있다.


$ sudo apt-get -y install software-properties-common




*참고


참고로 add-apt-repository 명령을 치면 무조건 사용자에게 추가할 것인지 한 차례 물어보고 엔터 키를 치면 진행을 하게 되는데, 여기서 사용자의 입력을 생략하고 무조건 실행되도록 하려면 맨 끝에 -y 옵션을 주면 된다. [1]


$ sudo add-apt-repository ppa:openjdk-r/ppa -y


위 예시는 openjdk 패키지를 설치하기 위한 ppa를 추가한 것이다.


일반적인 우분투 터미널에서는 결국 sudo privilege를 얻기 위해서 사용자 패스워드를 입력해야만 하지만, 적어도 기본적으로 root 계정으로 켜지는 Linux Container의 경우에는 저렇게 해 주면 자동으로 진행되므로 편한 점이 있다.


# add-apt-repository ppa:openjdk-r/ppa -y




<참고자료>

[1] http://askubuntu.com/questions/304178/how-do-i-add-a-ppa-in-a-shell-script-without-user-input




반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 16.04 (amd64)



새로 설치한 지 얼마 안된 우분투 16.04 머신에서 원래 잘 되던 패키지 설치(apt-get install)가 갑자기 진행이 안되면서 아래와 같이 install-info 를 processing하는 동안 에러가 발생했다는 메세지를 내뱉었다.


아래 출력은 openmpi 관련된 패키지를 설치하려고 시도하면서 발생한 에러를 그대로 가져온 것이다.



skylit@ns3sim:~$ sudo apt-get install libopenmpi1.10 libopenmpi-dev openmpi-common openmpi-bin 

Reading package lists... Done

Building dependency tree       

Reading state information... Done

The following additional packages will be installed:

  autotools-dev libhwloc-dev libhwloc-plugins libhwloc5 libibverbs-dev libibverbs1 libltdl-dev libnuma-dev libtool ocl-icd-libopencl1

Suggested packages:

  libhwloc-contrib-plugins libtool-doc opennmpi-doc autoconf automaken gfortran | fortran95-compiler gcj-jdk opencl-icd gfortran openmpi-checkpoint

The following NEW packages will be installed:

  autotools-dev libhwloc-dev libhwloc-plugins libhwloc5 libibverbs-dev libibverbs1 libltdl-dev libnuma-dev libopenmpi-dev libopenmpi1.10 libtool ocl-icd-libopencl1 openmpi-bin

  openmpi-common

0 upgraded, 14 newly installed, 0 to remove and 267 not upgraded.

1 not fully installed or removed.

Need to get 3,618 kB of archives.

After this operation, 15.5 MB of additional disk space will be used.

Do you want to continue? [Y/n] 

Get:1 http://kr.archive.ubuntu.com/ubuntu xenial/main amd64 autotools-dev all 20150820.1 [39.8 kB]

Get:2 http://kr.archive.ubuntu.com/ubuntu xenial/main amd64 libltdl-dev amd64 2.4.6-0.1 [162 kB]

Get:3 http://kr.archive.ubuntu.com/ubuntu xenial/main amd64 libtool all 2.4.6-0.1 [193 kB]

Get:4 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 libhwloc5 amd64 1.11.2-3 [99.5 kB]

Get:5 http://kr.archive.ubuntu.com/ubuntu xenial/main amd64 libibverbs1 amd64 1.1.8-1.1ubuntu2 [25.0 kB]

Get:6 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 libopenmpi1.10 amd64 1.10.2-8ubuntu1 [2,025 kB]

Get:7 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 openmpi-common all 1.10.2-8ubuntu1 [129 kB]

Get:8 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 openmpi-bin amd64 1.10.2-8ubuntu1 [100 kB]

Get:9 http://kr.archive.ubuntu.com/ubuntu xenial/main amd64 libnuma-dev amd64 2.0.11-1ubuntu1 [31.7 kB]

Get:10 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 libhwloc-dev amd64 1.11.2-3 [155 kB]

Get:11 http://kr.archive.ubuntu.com/ubuntu xenial/main amd64 ocl-icd-libopencl1 amd64 2.2.8-1 [29.7 kB]

Get:12 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 libhwloc-plugins amd64 1.11.2-3 [13.2 kB]

Get:13 http://kr.archive.ubuntu.com/ubuntu xenial/main amd64 libibverbs-dev amd64 1.1.8-1.1ubuntu2 [77.6 kB]

Get:14 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 libopenmpi-dev amd64 1.10.2-8ubuntu1 [537 kB]

Fetched 3,618 kB in 1s (2,992 kB/s)      

Setting up install-info (6.1.0.dfsg.1-5) ...

/usr/sbin/update-info-dir: 2: /etc/environment: LC: not found

dpkg: error processing package install-info (--configure):

 subprocess installed post-installation script returned error exit status 127

Errors were encountered while processing:

 install-info

E: Sub-process /usr/bin/dpkg returned an error code (1)

skylit@ns3sim:~$



SuperUser에 찾아보니 /etc/environment 파일을 아래와 같이 고치면 해결된다고 한다.


/etc/environment 파일:

LC_ALL="en_US.UTF-8"


실제로 내가 /etc/environment 파일을 열어 보니, LC와 ALL 사이, 그리고 en과 US 사이가 밑줄이 아니라 공백으로 되어 있었다. (LC ALL="en US.UTF-8"


그런데 나는 해당 파일을 전혀 손댄 적이 없었고, 처음에는 이것저것 패키지 설치가 잘 되었던 기억이 나는데, 도대체 어떻게 고쳐진 것일까? ;;





<참고자료>

[1] "Ubuntu 10.04 - install-info error during update", 
http://superuser.com/questions/129049/ubuntu-10-04-install-info-error-during-update



반응형
블로그 이미지

Bryan_

,
반응형

Host OS: Ubuntu 16.04 (amd64)
Container template: ubuntu


ubuntu 템플릿을 가지고 Linux Container를 만들고 난 직후에 환경변수가 하나도 잡혀 있지 않아서 몇 가지 불편한 점이 있었다.

vi는 HOME 환경변수를 참조해야 하는데 없어서 설정파일 저장을 못하고, screen 툴은 TERM 환경변수가 없어서 아예 실행이 안되는 문제가 있었다. 그 외에도 PATH 환경변수가 없으니까 심지어 apt-get install조차 안되었다.


내가 Linux Container 생성 단계에서 뭔가 빠뜨린 것인지 모르겠지만, 일단 기본으로 생성한 Container에서 필요한 몇 가지 환경 변수를 메모하게 되었다.


TERM은 vt100이 무난하다는 의견이 있어서 이것으로 했다. 이렇게 적용했더니 쉘에서 ls를 쳤을 때 파일 종류별로 색상이 달라지는 등 소소한 변화가 있었다. 아니면 xterm을 써도 상관없다.


$ export TERM=vt100



그냥 Container를 만들고 시작하면 root 계정으로 들어가길래 /root/를 HOME으로 설정했다.


$ export HOME=/root/



PATH의 경우 일단 최소한으로 시스템 도구들의 위치를 참조하게 했다.


$ export PATH=$PATH:/usr/local/sbin/

$ export PATH=$PATH:/usr/sbin/                         

$ export PATH=$PATH:/sbin



이 환경변수 값들을 /root/.bashrc 파일에 추가해줄 수도 있지만, Container는 full virtualization처럼 이미지 파일로 독립된 공간을 유지하는 것 같지 않아서 잘 모르겠다. Container를 더 익숙하게 사용하게 되면 이 글을 다시 고칠 예정이다.


반응형
블로그 이미지

Bryan_

,
반응형

Host OS: Ubuntu 16.04 LTS (amd64)


Linux Container를 이용해서 ns-3에서 네트워크 시뮬레이션을 할 필요가 생겼다. 일단 ns-3 공식 사이트에 나와 있는 튜토리얼을 따라해 보니 Linux Container 생성은 되는데, 외부 네트워크에 접속할 수 없다. 개별 네트워크 설정이 가능한 Container가 인터넷이 되게 하는 방법은 VM과 다를 바가 없지만, Container 생성 단계에서 약간의 작업이 들어가기 때문에 기록하게 되었다.



1. Host 머신 설정


Host가 Container들을 브릿지로 관리하는지, NAT로 관리하는지에 따라 설정이 다른데, 여기서는 NAT를 쓰는 경우를 기준으로 설명한다.


우분투에 lxc를 설치하고 나면 자동으로 브릿지가 하나 생성되어 있는데 보통 br과 lxc라는 단어가 동시에 들어가 있다. 필자의 경우 lxcbr0 이름으로 브릿지가 생성되어 있었고, IP주소는 10.0.3.1로 잡혀 있었다.


(Host에서 lxc 설치 후에 lxcbr0 인터페이스가 새로 생긴 것을 확인할 수 있다.)



Host에서 NAT를 통해 인터넷 접속을 허용하기 위해서 몇 가지 작업을 해 줘야 한다. 먼저 iptables에서 NAT 내부에서 인터넷으로 나가는 패킷을 masquerade 시켜 준다.

$ sudo iptables -t nat -A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE


그리고 /etc/sysctl.conf 파일에서,


net.ipv4.ip_forward=1 

위 라인의 주석을 제거한 다음, sysctl을 새로 적용한다.


$ sudo sysctl -p /etc/sysctl.conf



일단 ns-3에서 Linux Container를 생성해서 "시뮬레이션용 네트워크"에 연결하는 튜토리얼 [1] 을 따라해 보면 샘플 lxc 설정 파일이 있는데, 여기에 외부접속 용도의 네트워크 인터페이스를 하나 추가해 준다.


(NOTE)

ns-3 용도가 아니라 일반 VM처럼 쓰고 싶으면 네트워크 인터페이스를 굳이 여러 개 할 필요는 없고, 기본으로 설정하는 한 개의 네트워크 인터페이스 구성을 변경하면 된다.



lxc 설정 파일(여기서는 ns-3에서 샘플로 쓰는 lxc-left.conf 파일에 내용 추가 [1])에 아래 내용을 추가한다.


# Container with network virtualized using a pre-configured bridge named br-left and

# veth pair virtual network devices

lxc.utsname = left

lxc.network.type = veth

lxc.network.flags = up

lxc.network.link = br-left

lxc.network.ipv4 = 10.0.0.1/24


######################################

# 여기 아래부터 새로 추가한 부분

######################################

lxc.network.type = veth

lxc.network.flags = up

lxc.network.link = lxcbr0    <-- Host에 있는 브릿지 인터페이스 이름

lxc.network.ipv4 = 10.0.3.2/24  <-- Host 브릿지의 IP주소 대역에 있는 주소

lxc.network.name = eth1 <-- Container에서 보여지는 인터페이스 이름(임의설정 가능)


이제 위의 설정파일을 가지고 left라는 이름의 Container를 생성하고 시작한다.

$ sudo lxc-create -n left -f lxc-left.conf -t /usr/share/lxc/templates/lxc-ubuntu

$ sudo lxc-start -n left -F /bin/bash



2. Container 내부 설정


만약 Container가 정상적으로 생성되었다면 left라는 이름의 root 계정으로 쉘 프롬프트가 바뀔 것이다. ifconfig를 쳐 보면 아래와 같이 eth1 인터페이스가 인식되는 것을 볼 수 있다. (eth0의 경우는 원래 설정되어 있던 것)


(lxc-left.conf 설정파일에 새로 추가한 eth1 인터페이스가 설정한 IP주소 

10.0.3.2로 표시되는 것을 확인할 수 있다.)


Container를 시작한 직후에는 default route가 설정되어 있지 않기 때문에 인터넷 상의 머신으로 ping이 되지 않는다. 따라서 Container 상의 쉘에서 Host 머신과 연결하는 route를 추가한다. Host 머신의 lxcbr0 인터페이스의 IP주소가 10.0.3.1이기 때문에, default route의 게이트웨이를 10.0.3.1로 설정한다.


root@left:/root# route add default gw 10.0.3.1



여기까지 설정하면 IP주소를 통해 인터넷 상의 아무 컴퓨터에나 접속할 수는 있다. 다만 도메인 네임 서버가 설정되어 있지 않으므로 www.google.com 과 같은 도메인 네임으로는 주소를 찾을 수 없다.


도메인 네임 서버 설정은 여러가지 방법이 있지만, Container 자체가 약간 휘발성에 잠시 쓰는 느낌이 있어서, 일단 임시방편으로 /etc/resolv.conf 파일을 직접 수정했다. (좋은 방법은 아닌 것 같지만... 당장 되긴 되니까.)

네임서버는 일단 구글 도메인 네임 서버(8.8.4.4)로 했는데, 국내 다른 도메인 네임 서버로 설정해도 상관이 없다.


root@left:/root# echo "nameserver 8.8.4.4" > /etc/resolv.conf


여기까지 하고 나면 인터넷에 접속이 된다. 
이제부터 apt-get install 을 써서 원하는 패키지를 설치할 수 있다.




<참고자료>

[1] https://www.nsnam.org/wiki/HOWTO_Use_Linux_Containers_to_set_up_virtual_networks#Running_an_ns-3_Simulated_CSMA_Network



반응형
블로그 이미지

Bryan_

,