BESS 개발 노트 01: BESS 설치 및 기본 사용법

소개



이것은 BESS(Berkeley Extensible Software Switch)의 개발에 관한 가이드북이다. 공식 Wiki에는 영어판 밖에 없는 데다 내용도 적다, 그래서 이 메모를 쓴다. 이 메모에는 공식 위키에 있는 중요한 내용도 포함하여 자신이 개발, 소스 코드를 읽을 때의 이해와 발견 등이 포함되어 있다.
만약 누군가의 도움이 되면, 그것은 다행이 된다.

공식 페이지 -> BESS
공식 Wiki와 Repo -> BESS Wiki

개발 환경



Ubuntu 18.04 LTS 권장

VMware에서 우분투를 설치하는 것이 좋습니다. 스냅샷 기능을 활용하여 시스템에 회복 불가능한 데미지가 나오면 쉽게 정상 상태로 돌아갈 수 있다.
결코 VM에 충분한 메모리를 설치하는 것, 2~4GB의 기준.

종속성 설치



BESS에는 다음 소프트 패키지가 필요합니다.
sudo apt install make apt-transport-https ca-certificates g++ make pkg-config libunwind8-dev liblzma-dev zlib1g-dev libpcap-dev libssl-dev libnuma-dev git python python-pip python-scapy libgflags-dev libgoogle-glog-dev libgraph-easy-perl libgtest-dev libgrpc++-dev libprotobuf-dev libc-ares-dev libbenchmark-dev libgtest-dev protobuf-compiler-grpc
pip install --user protobuf grpcio scapy

빌드



Repo에서 복제 및 스크립트 실행:
git clone https://github.com/NetSys/bess.git
cd bess/
sudo ./build.py

다음 출력이라면 빌드 성공 :
> sudo ./build.py
Configuring DPDK...
 - "Mellanox OFED" is not available. Disabling MLX4 and MLX5 PMDs...
Building DPDK...
Generating protobuf codes for pybess...
Building BESS daemon...
Building BESS kernel module (4.15.0-74-generic - running kernel) ...
Done.

주의사항


  • 만약 빌드의 도중에 DPDK의 다운로드를 할 수 없게 되면, 출력을 따라서, 메뉴얼로 다운로드해, ​​폴더 deps 로 해동, 그리고 한번 더 빌드한다.
  • 만약 core 의 소스 코드를 긁으면, 재빌드의 전과 관련된 *.o 파일을 삭제하는 것을 추천한다.
  • 폴더 core/pb 에 있는 소스 코드는 protobuf로 생성하기 때문에 빌드 전에 아무것도 없다.
  • 모든 warning은 error로서 취급하고 있다. error가 있으면 빌드는 절대로 실패한다.
  • hugepage의 설치는 결코 빌드 후에 하는 것. 순서가 잘못되면 다음 오류가 발생할 수 있습니다.
  • Log:
     make: Entering directory '/home/****/bess/core'
    [CXX]       opts.o
    [CXX]       worker.o
    [CXX]       packet_pool.o
    [CXX]       task.o
    [CXX]       resume_hook.o
    [CXX]       memory.o
    [CXX]       dpdk.o
    [CXX]       event.o
    [CXX]       gate.o
    [CXX]       port.o
    [CXX]       main.o
    [CXX]       debug.o
    [CXX]       module_graph.o
    [CXX]       bessctl.o
    g++: internal compiler error: Killed (program cc1plus)
    Please submit a full bug report,
    with preprocessed source if appropriate.
    See <file:///usr/share/doc/gcc-7/README.Bugs> for instructions.
    Error: bessctl.o
    g++ -o bessctl.o -c bessctl.cc -std=c++17 -g3 -ggdb3 -march=native -isystem /home/****/bess/deps/dpdk-17.11/build/include -isystem /home/****/bess/core -isystem ./.. -isystem /home/****/bess/core/modules -D_GNU_SOURCE -Werror -Wall -Wextra -Wcast-align -Wno-error=deprecated-declarations -pthread -I/usr/include/x86_64-linux-gnu -fno-gnu-unique -O3 -DNDEBUG -MT bessctl.o -MMD -MP -MF .deps/bessctl.d
    Makefile:439: recipe for target 'bessctl.o' failed
    make: *** [bessctl.o] Error 1
    make: Leaving directory '/home/****/bess/core'
    
    Error has occured running command: make -j1 -C core
    

    hugepage 설치



    매번 재부팅하려면이 설치가 필요합니다.

    다음 명령을 실행합니다(시스템에 따라 명령이 다름):
    # For single-node systems
    sudo sysctl vm.nr_hugepages=1024
    
    # For multi-node (NUMA) systems
    echo 1024 | sudo tee /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
    echo 1024 | sudo tee /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
    

    BESS를 시작하고 테스트 스크립트 실행



    다음 명령 실행
    > sudo bessctl/bessctl
    Type "help" for more information.
    Connection to localhost:10514 failed
    Perhaps bessd daemon is not running locally? Try "daemon start".
    <disconnected> $
    

    그런 다음 daemon start 실행 :
    Done.
    localhost:10514 $
    

    이때 BESS는 이미 시작되었다.

    특정 테스트 스크립트를 실행해 보겠습니다.
    $ run samples/acl
    

    결과:
    Done.
    localhost:10514 $
    

    아무런 출력도 없다. 그 원인은, 이 스크립트에는 어떤 출력 커멘드도 포함하고 있지 않다.monitor pipeline 명령을 입력하면 다음 출력이 표시됩니다.



    이것은 테스트 스크립트를 성공적으로 실행하는 간증입니다.

    주의사항



    이제 Linux에서는 Python3을 사용하고 있지만 BESS에는 Python2로 작성하므로 다음 오류 메시지가 표시되면 :
    Traceback (most recent call last):
      File "bessctl/bessctl", line 186, in <module>
        main()
      File "bessctl/bessctl", line 170, in main
        run_cli()
      File "bessctl/bessctl", line 159, in run_cli
        cli.loop()
      File "bessctl/bessctl", line 134, in loop
        super(BESSCLI, self).loop()
      File "/home/****/bess/bessctl/cli.py", line 528, in loop
        self.process_one_line()
      File "/home/****/bess/bessctl/cli.py", line 440, in process_one_line
        self.call_func(func, args)
      File "bessctl/bessctl", line 95, in call_func
        super(BESSCLI, self).call_func(func, args)
      File "/home/****/bess/bessctl/cli.py", line 411, in call_func
        func(*args)
      File "/home/****/bess/bessctl/commands.py", line 1720, in monitor_pipeline
        _monitor_pipeline(cli, 'pkts', '', graph_args=opts)
      File "/home/****/bess/bessctl/commands.py", line 1711, in _monitor_pipeline
        graph_args=graph_args))
      File "/home/****/bess/bessctl/commands.py", line 1389, in _draw_pipeline
        node_labels[gate.name]), file=f.stdin)
    TypeError: a bytes-like object is required, not 'str
    

    Python2에서 bessctl 실행 :python2 bessctl/bessctl

    계속



    다음은 BESS 스크립트를 작성하는 방법을 소개합니다. BESS가 가지고 있는 모듈을 사용하는 방법도 이해할 수 있을 것이다.

    좋은 웹페이지 즐겨찾기