]> git.feebdaed.xyz Git - linuxyz.git/commitdiff
readme
authorseantywork <seantywork@gmail.com>
Tue, 18 Nov 2025 04:45:16 +0000 (13:45 +0900)
committerseantywork <seantywork@gmail.com>
Tue, 18 Nov 2025 04:45:16 +0000 (13:45 +0900)
README.md
docs/README.md [deleted file]

index 81008c4a8c7b0aa542595b1dc374baa3e8d942fc..c144659c979b69560e595bd11c42f9a256a31f85 100644 (file)
--- a/README.md
+++ b/README.md
 # linuxyz
 
-- [docs](docs)
\ No newline at end of file
+***crap compilation of mostly Linux stuff***
+
+
+**Disclaimer : I am not liable for any misuse of this code Only use it on machines and in environments that you have explicit permissions and authrizations to do so**
+
+
+# LINUX
+
+```shell
+
+
+# process & memory (arch_mem)
+   process, hardware interrupt (timer) -> kernel -> process -> hardware interrupt(timer)..., threads, scheduling, pcb
+   memory, kernel space, user space, virtual address (page num + distance), physical address, page table, page, frame, mmu, tlb, major fault, minor fault
+   ps, top, lsof, strace, ltrace, renice, uptime, trace-cmd, kernelshark
+   vmstat, iostat, iotop, pidstat
+   cgroup, /proc/self/cgroup, /sys/fs/cgroup
+
+# device (driver)
+   rootfs, /bin, /dev, /etc, /home, /lib, /proc, /run, /sys, /sbin, /tmp, /usr, /var, /boot, /media, /opt
+   /dev, block, character, pipe, socket, user i/o oriented, /sys/devices, actual device info
+     udev, devtmpfs, kernel sends uevent to udev, udev initializes and registers devices, in devtmpfs when booting
+     udevadm info --query=all --name=/dev/sda, udevadm monitor
+     kernel block device interface < - > scsi device driver < - > bus < - > (ATA, USB...) bridge driver < - > device
+   disk, partition table -> partition -> fs data structure -> fs (maybe rootfs) data
+     parted -l, fdisk /dev/sdd, mkfs -t ext4 /dev/sdf2, mount -t ext4 /dev/sdf2 /home/some, umount /home/some, blkid, /etc/fstab
+     lvm, pvs, pvdisaply, vgs, vgdisplay, lvs, lvdisplay, pvcreate,vgcreate, vgextend, lvcreate, lvextend
+     block device (kernel) > devmapper (kernel) > lvm (user)
+     inode (data pointer), block bitmap (allocation pointer), fsck > inode != block bitmap > lost + found
+   network, physical, internet, transport, application, ipv4, ipv6
+     ping, host, ip, iw, linux network interface
+     netplan, /etc/netplan, networkmanager, /etc/NetworkManager
+     /etc/hosts, /etc/resolv.conf, /etc/nsswitch.conf
+     netstat, tcp, udp
+     iptables
+     user process < - > kernel socket (system call) < - > network
+     ipc (inter process communication) > unix domain socket > eg) mysql.sock
+     rsync
+# syscall & user mode (os)
+  shell
+  build-essential
+  go
+  make
+  git
+  curl
+  podman
+  chrome
+  libreoffice
+  vscode
+  virsh
+  wireshark
+  gh
+
+
+harware (interrupt)
+
+kernel vas
+
+  interrupt (hard, soft irq)
+
+  process 
+
+process vas
+
+  user (syscall)
+
+
+```
+
+
+```shell
+
+# process & memory
+
+# procfs : /proc/*
+
+# kernel stacks
+
+cat /proc/$PID/stack
+
+# user stacks
+
+gdb
+
+# both
+
+# use eBPF
+
+sudo stackcount-bpfcc -p $PID -v -d
+
+# device
+
+# sysfs: /sys/*
+
+```
+
+```shell
+
+# network protocol
+
+# l2 link
+
+(ethernet)
+preamble
+src
+dst
+type/len
+data (payload)
+
+switch > mac address table > flooding, filtering and forwarding, ageing
+
+# l3 network
+
+(ipv4)
+version
+headlen
+servicetype
+packetlen
+identifier
+flagmentation offset
+ttl
+proto
+header csum
+src 
+dst
+option
+padding
+data(payload)
+-
+(ipv6)
+version
+traffic class
+flow label
+payload len
+next header
+hop limitation
+src
+dst
+data(payload)
+-
+(arp)
+hardware type
+proto type
+hardware addrlen
+proto addr len
+op code
+src hardware addr
+src proto addr
+dst hardware addr
+dst proto addr
+
+-
+router > routing table > NAT, NAPT
+
+
+# l4 transport
+
+(icmp)
+-
+(tcp)
+src port
+dst port
+sequence
+confirmation reply number
+data offset
+reserved
+control bit (syn, ack, fin…)
+window
+checksum
+emergency ptr
+option
+data (payload)
+-
+(udp)
+src port
+dst port
+len
+checksum
+data(payload)
+
+```
+
+
+# LINUX KERNEL MODULE
+
+```shell
+
+lsmod
+
+insmod
+rmmod
+
+depmod
+
+modprobe
+
+modprobe -r
+
+
+
+```
+```shell
+# auto load:  insert module load command to
+
+# /etc/modules-load.d/foo.conf
+# or
+# /etc/modprobe.d/foo.conf
+foo
+
+```
+
+```shell
+
+# blacklist: insert line to
+
+# /etc/modules-load.d/foo.conf
+# or
+# /etc/modprobe.d/foo.conf
+blacklist foo
+
+```
+
+```shell
+
+# dkms
+# autobuild when kernel update
+
+# add dkms.conf
+dkms add . -m $MODULE_NAME -v $VERSION
+
+dkms autoinstall
+
+# or
+
+dkms build $MODULE -v $VERSION
+
+dkms install $MODULE -v $VERSION
+
+
+```
+
+```shell
+# manually create dev without using udev
+
+sudo mknod "${DEVNM}" c ${MAJOR} ${MINOR}
+
+```
+
+# LINUX BOOT
+
+```shell
+boot (firm)
+
+bios | uefi -> grub -> vmlinuz, initramfs -> device and drivers -> rootfs mount -> init (pid 1, systemd, user space) -> log in
+
+kernel inspection, cpu, memory, device bus, device, aux kernel subsys(networking...), rootfs, user space
+
+init(systemd)
+  systemctl, unit, /etc/systemd, /lib/systemd, /usr/systemd...
+    target, service, socket, mount...
+```
+
+# GRUB
+
+```shell
+# check partition and images
+
+ls
+
+linux (hd0,1)/vmlinuz root=/dev/sda1
+
+initrd (hd0,1)/initrd.img
+
+boot
+
+```
+
+# LINUX KERNEL BUILD
+
+```shell
+
+# packages
+
+sudo apt update
+
+
+sudo apt install -y git fakeroot build-essential tar ncurses-dev \
+    tar xz-utils libssl-dev bc stress python3-distutils libelf-dev \
+    linux-headers-$(uname -r) bison flex libncurses5-dev util-linux net-tools "linux-tools-$(uname -r)" exuberant-ctags cscope \
+    sysfsutils gnome-system-monitor curl perf-tools-unstable \
+    gnuplot rt-tests indent tree psmisc smem libnuma-dev numactl \
+    hwloc bpfcc-tools sparse flawfinder cppcheck bsdmainutils \
+    trace-cmd virt-what dwarves 
+
+
+# get source
+
+curl -o /tmp/linux-5.5.1.tar.xz https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.5.1.tar.xz
+
+# or clone
+
+git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
+
+mv /tmp/linux-5.5.1.tar.xz ~
+
+cd ~
+
+tar -xf linux-5.5.1.tar.xz
+
+# default
+    LLKD_KSRC="$HOME/linux-5.5.1"
+    cp /boot/config-5.4.0-148-generic "$LLKD_KSRC/.config"
+    cd "$LLKD_KSRC"
+    make menuconfig
+
+# localmod
+    LLKD_KSRC="$HOME/linux-5.5.1"
+    lsmod > /tmp/lsmod.now
+    cd "$LLKD_KSRC"
+    make LSMOD=/tmp/lsmod.now localmodconfig
+    make menuconfig
+
+# ubuntu specific
+
+scripts/config --disable SYSTEM_TRUSTED_KEYS
+scripts/config --disable SYSTEM_REVOCATION_KEYS
+
+# change config
+
+LLKD_KSRC="$HOME/linux-5.5.1"
+
+cp "$LLKD_KSRC/init/Kconfig" "$LLKD_KSRC/init/Kconfig.orig"
+
+vim "$LLKD_KSRC/init/Kconfig"
+
+# build
+
+cd "$LLKD_KSRC"
+
+time make -j4
+
+
+# module install
+
+cd "$LLKD_KSRC"
+
+sudo make modules_install
+
+ls /lib/modules
+
+
+# boot image and initramfs
+
+LLKD_KSRC="$HOME/linux-5.5.1"
+
+
+cd "$LLKD_KSRC"
+
+sudo make install
+
+
+# boot update 
+
+sudo cp /etc/default/grub /etc/default/grub.orig
+
+sudo vim /etc/default/grub
+
+sudo update-grub
+
+
+# ui mode switch
+
+Ctrl + Alt + F2
+
+
+# make iso
+
+sudo apt install genisofs
+
+mkdir /bck
+
+# with isolinux at the top "/boot" directroy - relative to source path
+
+mkisofs -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -joliet-long -R -x /bck -x /proc -x /tmp -x /mnt -x /dev -x /sys -x /run -x /media -x /var/log -x /var/cache/apt/archives -o /bck/<name>.iso /
+
+# then extract iso using scp or whatever
+
+sudo isohybrid /bck/<output>.iso
+
+
+```
+
+# LINUX KERNEL BUILD DEB PKG PATCH REAL TIME
+
+```shell
+
+
+sudo apt install build-essential git libssl-dev libelf-dev flex bison
+
+# first find the closest available rt patch for current kernel(uname -a)
+# then get
+
+wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.143.tar.xz
+
+wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.143-rt64.patch.xz
+
+
+tar -xf linux-5.4.143.tar.xz
+cd linux-5.4.143
+xzcat ../patch-5.4.143-rt64-rc2.patch.xz | patch -p1
+
+cp /boot/config-5.4.0-81-generic .config
+make oldconfig
+
+# preempt_rt > Y
+
+vim .config
+
+# delete value as below
+
+CONFIG_SYSTEM_TRUSTED_KEYS=""
+CONFIG_MODULE_SIG_KEY=""
+CONFIG_SYSTEM_REVOCATION_KEYS=""
+
+# comment out
+
+CONFIG_MODULE_SIG_FORCE
+CONFIG_DEBUG_INFO_BTF
+CONFIG_MODULE_SIG_ALL
+
+# build kernel
+# with git repo
+make -j4 deb-pkg
+# not with git repo
+make -j4 bindeb-pkg
+
+# install
+
+sudo dpkg -i ../linux-headers-5.4.143-rt64-rc2_5.4.143-rt64-1_amd64.deb ../linux-image-5.4.143-rt64_5.4.143-rt64-1_amd64.deb ../linux-libc-dev_5.4.143-rt64-1_amd64.deb
+
+
+reboot
+
+```
+
+# LINUX KERNEL MODULE DRIVER CHANGE
+
+```shell
+
+# net example
+
+sudo mv /lib/modules/$(uname -r)/kernel/drivers/net/igb/igb.ko{,.bak}
+
+echo 'blacklist igb' > /etc/modprobe.d/blacklist.conf
+
+# build and install new driver module
+
+depmod
+
+sudo update-initramfs -c -k $(uname -r)
+
+```
+
+
+# LINUX DIAGNOSTIC
+
+```shell
+journalctl -f
+journalctl -xe
+journalctl -k
+journalctl -b
+dmesg
+dmest -wH
+efibootmgr
+```
+
+# LINUX KERNEL PANIC KDUMP
+
+```shell
+
+# should be enabled
+# /boot/config-$(uname -r)
+
+CONFIG_RELOCATABLE=y
+CONFIG_KEXEC=y
+CONFIG_CRASH_DUMP=y
+CONFIG_DEBUG_INFO=y
+
+
+sudo apt update
+
+sudo apt install kdump-tools crash kexec-tools makedumpfile
+
+# dbg symbol package
+
+sudo apt install ubuntu-dbgsym-keyring
+
+sudo echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
+deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
+deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
+sudo tee -a /etc/apt/sources.list.d/ddebs.list
+
+sudo apt update
+
+sudo apt install linux-image-$(uname -r)-dbgsym
+
+# yes
+
+# reboot
+
+sudo grep USE_KDUMP /etc/default/kdump-tools
+
+sudo grep LOAD_KEXEC /etc/default/kexec
+
+# check
+
+sudo kdump-config show
+
+# after panic and reboot
+
+sudo -i
+
+cd /var/crash/$CRASH_TIMESTAMP
+
+root@ubuntu24-8:/var/crash/xx# ls
+dmesg.xx  dump.xx
+
+# read dump
+
+crash /usr/lib/debug/boot/vmlinux-$(uname -r) dump.xx
+```
+
+# GCC G++ CLANG COMPILE
+
+```shell
+
+# install 
+
+sudo apt install build-essential clang llvm clang-tidy cppcheck
+
+--std=c99 
+
+--std=c++11
+
+--std=c++14
+
+-g  # for gdb
+
+-Wall
+
+-l # for linking
+
+-c # for unlinked object file
+
+-I # inlcude dir
+
+-L # library directory
+
+-Wl,-rpath=  # library directory (for dynamic loader)
+
+-c -fPIC # for .so
+
+-shared # for .so
+
+# ex) 
+# gcc -c -Wall -o solimod.o -fpic lib/sorrylinusmod/mod/solimod.c
+# gcc -shared -o libsolimod.so solimod.o
+
+ar rcs # for .a
+
+# ex)
+# gcc -c -o out.o out.c
+# ar rcs libout.a out.o
+
+-D  # define variable
+
+-fanalyzer # on static analysis
+
+clang-tidy # clang static analysis
+
+clang-tidy src/main.c -- -I.
+
+cppcheck # yet another static analysis
+
+cppcheck --enable=all -I. src/main.c
+
+```
+
+
+# GDB DEBUGGER C C++ GO BINARY DEBUG
+
+```shell
+Startup 
+% gdb -help            print startup help, show switches
+*% gdb object          normal debug 
+*% gdb object core     core debug (must specify core file)
+%% gdb object pid      attach to running process
+% gdb                  use file command to load object 
+
+Help
+*(gdb) help            list command classes
+(gdb) help running      list commands in one command class
+(gdb) help run         bottom-level help for a command "run" 
+(gdb) help info         list info commands (running program state)
+(gdb) help info line    help for a particular info command
+(gdb) help show         list show commands (gdb state)
+(gdb) help show commands        specific help for a show command
+
+Breakpoints
+*(gdb) break main       set a breakpoint on a function
+*(gdb) break 101        set a breakpoint on a line number
+*(gdb) break basic.c:101        set breakpoint at file and line (or function)
+*(gdb) info breakpoints        show breakpoints
+*(gdb) delete 1         delete a breakpoint by number
+(gdb) delete           delete all breakpoints (prompted)
+(gdb) clear             delete breakpoints at current line
+(gdb) clear function    delete breakpoints at function
+(gdb) clear line        delete breakpoints at line
+(gdb) disable 2         turn a breakpoint off, but don't remove it
+(gdb) enable 2          turn disabled breakpoint back on
+(gdb) tbreak function|line        set a temporary breakpoint
+(gdb) commands break-no ... end   set gdb commands with breakpoint
+(gdb) ignore break-no count       ignore bpt N-1 times before activation
+(gdb) condition break-no expression         break only if condition is true
+(gdb) condition 2 i == 20         example: break on breakpoint 2 if i equals 20
+(gdb) watch expression        set software watchpoint on variable
+(gdb) info watchpoints        show current watchpoints
+
+Running the program
+*(gdb) run             run the program with current arguments
+*(gdb) run args redirection        run with args and redirection
+(gdb) set args args...        set arguments for run 
+(gdb) show args        show current arguments to run
+*(gdb) cont            continue the program
+*(gdb) step            single step the program; step into functions
+(gdb) step count       singlestep \fIcount\fR times
+*(gdb) next            step but step over functions 
+(gdb) next count       next \fIcount\fR times
+*(gdb) CTRL-C          actually SIGINT, stop execution of current program 
+*(gdb) attach process-id        attach to running program
+*(gdb) detach        detach from running program
+*(gdb) finish        finish current function's execution
+(gdb) kill           kill current executing program 
+
+Core 
+(gdb) generate-core-file  generate core dump file
+
+Thread
+(gdb) info threads             get threads 
+(gdb) thread id                switch to thread with id
+(gdb) thread apply id action   apply action to thread id
+
+Stack backtrace
+*(gdb) bt              print stack backtrace
+(gdb) frame            show current execution position
+(gdb) up               move up stack trace  (towards main)
+(gdb) down             move down stack trace (away from main)
+*(gdb) info locals      print automatic variables in frame
+(gdb) info args         print function parameters 
+
+Browsing source
+*(gdb) list 101                list 10 lines around line 101
+*(gdb) list 1,10        list lines 1 to 10
+*(gdb) list main       list lines around function 
+*(gdb) list basic.c:main        list from another file basic.c
+*(gdb) list -          list previous 10 lines
+(gdb) list *0x22e4      list source at address
+(gdb) cd dir           change current directory to \fIdir\fR
+(gdb) pwd              print working directory
+(gdb) search regexpr    forward current for regular expression
+(gdb) reverse-search regexpr        backward search for regular expression
+(gdb) dir dirname       add directory to source path
+(gdb) dir              reset source path to nothing
+(gdb) show directories        show source path
+
+Browsing Data
+*(gdb) print expression        print expression, added to value history
+*(gdb) print/x expressionR        print in hex
+(gdb) print array[i]@count        artificial array - print array range
+(gdb) print $          print last value
+(gdb) print *$->next    print thru list
+(gdb) print $1         print value 1 from value history
+(gdb) print ::gx        force scope to be global
+(gdb) print 'basic.c'::gx        global scope in named file (>=4.6)
+(gdb) print/x &main     print address of function
+(gdb) x/countFormatSize address        low-level examine command
+(gdb) x/x &gx          print gx in hex
+(gdb) x/4wx &main       print 4 longs at start of \fImain\fR in hex
+(gdb) x/gf &gd1         print double
+(gdb) help x           show formats for x
+*(gdb) info locals      print local automatics only
+(gdb) info functions regexp         print function names
+(gdb) info variables  regexp        print global variable names
+*(gdb) ptype name        print type definition
+(gdb) whatis expression       print type of expression
+*(gdb) set variable = expression        assign value
+(gdb) display expression        display expression result at stop
+(gdb) undisplay        delete displays
+(gdb) info display     show displays
+(gdb) show values      print value history (>= gdb 4.0)
+(gdb) info history     print value history (gdb 3.5)
+
+Object File manipulation
+(gdb) file object                      load new file for debug (sym+exec)
+(gdb) file                             discard sym+exec file info
+(gdb) symbol-file object        load only symbol table
+(gdb) exec-file object                 specify object to run (not sym-file)
+(gdb) core-file core                   post-mortem debugging
+
+Signal Control
+(gdb) info signals             print signal setup
+(gdb) handle signo actions      set debugger actions for signal
+(gdb) handle INT print          print message when signal occurs
+(gdb) handle INT noprint        don't print message
+(gdb) handle INT stop          stop program when signal occurs
+(gdb) handle INT nostop         don't stop program
+(gdb) handle INT pass          allow program to receive signal
+(gdb) handle INT nopass         debugger catches signal; program doesn't
+(gdb) signal signo             continue and send signal to program
+(gdb) signal 0                 continue and send no signal to program
+
+Machine-level Debug
+(gdb) info registers           print registers sans floats
+(gdb) info all-registers        print all registers
+(gdb) print/x $pc              print one register
+(gdb) stepi                    single step at machine level
+(gdb) si                       single step at machine level
+(gdb) nexti                    single step (over functions) at machine level
+(gdb) ni                       single step (over functions) at machine level
+(gdb) display/i $pc            print current instruction in display
+(gdb) x/x &gx                  print variable gx in hex
+(gdb) info line 22             print addresses for object code for line 22
+(gdb) info line *0x2c4e         print line number of object code at address
+(gdb) x/10i main               disassemble first 10 instructions in \fImain\fR
+(gdb) disassemble addr          dissassemble code for function around addr
+
+History Display
+(gdb) show commands            print command history (>= gdb 4.0)
+(gdb) info editing             print command history (gdb 3.5)
+(gdb) ESC-CTRL-J               switch to vi edit mode from emacs edit mode
+(gdb) set history expansion on       turn on c-shell like history
+(gdb) break class::member       set breakpoint on class member. may get menu
+(gdb) list class::member        list member in class
+(gdb) ptype class               print class members
+(gdb) print *this              print contents of this pointer
+(gdb) rbreak regexpr           useful for breakpoint on overloaded member name
+
+Miscellaneous
+(gdb) define command ... end        define user command
+*(gdb) RETURN                  repeat last command
+*(gdb) shell command args       execute shell command 
+*(gdb) source file             load gdb commands from file
+*(gdb) quit                    quit gdb
+
+```
+
+
+# VALGRIND DYNAMIC ANALYSIS
+
+```shell
+
+valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose ./main.out 
+
+
+```
+
+# CORE DUMP
+
+```shell
+
+# check
+
+ulimit -c
+
+# set unlimited 
+
+ulimit -c unlimited
+
+
+```
+
+# SYSTEMCTL SYSTEMD
+
+```shell
+# /root/1234.sh
+
+ncat -lv 1234
+
+```
+
+```shell
+
+/etc/systemd/system/nc1234.service
+```
+
+
+```shell
+# /etc/systemd/system/nc1234.service
+
+[Unit]
+Description=nc1234 demo service
+After=network.target
+StartLimitIntervalSec=0
+[Service]
+Type=simple
+Restart=always
+RestartSec=1
+User=root
+ExecStart=/root/1234.sh
+
+[Install]
+WantedBy=multi-user.target
+
+```
+
+```shell
+systemctl enable nc1234
+
+systemctl start nc1234
+
+```
+
+# CPU NUMA 
+
+```shell
+
+# from numa nodes 0,1 use 1 if possible
+numactl --cpubind=0,1 --preferred=1 $EXECUTABLE
+
+
+```
+
+
+# EBPF LINUX LIBBPF
+
+
+
+```shell
+
+
+# install bcc
+# ubuntu 22.04
+
+sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
+  libllvm14 llvm-14-dev libclang-14-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
+  liblzma-dev libdebuginfod-dev arping netperf iperf
+
+
+git clone https://github.com/iovisor/bcc.git
+
+mkdir bcc/build
+cd bcc/build
+cmake ..
+make
+sudo make install
+
+# build python3 binding
+
+cmake -DPYTHON_CMD=python3 .. 
+pushd src/python/
+make
+sudo make install
+popd
+
+
+```
+
+
+```shell
+# libbpf
+
+apt install clang libelf1 libelf-dev zlib1g-dev
+
+git clone --recurse-submodules https://github.com/libbpf/libbpf-bootstrap
+
+cd libbpf-bootstrap 
+
+git submodule update --init --recursive   
+
+
+
+```
+
+
+# XDP LINUX EBPF
+
+```shell
+# in project dir ex) xdp
+
+git clone https://github.com/xdp-project/xdp-tools
+
+# git clone https://github.com/libbpf/libbpf
+
+sudo apt install clang llvm libelf-dev libpcap-dev build-essential libc6-dev-i386 m4
+
+# To install the ‘perf’ utility, run this on Debian:
+
+sudo apt install linux-perf
+# or this on Ubuntu:
+
+sudo apt install linux-tools-$(uname -r)
+
+# kernel header
+
+sudo apt install linux-headers-$(uname -r)
+
+# etc
+
+sudo apt install linux-tools-common linux-tools-generic
+sudo apt install tcpdump
+
+
+cd xdp-tools
+
+./configure
+
+make
+
+sudo make install
+
+cd lib/libbpf/src
+
+sudo make install
+
+# compile 
+
+clang -O2 -g -Wall -c -target bpf -o test_xdp.o test_xdp.c
+
+# create veth or on interface
+
+# load module
+
+sudo ip link set veth1 xdpgeneric obj test_xdp.o sec xdp_drop
+
+# or
+
+sudo xdp-loader load -m skb -s xdp_drop veth1 test_xdp.o
+
+
+# unload
+
+sudo ip link set veth1 xdpgeneric off
+
+# or 
+
+sudo xdp-loader unload -a veth1
+
+# check 
+
+sudo bpftool map show
+
+sudo bpftool map dump id 13
+
+# bpf printk out
+
+sudo cat /sys/kernel/tracing/trace
+
+```
+
+
+
+# PROFILE PATH PERMANENT
+
+```shell
+
+vim .profile
+
+source .profile
+
+```
+# GIT
+
+```shell
+
+# local branch
+
+git switch -c <loc_name> <remote_name>/<branch>
+
+# local merge
+# on target branch
+
+git merge <loc_name>
+
+# on forked remote branch's local branch
+# pulling equivalent
+
+git remote add <upstream_name> <upstream_addr>
+
+git fetch <upstream_name>
+
+git rebase <upstream_name>/<branch>
+
+git add .
+
+git commit
+
+git push -f <forked_origin> <forked_origin_branch>
+
+# then PR
+
+# squash commits
+
+git log
+
+git reset --soft HEAD~<last_commits_count>
+
+ex) git reset --soft HEAD~5
+
+# config 
+
+git config --global credential.helper store
+
+# then clone or pull or whatever to store
+
+# squash commits using editor
+
+git rebase -i my_first_commit~
+
+# prefix `pick` to use commit
+# prefix `squash` to get it meld into previous commit
+
+
+# git diff
+
+
+git diff commit_a commit_b
+
+# or just the current and latest commit
+
+git diff
+
+
+# git create patch file for latest commit
+
+git format-patch -1 HEAD
+
+# signoff
+
+git commit --signoff
+
+# stat patch before applying
+
+git apply --stat a_file.patch
+
+# check patch before applying
+
+git apply --check a_file.patch
+
+# apply patch 
+
+git am --signoff < a_file.path
+
+# git submodule
+
+git submodule add <repository.git>
+
+# git submodule pull all
+
+git submodule update --recursive
+
+# git submodule clone
+
+git clone <repository.git>
+
+git submodule init
+
+git submodule update
+
+# private repo
+# automatic with go
+
+git config --global set url."https://$ID:$PW@github.com/org".instreadOf "https://github.com/org"
+
+# github workflow self hosted runner 
+
+# Create a folder
+mkdir actions-runner && cd actions-runner
+
+# Download the latest runner package
+
+curl -o actions-runner-linux-x64-2.306.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.306.0/actions-runner-linux-x64-2.306.0.tar.gz
+
+# Optional: Validate the hash
+
+echo "b0a090336f0d0a439dac7505475a1fb822f61bbb36420c7b3b3fe6b1bdc4dbaa  actions-runner-linux-x64-2.306.0.tar.gz" | shasum -a 256 -c
+
+# Extract the installer
+
+tar xzf ./actions-runner-linux-x64-2.306.0.tar.gz
+
+# Create the runner and start the configuration experience
+
+./config.sh --url https://github.com/seantywork/k8s-base-cluster-setup --token <TOKEN>
+
+# Last step, run it!
+
+./run.sh
+
+```
+
+
+```shell
+
+# install github cli
+
+curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg 
+
+sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
+
+echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null 
+
+sudo apt update
+
+sudo apt install gh -y
+
+```
+
+```shell
+
+# some commands
+
+gh pr list
+
+gh pr edit <num> --add-reviewer seantywork
+
+gh pr edit <num> --add-assignee seantywork
+
+gh pr merge <num> --merge
+
+gh pr view <num> --json state,author,assignees,reviews,reviewRequests,mergeable
+
+```
+
+```shell
+
+# git lfs
+
+git lfs install
+
+
+git lfs track "*.png" "*.jpg" "*.docx" "*.zip"
+
+git add .
+
+git commit -m "lfs"
+
+
+
+```
+
+
+```shell
+
+# git server
+
+# on git server
+
+sudo mkdir /git
+
+
+sudo adduser git
+
+sudo chown git:git /git
+
+su git
+cd
+mkdir .ssh && chmod 700 .ssh
+touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
+
+
+cd /git
+
+mkdir boxproject.git
+
+git init --bare
+
+
+
+# on git user computer
+
+ssh-copy-id git@gitserver
+
+mkdir boxproject
+
+git init
+git add .
+git commit -m 'init'
+git branch -M main
+git remote add origin git@gitserver:/git/boxproject.git
+git push -u origin main
+
+
+# on another user computer
+
+
+git clone git@gitserver:/git/boxproject.git
+
+cd boxproject
+
+git fetch --all
+
+git switch -c main origin/main
+
+```
+
+```shell
+
+# remove submodule
+
+# delete in .gitmodules 
+
+git add .gitmodules
+
+# delete in .git/config.
+
+git rm --cached path_to_submodule 
+
+rm -rf .git/modules/path_to_submodule
+
+git commit -m "Removed submodule <name>"
+
+rm -rf path_to_submodule
+
+```
+
+
+```shell
+
+# git email
+
+sudo apt update
+
+sudo apt install git-email
+
+# might have to install perl dependency
+
+cpan Authen::SASL MIME::Base64 Net::SMTP::SSL
+
+# configure $HOME/.gitconfig
+
+[sendemail]
+    smtpServer = smtp.gmail.com
+    smtpServerPort = 587
+    smtpEncryption = tls
+    smtpUser = my_email@gmail.com
+    # (Optional: we'll leave this commented out and use a different way)
+    # smtpPass = PASSWORD
+
+# generate google app password for gmail
+# goto acoount manager, search app password
+
+# add pass to .gitconfig
+
+git send-email --to=my_email@gmail.com something.patch
+
+```
+
+# NGINX SETTING
+
+
+```shell
+sudo mkdir -pv /var/www/<project_name>/static/ 
+
+sudo chown -cR ubuntu:ubuntu /var/www/<project_name>/  
+
+
+django setting.py debug false 
+
+python manage.py collectstatic 
+```
+
+# HTTPS
+
+```shell
+
+# Nginx configuration: /etc/nginx/sites-available/<nginx_config_name> 
+
+server_tokens               off; 
+
+access_log                  /var/log/nginx/<nginx_config_name>.access.log; 
+
+error_log                   /var/log/nginx/<nginx_config_name>.error.log; 
+
+
+server { 
+
+  server_name               .<domain_name>; 
+
+  listen                    80; 
+
+  return                    307 https://$host$request_uri; 
+
+} 
+
+
+server { 
+
+  location / { 
+
+    proxy_pass              http://localhost:8000; 
+
+    proxy_set_header        Host $host; 
+
+    proxy_set_header    X-Forwarded-Proto $scheme; 
+
+  } 
+
+
+  location /static { 
+
+    autoindex on; 
+
+    alias <static_location>; 
+
+  } 
+
+
+  listen 443 ssl; 
+
+  ssl_certificate /etc/letsencrypt/live/www.supersecure.codes/fullchain.pem; 
+
+  ssl_certificate_key /etc/letsencrypt/live/www.supersecure.codes/privkey.pem; 
+
+  include /etc/letsencrypt/options-ssl-nginx.conf; 
+
+  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
+
+} 
+
+
+```
+
+```shell
+
+sudo systemctl restart nginx 
+
+
+cd /etc/nginx/sites-enabled 
+
+sudo ln -s ../sites-available/<nginx_config_name> . 
+
+
+sudo vi /etc/nginx/nginx.conf 
+
+ssl_protocols TLSv1.2 TLSv1.3; 
+
+include /etc/nginx/sites-enabled/<nginx_config_name> 
+
+sudo systemctl restart nginx 
+
+
+sudo snap install --classic certbot 
+
+sudo ln -s /snap/bin/certbot /usr/bin/certbot 
+
+sudo certbot --nginx --rsa-key-size 4096 --no-redirect 
+
+
+sudo systemctl restart nginx 
+
+
+
+```
+
+
+# AWS RESTART
+
+```shell
+# ip and dns check 
+
+# aws new ssh domain and ip check  
+
+# namecheap DNS relinking 
+
+```
+
+
+# NGINX CHECK 
+
+```shell
+
+
+
+
+stream { 
+
+        upstream galera_cluster { 
+
+            server 127.0.0.1:33061; #node1 
+
+            server 127.0.0.1:33062; #node2 
+
+            server 127.0.0.1:33063; #node3 
+
+            zone tcp_mem 64k; 
+
+            least_conn; 
+
+        } 
+
+
+        server { 
+
+            listen 3306; # MySQL default 
+
+            proxy_pass galera_cluster; 
+
+        } 
+
+} 
+
+
+
+http  
+
+
+        sendfile on; 
+
+        tcp_nopush on; 
+
+        tcp_nodelay on; 
+
+        reset_timedout_connection on; 
+
+        client_body_timeout 3600; 
+
+        send_timeout 2; 
+
+
+        keepalive_timeout 30; 
+
+        keepalive_requests 100000; 
+
+
+        #types_hash_max_size 2048; 
+
+        # server_tokens off; 
+
+
+        client_max_body_size 40G; 
+
+        client_body_buffer_size 16K; 
+
+        client_header_buffer_size 1K; 
+
+
+        proxy_request_buffering off; 
+
+
+        proxy_send_timeout 3600; 
+
+
+server 
+
+
+location 
+
+
+                proxy_pass http://agc_server; 
+
+                proxy_read_timeout 300s; 
+
+                proxy_connect_timeout 75s; 
+
+                proxy_set_header X-Real-IP $remote_addr; 
+
+                #proxy_set_header Host $host; 
+
+                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
+
+                proxy_set_header X-Forwarded-For $remote_addr; 
+
+                proxy_set_header X-Forwarded-Proto $scheme; 
+
+                proxy_set_header Host $http_host; 
+
+                proxy_http_version 1.1; 
+
+                proxy_set_header   Upgrade $http_upgrade; 
+
+                proxy_set_header   Connection "upgrade"; 
+
+
+
+```
+
+
+```shell
+# or
+
+upstream UC {
+
+  server 0.0.0.0:8888;
+
+}
+
+upstream PTT {
+
+  server 0.0.0.0:8888;
+
+}
+
+
+server
+{
+        listen       80;
+        server_name      usagecorpus.com www.usagecorpus.com;
+        return 301 https://$host$request_uri;
+}
+
+server
+{
+        listen       80;
+        server_name      ptt.usagecorpus.com;
+        return 301 https://$host$request_uri;
+}
+
+
+
+server
+{
+        server_name  usagecorpus.com www.usagecorpus.com;
+        client_max_body_size 0;
+
+        location / {
+            # add_header Content-Type text/plain;
+            # return 200 'okay';
+
+             proxy_pass http://UC;
+             proxy_set_header X-Real-IP $remote_addr;
+             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+             proxy_set_header X-Forwarded-For $remote_addr;
+             proxy_set_header X-Forwarded-Proto $scheme;
+             proxy_set_header Host $http_host;
+
+       #      proxy_buffering off;
+       #      proxy_request_buffering off;
+
+       #      proxy_http_version 1.1;
+       #      proxy_set_header   Upgrade $http_upgrade;
+       #      proxy_set_header   Connection "upgrade";
+
+
+      }
+
+
+    #listen 80; # managed by Certbot
+
+    listen 443 ssl; # managed by Certbot
+    ssl_certificate /etc/letsencrypt/live/usagecorpus.com/fullchain.pem; # managed by Certbot
+    ssl_certificate_key /etc/letsencrypt/live/usagecorpus.com/privkey.pem; # managed by Certbot
+    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
+    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
+
+
+}
+
+server
+{
+        server_name  ptt.usagecorpus.com;
+        client_max_body_size 0;
+
+        location / {
+            # add_header Content-Type text/plain;
+            # return 200 'okay';
+
+             proxy_pass http://PTT;
+             proxy_set_header X-Real-IP $remote_addr;
+             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+             proxy_set_header X-Forwarded-For $remote_addr;
+             proxy_set_header X-Forwarded-Proto $scheme;
+             proxy_set_header Host $http_host;
+
+       #      proxy_buffering off;
+       #      proxy_request_buffering off;
+
+       #      proxy_http_version 1.1;
+       #      proxy_set_header   Upgrade $http_upgrade;
+       #      proxy_set_header   Connection "upgrade";
+
+
+       }
+
+
+    #listen 80; # managed by Certbot
+
+    listen 443 ssl; # managed by Certbot
+    ssl_certificate /etc/letsencrypt/live/usagecorpus.com/fullchain.pem; # managed by Certbot
+    ssl_certificate_key /etc/letsencrypt/live/usagecorpus.com/privkey.pem; # managed by Certbot
+    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
+    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
+
+}
+
+```
+
+```shell
+sudo systemctl start nginx 
+
+sudo systemctl restart nginx 
+
+
+```
+
+# CGROUP
+
+```shell
+# cgroup 
+
+# check cgroup mount location
+
+mount | grep cgroup2
+
+# if not change kernel parameters in grub to see
+
+# cgroup_no_v1=all
+
+cat /proc/cmdline
+
+# check controllers
+
+cat /sys/fs/cgroup/cgroup.controllers
+
+# add controller , here SOMETHING being cpu 
+
+echo "+$SOMETHING" >> /sys/fs/cgroup/cgroup.subtree_control  
+
+# add sub group
+
+mkdir /sys/fs/cgroup/$SOME_GROUP
+
+# give cpu max
+
+echo "$MAX $PERIOD" > /sys/fs/cgroup/$SOME_GROUP/cpu.max
+
+# revoke group
+
+rmdir /sys/fs/cgroup/$SOME_GROUP
+
+
+```
+
+
+# PROCESS NAMESPACE
+
+```shell
+
+
+unshare --user --pid --map-root-user --mount-proc --fork bash 
+
+```
+
+# OVERLAYFS
+
+```shell
+sudo mkdir /tmp/upper /tmp/overlay /mnt/merged_directories
+
+sudo mount -t overlay overlay -olowerdir=/path/to/dir1:/path/to/dir2,upperdir=/tmp/upper,workdir=/tmp/overlay /mnt/merged_directories
+
+```
+
+# NETWORK NAMESPACE
+
+```shell
+
+# bridge, veth with peer
+
+sudo ip link add br-blah01 type bridge 
+
+sudo ip link add dev vm1 type veth peer name vm2
+
+sudo ip link set vm1 master br-blah01
+
+sudo ip addr add 10.0.0.1/24 dev br-blah01
+
+sudo ip addr add 10.0.0.2/24 dev vm2
+
+sudo ip link set br-blah01 up
+
+sudo ip link set vm1 up
+
+sudo ip link set vm2 up
+
+# veth with peer namespace 
+
+sudo ip netns add blahnet
+
+sudo ip link set vm2 netns blahnet 
+
+sudo ip netns exec blahnet ip link set dev lo up
+
+sudo ip netns exec blahnet ip a
+
+sudo iptables -t nat -A POSTROUTING -o br-blah01 -j MASQUERADE
+sudo iptables -t nat -A POSTROUTING -o wlo1 -j MASQUERADE
+
+sudo ip netns exec blahnet /bin/bash
+
+ip addr add 10.0.0.2/24 dev vm2
+
+ip link set dev vm2 up
+
+ip route add default via 10.0.0.1
+
+echo "nameserver 8.8.8.8" >> /etc/resolv.conf
+echo "nameserver 8.8.4.4" >> /etc/resolv.conf
+
+```
+
+
+# ROUTER/MODEM LAN
+
+```shell
+
+
+
+ethernet 
+
+
+wifi 
+
+
+mac
+
+ip
+
+dns (check /etc/resolv.conf) 
+
+
+dhcp (alongside static) 
+
+# ethernet wan
+
+ plug the cable into wan port
+
+# ethernet hub/ap mode & ethernet extension
+
+ turn off dhcp, enable hub/ap mode
+
+ set internal new ip avoiding collision, under the default gateway cidr, set default gateway and dns
+
+ plug the cable into lan port
+
+
+# wireless wan
+
+wifi wan
+
+dont turn off dhcp
+
+set internal new ip, for a new cidr range connect to the main ap with wisp
+
+
+# wireless multibridge
+
+wifi extension
+
+set internal new ip avoiding collision, under the default gateway cidr
+
+turn off dhcp
+
+connect to the main ap with repeater
+
+
+port forward 
+
+
+
+```
+
+# NETWORK INTERFACE ADDRESS NETPLAN SYSTEMD-NETWORKD
+
+```shell
+
+# netplan
+
+# below is the default configuration
+
+# craete other ones if needed
+
+```
+```shell
+# /etc/netplan/01-network-manager-all.yaml 
+
+network:
+ version: 2
+ renderer: NetworkManager # or systemd-networkd
+ ethernets:  # or wifis, bridges, modems
+   eth0:
+     dhcp4: no 
+     addresses: [172.23.207.254/20]
+     gateway4: 192.168.1.1
+     nameservers:
+         addresses: [8.8.8.8,8.8.8.4]
+```
+```shell
+sudo netplan try
+
+# sudo netplan generate
+sudo netplan apply
+```
+
+
+```shell
+
+# disable cloud init network config if necessary
+
+
+
+```
+
+```shell
+
+sudo nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
+
+network: {config: disabled}
+
+```
+
+```shell
+
+# /etc/network/interfaces
+
+auto eth0
+iface eth0 inet static 
+address 192.168.2.1
+netmask 255.255.255.0
+gateway 192.1.2.254
+
+# or dhcp
+
+auto eth0
+iface eth0 inet dhcp
+
+
+```
+
+
+```shell
+
+# /etc/NetworkManager
+
+
+```
+
+# DISABLE/ENABLE WIFI IF
+
+```shell
+# disable
+```
+
+```shell
+# /etc/network/interfaces
+iface <interface_name> inet manual
+```
+
+```shell
+# enable
+# undo above
+
+```
+# ARP
+
+```shell
+
+# delete 
+sudo ip -s -s neigh flush all
+
+arp -d 192.168.1.1
+
+# add
+
+arp -i interface -s ip mac
+
+```
+
+```shell
+# longer cache expiration
+
+net.ipv4.neigh.default.gc_stale_time=57600
+
+# larger garbage collection threshold
+
+net.ipv4.neigh.default.gc_thresh1 = 32768
+net.ipv4.neigh.default.gc_thresh2 = 32768
+net.ipv4.neigh.default.gc_thresh3 = 32768
+
+
+```
+
+# REDIRECT
+
+```shell
+
+sysctl -w net.ipv4.conf.enp134s0f2.accept_redirects=0
+sysctl -w net.ipv4.conf.enp134s0f2.send_redirects=0
+sysctl -w net.ipv4.conf.enp134s0f0.accept_redirects=0
+sysctl -w net.ipv4.conf.enp134s0f0.send_redirects=0
+
+
+```
+
+# ETHTOOL
+
+
+```shell
+
+# queue
+
+ethtool -l devname 
+
+# only use one combined rxtx channel
+
+ethtool -L devname combined 1
+
+
+```
+
+```shell
+
+# ring buffer
+
+ethtool -G enp134s0f0 rx 4096
+ethtool -G enp134s0f0 tx 4096
+ethtool -G enp134s0f2 rx 4096
+ethtool -G enp134s0f2 tx 4096
+
+```
+
+```shell
+
+# flow
+
+ethtool -N eth0 rx-flow-hash udp4 fn
+ethtool -N eth0 flow-type udp4 src-port 4242 dst-port 4242 action 16
+
+```
+
+
+# IP INTERFACE IPTABLES NAT PORT FORWARD NETFILTER
+
+```shell
+
+# link, addr
+
+sudo modprobe dummy
+
+sudo ip link add deth0 type dummy
+
+sudo ip link set dev deth0 address C8:D7:4A:4E:47:50
+
+sudo ip addr add 192.168.1.100/24 brd + dev deth0 # label deth0:0
+
+sudo ip link set dev deth0 up
+
+sudo ip link set dev deth0 down
+
+sudo ip addr del 192.168.1.100/24 brd + dev deth0 # label deth0:0
+
+sudo ip link delete deth0 type dummy
+
+sudo modprobe -r dummy
+
+# route
+
+# to NAT
+
+ip addr add 192.168.10.2/24 dev enp3s0
+
+ip link set dev enp3s0 up
+
+# enp3s0 being the interface the router is connected to
+# router WAN IP being 192.168.10.2/24 or something
+# router default gateway 192.168.10.1
+# router LAN IP being 192.168.100.1/24 or something
+
+# from NAT
+
+ip route add 192.168.10.0/24 via 192.168.100.1 dev eth0
+
+# eth0 being an interface with a connection to the router
+# using eth0 gateway router (192.168.100.1) to route to 192.168.10.0/24 network
+
+# route with table 
+# ex) add rule as table number 5
+
+ip route add 192.168.10.0/24 dev enp3s0 table 5
+
+# flush to apply 
+
+ip route flush cache
+
+# nexthop different network
+
+sudo ip route add 192.168.122.87 dev enp1s0
+
+sudo ip route add 10.0.2.0/24 via 192.168.122.87 dev enp1s0
+
+# rule 
+
+# all 
+
+ip rule add preference 100 from all lookup 5
+
+# fwmark
+# ex) lookup table 5 if marked 5 
+
+ip rule add preference 100 fwmark 5 table 5
+
+# by source 
+
+ip rule add preference 100 from 192.168.0.0/24 lookup 100
+
+```
+
+```shell
+
+# forward
+
+# ephemeral
+
+echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
+
+echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
+
+# permanent
+cat <<EOF | sudo tee /etc/sysctl.d/99-ipv4-forward.conf
+net.ipv4.ip_forward                 = 1
+EOF
+
+cat <<EOF | sudo tee /etc/sysctl.d/99-ipv6-forward.conf
+net.ipv6.conf.all.forwarding                 = 1
+EOF
+
+sudo sysctl -p
+
+sudo sysctl --system
+
+```
+```shell
+
+# routing steps
+
+# incoming mangle prerouting, fwmark
+
+sudo iptables -t mangle -A PREROUTING -p udp -s 192.168.10.5 -j MARK --set-mark 5
+
+# incoming prerouting
+
+sudo iptables -t nat -A PREROUTING -i wlo1 -p tcp --dport 8888 -j DNAT --to-destination 192.168.1.100:8000
+
+# route decision incoming
+
+# incoming input 
+
+sudo iptables -t nat -A INPUT -i enp3s0 -p udp -s 192.168.10.5 -j SNAT --to-source 192.168.10.50
+
+
+# route forward if no local 
+
+# forward init rule
+sudo iptables -A FORWARD -i wlo1 -o deth0 -p tcp --syn --dport 8888 -m conntrack --ctstate NEW -j ACCEPT
+
+# forward allow all tcp init rule
+
+sudo iptables -A FORWARD -i wlo1 -o deth0 -p tcp -m conntrack --ctstate NEW -j ACCEPT
+
+# forward rules
+sudo iptables -A FORWARD -i wlo1 -o deth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+sudo iptables -A FORWARD -i deth0 -o wlo1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+# forward default DROP
+
+sudo iptables -P FORWARD DROP
+
+
+# outgoing mangle output 
+
+sudo iptables -t mangle -A OUTPUT -p udp -d 192.168.10.5 -j MARK --set-mark 5
+
+# outgoing output 
+
+sudo iptables -t nat -A OUTPUT -p udp -d 192.168.10.50 -j DNAT --to-destination 192.168.10.5
+
+# route decision out
+
+# outbound including forward
+
+# outgoing postrouting
+
+sudo iptables -t nat -A POSTROUTING -o wlo1 -p tcp -j MASQUERADE
+
+# outgoing postrouting
+
+sudo iptables -t nat -A POSTROUTING -o wlo1 -p tcp -s 192.168.10.50 -j SNAT --to-source 192.168.10.5
+
+
+# permanent rule
+
+sudo service netfilter-persistent save
+
+# delete 
+
+sudo iptables -S 
+
+iptables -L -n -t nat
+
+sudo iptables -D [ -t nat ] $A_SPEC
+
+# or
+
+sudo iptables -L --line-numbers
+
+sudo iptables -D INPUT $LINE_NUM
+
+
+# netfilter queue
+
+sudo iptables -I FORWARD -p tcp -j NFQUEUE --queue-num 100
+
+# netfilter queue dev
+
+sudo apt install libnetfilter-queue-dev
+
+```
+
+
+```shell
+
+# gateway - LAN route scenario
+sudo ip netns add net1
+
+sudo ip link add dev veth1 type veth peer name veth2 netns net1
+
+sudo ip link set up veth1
+
+sudo ip netns exec net1 ip link set up veth2
+
+sudo ip addr add 192.168.62.5/24 dev veth1
+
+sudo ip netns exec net1 ip addr add 192.168.62.6/24 dev veth2
+
+
+sudo ip netns add net2
+
+sudo ip link add dev veth21 type veth peer name veth22 netns net2
+
+sudo ip link set up veth21
+
+sudo ip netns exec net2 ip link set up veth22
+
+sudo ip addr add 192.168.26.5/24 dev veth21
+
+sudo ip netns exec net2 ip addr add 192.168.26.6/24 dev veth22
+
+sudo sysctl -w net.ipv4.ip_forward=1
+
+sudo iptables -P FORWARD ACCEPT
+
+sudo ip netns exec net1 ip route add 192.168.26.0/24 via 192.168.62.5 dev veth2
+
+sudo ip netns exec net2 ip route add 192.168.62.0/24 via 192.168.26.5 dev veth22
+
+```
+
+```shell
+# gateway - WAN route scenario 
+
+sudo ip netns add net1
+
+sudo ip link add dev veth1 type veth peer name veth2 netns net1
+
+sudo ip link set up veth1
+
+sudo ip netns exec net1 ip link set up veth2
+
+sudo ip netns exec net1 ip link set up lo
+
+sudo ip addr add 192.168.62.5/24 dev veth1
+
+sudo ip netns exec net1 ip addr add 192.168.62.6/24 dev veth2
+
+sudo ip netns exec net1 ip route add default via 192.168.62.5 dev veth2
+
+sudo ip route add 192.168.64.0/24 via 192.168.62.6 dev veth1
+
+sudo ip netns add net2
+
+sudo ip link add dev veth3 type veth peer name veth4 netns net2
+
+sudo ip link set veth3 netns net1
+
+sudo ip netns exec net1 ip link set up veth3
+
+sudo ip netns exec net2 ip link set up veth4
+
+sudo ip netns exec net1 ip addr add 192.168.122.1/24 dev veth3
+
+sudo ip netns exec net2 ip addr add 192.168.122.6/24 dev veth4
+
+sudo ip netns exec net2 ip route add default via 192.168.122.1 dev veth4
+
+sudo ip netns exec net1 ip route add 192.168.122.0/24 via 192.168.122.1 dev veth3
+
+sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
+
+
+sudo ip netns exec net1 iptables -P FORWARD ACCEPT
+
+
+sudo iptables -I FORWARD -p all -i veth1 -m conntrack --ctstate NEW -j ACCEPT
+
+sudo iptables -I FORWARD -p all -i veth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+sudo iptables -I FORWARD -p all -o veth1 -m conntrack --ctstate NEW -j ACCEPT
+
+sudo iptables -I FORWARD -p all -o veth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+sudo iptables -t nat -I POSTROUTING -p all -o veth1 -j MASQUERADE
+
+sudo iptables -t nat -I POSTROUTING -p all -o ens3 -j MASQUERADE
+
+
+sudo iptables -P FORWARD DROP
+
+sudo ip rule add preference 200 from all lookup 200 
+
+sudo ip route add 192.168.122.6/32 via 192.168.62.6 dev veth1 table 200
+
+```
+
+```shell
+
+# gateway - forward scenario
+
+sudo ip netns add net1
+
+sudo ip link add dev veth1 type veth peer name veth2 netns net1
+
+sudo ip link set up veth1
+
+sudo ip netns exec net1 ip link set up veth2
+
+sudo ip netns exec net1 ip link set up lo
+
+sudo ip addr add 192.168.62.5/24 dev veth1
+
+sudo ip netns exec net1 ip addr add 192.168.62.6/24 dev veth2
+
+sudo ip netns exec net1 ip route add default via 192.168.62.5 dev veth2
+
+# sudo ip route add 192.168.64.0/24 via 192.168.62.6 dev veth1
+
+sudo ip netns add net2
+
+sudo ip link add dev veth3 type veth peer name veth4 netns net2
+
+sudo ip link set veth3 netns net1
+
+sudo ip netns exec net1 ip link set up veth3
+
+sudo ip netns exec net2 ip link set up veth4
+
+sudo ip netns exec net1 ip addr add 192.168.64.1/24 dev veth3
+
+sudo ip netns exec net2 ip addr add 192.168.64.6/24 dev veth4
+
+sudo ip netns exec net2 ip route add default via 192.168.64.6 dev veth4
+
+sudo ip netns exec net1 ip route add 192.168.64.0/24 via 192.168.64.1 dev veth3
+
+sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
+
+
+#tcp
+
+sudo ip netns exec net1 iptables -t nat -I PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 192.168.64.6:8000
+
+
+sudo ip netns exec net1 iptables -I FORWARD -p tcp --syn -i veth3 -m conntrack --ctstate NEW -j ACCEPT
+
+sudo ip netns exec net1 iptables -I FORWARD -p tcp -i veth3 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+sudo ip netns exec net1 iptables -I FORWARD -p tcp --syn -o veth3 -m conntrack --ctstate NEW -j ACCEPT
+
+sudo ip netns exec net1 iptables -I FORWARD -p tcp -o veth3 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+
+sudo ip netns exec net1 iptables -P FORWARD DROP
+
+#sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth3 -j SNAT --to-source 192.168.64.1
+
+# or
+
+sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth2 -j MASQUERADE
+
+sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth3 -j MASQUERADE
+
+```
+
+
+
+```shell
+
+# gateway - NAT scenario
+
+sudo ip netns add net1
+
+sudo ip link add dev veth1 type veth peer name veth2 netns net1
+
+sudo ip link set up veth1
+
+sudo ip netns exec net1 ip link set up veth2
+
+sudo ip netns exec net1 ip link set up lo
+
+sudo ip addr add 192.168.62.5/24 dev veth1
+
+sudo ip netns exec net1 ip addr add 192.168.62.6/24 dev veth2
+
+sudo ip netns exec net1 ip route add default via 192.168.62.5 dev veth2
+
+sudo ip route add 192.168.64.0/24 via 192.168.62.6 dev veth1
+
+sudo ip netns add net2
+
+sudo ip link add dev veth3 type veth peer name veth4 netns net2
+
+sudo ip link set veth3 netns net1
+
+sudo ip netns exec net1 ip link set up veth3
+
+sudo ip netns exec net2 ip link set up veth4
+
+sudo ip netns exec net1 ip addr add 192.168.64.1/24 dev veth3
+
+sudo ip netns exec net2 ip addr add 192.168.64.6/24 dev veth4
+
+sudo ip netns exec net2 ip route add default via 192.168.64.6 dev veth4
+
+sudo ip netns exec net1 ip route add 192.168.64.0/24 via 192.168.64.1 dev veth3
+
+sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
+
+#tcp
+
+
+sudo ip netns exec net1 iptables -I FORWARD -p tcp --syn -i veth2 -m conntrack --ctstate NEW -j ACCEPT
+
+sudo ip netns exec net1 iptables -I FORWARD -p tcp -i veth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+sudo ip netns exec net1 iptables -I FORWARD -p tcp --syn -o veth2 -m conntrack --ctstate NEW -j ACCEPT
+
+sudo ip netns exec net1 iptables -I FORWARD -p tcp -o veth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth3 -j MASQUERADE
+
+sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth2 -j MASQUERADE
+
+
+#all
+
+
+#sudo ip netns exec net1 iptables -I FORWARD -p all -i veth2 -m conntrack --ctstate NEW -j ACCEPT
+
+#sudo ip netns exec net1 iptables -I FORWARD -p all -i veth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+#sudo ip netns exec net1 iptables -I FORWARD -p all -o veth2 -m conntrack --ctstate NEW -j ACCEPT
+
+#sudo ip netns exec net1 iptables -I FORWARD -p all -o veth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
+
+#sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p all -o veth3 -j MASQUERADE
+
+#sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p all -o veth2 -j MASQUERADE
+
+
+sudo ip netns exec net1 iptables -P FORWARD DROP
+
+```
+
+```shell
+
+# gateway - bridge scenario
+
+
+sudo ip netns add net1
+
+sudo ip link add dev veth1 type veth peer name veth2 netns net1
+
+sudo ip link set up veth1
+
+sudo ip netns exec net1 ip link set up lo
+
+sudo ip addr add 192.168.64.1/24 dev veth1
+
+sudo ip route add 192.168.64.0/24 via 192.168.64.2 dev veth1
+
+sudo ip netns add net2
+
+sudo ip link add dev veth3 type veth peer name veth4 netns net2
+
+sudo ip link set veth3 netns net1
+
+sudo ip netns exec net2 ip link set up veth4
+
+sudo ip netns exec net2 ip addr add 192.168.64.6/24 dev veth4
+
+sudo ip netns exec net2 ip route add default via 192.168.64.1 dev veth4
+
+sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
+
+
+sudo ip netns exec net1 ip link add br0 type bridge stp_state 0
+
+sudo ip netns exec net1 ip link set br0 address 12:34:56:78:9a:bc
+
+sudo ip netns exec net1 ip link set veth2 master br0 
+
+sudo ip netns exec net1 ip link set veth3 master br0
+
+sudo ip netns exec net1 ip addr add 192.168.64.2/24 dev br0
+
+sudo ip netns exec net1 ip link set br0 up
+
+sudo ip netns exec net1 ip link set veth2 up 
+
+sudo ip netns exec net1 ip link set veth3 up
+
+sudo ip netns exec net1 ip route add default via 192.168.64.1 dev br0
+
+sudo ip netns exec net1 ip route add 192.168.64.0/24 via 192.168.64.2 dev br0 proto static
+
+
+```
+
+```shell
+
+# gateway - bridge vlan trunk scenario
+
+
+sudo ip netns add net1
+
+sudo ip link add dev veth1 type veth peer name veth2 netns net1
+
+sudo ip link set up veth1
+
+sudo ip netns exec net1 ip link set up lo
+
+sudo ip addr add 192.168.64.1/24 dev veth1
+
+sudo ip route add 192.168.64.0/24 dev veth1
+
+sudo ip netns add net2
+
+sudo ip link add dev veth3 type veth peer name veth4 netns net2
+
+sudo ip link set veth3 netns net1
+
+sudo ip netns exec net2 ip link set up veth4
+
+sudo ip netns exec net2 ip addr add 192.168.64.6/24 dev veth4
+
+sudo ip netns exec net2 ip route add default via 192.168.64.1 dev veth4
+
+sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
+
+
+sudo ip netns exec net1 ip link add br0 type bridge stp_state 0
+
+sudo ip netns exec net1 ip link set br0 address 12:34:56:78:9a:bc
+
+sudo ip netns exec net1 ip link set veth2 master br0 
+
+sudo ip netns exec net1 ip link set veth3 master br0
+
+sudo ip netns exec net1 ip addr add 192.168.64.2/24 dev br0
+
+sudo ip netns exec net1 ip link set br0 up
+
+sudo ip netns exec net1 ip link set veth2 up 
+
+sudo ip netns exec net1 ip link set veth3 up
+
+#sudo ip netns exec net1 ip route add default via 192.168.64.1 dev br0
+
+sudo ip netns exec net1 ip route add default dev br0
+
+sudo ip netns exec net1 ip route add 192.168.64.0/24 dev br0 proto static
+
+
+# 
+
+sudo ip netns exec net1 ip link set br0 type bridge vlan_filtering 1
+
+sudo ip netns add net3
+
+sudo ip link add dev veth5 type veth peer name veth6 netns net3
+
+sudo ip link set veth5 netns net1
+
+sudo ip netns exec net1 ip link set veth5 master br0
+
+sudo ip netns exec net1 ip link set veth5 up
+
+sudo ip netns exec net3 ip link set up veth6
+
+sudo ip netns exec net3 ip addr add 192.168.66.6/24 dev veth6
+
+sudo ip netns exec net3 ip link set dev veth6 up
+
+sudo ip netns exec net3 ip route add default via 192.168.66.1 dev veth6
+
+sudo ip netns exec net1 bridge vlan add dev veth5 vid 5 pvid untagged master
+
+sudo ip netns exec net1 bridge vlan add dev veth2 vid 5 master
+
+sudo ip netns exec net1 ip route add 192.168.66.0/24 dev br0 proto static
+
+
+#
+
+sudo ip link add link veth1 name veth1.5 type vlan id 5
+
+sudo ip addr add 192.168.66.1/24 dev veth1.5
+
+sudo ip link set veth1.5 up
+
+```
+
+
+```shell
+# gateway redirect scenario 
+
+
+# 10.168.0.29 being NAT 
+
+# 10.168.0.26 being default gateway 
+
+# 10.168.0.100 being default gateway's default gateway
+
+# on NAT 
+
+sudo ip netns add vnet 
+
+sudo ip link set enp7s0 netns vnet 
+
+sudo ip netns exec vnet ip addr add 10.168.0.29/24 dev enp7s0
+
+sudo ip netns exec vnet ip link set up dev enp7s0 
+
+sudo ip netns exec vnet ip route add default via 10.168.0.26
+# on default gateway 
+
+sudo ip rule add preference 221 from 10.168.0.0/24 lookup 221
+
+sudo ip route add default via 10.168.0.100 dev enp7s0 table 221
+
+echo 0 | tee /proc/sys/net/ipv4/conf/*/send_redirects
+
+
+```
+
+```shell
+
+# host to different NAT with same ip scenario
+
+# nat1
+sudo ip netns add net0
+
+sudo ip link add dev veth01 type veth peer name veth02 netns net0
+
+sudo ip link set up veth01
+
+sudo ip netns exec net0 ip link set up veth02
+
+sudo ip addr add 192.168.10.20/24 dev veth01
+
+sudo ip netns exec net0 ip addr add 192.168.10.2/24 dev veth02
+
+# nat2
+
+sudo ip netns add net1
+
+sudo ip link add dev veth11 type veth peer name veth12 netns net1
+
+sudo ip link set up veth11
+
+sudo ip netns exec net1 ip link set up veth12
+
+sudo ip addr add 192.168.10.30/24 dev veth11
+
+sudo ip netns exec net1 ip addr add 192.168.10.2/24 dev veth12
+
+sudo ip rule add preference 100 from all lookup local
+
+sudo ip rule del preference 0
+
+sudo ip rule add preference 92 fwmark 2 table 92
+sudo ip rule add preference 93 fwmark 3 table 93
+
+sudo ip route add default via 192.168.10.20 dev veth01 table 92
+sudo ip route add default via 192.168.10.30 dev veth11 table 93
+
+
+sudo iptables -t nat -A INPUT -p tcp -i veth02 -j SNAT --to-source 192.168.10.3
+sudo iptables -t mangle -A OUTPUT -p tcp -d 192.168.10.2 -j MARK --set-mark 2
+sudo iptables -t mangle -A OUTPUT -p tcp -d 192.168.10.3 -j MARK --set-mark 3
+sudo iptables -t nat -A OUTPUT -p tcp -d 192.168.10.3 -j DNAT --to-destination 192.168.10.2
+
+sudo ip route flush cache
+
+
+# test
+
+# in net0
+sudo ip netns exec net0 nc -l 192.168.10.2 9999
+
+# in net1 
+sudo ip netns exec net1 nc -l 192.168.10.2 9999
+
+# on host
+nc 192.168.10.2 9999 
+
+# on host
+nc 192.168.10.3 9999
+
+
+```
+
+```shell
+
+# network namespace
+
+sudo ip netns add net1
+
+sudo ip netns del net1
+
+sudo ip -all netns exec ip link show
+
+# veth namespace
+
+ip link add veth1 netns net1 type veth
+
+ip link add veth1 netns net1 type veth peer name veth2 netns net2
+
+# veth
+
+sudo ip link add veth1 type veth
+
+
+sudo ip addr add 192.168.1.1/24 brd + dev veth0
+
+sudo ip addr add 192.168.1.5/24 brd + dev veth1
+
+sudo ip link set dev veth0 up
+
+sudo ip link set dev veth1 up
+
+sudo ip link set dev veth1 down
+
+sudo ip link set dev veth0 down
+
+sudo ip addr del 192.168.1.1/24 brd + dev veth0
+
+sudo ip addr del 192.168.1.5/24 brd + dev veth1
+
+sudo ip link del veth1 type veth
+
+# veth with peer
+
+sudo ip link add br-blah01 type bridge 
+
+sudo ip link add dev vm1 type veth peer name vm2
+
+sudo ip link set vm1 master br-blah01
+
+sudo ip addr add 10.0.0.1/24 dev br-blah01
+
+sudo ip addr add 10.0.0.2/24 dev vm2
+
+sudo ip link set br-blah01 up
+
+sudo ip link set vm1 up
+
+sudo ip link set vm2 up
+
+
+```
+```shell
+
+# bridge
+
+sudo ip link add br0 type bridge 
+
+ip link set br0 type bridge stp_state 1
+
+# ip link set br0 type bridge vlan_filtering 1
+
+ip link set eth1 master br0
+
+ip link set eth1 up
+
+ip link set br0 up
+
+
+```
+
+```shell
+
+# tuntap
+
+sudo ip tuntap add mode tap tap0
+
+sudo ip addr add 192.168.1.100/24 brd + dev tap0
+
+sudo ip link set tap0 master br0
+
+sudo ip link set dev tap0 up
+
+```
+
+
+```shell
+
+# vlan
+
+sudo apt-get install vlan
+
+sudo modprobe 8021q
+
+# permanent
+
+echo "8021q" >> /etc/modules
+
+sudo ip link add link eth0 name eth0.100 type vlan id 5
+
+sudo ip link set eth0.100 up
+
+
+
+
+
+# del
+
+sudo ip link set eth0.100 down
+
+sudo ip link del eth0.100
+
+
+```
+
+
+```shell
+
+# vxlan
+
+# on host1
+
+sudo ip netns add top
+
+sudo ip link add top-in type veth peer name top-out
+
+sudo ip link set top-in netns top
+
+sudo ip netns exec top ip addr add 10.10.5.2/16 dev top-in
+
+sudo ip netns exec top ip link set top-in up
+
+# on host1: bridge
+
+sudo ip link add middle type bridge
+
+sudo ip addr add 10.10.5.1/16 dev middle
+
+sudo ip link set top-out master middle
+
+sudo ip link set top-out up
+
+sudo ip link set middle up
+
+# on host1: route
+
+sudo ip netns exec top ip route add default via 10.10.5.1
+
+# on host1: vxlan
+
+sudo ip link add vxlan-top type vxlan id 100 local 192.168.99.1 remote 192.168.99.2 dev eth0
+
+sudo ip link set vxlan-top master middle
+
+sudo ip link set vxlan-top up
+
+
+# on host2
+
+sudo ip netns add bottom
+
+sudo ip link add bottom-in type veth peer name bottom-out
+
+sudo ip link set bottom-in netns bottom
+
+sudo ip netns exec bottom ip addr add 10.10.5.12/16 dev bottom-in
+
+sudo ip netns exec bottom ip link set bottom-in up
+
+# on host2: bridge
+
+sudo ip link add middle type bridge
+
+sudo ip addr add 10.10.5.11/16 dev middle
+
+sudo ip link set bottom-out master middle
+
+sudo ip link set bottom-out up
+
+sudo ip link set middle up
+
+# on host2: route
+
+sudo ip netns exec bottom ip route add default via 10.10.5.11
+
+
+# on host1: vxlan
+
+sudo ip link add vxlan-bottom type vxlan id 100 local 192.168.99.2 remote 192.168.99.1 dev eth0
+
+sudo ip link set vxlan-bottom master middle
+
+sudo ip link set vxlan-bottom up
+
+# test
+
+# on host1
+sudo ip netns exec top ncat -l 10.10.5.2 9999
+
+# on host2
+
+
+sudo ip netns exec bottom ncat 10.10.5.2 9999
+
+```
+
+
+```shell
+# macvlan
+
+ip link add macvlan1 link eth0 type macvlan mode bridge
+
+ip netns add net1
+
+ip link set macvlan1 netns net1
+
+ip netns exec net1 ip link set macvlan1 up 
+
+ip netns exec net1 ip link addr add 192.168.0.16 dev macvlan1
+
+
+```
+
+```shell
+
+# bond 
+
+#ip link add bond1 type bond miimon 100 mode active-backup
+ip link add bond1 type bond miimon 100 mode balance-xor
+ip link addr add $ETH0_ADDR dev bond1 
+ip link set eth0 master bond1
+ip link set eth1 master bond1
+ip link set bond1 up
+```
+
+```shell
+
+# netkit
+
+sudo ip netns add net1
+
+sudo ip link add nkpeer0 type netkit
+
+sudo ip link set nkpeer0 netns net1
+
+sudo ip link set dev nk0 up
+
+sudo ip netns exec net1 ip link set dev nkpeer0 up
+
+sudo ip addr add 10.168.0.1/24 dev nk0
+
+sudo ip netns exec net1 ip addr add 10.168.0.2/24 dev nkpeer0
+
+
+```
+
+```shell
+
+
+# xfrm
+
+# xfrm ip addr
+
+
+sudo ip netns add vnet
+sudo ip link add dev veth01 type veth peer name veth02 netns vnet
+sudo ip addr add 192.168.10.1/24 dev veth01
+sudo ip addr add 10.168.66.1/24 dev veth01
+sudo ip link set up veth01
+sudo ip netns exec vnet ip addr add 192.168.10.2/24 dev veth02
+sudo ip netns exec vnet ip addr add 10.168.66.2/24 dev veth02
+sudo ip netns exec vnet ip link set up veth02
+
+# xfrm state, policy
+
+# client
+
+ip xfrm state add \
+    src 10.168.66.1/24 dst 10.168.66.2/24 proto esp spi 0x01000000 reqid 0x01000000 mode tunnel flag af-unspec \
+    aead 'rfc4106(gcm(aes))' 0xaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeff 128 \
+    sel src 10.168.66.1/24 dst 10.168.66.2/24 
+
+
+ip xfrm state add \
+    src 10.168.66.2/24 dst 10.168.66.1/24 proto esp spi 0x02000000 reqid 0x02000000 mode tunnel flag af-unspec \
+    aead 'rfc4106(gcm(aes))' 0xaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeff 128 \
+    sel src 10.168.66.2/24 dst 10.168.66.1/24 
+
+ip xfrm policy add \
+    src 10.168.66.1/24 dst 10.168.66.2/24 dir out \
+    tmpl src 10.168.66.1/24 dst 10.168.66.2/24 proto esp reqid 0x01000000 mode tunnel
+
+ip xfrm policy add \
+    src 10.168.66.2/24 dst 10.168.66.1/24 dir in \
+    tmpl src 10.168.66.2/24 dst 10.168.66.1/24 proto esp reqid 0x02000000 mode tunnel
+
+
+# server
+
+ip netns exec vnet ip xfrm state add \
+    src 10.168.66.1/24 dst 10.168.66.2/24 proto esp spi 0x01000000 reqid 0x01000000 mode tunnel flag af-unspec \
+    aead 'rfc4106(gcm(aes))' 0xaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeff 128 \
+    sel src 10.168.66.1/24 dst 10.168.66.2/24
+
+
+ip netns exec vnet ip xfrm state add \
+    src 10.168.66.2/24 dst 10.168.66.1/24 proto esp spi 0x02000000 reqid 0x02000000 mode tunnel flag af-unspec \
+    aead 'rfc4106(gcm(aes))' 0xaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeff 128 \
+    sel src 10.168.66.2/24 dst 10.168.66.1/24 
+
+ip netns exec vnet ip xfrm policy add \
+    src 10.168.66.1/24 dst 10.168.66.2/24 dir in \
+    tmpl src 10.168.66.1/24 dst 10.168.66.2/24 proto esp reqid 0x01000000 mode tunnel
+
+ip netns exec vnet ip xfrm policy add \
+    src 10.168.66.2/24 dst 10.168.66.1/24 dir out \
+    tmpl src 10.168.66.2/24 dst 10.168.66.1/24 proto esp reqid 0x02000000 mode tunnel
+
+
+
+```
+
+
+```shell
+# gre
+
+
+sudo sysctl -w net.ipv4.ip_forward=1
+
+sudo ip tunnel add gre1 mode gre remote <HOST_B_IP> local <HOST_A_IP> ttl 25
+
+sudo ip addr add <HOST_A_PRIV_IP> dev gre1
+
+sudo ip link set gre1 up
+
+```
+
+# NFTABLES NFT
+
+
+```shell
+
+# iptables translate, outputs nftables equivalent
+
+iptables-translate -A INPUT -i enp1s0 -p tcp --dport 22 -j ACCEPT
+
+# list
+
+sudo nft list ruleset
+
+# default file at
+# /etc/nftools.conf
+# or /etc/nftables.conf
+
+# can use include syntax 
+
+include "ipv4-ipv5-webserver-rules.nft"
+
+
+```
+
+# CONNTRACK
+
+
+```shell
+
+sudo apt-get install conntrack
+
+
+sudo conntrack -L
+
+# delete
+conntrack -D -p tcp --dport 993
+
+```
+
+
+# FIREWALL  
+
+```shell
+
+
+# ubuntu 
+
+
+
+sudo ufw default allow incoming 
+
+sudo ufw default allow outgoing 
+
+
+sudo ufw allow ssh 
+
+sudo ufw allow https 
+
+
+sudo ufw allow 22 
+
+sudo ufw allow 443 
+
+
+sudo ufw allow 6000:6007/tcp 
+
+
+sudo ufw allow from 203.0.113.4 to any port 22 
+
+
+sudo ufw allow from 203.0.113.0/24 
+
+
+sudo ufw deny from 203.0.113.4 
+
+
+sudo ufw enable 
+
+
+sudo ufw disable 
+
+
+
+# centos 
+
+
+systemctl enable firewalld 
+
+
+sudo firewall-cmd --permanent --add-service={http,https} --permanent 
+
+
+sudo firewall-cmd --add-port=7070/tcp --permanent 
+
+
+firewall-cmd --zone=trusted --add-source=192.168.0.1/24 --permanent 
+
+
+firewall-cmd --zone=trusted --add-source=10.10.0.0/16 --permanent 
+
+```
+
+# SSH 
+
+```shell
+# use identity
+
+# private key at
+# ~/.ssh/identity
+
+# .ssh/config
+
+Host 192.168.101.171
+  HostName 192.168.101.171
+  User thy
+  IdentityFile       ~/.ssh/identity
+
+```
+
+# SSH TUNNEL 
+
+```shell
+
+ssh -f user@ssh.server.com -L 2000:ssh.server.com:2005 -N
+
+ssh -f -L 2000:ssh.server.com:2005 user@ssh.server.com -N
+
+```
+
+
+# SSH KEY DISTRIBUTE
+
+```shell
+ssh-keygen -t rsa 
+
+
+ssh-copy-id username@node_name 
+
+
+# move id_rsa to the client 
+
+# add id_rsa.pub to authrized_keys 
+
+# on client move id_rsa to ~/.ssh 
+
+
+```
+
+# NCAT
+
+```shell
+
+apt install -y ncat 
+
+
+ncat -lvp <port> 
+
+
+ncat <addr> <port> -e /bin/bash
+```
+
+
+# AP
+
+```shell
+sudo apt-get install hostapd dnsmasq
+
+sudo vim /etc/hostapd/hostapd.conf
+```
+
+```shell
+# /etc/hostapd/hostapd.conf
+interface=wlan0
+driver=nl80211
+ssid=MyWiFiNetwork
+hw_mode=g
+channel=7
+wmm_enabled=0
+macaddr_acl=0
+auth_algs=1
+ignore_broadcast_ssid=0
+wpa=2
+wpa_passphrase=12345678
+wpa_key_mgmt=WPA-PSK
+wpa_pairwise=TKIP
+rsn_pairwise=CCMP
+```
+
+```shell
+sudo vim /etc/default/hostapd
+```
+
+```shell
+# /etc/default/hostapd
+
+DAEMON_CONF="/etc/hostapd/hostapd.conf"
+```
+
+```shell
+
+sudo systemctl unmask hostapd
+sudo systemctl enable hostapd
+sudo systemctl start hostapd
+
+
+sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.org
+
+sudo vim /etc/dnsmasq.conf
+
+```
+
+```shell
+# /etc/dnsmasq.conf
+port=5353
+interface=wlan0
+dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
+```
+```shell
+
+sudo systemctl enable hostapd
+sudo systemctl start hostapd
+sudo systemctl reload dnsmasq
+
+sudo vim /lib/systemd/system/dnsmasq.service
+```
+
+```shell
+# /lib/systemd/system/dnsmasq.service
+
+After=network-online.target
+Wants=network-online.target
+```
+
+```shell
+sudo vim /etc/netplan/50-cloud-init.yaml
+```
+
+```yaml
+network:
+    ethernets:
+        eth0:
+            dhcp4: true
+            optional: true
+        wlan0:
+            dhcp4: false
+            addresses:
+            - 192.168.4.1/24
+    version: 2
+```
+
+```shell
+sudo reboot
+
+# to internet
+
+# file
+sudo nano /etc/sysctl.d/routed-ap.conf
+# or
+sudo nano /etc/sysctl.conf
+
+# Enable IPv4 routing
+net.ipv4.ip_forward=1
+# instant enabling
+sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
+
+sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
+
+# save using command
+sudo netfilter-persistent save
+# or
+sudo bash -c "iptables-save > /etc/iptables.ipv4.nat"
+
+sudo nano /etc/rc.local
+# add above exit0
+iptables-restore < /etc/iptables.ipv4.nat
+
+# or simply with iptables-save
+
+sudo iptables-save > /etc/iptables/rules.v4
+sudo ip6tables-save > /etc/iptables/rules.v6
+
+
+
+sudo reboot
+
+
+```
+
+# DHCP SERVER
+
+```shell
+sudo apt install isc-dhcp-server
+
+```
+
+```shell
+# interface
+
+sudo vim /etc/default/isc-dhcp-server
+----
+INTERFACESv4="enp0s8"
+----
+
+
+# /etc/dhcp/dhcpd.conf
+
+# comment if not using dns server
+
+#option domain-name "example.org";
+#option domain-name-servers ns1.example.org, ns2.example.org;
+
+# uncomment if the official dhcp server for the local network
+authoritative;
+# define subnet per interface
+
+subnet 10.1.1.0 netmask 255.255.255.0 {
+  range 10.1.1.3 10.1.1.254;
+}
+
+subnet 192.168.0.0 netmask 255.255.0.0 {
+}
+```
+
+```shell
+
+
+# /etc/dhcp/dhcpd.conf
+
+default-lease-time 600;
+max-lease-time 7200;
+
+# define dns server
+
+
+subnet 10.1.1.0 netmask 255.255.255.0 {
+  range 10.1.1.3 10.1.1.254;
+  option domain-name-servers 10.1.1.1, 8.8.8.8;
+}
+
+subnet 192.168.0.0 netmask 255.255.0.0 {
+}
+
+# define default gateway
+
+subnet 10.1.1.0 netmask 255.255.255.0 {
+  range 10.1.1.3 10.1.1.254;
+  option routers 10.1.1.1;
+}
+
+
+# define static ip
+host web-server {
+  hardware ethernet 00:17:a4:c2:44:22;
+  fixed-address 10.1.1.200;
+}
+
+```
+
+```shell
+sudo systemctl enable isc-dhcp-server
+sudo systemctl start isc-dhcp-server
+```
+
+```shell
+
+# to internet
+
+# file
+sudo nano /etc/sysctl.d/routed-ap.conf
+# or
+sudo nano /etc/sysctl.conf
+
+# Enable IPv4 routing
+net.ipv4.ip_forward=1
+# instant enabling
+sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
+
+sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
+
+# save using command
+sudo netfilter-persistent save
+# or
+sudo bash -c "iptables-save > /etc/iptables.ipv4.nat"
+
+sudo nano /etc/rc.local
+# add above exit0
+iptables-restore < /etc/iptables.ipv4.nat
+
+# or simply with iptables-save
+
+sudo iptables-save > /etc/iptables/rules.v4
+sudo ip6tables-save > /etc/iptables/rules.v6
+
+
+
+sudo reboot
+
+```
+
+# DNS SERVER
+
+```shell
+
+sudo apt-get install bind9
+
+# /etc/default/bind9
+
+# ipv4
+OPTIONS="-4 -u bind"
+
+# ipv6
+OPTIONS="-6 -u bind"
+
+# /etc/bind/named.conf.options
+
+acl "trusted" {
+        192.168.50.43;    # ns1 - can be set to localhost
+        192.168.50.44;    # ns2
+        192.168.50.24;  # host1
+        192.168.50.25;  # host2
+};
+
+...
+
+options {
+        directory "/var/cache/bind";
+        recursion yes;                 # enables resursive queries
+        allow-recursion { trusted; };  # allows recursive queries from "trusted" clients
+        listen-on { 192.168.50.43; };   # ns1 private IP address - listen on private network only
+        allow-transfer { none; };      # disable zone transfers by default
+
+        forwarders {
+                8.8.8.8;
+                8.8.4.4;
+        };
+};
+
+
+# /etc/bind/named.conf.local
+
+# forward
+zone "hey.example.com" {
+    type master;
+    file "/etc/bind/zones/db.hey.example.com"; # zone file path
+    allow-transfer { 192.168.50.44; };         # ns2 private IP address - secondary
+};
+
+# reverse
+
+zone "50.168.192.in-addr.arpa" {
+    type master;
+    file "/etc/bind/zones/db.192.168.50";  # 192.168.50.0/24 subnet
+    allow-transfer { 192.168.50.44; };  # ns2 private IP address - secondary
+};
+
+
+
+sudo mkdir /etc/bind/zones
+
+# forward zone
+cd /etc/bind/zones
+sudo cp ../db.local ./db.hey.example.com
+
+
+sudo vim db.hey.example.com
+
+# replace SOA first to ns1 FQDN
+# replace SOA second to admin.${domain}
+# increase serial by 1
+
+@       IN      SOA     ns1.hey.example.com. admin.hey.example.com. (
+                              3         ; Serial
+
+# delete NS, A, AAA
+
+# add NS
+
+; name servers - NS records
+    IN      NS      ns1.hey.example.com.
+    IN      NS      ns2.hey.example.com.
+
+# add A
+
+; name servers - A records
+ns1.hey.example.com.          IN      A       192.168.50.43
+ns2.hey.example.com.          IN      A       192.168.50.44
+
+; 10.128.0.0/16 - A records
+host1.hey.example.com.        IN      A      192.168.50.24
+host2.hey.example.com.        IN      A      192.168.50.25
+
+
+
+# reverse zone
+cd /etc/bind/zones
+sudo cp ../db.127 ./db.192.168.50
+
+# do the same as forward with SOA
+# but here match the serial with the forward
+@       IN      SOA     ns1.hey.example.com. admin.hey.example.com. (
+                              3         ; Serial
+
+# delete NS, PTR
+
+# add NS
+
+; name servers - NS records
+      IN      NS      ns1.hey.example.com.
+      IN      NS      ns2.hey.example.com.
+
+# add PTR
+# add PTR records for all of your servers whose IP addresses are on the subnet of the zone file that you are editing
+
+; PTR Records
+43   IN      PTR     ns1.hey.example.com.    ; 192.168.50.43
+44   IN      PTR     ns2.hey.example.com.    ; 192.168.50.44
+24   IN      PTR     host1.hey.example.com.  ; 192.168.50.24
+25   IN      PTR     host2.hey.example.com.  ; 192.168.50.25
+
+# subnet /16 example
+#; PTR Records
+#11.10   IN      PTR     ns1.nyc3.example.com.    ; 10.128.10.11
+#12.20   IN      PTR     ns2.nyc3.example.com.    ; 10.128.20.12
+#101.100 IN      PTR     host1.nyc3.example.com.  ; 10.128.100.101
+#102.200 IN      PTR     host2.nyc3.example.com.  ; 10.128.200.102
+
+
+# configuration check
+
+sudo named-checkconf
+
+# zone file check
+
+sudo named-checkzone
+
+# forward zone check
+
+sudo named-checkzone hey.example.com db.hey.example.com
+
+# reverse zone check
+
+sudo named-checkzone 50.168.192.in-addr.arpa /etc/bind/zones/db.192.168.50
+
+
+# restart to apply
+
+sudo systemctl restart bind9
+
+
+
+# dns client
+
+sudo apt install resolvconf
+
+sudo vim /etc/resolvconf/resolv.conf.d/head
+
+search hey.example.com  # your private domain
+nameserver 192.168.50.43  # ns1 private IP address
+nameserver 192.168.50.44  # ns2 private IP address
+
+# regen /etc/resolv.conf
+
+sudo resolvconf -u
+
+# or you can use netplan, interface, ip ...
+
+
+# forward lookup
+
+nslookup host1.hey.example.com
+
+# reverse lookup
+
+nslookup 192.168.50.24
+
+
+# adding new
+
+# Forward zone file: Add an “A” record for the new host, increment the value of “Serial”
+# Reverse zone file: Add a “PTR” record for the new host, increment the value of “Serial”
+# Add your new host’s private IP address to the “trusted” ACL (named.conf.options)
+
+
+# adding ns2
+
+
+# same /etc/bind/named.conf.options but change listen-on
+
+# /etc/bind/named.conf.local
+
+zone "hey.example.com" {
+    type slave;
+    file "slaves/db.hey.example.com";
+    masters { 192.168.50.43; };  # ns1 private IP
+};
+
+zone "50.168.192.in-addr.arpa" {
+    type slave;
+    file "slaves/db.192.168.50";
+    masters { 192.168.50.43; };  # ns1 private IP
+};
+
+# adding new on slave
+
+# Add your new host’s private IP address to the “trusted” ACL (named.conf.options)
+
+
+
+```
+
+# BGP BIRD
+
+```shell
+
+sudo apt update
+sudo apt install bird
+
+# on machine1
+# /etc/bird/bird.conf 
+
+router id 10.168.0.29;
+
+protocol kernel {
+  metric 0;
+  import none;
+  learn;
+  export all;
+}
+
+protocol device {
+}
+
+protocol direct {
+}
+
+protocol bgp peer2 {
+  local as 64512;
+  neighbor 10.168.0.26 as 64513;
+  import all;
+  export all;
+}
+
+# on machine2
+# /etc/bird/bird.conf
+
+router id 10.168.0.26;
+
+
+protocol kernel {
+  metric 0;
+  import none;
+  learn;
+  export all;
+
+}
+
+protocol device {
+}
+
+protocol direct {
+}
+
+protocol bgp peer1 {
+  local as 64513;
+  neighbor 10.168.0.29 as 64512;
+  import all;
+  export all;
+}
+
+# check 
+
+birdc show protocols 
+
+birdc show protocols all peer2
+
+birdc show route
+
+
+
+```
+
+
+# GRPC
+
+```shell
+# golang
+
+apt install -y protobuf-compiler
+
+apt install golang-goprotobuf-dev -y
+
+go install google.golang.org/protobuf/cmd/protoc-gen-go
+
+go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
+
+export PATH="$PATH:$(go env GOPATH)/bin"
+
+protoc --go_out=. --go_opt=paths=source_relative \
+    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
+    ./chat.proto
+```
+
+# FS MOUNT
+
+```shell
+
+
+lsblk 
+
+
+mkfs.<fs> <drive> 2>/dev/null 
+
+
+mkfs.xfs /dev/sdb 2>/dev/null 
+
+
+mkdir <dir> 
+
+
+mount <drive> <dir> 
+
+
+df 
+
+
+/etc/fstab 
+
+```
+
+
+# RAID
+
+```shell
+
+
+mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc  
+
+
+mkfs.<fs> <drive> 2>/dev/null 
+
+
+mkdir <dir> 
+
+
+mount <drive> <dir> 
+
+
+df 
+
+
+/etc/fstab 
+
+```
+
+# LVM DISK EXTENSION
+
+```shell
+
+# resize 
+
+
+sudo lvremove /dev/ubuntu-box-SOMETHING 
+
+
+sudo lvm lvextend -l +100%FREE /dev/ubuntu-box-1-vg 
+
+
+sudo resize2fs -p /dev/ubuntu-box-1-vg 
+
+
+# xfs 
+
+sudo xfs_growfs /dev/ubuntu-box-1-vg 
+
+
+# extend 
+
+
+sudo pvcreate /dev/vdb 
+
+
+sudo vgextend ubuntu-box-1-vg /dev/vdb 
+
+
+sudo lvm lvextend -l +100%FREE /dev/ubuntu-box-1-vg 
+
+
+sudo resize2fs -p /dev/ubuntu-box-1-vg 
+
+
+# xfs 
+
+sudo xfs_growfs /dev/ubuntu-box-1-vg 
+
+
+/etc/fstab 
+
+```
+
+# NFS
+
+```shell
+
+
+# on nfs server 
+
+
+sudo apt install nfs-kernel-server 
+
+
+sudo apt install nfs-common 
+
+
+mkdir -p /nfs/data 
+
+
+sudo chown nobody:nogroup /nfs/data 
+
+
+sudo vim /etc/exports   
+
+
+```
+
+```shell
+# /etc/exports   
+
+
+... 
+
+/nfs/data    <client-addr>(rw,sync,no_subtree_check)  
+
+
+```
+
+```shell
+
+exportfs -a 
+
+
+sudo systemctl restart nfs-kernel-server  
+
+
+# on nfs client 
+
+
+sudo apt install nfs-common 
+
+
+mkdir -p /nfsclient/upload 
+
+
+sudo mount <nfs-server-addr>:/nfs/data /nfsclient/upload 
+
+
+# disconnect  
+
+
+sudo umount /nfsclient/upload 
+
+
+
+```
+
+# SSHFS
+
+
+```shell
+
+sudo apt install sshfs
+
+# mount local to remote
+
+sshfs -p $PORT /data/local user@host:/data/remote
+
+# unmount 
+
+sudo umount /data/local
+
+# make permanent
+
+sudo nano /etc/fstab
+
+
+user@host:/data/remote /data/local  fuse.sshfs noauto,x-systemd.automount,_netdev,reconnect,identityfile=/home/sammy/.ssh/id_rsa,allow_other,default_permissions, port=$PORTNUMBER 0 0
+
+```
+
+
+
+
+# CHECK FILE SYSTEM FS INTEGRITY
+
+```shell
+fsck
+
+```
+
+# DD FORMAT DISK FDISK
+
+```shell
+# check disk
+
+fdisk -l
+
+
+# unmount
+
+umount /dev/sdb
+
+
+# format
+sudo dd if=/dev/zero of=/dev/sdb bs=1m
+
+# create new partition
+
+fdisk
+n
+
+# write save
+
+fdisk
+w
+
+# format iso on usb
+
+sudo dd bs=4M if=filename.iso of=/dev/sdb status=progress
+
+# format fs
+
+sudo mkfs.vfat /dev/sdb1 
+
+# eject
+
+sudo eject /dev/sdb
+```
+
+# APT
+
+```shell
+
+# hash sum mismatch
+
+sudo rm -rf /var/lib/apt/lists/*
+
+sudo apt clean
+
+sudo apt update
+
+
+```
+
+# APT KEY
+
+```shell
+
+# apt-key 
+
+
+sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys <> 
+
+
+# wget or curl 
+
+
+sudo wget -q -O /usr/share/keyrings/<>.gpg https://<>/<>.gpg 
+
+
+echo "deb [signed-by=/usr/share/keyrings/<>.gpg] https://packages.cloud.google.com/apt kubernetes-xenial" | sudo tee -a /etc/apt/sources.list.d/cloud-google.list 
+
+
+```
+
+# DB SYNC REPLICATION
+
+```shell
+
+
+
+sudo apt install mysql-server mysql-client 
+
+
+mysql_secure_installation 
+
+
+# dump 
+
+
+mysqldump -u username -p database_name > data-dump.sql 
+
+
+mysql -u username -p new_database < data-dump.sql 
+
+
+# sync 
+
+
+# master 
+
+
+sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 
+```
+
+```shell
+bind-address    =0.0.0.0 
+
+
+server-id       =1 
+
+... 
+
+log_bin = /var/log/mysql/mysql-bin.log 
+
+log_bin_index =/var/log/mysql/mysql-bin.log.index 
+
+relay_log = /var/log/mysql/mysql-relay-bin 
+
+relay_log_index = /var/log/mysql/mysql-relay-bin.index 
+```
+
+```shell
+
+sudo systemctl restart mysql 
+
+
+sudo mysql -u root -p 
+
+
+CREATE USER 'replication_user'@'*' IDENTIFIED BY 'replica_password'; 
+
+
+GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'*'; 
+
+
+SHOW MASTER STATUS\G 
+
+
+// Get File (MASTER_LOG_FILE), Position (MASTER_LOG_POS) 
+
+
+# slave 
+
+
+sudo vim  /etc/mysql/mysql.conf.d/mysqld.cnf 
+```
+
+```shell
+# /etc/mysql/mysql.conf.d/mysqld.cnf 
+
+bind-address           = 0.0.0.0 
+
+
+server-id              =2  
+
+
+log_bin = /var/log/mysql/mysql-bin.log 
+
+log_bin_index =/var/log/mysql/mysql-bin.log.index 
+
+relay_log = /var/log/mysql/mysql-relay-bin 
+
+relay_log_index = /var/log/mysql/mysql-relay-bin.index 
+
+
+```
+
+```shell
+
+sudo mysql -u root -p 
+
+
+STOP SLAVE;  
+
+
+CHANGE MASTER TO MASTER_HOST ='MASTER_IP', MASTER_USER ='replication_user', MASTER_PASSWORD ='replica_password', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 1643; 
+
+
+START SLAVE; 
+
+
+# MGR 
+
+
+uuidgen 
+
+
+sudo vim  /etc/mysql/mysql.conf.d/mysqld.cnf 
+
+```
+
+```shell
+
+[mysqld] 
+
+
+# General replication settings 
+
+disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" 
+
+gtid_mode = ON 
+
+enforce_gtid_consistency = ON 
+
+master_info_repository = TABLE 
+
+relay_log_info_repository = TABLE 
+
+binlog_checksum = NONE 
+
+log_slave_updates = ON 
+
+log_bin = binlog 
+
+binlog_format = ROW 
+
+transaction_write_set_extraction = XXHASH64 
+
+loose-group_replication_bootstrap_group = OFF 
+
+loose-group_replication_start_on_boot = OFF 
+
+loose-group_replication_ssl_mode = REQUIRED 
+
+loose-group_replication_recovery_use_ssl = 1 
+
+
+# Shared replication group configuration 
+
+loose-group_replication_group_name = "" # uuidgen value 
+
+loose-group_replication_ip_whitelist = "ip1,ip2,ip3" # group ips 
+
+loose-group_replication_group_seeds = "ip1:port,ip2:port,ip3:port" # group ips with ports # port usually 33061 
+
+
+# Single or Multi-primary mode? Uncomment these two lines 
+
+# for multi-primary mode, where any host can accept writes 
+
+#loose-group_replication_single_primary_mode = OFF  # for multi primary group uncomment 
+
+#loose-group_replication_enforce_update_everywhere_checks = ON # for multi primary group uncomment 
+
+
+# Host specific replication configuration 
+
+server_id =    # id 
+
+bind-address = "" # bind-address 
+
+report_host = "" # bind-address  
+
+loose-group_replication_local_address = "" # bind-address:port # port usually 33061 
+
+
+```
+
+```shell
+
+
+systemctl restart mysql 
+
+
+# on all members 
+
+
+mysql 
+
+
+SET SQL_LOG_BIN=0; 
+
+
+CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL; 
+
+
+GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; 
+
+
+FLUSH PRIVILEGES; 
+
+
+SET SQL_LOG_BIN=1; 
+
+
+CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; 
+
+# or 
+
+CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; 
+
+
+INSTALL PLUGIN group_replication SONAME 'group_replication.so'; 
+
+
+# on one member (maybe first) 
+
+
+SET GLOBAL group_replication_bootstrap_group=ON; 
+
+
+START GROUP_REPLICATION; 
+
+
+SET GLOBAL group_replication_bootstrap_group=OFF; 
+
+
+# on the other members 
+
+
+START GROUP_REPLICATION; 
+
+
+```
+
+# MONGODB
+
+```shell
+
+curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add - 
+
+
+echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list 
+
+
+sudo apt update 
+
+
+sudo apt install mongodb-org 
+
+
+mkdir -p ~/data/db 
+
+
+sudo mongod --dbpath ~/data/db 
+
+
+```
+
+
+# CHROME
+
+```shell
+
+# download .deb 
+
+
+sudo apt install ./<file>.deb 
+
+
+```
+
+
+# VSCODE
+
+```shell
+# download .deb 
+
+
+sudo apt install ./<file>.deb 
+```
+
+# GOLANG
+
+```shell
+curl -OL https://golang.org/dl/go1.16.7.linux-amd64.tar.gz 
+
+
+sudo tar -C /usr/local -xvf go1.16.7.linux-amd64.tar.gz 
+
+
+sudo nano ~/.profile 
+
+
+```
+
+```shell
+. . . 
+
+export PATH=$PATH:/usr/local/go/bin 
+```
+
+```shell
+source ~/.profile 
+
+```
+
+```shell
+
+# private module
+
+# $HOME/.gitconfig
+
+[url "https://${ID}:${PW}@private.git.com"]
+        insteadOf = https://private.git.com
+
+# or
+
+git config --global url."https://${ID}:${PW}@private.git.com".insteadOf "https://private.git.com"
+
+export GONOPROXY=private.git.com
+export GONOSUMDB=private.git.com
+export GOPRIVATE=private.git.com
+
+# subgroup
+
+git config --global url."https://${ID}:${PW}@private.git.com/sub".insteadOf "https://private.git.com/sub"
+
+export GONOPROXY=private.git.com/sub
+export GONOSUMDB=private.git.com/sub
+export GOPRIVATE=private.git.com/sub
+
+```
+
+# JMETER
+
+```shell
+
+# install openjdk
+
+# create thread group
+
+# add sampler
+
+jmeter -n -t <ThreadGroup.jmx> -l <report.csv> -e -o <report>
+
+```
+
+# CRYPTO
+
+```shell
+
+openssl
+
+
+# issuer(ca) keygen
+
+openssl genrsa -out ca_priv.pem 2048
+
+openssl rsa -in ca_priv.pem -outform PEM -pubout -out ca_pub.pem
+
+# ec 
+
+openssl genpkey -algorithm ed25519 -out ./certs/ca_priv.pem 
+
+openssl pkey -in ./certs/ca_priv.pem -outform PEM -pubout -out ./certs/ca_pub.pem
+
+# gencert
+
+openssl req -x509 -new -key ca_priv.pem -days 365 -out ca.crt -subj "/CN=issuerforseantywork.com"
+
+
+# subject(issuer) keygen
+
+openssl genrsa -out sub_priv.pem 2048
+
+openssl rsa -in sub_priv.pem -outform PEM -pubout -out sub_pub.pem
+
+# ec
+
+openssl genpkey -algorithm ed25519 -out ./certs/server.key 
+
+openssl pkey -in ./certs/server.key -outform PEM -pubout -out ./certs/server.pub
+
+
+
+# subject csr
+
+openssl req -key sub_priv.pem -new -sha256 -out sub.csr -subj "/CN=subjectforseantywork.com"
+
+# issuer signing
+
+openssl  x509 -req -days 180 -in sub.csr -CA ca.crt -CAkey ca_priv.pem -CAcreateserial -sha256 -out sub.crt
+
+# issuer signing with sans
+
+openssl  x509 -req -extfile <(printf "subjectAltName = DNS:some.thing") -days 180 -in sub.csr -CA ca.crt -CAkey ca_priv.pem -CAcreateserial -sha256 -out sub.crt
+
+# read csr, certificate
+
+openssl x509 -in <csr,crt> -text -noout
+
+# verify subject cert against issuer cert
+
+openssl verify -CAfile ca.crt sub.crt
+
+
+# ca extension
+
+
+CONFIG="[ v3_req ]\n" && \
+CONFIG="${CONFIG}subjectKeyIdentifier=hash\n" && \
+CONFIG="${CONFIG}authorityKeyIdentifier=keyid:always,issuer\n" && \
+CONFIG="${CONFIG}basicConstraints=CA:TRUE\n" && \
+CONFIG="${CONFIG}keyUsage=keyCertSign,cRLSign\n" && \
+openssl req -new -x509 -days 3650 \
+       -sha256 -key root.key \
+       -out root.crt \
+       -subj "/CN=ROOT CA" \
+       -config <(printf "${CONFIG}") \
+       -extensions v3_req 
+
+
+# cert extension
+
+EXTFILE="subjectKeyIdentifier=hash\n" && \
+EXTFILE="${EXTFILE}authorityKeyIdentifier=keyid,issuer\n" && \
+EXTFILE="${EXTFILE}basicConstraints=CA:FALSE\n" && \
+EXTFILE="${EXTFILE}subjectAltName=email:copy\n" && \
+EXTFILE="${EXTFILE}extendedKeyUsage=serverAuth\n" && \
+openssl  x509 -req -days 365 \
+       -in ./server.csr \
+       -extfile <(printf "${EXTFILE}") \
+       -CA ./root.crt \
+       -CAkey ./root.key \
+  -sha256 \
+       -out ./server.crt 
+
+
+
+# x509
+
+ certificate and public key send, root ca on the authenticate requester side, chained authentication
+
+ if done, use the pub key to send symmetric key
+
+# gpg
+
+gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
+
+gpg --output un_encrypted.data --decrypt encrypted.data
+
+
+# john
+
+./john --format=raw-MD5-opencl --wordlist=../passwords.txt --rules ../md5.txt
+
+# hashcat
+
+./hashcat.bin -m 17400 ../sha3_256.txt ../passwords.txt -r ../password_rule.rule -w 3 --force
+
+
+
+
+# quantum safe
+
+# get suitable openssl
+
+OSSLV="openssl-3.4.1"
+
+
+curl -L "https://github.com/openssl/openssl/releases/download/openssl-$OSSLV/openssl-$OSSLV.tar.gz" -o "openssl-$OSSLV.tar.gz"
+
+tar -zxf "openssl-$OSSLV.tar.gz"
+
+cd "openssl-$OSSLV"
+
+./config
+
+make
+
+make test
+
+sudo make install
+
+sudo ldconfig /usr/local/lib64/
+
+# get oqs
+
+LIBOQSV="0.12.0"
+OQSPROVV="0.8.0"
+
+rm -rf liboqs* oqs-provider* *.tar.gz
+
+sudo apt update 
+
+sudo apt install astyle cmake gcc ninja-build python3-pytest python3-pytest-xdist unzip xsltproc doxygen graphviz python3-yaml valgrind
+
+curl -L https://github.com/open-quantum-safe/liboqs/archive/refs/tags/$LIBOQSV.tar.gz -o $LIBOQSV.tar.gz
+
+
+curl -L https://github.com/open-quantum-safe/oqs-provider/archive/refs/tags/$OQSPROVV.tar.gz -o $OQSPROVV.tar.gz
+
+
+tar xzf $LIBOQSV.tar.gz
+
+tar xzf $OQSPROVV.tar.gz
+
+mv "liboqs-$LIBOQSV" liboqs
+
+mv "oqs-provider-$OQSPROVV" oqs-provider
+
+pushd liboqs
+
+mkdir build 
+
+pushd build 
+
+cmake -GNinja .. 
+
+ninja 
+
+sudo ninja install
+
+popd 
+
+popd 
+
+pushd oqs-provider
+
+cmake -S . -B _build && cmake --build _build && ctest --test-dir _build && sudo cmake --install _build
+
+popd
+
+# add below to /usr/local/ssl/openssl.cnf
+
+openssl_conf = openssl_init
+
+[openssl_init]
+providers = provider_sect
+
+[provider_sect]
+oqsprovider = oqsprovider_sect
+default = default_sect
+fips = fips_sect
+
+[default_sect]
+activate = 1
+
+[fips_sect]
+activate = 1
+
+[oqsprovider_sect]
+activate = 1
+
+
+# check
+
+openssl list -providers
+
+
+
+# pq certgen
+
+openssl req -x509 -new -newkey dilithium3 -keyout dilithium3_CA.key -out dilithium3_CA.crt -nodes -subj "/CN=test CA" -days 365
+
+openssl genpkey -algorithm dilithium3 -out dilithium3_srv.key
+
+openssl req -new -newkey dilithium3 -keyout dilithium3_srv.key -out dilithium3_srv.csr -nodes -subj "/CN=test server" 
+
+openssl x509 -req -in dilithium3_srv.csr -out dilithium3_srv.crt -CA dilithium3_CA.crt -CAkey dilithium3_CA.key -CAcreateserial -days 365
+
+
+# server test
+
+openssl s_server -port 9999 -cert dilithium3_srv.crt -key dilithium3_srv.key -tls1_3 -groups frodo640shake
+
+# client test 
+
+openssl s_client -connect 192.168.64.6:9999 -CAfile certs/dilithium3_ca.crt -groups frodo640shake
+```
+
+
+
+# DOCKER INSTALL
+
+```shell
+
+
+apt remove docker docker-engine docker.io containerd runc 
+
+apt update 
+
+apt install \ 
+
+    ca-certificates \ 
+
+    curl \ 
+
+    gnupg \ 
+
+    lsb-release 
+
+mkdir -p /etc/apt/keyrings 
+
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 
+
+echo \ 
+
+  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ 
+
+  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 
+
+apt update 
+
+apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin 
+
+```
+
+# INSTALL DOCKER-COMPOSE
+
+```shell
+
+curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
+
+chmod +x /usr/local/bin/docker-compose 
+
+
+```
+
+# PODMAN
+
+```shell
+
+sudo apt-get install -y podman
+
+sudo apt-get install -y podman-compose
+
+# /etc/containers/registries.conf
+
+unqualified-search-registries = ["docker.io"]
+
+
+
+
+```
+
+
+# PREPARE DOCKER IMAGE
+
+```shell
+
+
+
+docker-compose up  
+
+
+docker-compose down 
+
+
+docker login 
+
+
+docker tag IMAGEID seantywork/NAME 
+
+
+docker push seantywork/NAME
+
+```
+
+# DOCKER PRIVATE
+
+```shell
+
+docker login <address:port> 
+```
+
+
+# DOCKER 
+
+```shell
+
+
+# in case of podman
+
+
+vim ~/.config/containers/registries.conf
+
+unqualified-search-registries = ["docker.io"]
+
+
+# login
+
+docker login
+
+# logout 
+
+docker logout
+
+# pull 
+
+docker pull image:tag
+
+# tag 
+
+docker tag orgimg/test newimg/test 
+
+# push 
+
+docker push newimg/test
+
+# build 
+
+docker build -t image-name:tag .
+
+# export 
+
+docker save localhost/image-name:latest -o test.tar.gz
+
+# import 
+
+docker load -i test.tar.gz
+
+# util
+
+docker image ...
+docker container ...
+docker network ...
+docker volume ... 
+
+# network
+
+docker network create --driver=bridge cbr0
+
+# network ls
+
+docker network ls
+
+# network rm 
+
+docker network rm cbr0
+
+# run with name
+
+docker run --rm --name name0  -p 8080:80 localhost/image-name
+
+# run with network
+
+docker run --rm --network cbr0  -p 8080:80 localhost/image-name
+
+# run with port
+
+docker run --rm -p 8080:80 localhost/image-name
+
+# run with volume
+
+docker run --rm -v ./local:/workspace localhost/image-name
+
+# run detached
+
+docker run --rm -d localhost/image-name
+
+# run with command
+
+docker run --rm -t -v ./local:/usr/workspace localhost/image-name /bin/bash -c 'cd test && ./hello.sh'
+
+# run with interactive 
+
+docker run --rm -it -v ./local:/usr/workspace localhost/image-name /bin/bash -c 'cd test && ./hello.sh'
+
+# run with environment 
+
+docker run --rm -e MYENV=hello localhost/image-name
+
+
+# exec
+
+docker exec -it container /bin/bash
+
+# stop 
+
+docker stop container
+
+```
+
+
+# DOCKER-COMPOSE
+
+```shell
+
+# build, name, port,  
+
+# image , volume, runtime 
+
+```
+
+
+# DOCKER REMOTE
+
+```shell
+
+
+
+# on docker daemon host 
+
+
+ssh-keygen 
+
+
+# move id_rsa to the client 
+
+# add id_rsa.pub to authrized_keys 
+
+# on client move id_rsa to ~/.ssh 
+
+
+docker -H ssh://user@host <command> 
+
+
+```
+
+# DOCKER REMOTE CONTEXT
+
+```shell
+
+
+docker context create \ 
+
+    --docker host=ssh://user@host \ 
+
+    docker-remote 
+
+
+docker context use docker-remote 
+
+
+docker context use default 
+
+```
+
+
+# KIND INSTALL
+
+```shell
+
+
+curl -Lo ./kind "https://kind.sigs.k8s.io/dl/v0.14.0/kind-$(uname)-amd64" 
+
+
+chmod +x ./kind 
+
+
+sudo mv ./kind /usr/local/bin/ 
+
+```
+
+
+
+
+# JOIN TOKEN CREATION
+
+```shell
+kubeadm token create --print-join-command 
+
+```
+
+
+# WORKER NODE JOIN
+
+```shell
+
+sudo kubeadm join 10.128.0.37:6443 --token j4eice.33vgvgyf5cxw4u8i \ 
+
+    --discovery-token-ca-cert-hash sha256:37f94469b58bcc8f26a4aa44441fb17196a585b37288f85e22475b00c36f1c61 
+
+
+```
+
+
+# LABEL WORKER
+
+
+```shell
+sudo kubectl label node worker-node01  node-role.kubernetes.io/worker=worker 
+
+
+sudo kubectl label node worker-node01  ingress-ready=true 
+
+
+
+```
+
+
+# IN CASE OF DNS MESSED UP
+
+```shell
+
+
+sudo kubectl -n kube-system rollout restart deployment coredns 
+
+
+```
+
+
+# MASTER NODE SCHEDULING
+
+
+```shell
+kubectl taint nodes --all node-role.kubernetes.io/master- 
+
+# or
+
+sudo kubectl taint node <master> node-role.kubernetes.io/control-plane:NoSchedule-
+
+sudo kubectl taint node <master> node-role.kubernetes.io/master:NoSchedule-
+
+
+```
+
+# PREVENT SCHEDULING
+
+
+```shell
+sudo kubectl cordon <node> 
+
+
+```
+
+
+# TEAR DOWN CLUSTER
+
+
+```shell
+
+sudo kubectl drain <node> --delete-local-data --force --ignore-daemonsets 
+
+```
+
+
+# RE-SCHEDULE NODE
+
+```shell
+sudo kubectl uncordon <node> 
+
+```
+
+# ON EACH NODE
+
+```shell
+
+sudo kubeadm reset 
+```
+
+# HA CLUSTER
+
+
+```shell
+
+sudo apt-get update 
+
+sudo apt-get install haproxy 
+
+
+sudo vim /etc/haproxy/haproxy.cfg 
+
+```
+
+```shell
+# /etc/haproxy/haproxy.cfg 
+
+
+
+global 
+
+... 
+
+default 
+
+... 
+
+frontend kubernetes 
+
+bind <kube-lb-domain-or-ip>:<kube-lb-port> # *:<kube-lb-port> 
+
+option tcplog 
+
+mode tcp 
+
+#default_backend kubernetes-master-nodes 
+
+
+
+#acl kubernetes-master-rule hdr(host) -i k8s.cluster.com 
+
+
+
+#use_backend kubernetes-master-nodes if kubernetes-master-rule 
+
+
+
+backend kubernetes-master-nodes 
+
+mode tcp 
+
+balance roundrobin 
+
+option tcp-check 
+
+server k8s-master-0 <kube-master-0>:6443 check fall 3 rise 2 
+
+server k8s-master-1 <kube-master-1>:6443 check fall 3 rise 2 
+
+server k8s-master-2 <kube-master-2>:6443 check fall 3 rise 2 
+
+```
+
+```shell
+
+
+sudo systemctl restart haproxy 
+
+
+
+# same wj.sh on all nodes 
+
+
+# different mj.sh on the first master node 
+
+
+sudo kubeadm init --apiserver-advertise-address=$MASTER_IP --apiserver-cert-extra-sans="$MASTER_IP,$KUBELBADDR" --pod-network-cidr=$POD_CIDR --control-plane-endpoint "$KUBELBADDR:$KUBELBPORT"  --node-name "$NODENAME" --ignore-preflight-errors Swap 
+
+```
+
+# SCP CERTS
+
+
+```shell
+
+
+USER=<user-on-host> # customizable 
+
+# Set the control_plane_ips to all other master node ips or hostnames 
+
+CONTROL_PLANE_IPS="<addr1> <addr2>" 
+
+for host in ${CONTROL_PLANE_IPS}; do 
+
+    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host: 
+
+    scp /etc/kubernetes/pki/ca.key "${USER}"@$host: 
+
+    scp /etc/kubernetes/pki/sa.key "${USER}"@$host: 
+
+    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host: 
+
+    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host: 
+
+    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host: 
+
+    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt 
+
+    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key 
+
+    scp /etc/kubernetes/admin.conf "${USER}"@$host: 
+
+done 
+
+
+
+```
+
+
+# MV CERTS ON EACH MASTER NODE
+
+
+```shell
+
+
+USER=<user-on-host> # customizable 
+
+mkdir -p /etc/kubernetes/pki/etcd 
+
+mv /home/${USER}/ca.crt /etc/kubernetes/pki/ 
+
+mv /home/${USER}/ca.key /etc/kubernetes/pki/ 
+
+mv /home/${USER}/sa.pub /etc/kubernetes/pki/ 
+
+mv /home/${USER}/sa.key /etc/kubernetes/pki/ 
+
+mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/ 
+
+mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/ 
+
+mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt 
+
+mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key 
+
+mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf 
+
+
+```
+
+
+# JOIN MASTER NODE
+
+
+```shell
+
+
+sudo kubeadm join 10.128.0.37:6443 --token j4eice.33vgvgyf5cxw4u8i \ 
+
+    --discovery-token-ca-cert-hash sha256:37f94469b58bcc8f26a4aa44441fb17196a585b37288f85e22475b00c36f1c61 \ 
+
+    --control-plane --node-name <name> 
+
+
+# admin.conf -> .kube/config 
+```
+
+
+# JOIN WORKER NODE
+
+
+```shell
+sudo kubeadm join 10.128.0.37:6443 --token j4eice.33vgvgyf5cxw4u8i \ 
+
+    --discovery-token-ca-cert-hash sha256:37f94469b58bcc8f26a4aa44441fb17196a585b37288f85e22475b00c36f1c61 \ 
+
+    --node-name <name> 
+
+
+
+```
+
+# CNIS
+
+
+```shell
+
+kubectl apply -f  <CNI> ex) https://docs.projectcalico.org/manifests/calico.yaml , "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" , https://raw.githubusercontent.com/aojea/kindnet/master/install-kindnet.yaml 
+
+```
+
+
+# KIND RUN
+
+
+```yaml
+
+# Kind yaml structure example
+
+
+
+kindcluster.yaml 
+
+
+kind: Cluster 
+
+
+apiVersion: kind.x-k8s.io/v1alpha4 
+
+
+nodes: 
+
+
+ - role: control-plane 
+
+     kubeadmConfigPatches: 
+
+  - | 
+
+    kind: InitConfiguration 
+
+    nodeRegistration: 
+
+      kubeletExtraArgs: 
+
+        node-labels: "ingress-ready=true" 
+
+  extraPortMappings: 
+
+  - containerPort: 80 
+
+    hostPort: 80 
+
+    protocol: TCP 
+
+  - containerPort: 443 
+
+    hostPort: 443 
+
+    protocol: TCP 
+
+ - role: worker 
+
+
+ - role: worker
+```
+
+```shell
+kind create cluster --name kindcluster --config ./kindcluster.yaml --image=kindest/node:v1.21.12 
+
+```
+
+# KUBECTL DEPLOYMENT
+
+
+```shell
+kubectl apply -f <yamls> 
+```
+
+# PORT FORWARD
+
+```shell
+kubectl port-forward resource/name port
+```
+
+
+# KUBECTL INGRESS
+
+
+```shell
+kubectl label node <node> ingress-ready=true 
+
+
+kubectl apply -f <controller> ex) https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml 
+
+
+kubectl apply -f ingress.yaml 
+
+
+```
+
+# TLS INGRESS NEED SECRET
+
+
+```shell
+
+
+# self singed certs 
+
+
+openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=localhost" 
+
+
+kubectl create secret tls --save-config tls-openssl --key ./tls.key --cert ./tls.crt 
+
+
+# include $HOME .kube config -- remote kubectl and switching 
+
+
+kubectl config use-context <context-name
+
+```
+
+
+# TURNING OFF
+
+```shell
+
+kubectl delete --all ingress, services, deployments 
+
+
+kind delete cluster --name NAME 
+
+
+docker system prune -a  
+
+```
+
+
+# CHECK
+
+
+```shell
+systemctl status docker 
+
+systemctl status kubelet 
+
+```
+
+# SECRET REG
+
+
+```shell
+
+kubectl create secret generic <regcred> \ 
+
+    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ 
+
+    --type=kubernetes.io/dockerconfigjson 
+
+
+kubectl create secret docker-registry <pull_secret_name> \ 
+
+    --docker-server=<registry_server> \ 
+
+    --docker-username=<user_name> \ 
+
+    --docker-password=<password> \ 
+
+```
+
+
+# K8S COMPONENTS
+
+```shell
+
+
+ingress controller -> ingress -> svc 
+
+svc -> dpl, stf  
+
+secret -> tls, reg -> cert&key, credentials 
+
+vol -> pv[k8sdiskpath], storageclass -> stf, volmount[containerpath] = volclaim = storageclass 
+
+```
+
+# DEPLOYMENT EXAMPLE
+
+
+```yaml
+apiVersion: apps/v1 
+
+kind: Deployment 
+
+metadata: 
+
+  name: db 
+
+spec: 
+
+  selector: 
+
+    matchLabels: 
+
+      app: db 
+
+  replicas: 1 
+
+  template: 
+
+    metadata: 
+
+      labels: 
+
+        app: db 
+
+    spec: 
+
+      imagePullSecrets: 
+
+        - name: docker-secret 
+
+      containers: 
+
+        - name: db 
+
+          image: seantywork/db 
+
+          ports: 
+
+          - containerPort: 3306 
+
+```
+
+
+# SERVICE EXAMPLE
+
+
+```yaml
+
+apiVersion: v1 
+
+kind: Service 
+
+metadata: 
+
+  name: db 
+
+  labels: 
+
+    app: db 
+
+spec: 
+
+  type: ClusterIP 
+
+  ports: 
+
+  - port: 3306 
+
+    targetPort: 3306 
+
+    protocol: TCP 
+
+  selector: 
+
+    app: db 
+
+```
+
+
+# SERVICE IN DIFFERENT NAMESPACE
+
+
+```shell
+
+<serivce_name>.<namespace_name> 
+```
+
+# NODE SELECTOR & AFFINITY
+
+
+```yaml
+
+
+apiVersion: v1 
+
+kind: Pod 
+
+
+.... 
+
+
+spec: 
+
+  nodeSelector:  
+
+    region: east 
+
+    type: user-node 
+
+```
+
+
+```yaml
+
+apiVersion: v1 
+
+kind: Pod 
+
+metadata: 
+
+  name: with-node-affinity 
+
+spec: 
+
+  affinity: 
+
+    nodeAffinity: 
+
+      requiredDuringSchedulingIgnoredDuringExecution: 
+
+        nodeSelectorTerms: 
+
+        - matchExpressions: 
+
+          - key: topology.kubernetes.io/zone 
+
+            operator: In 
+
+            values: 
+
+            - antarctica-east1 
+
+            - antarctica-west1 
+
+
+
+```
+
+
+# ENV
+
+
+```yaml
+apiVersion: apps/v1 
+
+kind: Deployment 
+
+
+.... 
+
+
+
+    spec: 
+
+      containers: 
+
+        - name: kibana 
+
+          image: docker.elastic.co/kibana/kibana:7.11.0 
+
+          env: 
+
+          - name: ELASTICSEARCH_HOSTS 
+
+            value: http://elasticsearch:9200 
+
+          imagePullPolicy: Always 
+
+          ports: 
+
+          - containerPort: 5601 
+
+
+```
+
+
+# COMMAND
+
+
+```yaml
+
+.... 
+
+
+containers: 
+
+  - name: mysqldump 
+
+    image: mysql 
+
+    command: ["/bin/sh", "-c"] 
+
+    args: 
+
+      - echo starting; 
+
+        ls -la /backups; 
+
+        mysqldump --host=... -r /backups/file.sql db_name; 
+
+        ls -la /backups; 
+
+        echo done; 
+
+    volumeMounts: 
+
+      - ... 
+
+
+```
+
+# NODEPORT
+
+
+```yaml
+kind: Service
+apiVersion: v1
+metadata:
+  name: nodeport-test
+spec:
+  type: NodePort
+  selector:
+    app: tgtraffic
+  ports:
+    - nodePort: 30505
+      port: 5005
+      targetPort: 5005
+
+```
+
+# INGRESS
+
+```yaml
+
+apiVersion: networking.k8s.io/v1 
+
+kind: Ingress 
+
+metadata: 
+
+  name: ingress 
+
+spec: 
+
+  tls: 
+
+  - hosts: 
+
+    - usagecorpus.com 
+
+    secretName: uc-tls-secret 
+
+  - hosts: 
+
+    - www.usagecorpus.com 
+
+    secretName: uc-tls-secret 
+
+  - hosts: 
+
+    - ptt.usagecorpus.com 
+
+    secretName: ptt-tls-secret 
+
+  rules: 
+
+  - host: "usagecorpus.com" 
+
+    http: 
+
+      paths: 
+
+        - path: / 
+
+          pathType: Prefix 
+
+          backend: 
+
+            service: 
+
+              name: traffic 
+
+              port: 
+
+                number: 5005 
+
+  - host: "www.usagecorpus.com" 
+
+    http: 
+
+      paths: 
+
+        - path: / 
+
+          pathType: Prefix 
+
+          backend: 
+
+            service: 
+
+              name: traffic 
+
+              port: 
+
+                number: 5005 
+
+  - host: "ptt.usagecorpus.com" 
+
+    http: 
+
+      paths: 
+
+        - path: / 
+
+          pathType: Prefix 
+
+          backend: 
+
+            service: 
+
+              name: trafficph 
+
+              port: 
+
+                number: 5006 
+
+
+```
+
+
+# CONFIGMAP
+
+
+```yaml
+
+apiVersion: v1
+data:
+  allow-snippet-annotations: "true"
+  use-forwarded-headers: "true"
+  compute-full-forwarded-for: "true"
+  keep-alive: "20"
+kind: ConfigMap
+metadata:
+  annotations:
+    kubectl.kubernetes.io/last-applied-configuration: |
+      {"apiVersion":"v1","data":{"allow-snippet-annotations":"true","use-forwarded-headers":"true"},"kind":"ConfigMap","metadata":{"annotations":{},"creationTimestamp":"2022-11-23T07:56:59Z","labels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/part-of":"ingress-nginx","app.kubernetes.io/version":"1.5.1"},"name":"ingress-nginx-controller","namespace":"ingress-nginx","resourceVersion":"383","uid":"08673e9a-bdba-4a5a-9dda-a7f470d6214e"}}
+  creationTimestamp: "2022-11-23T07:56:59Z"
+  labels:
+    app.kubernetes.io/component: controller
+    app.kubernetes.io/instance: ingress-nginx
+    app.kubernetes.io/name: ingress-nginx
+    app.kubernetes.io/part-of: ingress-nginx
+    app.kubernetes.io/version: 1.5.1
+  name: ingress-nginx-controller
+  namespace: ingress-nginx
+  resourceVersion: "24225834"
+  uid: 08673e9a-bdba-4a5a-9dda-a7f470d6214e
+```
+
+```yaml
+
+
+apiVersion: v1 
+
+kind: ConfigMap 
+
+metadata: 
+
+  namespace: logging 
+
+  name: elasticsearch-data-config 
+
+  labels: 
+
+    app: elasticsearch 
+
+    role: data 
+
+data: 
+
+  elasticsearch.yml: |- 
+
+    cluster.name: ${CLUSTER_NAME} 
+
+    node.name: ${NODE_NAME} 
+
+    discovery.seed_hosts: ${NODE_LIST} 
+
+    cluster.initial_master_nodes: ${MASTER_NODES} 
+
+    network.host: 0.0.0.0 
+
+    node: 
+
+      master: false 
+
+      data: true 
+
+      ingest: false 
+
+    xpack.security.enabled: true 
+
+    xpack.monitoring.collection.enabled: true 
+
+
+```
+
+
+```shell
+
+# create
+
+
+kubectl create configmap ${CONFIGMAP_NAME} --from-file=${FILE} --from-file=${FILE}
+
+
+```
+
+
+```shell
+# mount
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: clusterdebugger
+spec:
+  selector:
+    matchLabels:
+      app: clusterdebugger
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: clusterdebugger
+    spec:
+      imagePullSecrets:
+        - name: harbor-secret
+      containers:
+        - name: clusterdebugger
+          image: harbor.mipllab.com/library/clusterdebugger
+          volumeMounts:
+          - mountPath: /tmp
+            name: debugger-mount
+          imagePullPolicy: Always
+          ports:
+          - containerPort: 6700
+      volumes:
+      - name: debugger-mount
+        configMap: 
+          name: debugger-mount
+          items:
+            - key: usercontent.c
+              path: usercontent.c
+            - key: usercontent.input
+              path: usercontent.input
+
+```
+
+
+
+# SECRET EXAMPLE (TLS)
+
+```shell
+apiVersion: v1 
+
+data: 
+
+  tls.crt: ./tls.crt 
+
+  tls.key: ./tls.key 
+
+kind: Secret 
+
+metadata: 
+
+  name: uc-tls-secret 
+
+  namespace: default 
+
+type: kubernetes.io/tls 
+
+```
+
+# ANNOTATION
+
+```yaml
+
+apiVersion: networking.k8s.io/v1 
+
+kind: Ingress 
+
+metadata: 
+
+  name: minimal-ingress 
+
+  annotations: 
+    nginx.ingress.kubernetes.io/proxy-body-size: "0"
+    nginx.ingress.kubernetes.io/proxy-http-version : "1.1"
+    nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
+    nginx.ingress.kubernetes.io/proxy-buffering: "off"
+    nginx.ingress.kubernetes.io/rewrite-target: / 
+
+spec: 
+
+  ingressClassName: nginx-example 
+
+  rules: 
+
+  - http: 
+
+      paths: 
+
+      - path: /testpath 
+
+        pathType: Prefix 
+
+        backend: 
+
+          service: 
+
+            name: test 
+
+            port: 
+
+              number: 80 
+
+
+```
+
+# DEPLOYMENT EXAMPLE (VOLUME)
+
+
+```yaml
+
+apiVersion: apps/v1 
+
+kind: Deployment 
+
+metadata: 
+
+  name: db 
+
+spec: 
+
+  selector: 
+
+    matchLabels: 
+
+      app: db 
+
+  replicas: 1 
+
+  template: 
+
+    metadata: 
+
+      labels: 
+
+        app: db 
+
+    spec: 
+
+      imagePullSecrets: 
+
+        - name: docker-secret 
+
+      volumes: 
+
+        - name: db-pv-storage 
+
+          persistentVolumeClaim: 
+
+            claimName: dbpvc 
+
+      containers: 
+
+        - name: db 
+
+          image: seantywork/db 
+
+          ports: 
+
+          - containerPort: 3306 
+
+          volumeMounts: 
+
+          - mountPath: "/var/lib/mysql" 
+
+            name: db-pv-storage 
+
+```
+
+# STATEFULSET EXAMPLE
+
+
+```yaml
+apiVersion: apps/v1 
+
+kind: StatefulSet 
+
+metadata: 
+
+  name: dbstf 
+
+spec: 
+
+  selector: 
+
+    matchLabels: 
+
+      app: dbstf 
+
+  serviceName: "dbstf" 
+
+  replicas: 1 
+
+  template: 
+
+    metadata: 
+
+      labels: 
+
+        app: dbstf 
+
+    spec: 
+
+      terminationGracePeriodSeconds: 10 
+
+      containers: 
+
+      - name: dbstf 
+
+        image: seantywork/db 
+
+        ports: 
+
+        - containerPort: 3306 
+
+        volumeMounts: 
+
+        - name: dbpvc 
+
+          mountPath: /var/lib/mysql 
+
+  volumeClaimTemplates: 
+
+  - metadata: 
+
+      name: dbpvc 
+
+    spec: 
+
+      accessModes: ["ReadWriteOnce"] 
+
+      storageClassName: "manual" 
+
+      resources: 
+
+        requests: 
+
+          storage: 3Gi 
+
+
+```
+
+# STORAGECLASS EXAMPLE (DEFAULT)
+
+```shell
+
+kind: StorageClass 
+
+apiVersion: storage.k8s.io/v1 
+
+metadata: 
+
+  annotations: 
+
+    storageclass.kubernetes.io/is-default-class: "true" 
+
+  name: pv2-local-storageclass 
+
+provisioner: kubernetes.io/no-provisioner 
+
+volumeBindingMode: WaitForFirstConsumer 
+
+```
+
+
+# STORAGECLASS EXAMPLE (DEFAULT NFS)
+
+```shell
+
+helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ 
+
+
+helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ 
+
+    --set nfs.server=x.x.x.x \ 
+
+    --set nfs.path=/exported/path 
+
+# yaml
+```
+
+```yaml
+kind: StorageClass 
+
+apiVersion: storage.k8s.io/v1 
+
+metadata: 
+
+  annotations: 
+
+    storageclass.kubernetes.io/is-default-class: "true" 
+
+  name: nfs-default-storageclass 
+
+provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # cluster.local/nfs-subdir-external-provisioner 
+
+allowVolumeExpansion: true 
+
+volumeBindingMode: Immediate 
+
+```
+
+# PERSISTENT VOLUME EXAMPLE (HOSTPATH)
+
+```yaml
+
+apiVersion: v1 
+
+kind: PersistentVolume 
+
+metadata: 
+
+  name: dbpv 
+
+  labels: 
+
+    type: local 
+
+spec: 
+
+  storageClassName: manual 
+
+  capacity: 
+
+    storage: 10Gi 
+
+  accessModes: 
+
+    - ReadWriteOnce 
+
+  hostPath: 
+
+    path: "/home/styw/project/k8s/vol_host" 
+
+```
+
+# PERSISTENT VOLUME EXAMPLE (LOCALSTORAGE) 
+
+```yaml
+
+apiVersion: v1 
+
+kind: PersistentVolume 
+
+metadata: 
+
+  name: pv1-local 
+
+spec: 
+
+  capacity: 
+
+    storage: 64Gi 
+
+  accessModes: 
+
+  - ReadWriteOnce 
+
+  persistentVolumeReclaimPolicy: Recycle 
+
+  storageClassName: local-storage 
+
+  local: 
+
+    path: /data/volumes/pv1 
+
+  nodeAffinity: 
+
+    required: 
+
+      nodeSelectorTerms: 
+
+      - matchExpressions: 
+
+        - key: kubernetes.io/hostname 
+
+          operator: In 
+
+          values: 
+
+          - worker1-lw 
+
+```
+
+# PERSISTENT VOLUME EXAMPLE (NFS) 
+
+```yaml
+apiVersion: v1 
+
+kind: PersistentVolume 
+
+metadata: 
+
+  name: dbpv 
+
+spec: 
+
+  capacity: 
+
+    storage: 10Gi 
+
+  volumeMode: Filesystem 
+
+  accessModes: 
+
+    - ReadWriteMany 
+
+  persistentVolumeReclaimPolicy: Recycle 
+
+  storageClassName: nfs 
+
+  mountOptions: 
+
+    - hard 
+
+    - nfsvers=4.1 
+
+  nfs: 
+
+    path: /opt/k8s-pods/data 
+
+    server: 192.168.1.40 
+
+
+```
+
+# PERSISTENT VOLUME CLAIM EXAMPLE (HOSTPATH) 
+
+```yaml
+
+apiVersion: v1 
+
+kind: PersistentVolumeClaim 
+
+metadata: 
+
+  name: dbpvc 
+
+spec: 
+
+  storageClassName: manual 
+
+  accessModes: 
+
+    - ReadWriteOnce 
+
+  resources: 
+
+    requests: 
+
+      storage: 3Gi 
+
+```
+
+# PERSISTENT VOLUME CLAIM EXAMPLE (LOCALSTORAGE) 
+
+```yaml
+kind: PersistentVolumeClaim 
+
+apiVersion: v1 
+
+metadata: 
+
+  name: pv1-local-claim 
+
+spec: 
+
+  accessModes: 
+
+  - ReadWriteOnce 
+
+  storageClassName: local-storage 
+
+  resources: 
+
+    requests: 
+
+      storage: 64Gi 
+
+```
+
+# PERSISTENT VOLUME CLAIM EXAMPLE (NFS) 
+
+```yaml
+
+apiVersion: v1 
+
+kind: PersistentVolumeClaim 
+
+metadata: 
+
+  name: dbpvc 
+
+spec: 
+
+  storageClassName: nfs 
+
+  accessModes: 
+
+    - ReadWriteMany 
+
+  resources: 
+
+    requests: 
+
+      storage: 10Gi 
+
+```
+
+# SYSBOX - FOR DIND 
+
+```shell
+
+
+# install 
+
+wget https://downloads.nestybox.com/sysbox/releases/v0.5.0/sysbox-ce_0.5.0-0.linux_amd64.deb 
+
+
+apt install jq 
+
+apt install ./sysbox-ce_0.5.0-0.linux_amd64.deb 
+
+
+systemctl status docker 
+
+systemctl status sysbox 
+
+
+docker-compose.yaml -- add runtime: sysbox-runc
+
+```
+
+# ON K8S
+
+```shell
+kubectl label node <node-name> sysbox-install=yes 
+
+kubectl apply -f https://raw.githubusercontent.com/nestybox/sysbox/master/sysbox-k8s-manifests/sysbox-install.yaml 
+
+
+```
+
+# REMOTE KUBECTL
+
+```shell
+
+
+
+kubectl -n kube-system create serviceaccount <service-account-name> 
+
+
+kubectl create clusterrolebinding <clusterrolebinding-name> --clusterrole=cluster-admin --serviceaccount=kube-system:<service-account-name> 
+
+
+export TOKENNAME=$(kubectl -n kube-system get serviceaccount/<service-account-name> -o jsonpath='{.secrets[0].name}') 
+
+
+export TOKEN=$(kubectl -n kube-system get secret $TOKENNAME -o jsonpath='{.data.token}' | base64 --decode) 
+
+
+curl -k -H "Authorization: Bearer $TOKEN" -X GET "https://<KUBE-API-IP>:6443/api/v1/nodes" | json_pp 
+
+
+kubectl config set-credentials <service-account-name> --token=$TOKEN 
+
+
+kubectl config set-context --current --user=<service-account-name> 
+
+
+# erase TLS auth info and add to cluster the option insecure-skip-tls-verify: true 
+
+
+# then copy and paste the $HOME .kube config and modify server address 
+
+
+# or just copy the whole config with a correct API server address 
+
+
+```
+
+
+# KUBE PROXY
+
+```shell
+
+kubectl proxy --address 0.0.0.0 --accept-hosts '.*' --port=<port> 
+
+```
+
+# KUBECTL REMOTE WITH TLS AND CUSTOM DOMAIN, IP
+
+```shell
+
+kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml 
+
+
+# edit certSANS 
+
+
+# on control plane 
+
+# remove below 
+
+
+/etc/kubernetes/pki/apiserver.{crt,key} ~ 
+
+
+kubeadm init phase certs apiserver --config kubeadm.yaml 
+
+
+docker ps | grep kube-apiserver | grep -v pause 
+
+
+docker kill <containerID> 
+
+
+# or 
+
+
+crictl pods | grep kube-apiserver | cut -d' ' -f1 
+
+
+crictl stopp <pod-id> 
+
+
+crictl rmp <pod-id> 
+
+
+# wait till kube-system pods to restart and accessible by the dns 
+
+# or
+
+# on all master nodes
+
+# remove current apiserver certificates
+sudo rm /etc/kubernetes/pki/apiserver.*
+
+# generate new certificates
+sudo kubeadm init phase certs apiserver --apiserver-cert-extra-sans="ADDR1,ADDR2,ADDR3"
+
+
+```
+
+# KUBEADM RENEW CERTIFICATE
+
+```shell
+
+# on all control plane nodes
+
+kubeadm certs renew all
+
+# then restart
+
+mv /etc/kubernetes/manifest/* mv /etc/kubernetes/manifest_tmp
+
+# wait 20+ seconds
+
+mv /etc/kubernetes/manifest_tmp/* mv /etc/kubernetes/manifest
+
+
+```
+
+# KUBEADM UPGRADE
+
+```shell
+
+# on the first master nodes
+
+sudo apt-mark unhold kubeadm && \
+sudo apt-get update && sudo apt-get install -y kubeadm=1.27.x-00 && \
+sudo apt-mark hold kubeadm
+
+sudo kubeadm upgrade apply v1.27.x
+
+sudo kubectl drain <node-to-drain> --ignore-daemonsets
+
+sudo apt-mark unhold kubelet kubectl && \
+sudo apt-get update && sudo apt-get install -y kubelet=1.27.x-00 kubectl=1.27.x-00 && \
+sudo apt-mark hold kubelet kubectl
+
+sudo systemctl daemon-reload
+sudo systemctl restart kubelet
+
+sudo kubectl uncordon <node-to-uncordon>
+
+# on other master nodes 
+
+sudo apt-mark unhold kubeadm && \
+sudo apt-get update && sudo apt-get install -y kubeadm=1.27.x-00 && \
+sudo apt-mark hold kubeadm
+
+sudo kubeadm upgrade node
+
+sudo kubectl drain <node-to-drain> --ignore-daemonsets
+
+sudo apt-mark unhold kubelet kubectl && \
+sudo apt-get update && sudo apt-get install -y kubelet=1.27.x-00 kubectl=1.27.x-00 && \
+sudo apt-mark hold kubelet kubectl
+
+sudo systemctl daemon-reload
+sudo systemctl restart kubelet
+
+sudo kubectl uncordon <node-to-uncordon>
+
+# on worker nodes
+
+sudo apt-mark unhold kubeadm && \
+sudo apt-get update && sudo apt-get install -y kubeadm=1.27.x-00 && \
+sudo apt-mark hold kubeadm
+
+sudo kubeadm upgrade node
+
+sudo kubectl drain <node-to-drain> --ignore-daemonsets
+
+sudo apt-mark unhold kubelet kubectl && \
+sudo apt-get update && sudo apt-get install -y kubelet=1.27.x-00 kubectl=1.27.x-00 && \
+sudo apt-mark hold kubelet kubectl
+
+sudo systemctl daemon-reload
+sudo systemctl restart kubelet
+
+sudo kubectl uncordon <node-to-uncordon>
+
+
+```
+
+# VM 
+
+```shell
+
+# iso 
+
+# processor 
+
+# memory 
+
+# storage 
+
+# network: bridge  
+
+```
+
+
+# CLOUD (AWS)
+
+```shell
+
+# EC2: create EC2 instance  
+
+# instance details: check instace details to get access 
+
+# elastic block store: it has volume, instance info 
+
+# network & security: check network & security  
+
+# network interface: it has vpc, subnet, instance info 
+
+# vpc: EC2 must be created in a same vpc 
+
+# subnet: EC2 must be created in a same subnet under the same vpc 
+
+# security group: each EC2 must share the same security(inbound, outbound) rule 
+
+# instance: take care of firewall 
+
+```
+
+# CLOUD (GCP)
+
+```shell
+
+# api 
+
+# oauth 
+```
+
+# AWS EKS
+
+```shell
+# eksctl version 0.106.0 
+
+# create IAM user and role related to EKS and Adminaccess 
+
+
+curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" 
+
+unzip awscliv2.zip 
+
+sudo ./aws/install 
+
+
+curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp 
+
+
+mv /tmp/eksctl /usr/local/bin 
+
+
+aws configure 
+
+
+eksctl create cluster -f ekscluster.yaml 
+
+```
+
+# CUSTOM REGISTRY - HARBOR 
+
+```shell
+
+
+curl -s https://api.github.com/repos/goharbor/harbor/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep '\.tgz$' | wget -i - 
+
+
+tar xvzf harbor-offline-installer*.tgz 
+
+
+cp harbor.yml.tmpl harbor.yml 
+
+
+# change necessary info 
+
+
+
+```
+
+```shell
+
+# kubernetes private nodeport
+
+helm repo add harbor https://helm.goharbor.io
+
+
+helm install go-harbor harbor/harbor --set expose.type=nodePort --set expose.tls.auto.commonName=192.168.50.94 --set externalURL=https://192.168.50.94:30003 --set persistence.enabled=false --set imagePullPolicy=Always # --set persistence.enabled=true --set persistence.persistentVolumeClaim.registry.size=10Gi --set persistence.persistentVolumeClaim.chartmuseum.size=5Gi --set persistence.persistentVolumeClaim.jobservice.size=5Gi --set persistence.persistentVolumeClaim.database.size=5Gi --set persistence.persistentVolumeClaim.redis.size=5Gi
+
+
+sudo kubectl exec go-harbor-nginx-9556767d6-tm89q -- cat /etc/nginx/cert/ca.crt > ca.crt 
+
+
+mkdir -p /etc/docker/certs.d/192.168.50.94:30003
+
+/bin/cp -Rf ca.crt /etc/docker/certs.d/192.168.50.94:30003/
+
+
+
+```
+
+# HELM
+
+```shell
+
+curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -  
+
+
+sudo apt install apt-transport-https --yes  
+
+
+echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list  
+
+
+sudo apt update  
+
+
+sudo apt install helm  
+```
+
+# JENKINS
+
+```shell
+
+sudo apt install -y openjdk-11-jdk openjdk-11-jre 
+
+
+wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - 
+
+
+sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' 
+
+
+sudo apt update 
+
+
+sudo apt -y install jenkins 
+
+
+# on k8s 
+
+
+helm repo add jenkins https://charts.jenkins.io 
+
+
+helm repo update 
+
+
+helm install jkns jenkins/jenkins 
+
+```
+
+
+# PROMETHEUS & GRAFANA 
+
+```shell
+
+helm repo add prometheus-community https://prometheus-community.github.io/helm-charts  
+
+  
+
+helm repo add stable https://charts.helm.sh/stable  
+
+
+helm repo update  
+
+
+helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack -f ./kube-prometheus-stack/value.yaml 
+
+
+
+kubectl port-forward deployment/prometheus-grafana 3000 
+
+
+# Prometheus alone 
+
+
+helm repo add prometheus-community https://prometheus-community.github.io/helm-charts 
+
+
+helm repo update 
+
+
+helm install prometheus prometheus-community/prometheus 
+
+
+# Grafana local 
+
+
+sudo apt install -y apt-transport-https 
+
+
+sudo apt install -y software-properties-common wget 
+
+
+sudo wget -q -O /usr/share/keyrings/grafana.key https://packages.grafana.com/gpg.key 
+
+
+echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list 
+
+
+sudo apt update 
+
+
+sudo apt install grafana-enterprise 
+
+
+sudo service grafana-server start 
+
+
+config -> /etc/grafana/grafana.ini 
+
+
+# localhost:3000 
+
+
+username: admin 
+
+password: prom-operator 
+
+
+```
+
+# OCTANT
+
+```shell
+
+wget https://github.com/vmware-tanzu/octant/releases/download/v0.24.0/octant_0.24.0_Linux-64bit.deb 
+
+
+dpkg -i octant_0.24.0_Linux-64bit.deb 
+
+
+```
+
+
+# REDIS
+
+```yaml
+
+version: "3"
+
+services:
+
+    redis:
+      image: redis:7.0.8
+      container_name: redis
+      command:
+        - /bin/sh
+        - -c
+        - redis-server --requirepass "youdonthavetoknow"
+      volumes:
+        - ./redis:/var/lib/redis/data
+        - ./redis.conf:/usr/local/etc/redis/redis.conf
+      ports:
+        - "6379:6379"
+```
+
+```shell
+
+# redis.conf
+
+port              6379
+daemonize         yes
+save              60 1
+bind              0.0.0.0
+tcp-keepalive     300
+dbfilename        dump.rdb
+dir               ./
+rdbcompression    yes
+
+```
+
+# KAFKA & ZOOKEEPER
+
+```shell
+helm repo add bitnami https://charts.bitnami.com/bitnami 
+
+
+helm install zookeeper bitnami/zookeeper --set replicaCount=1 --set auth.enabled=false --set allowAnonymousLogin=true 
+
+
+helm install kafka bitnami/kafka --set zookeeper.enabled=false --set replicaCount=1 --set externalZookeeper.servers=ZOOKEEPER-SERVICE-NAME 
+
+
+kubectl --namespace default exec -it $POD_NAME -- kafka-console-consumer.sh --bootstrap-server KAFKA-SERVICE-NAME:9092 --topic mytopic 
+
+
+kubectl --namespace default exec -it $POD_NAME -- kafka-console-producer.sh --broker-list KAFKA-SERVICE-NAME:9092 --topic mytopic 
+
+
+# or kafkacat like below 
+
+
+kafkacat -P -b KAFKA-SERVICE-NAME:9092 -t mytopic 
+
+
+kafkacat -C -b KAFKA-SERVICE-NAME:9092 -t mytopic 
+
+```
+```yaml
+# single node
+
+---
+
+version: "3"
+services:
+  zookeeper:
+    image: 'bitnami/zookeeper:3.7'
+    container_name: zookeeper
+    ports:
+      - '2181:2181'
+    environment:
+      - ALLOW_ANONYMOUS_LOGIN=yes
+    volumes:
+      - ./zook:/data
+  kafka:
+    image: 'bitnami/kafka:3.3'
+    container_name: kafka
+    ports:
+      - '9092:9092'
+    environment:
+      - KAFKA_BROKER_ID=1
+      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
+      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://172.17.80.95:9092
+      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
+      - ALLOW_PLAINTEXT_LISTENER=yes
+    volumes:
+      - ./data:/var/lib/kafka/data
+    depends_on:
+      - zookeeper
+
+
+```
+
+# ELASTIC SEARCH & KIBANA 
+
+```shell
+
+helm repo add bitnami https://charts.bitnami.com/bitnami 
+
+
+sudo helm install elasticsearch  bitnami/elasticsearch 
+
+
+sudo helm install kibana bitnami/kibana --set elasticsearch.hosts[0]=elasticsearch --set elasticsearch.port=9200 
+
+
+```
+
+```yaml
+
+version: "3"
+
+
+
+services:
+
+        elasticsearch:
+
+                image: elasticsearch:8.6.1
+
+                environment:
+
+                        - xpack.security.enabled=true
+
+                        - discovery.type=single-node
+
+                        - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
+
+                        - ELASTIC_PASSWORD=youdonthavetoknow
+
+
+                container_name: elasticsearch
+
+                ports:
+
+                        - "9200:9200"
+
+                volumes:
+
+                        - elastic_data:/usr/share/elasticsearch/data
+
+volumes:
+
+        elastic_data:
+
+```
+```shell
+# set password for kibana
+
+docker exec -it elasticsearch /bin/bash
+
+bin/elasticsearch-set-password [ auto | interactive ]
+
+```
+
+```yaml
+
+version: "3"
+services:
+    kibana:
+        image: kibana:8.5.3
+        container_name: kibana
+        restart: always
+        ports:
+            - 5601:5601
+        environment:
+            - ELASTICSEARCH_USERNAME="kibana_system"
+            - ELASTICSEARCH_PASSWORD="youdonthavetoknow"
+            - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
+            - XPACK_MONITORING_ENABLED=true
+            - XPACK_MONITORING_COLLECTION_ENABLED=true
+            - XPACK_SECURITY_ENABLED=true
+        networks:
+            - network1
+
+networks:
+    network1:
+        name: elastic_default
+        external: true
+
+
+```
+
+# GPU
+
+```shell
+
+# nvidia cuda driver
+
+# build prerequisite
+
+sudo apt-get install linux-headers-$(uname -r) build-essential
+
+# simple way
+
+# curl from https://www.nvidia.com/download/index.aspx 
+
+# and install run
+
+# host driver 
+
+# ubuntu 
+
+sudo apt-get install linux-headers-$(uname -r) 
+
+
+distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g') 
+
+
+wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.0-1_all.deb 
+
+
+sudo dpkg -i cuda-keyring_1.0-1_all.deb 
+
+
+sudo apt-get update 
+
+
+sudo apt-get -y install cuda-drivers 
+
+
+#centos 
+
+sudo dnf install -y tar bzip2 make automake gcc gcc-c++ pciutils elfutils-libelf-devel libglvnd-devel iptables firewalld vim bind-utils wget 
+
+
+sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
+
+
+distribution=rhel7 
+
+
+ARCH=$( /bin/arch ) 
+
+
+sudo yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/$distribution/${ARCH}/cuda-$distribution.repo 
+
+
+sudo yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r) 
+
+
+sudo yum clean expire-cache 
+
+
+sudo yum install -y nvidia-driver-latest-dkms 
+
+
+# post install 
+
+
+export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}} 
+
+
+export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64\ 
+
+                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 
+
+
+sudo systemctl enable nvidia-persistenced 
+
+
+
+/usr/bin/nvidia-persistenced --verbose 
+
+
+cat /proc/driver/nvidia/version 
+
+# disable noveau
+
+sudo nano /etc/modprobe.d/blacklist-nouveau.conf
+
+```
+```shell
+# /etc/modprobe.d/blacklist-nouveau.conf
+blacklist nouveau
+options nouveau modeset=0
+```
+```shell
+sudo update-initramfs -u
+sudo reboot
+```
+
+
+# GPU DRIVER INSTALL UNINSTALL
+
+
+```shell
+
+sudo ubuntu-drivers list
+
+# or, for servers:
+
+sudo ubuntu-drivers list --gpgpu
+
+# install
+sudo ubuntu-drivers install nvidia:525
+
+# or for servers:
+
+sudo ubuntu-drivers install --gpgpu nvidia:525-server
+
+# or install GPU API
+
+sudo sh cuda_<VERSION>_linux.run
+
+# or run file
+
+sudo NVIDIA_<VERSION>.run 
+
+```
+
+
+```shell
+# uninstall
+
+sudo apt-get --purge remove "*nvidia*"
+
+sudo /usr/bin/nvidia-uninstall
+
+# or runfile
+
+sudo NVIDIA_<VERSION>.run --uninstall
+
+```
+
+# GPU API
+
+```shell
+
+# nvidia cuda toolkit
+
+# check nvidia-smi cuda version
+
+# visit corresponding https://developer.nvidia.com/cuda-downloads 
+
+wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
+
+sudo sh cuda_12.2.0_535.54.03_linux.run
+
+# add path and ld path
+
+export PATH="/usr/local/cuda-12.2/bin:$PATH"
+
+# /etc/ld.so.conf
+
+...
+include /usr/local/cuda-12.2/lib64
+...
+
+sudo ldconfig
+
+
+# uninstall
+
+
+/usr/local/cuda/bin/<uninstaller>
+
+
+```
+
+
+# GPU CONTAINER
+
+
+
+```shell
+
+
+# install nvidia container toolkit 
+
+
+sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit 
+
+
+```
+
+```toml
+# containerd daemon config /etc/containerd/config.toml
+
+
+version = 2 
+
+[plugins] 
+
+  [plugins."io.containerd.grpc.v1.cri"] 
+
+    [plugins."io.containerd.grpc.v1.cri".containerd] 
+
+      default_runtime_name = "nvidia" 
+
+  
+
+      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] 
+
+        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] 
+
+          privileged_without_host_devices = false 
+
+          runtime_engine = "" 
+
+          runtime_root = "" 
+
+          runtime_type = "io.containerd.runc.v2" 
+
+          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] 
+
+            BinaryName = "/usr/bin/nvidia-container-runtime" 
+
+```
+
+```shell
+sudo systemctl restart containerd 
+
+``` 
+
+```shell
+# crio daemon
+
+# /etc/crio/crio.conf.d/crio.conf
+
+[crio]
+
+  [crio.runtime]
+    default_runtime = "nvidia"
+
+    [crio.runtime.runtimes]
+
+      [crio.runtime.runtimes.nvidia]
+        runtime_path = "/usr/bin/nvidia-container-runtime"
+        runtime_type = "oci"
+
+# or
+
+# /etc/crio/crio.conf
+
+ hooks_dir = [
+        "/usr/share/containers/oci/hooks.d",
+        "/run/containers/oci/hooks.d",
+        "/etc/containers/oci/hooks.d",
+ ]
+ ```
+
+```shell
+
+$ sudo mkdir -p /usr/share/containers/oci/hooks.d 
+
+# or
+
+$ sudo mkdir -p /run/containers/oci/hooks.d
+
+  
+
+$ sudo bash -c  
+
+cat > /usr/share/containers/oci/hooks.d/oci-nvidia-hook.json << EOF 
+
+{ 
+
+    "version": "1.0.0", 
+
+    "hook": { 
+
+        "path": "/usr/bin/nvidia-container-toolkit", 
+
+        "args": ["nvidia-container-toolkit", "prestart"] ,
+        
+        "env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]
+
+    }, 
+
+    "when": { 
+
+        "always": true, 
+
+        "commands": [".*"] 
+
+    }, 
+
+    "stages": ["prestart"] 
+
+} 
+
+EOF 
+
+
+
+# or you could use simplified command
+
+curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
+  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
+    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
+    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
+  && \
+    sudo apt-get update
+    
+    
+sudo apt-get install -y nvidia-container-toolkit
+
+
+sudo nvidia-ctk runtime configure --runtime=docker
+
+sudo systemctl restart docker
+
+
+sudo nvidia-ctk runtime configure --runtime=containerd
+
+
+sudo systemctl restart containerd
+
+sudo nvidia-ctk runtime configure --runtime=crio
+
+
+sudo systemctl restart crio
+
+# crio 
+
+/etc/crio/crio.conf.d/99-nvidia.conf
+
+[crio]
+
+  [crio.runtime]
+    default_runtime = "nvidia"
+
+    [crio.runtime.runtimes]
+
+      [crio.runtime.runtimes.nvidia]
+        runtime_path = "/usr/bin/nvidia-container-runtime"
+        runtime_type = "oci"
+
+
+sudo nvidia-ctk runtime configure --runtime=crio --set-as-default --config=/etc/crio/crio.conf.d/99-nvidia.conf
+
+/etc/nvidia-container-runtime/config.toml
+
+[nvidia-container-runtime]
+runtimes = ["crun", "docker-runc", "runc"]
+
+sudo systemctl restart crio
+
+# docker 
+
+
+sudo docker --gpus all 
+
+# docker-compose
+
+services:
+  jupyterlabc:
+    image: seantywork/jupyterlabc
+    deploy:
+      resources:
+        reservations:
+          devices:
+            - driver: nvidia
+              count: 1
+              capabilities: [gpu] 
+
+# kubernetes 
+
+
+kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml 
+
+
+# helm 
+
+
+helm repo add nvdp https://nvidia.github.io/k8s-device-plugin 
+
+
+helm repo update 
+
+
+helm upgrade -i nvdp nvdp/nvidia-device-plugin \ 
+
+  --namespace nvidia-device-plugin \ 
+
+  --create-namespace \ 
+
+  --version 0.13.0 
+
+
+
+```
+
+```yaml
+# gpu deployment 
+
+apiVersion: apps/v1 
+
+kind: Deployment 
+
+metadata: 
+
+  name: clusterdebuggergpu 
+
+spec: 
+
+  selector: 
+
+    matchLabels: 
+
+      app: clusterdebuggergpu 
+
+  replicas: 1 
+
+  template: 
+
+    metadata: 
+
+      labels: 
+
+        app: clusterdebuggergpu 
+
+    spec: 
+
+      nodeSelector: 
+
+        gpu-ready: ready 
+
+      imagePullSecrets: 
+
+        - name: harbor-secret 
+
+      containers: 
+
+        - name: clusterdebuggergpu 
+
+          image: harbor.mipllab.com/library/clusterdebugger 
+
+          resources: 
+
+            limits: 
+
+              nvidia.com/gpu: 1 
+
+          imagePullPolicy: Always 
+
+          ports: 
+
+          - containerPort: 6700 
+
+
+
+```
+
+
+
+# LIB TORCH
+
+```shell
+
+# https://pytorch.org/get-started/locally/
+
+# cpu
+
+wget https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.1.1%2Bcpu.zip
+
+unzip 
+
+mv libtorch libtorch-cpu
+
+# gpu
+
+wget https://download.pytorch.org/libtorch/cu121/libtorch-cxx11-abi-shared-with-deps-2.1.1%2Bcu121.zip
+
+
+# build 
+
+mkdir build
+cd build
+cmake -DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch .. 
+# cmake -DCMAKE_PREFIX_PATH=/home/seantywork/hack/torch-cc/libtorch .. (2.1)
+
+
+
+cmake --build . --config Release
+
+```
+
+
+
+# VIRTUAL MACHINE QEMU
+
+```shell
+sudo apt install qemu-kvm virt-manager virtinst libvirt-clients bridge-utils libvirt-daemon-system -y
+
+sudo systemctl enable --now libvirtd
+
+sudo systemctl start libvirtd
+
+sudo usermod -aG kvm $USER
+
+sudo usermod -aG libvirt $USER
+
+sudo virt-manager
+
+# aarch64 on x64
+
+# adding to the above first line
+
+sudo apt-get install qemu-system-arm qemu-efi
+
+# and set arch as aarch64 virt
+
+# then set UEFI to aarch64
+
+
+```
+
+
+# VM QEMU
+
+```shell
+
+virsh shutdown <vm>
+
+virsh start <vm>
+
+# create vm
+
+virsh dumpxml guest1 > guest1.xml
+
+# do some needed editing
+# delete uuid
+
+# hard new 
+virsh define guest1.xml
+
+# or
+# soft new
+
+virsh create guest1.xml
+
+# delete
+
+virsh destroy <vm>
+
+virsh undefine <vm>
+
+rm -rf /var/lib/libvirt/images/<vm>.qcow2
+
+
+# check device
+
+virsh nodedev-list --cap pci
+
+virsh nodedev-dumpxml pci_0000_00_19_0
+
+# add device
+
+virsh attach-device vm_name --file device.xml --config # --config also persistent, --persistent
+
+# remove device
+
+
+virsh detach-device vm_name device.xml
+
+# clone 
+
+virt-clone --original ubuntu-box1 --auto-clone
+
+# edit
+
+virsh edit guest
+
+# export/import
+
+# on host 1
+
+
+virsh list --all
+
+virsh shutdown target_guest_machine
+
+virsh dumpxml target_guest_machine > /root/target_guest_machine.xml
+
+# disk location
+
+virsh domblklist target_guest_name
+
+scp /root/target_guest_machine.xml destination_host_ip:/etc/libvirt/qemu
+
+scp /var/lib/libvirt/images/target_guest_name.qcow2 destination_host_ip:/var/lib/libvirt/images/
+
+
+# on host 2
+
+# specify qcow2 location
+
+virsh define target_guest_machine.xml
+
+virsh start target_guest_machine
+
+
+# install
+
+virt-install \
+-n ubuntu20-gpu \
+--description "ubuntu20-gpu" \
+--os-type=Linux \
+--os-variant=ubuntu20.04 \
+--ram=4096 \
+--vcpus=4 \
+--disk path=/var/lib/libvirt/images/ubuntu20-gpu.qcow2,format=qcow2,bus=virtio,size=32 \
+# --graphics none \
+--cdrom /home/seantywork/box/ubuntu-20-server.iso \
+--network bridge:br0
+# --boot uefi
+
+# vm uefi
+
+sudo apt install ovmf
+
+```
+
+```shell
+# clone with xml
+
+virsh shutdown "$source_vm"
+
+virsh dumpxml "$source_vm" > "/tmp/$new_vm.xml"
+
+sed -i /uuid/d "/tmp/$new_vm.xml"
+sed -i '/mac address/d' "/tmp/$new_vm.xml"
+
+sed -i "s/$source_vm/$new_vm/" "/tmp/$new_vm.xml"
+
+cp /var/lib/libvirt/images/ubuntu22.04.qcow2 /var/lib/libvirt/images/new.qcow2
+
+virsh define "/tmp/$new_vm.xml"
+
+```
+
+# VM QEMU NETWORK BRIDGE
+
+```shell
+
+# /etc/sysctl.d/10-bridge.conf
+
+net.bridge.bridge-nf-call-ip6tables=0
+net.bridge.bridge-nf-call-iptables=0
+net.bridge.bridge-nf-call-arptables=0
+
+```
+
+```shell
+
+
+echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
+
+reboot
+
+virsh net-destroy default
+virsh net-undefine default
+
+# save /etc/netplan/01-network-manager-all.yaml
+
+```
+
+```yaml
+
+# netplan
+
+# /etc/netplan/00-installer-config.yaml 
+
+network:
+  ethernets:
+    enx44a92c521758:
+      dhcp4: false
+      dhcp6: false
+  bridges:
+    br0:
+      interfaces: [ enx44a92c521758 ]
+      addresses: [192.168.0.32/24]
+      gateway4: 192.168.0.1
+      mtu: 1500
+      nameservers:
+        addresses: [168.126.63.1,8.8.8.8]
+      parameters:
+        stp: true
+        forward-delay: 4
+      dhcp4: no
+      dhcp6: no
+  version: 2
+
+
+```
+
+```shell
+#sudo netplan generate
+sudo netplan apply
+
+
+```
+
+```shell
+
+# network/interfaces
+# /etc/network/interfaces
+
+# The primary network interface
+auto eno1
+
+#make sure we don't get addresses on our raw device
+iface eno1 inet manual
+iface eno1 inet6 manual
+
+#set up bridge and give it a static ip
+auto br0
+allow-hotplug eno1
+iface br0 inet static
+        address 192.168.0.100
+        netmask 255.255.255.0
+        network 192.168.0.0
+        broadcast 192.168.0.255
+        gateway 192.168.0.1
+        bridge_ports eno1
+        bridge_stp off
+        bridge_fd 0
+        bridge_maxwait 0
+        dns-nameservers 8.8.8.8
+
+#allow autoconf for ipv6
+iface br0 inet6 auto
+        accept_ra 1
+
+
+
+```
+
+```shell
+
+sudo systemctl restart networking
+
+```
+
+```shell
+# host-bridge.xml
+
+<network>
+    <name>host-bridge</name>
+    <bridge name='br0'/>
+    <forward mode="bridge"/>
+</network>
+
+```
+
+```shell
+
+virsh net-define host-bridge.xml
+virsh net-autostart host-bridge
+virsh net-start host-bridge
+virsh net-list --all
+
+```
+
+# VM QEMU GPU PASSTHROUGH
+
+```shell
+
+# v
+# locations
+# /etc/default/grub
+# /etc/modules
+# /etc/modprobe.d/vfio.conf
+# /etc/modprobe.d/iommu_unsafe_interrupts.conf
+# /etc/modprobe.d/kvm.conf
+# /etc/modprobe.d/blacklist.conf
+
+efibootmgr
+
+# vt-x & vt-d enabled
+
+# or amd-v & amd-iommu
+
+# grub iommu config
+
+# v (worked set)
+/etc/default/grub
+GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
+
+# or 
+
+GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt vfio-pci.ids=<I:D>,<I:D>"
+
+# or (overkill, explicit)
+
+GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt vfio-pci.ids=<I:D>,<I:D> nofb nomodeset initcall_blacklist=sysfb_init video=vesafb:off video=efifb:off video=simplefb:off"
+
+# or (overkill, explicit, unsafe)
+
+GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt vfio-pci.ids=<I:D>,<I:D> pcie_acs_override=downstream,multifunction nofb nomodeset initcall_blacklist=sysfb_init video=vesafb:off video=efifb:off video=simplefb:off"
+
+
+update-grub
+
+reboot
+
+dmesg | grep -e IOMMU
+
+# vfio config
+# v
+echo "vfio" >> /etc/modules
+echo "vfio_iommu_type1" >> /etc/modules
+echo "vfio_pci" >> /etc/modules
+echo "vfio_virqfd" >> /etc/modules
+echo "vfio_nvidia" >> /etc/modules
+
+update-initramfs -u -k all
+
+systemctl reboot
+
+dmesg | grep -i vfio
+
+dmesg | grep 'remapping'
+
+# in case of no remapping
+# v
+echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
+
+
+# nvidia stability
+# v
+echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf
+
+# amd stability
+
+apt install pve-headers-$(uname -r)
+apt install git dkms build-essential
+git clone https://github.com/gnif/vendor-reset.git
+cd vendor-reset
+dkms install .
+echo "vendor-reset" >> /etc/modules
+update-initramfs -u
+shutdown -r now
+
+lspci -nn | grep 'AMD'  # <DEVICE_ID> ex) 01:00.0
+
+cat << EOF >>  /etc/systemd/system/vreset.service
+[Unit]
+Description=AMD GPU reset method to 'device_specific'
+After=multi-user.target
+[Service]
+ExecStart=/usr/bin/bash -c 'echo device_specific > /sys/bus/pci/devices/0000:<DEVICE_ID>/reset_method'
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable vreset.service && systemctl start vreset.service
+
+
+# gpu isolation and drivers
+
+lspci -nn | grep 'NVIDIA' # or 'AMD'
+
+
+#v
+echo "options vfio-pci ids=<ID>,<ID2>,..." > /etc/modprobe.d/vfio.conf
+
+
+ex)
+
+echo "options vfio-pci ids=1002:67df,1002:aaf0" > /etc/modprobe.d/vfio.conf
+
+# softdep
+# v
+echo "softdep snd_hda_intel pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
+echo "softdep xhci_hcd pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
+echo "softdep xhci_pci pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
+echo "softdep nvidia-gpu pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
+echo "softdep i2c_nvidia_gpu pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
+
+# blacklist
+
+# AMD drivers
+echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
+echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf
+# NVIDIA drivers
+# if snd_hda_intel present
+# echo "blacklist snd_hda_intel" >> /etc/modprobe.d/blacklist.conf
+# v
+echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
+echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
+echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
+echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
+# Intel drivers
+echo "blacklist snd_hda_intel" >> /etc/modprobe.d/blacklist.conf
+echo "blacklist snd_hda_codec_hdmi" >> /etc/modprobe.d/blacklist.conf
+echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf
+
+
+
+
+# gpu in vm
+
+#v
+# bios ovmf (uefi)
+
+# machine q35
+
+# display vmware compatible (proxmox)
+# or
+# v
+# video QXL and Display Spice Listen type Address (qemu/kvm)
+
+# add all pci devices within iommu group
+
+# edit if necessary
+
+# (qemu/kvm)
+
+virsh edit vm-gpu
+
+  <features>
+    <acpi/>
+    <apic/>
+    <hyperv>
+      <vendor_id state="on" value="whatever"/>
+    </hyperv>
+    <kvm>
+      <hidden state='on'/>
+    </kvm>
+    <vmport state='off'/>
+    <ioapic driver='kvm'/>
+  </features>
+
+# boot vm without secure boot (esc || f2)
+
+# check
+
+lspci -nn
+
+# noveau blacklist
+
+sudo nano /etc/modprobe.d/blacklist-nouveau.conf
+
+blacklist nouveau
+options nouveau modeset=0
+
+sudo update-initramfs -u
+
+
+# install corresponding gpu drivers
+
+https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html
+
+# or 
+
+https://www.nvidia.com/download/index.aspx
+
+# gpu reset at reboot
+# if necessary
+
+```
+
+```shell
+# /root/reset_pci_gpu.sh
+#!/bin/bash
+echo 1 > /sys/bus/pci/devices/0000\:09\:00.0/remove
+echo 1 > /sys/bus/pci/rescan
+
+crontab -e
+
+@reboot /root/reset_pci_gpu.sh
+
+```
+
+```shell
+# gpu reset method disable 
+# if necessary
+
+echo > /sys/bus/pci/devices/0000\:09\:00.0/reset_method
+
+```
+
+# VM CLUSTER
+
+```shell
+
+# proxmox
+
+
+# export/import
+
+qm list
+
+vzdump <id> --compress gzip --storage local
+
+# usually /var/lib/vz/dump
+
+qmrestore /var/lib/vz/dump/vzdump-qemu-<id>.vma.gz <new-id>
+
+
+
+# from different
+
+create vm
+
+import vm
+
+import disk
+
+qm importdisk <VM_ID> <OVA_DISK.vmdk> <VOL_NAME> -format qcow2
+
+ex) qm importdisk 101 ubuntu20-disk001.vmdk local-lvm -format qcow2
+
+create cluster
+
+join cluster
+
+
+# delete cluster
+
+systemctl stop pve-cluster corosync
+
+pmxcfs -l
+
+rm /etc/corosync/*
+
+rm /etc/pve/corosync.conf
+
+killall pmxcfs
+
+systemctl start pve-cluster
+
+```
+
+# IDA
+
+```shell
+
+
+# download run 
+
+
+chmod  
+
+
+sudo ./ida.run 
+
+```
+
+# RADARE2 R2
+
+```shell
+
+git clone https://github.com/radareorg/radare2
+
+cd radare2 ; sys/install.sh
+
+```
+
+```shell
+
+# cmd opts
+
+-L: List of supported IO plugins
+-q: Exit after processing commands
+-w: Write mode enabled
+-i [file]: Interprets a r2 script
+-A: Analyze executable at load time (xrefs, etc)
+-n: Bare load. Do not load executable info as the entrypoint
+-c 'cmds': Run r2 and execute commands (eg: r2 -wqc'wx 3c @ main')
+-p [prj]: Creates a project for the file being analyzed (CC add a comment when opening a file as a project)
+-: Opens r2 with the malloc plugin that gives a 512 bytes memory area to play with (size can be changed)
+       Similar to r2 malloc://512
+
+
+# basic
+
+
+; Command chaining: x 3;s+3;pi 3;s+3;pxo 4;
+| Pipe with shell commands: pd | less
+! Run shell commands: !cat /etc/passwd
+!! Escapes to shell, run command and pass output to radare buffer
+` Radare commands: wx `!ragg2 -i exec`
+~ grep
+~! grep -v
+~[n] grep by columns afl~[0]
+~:n grep by rows afl~:0
+.. repeats last commands (same as enter \n)
+( Used to define and run macros
+$ Used to define alias
+$$: Resolves to current address
+Offsets (@) are absolute, we can use $$ for relative ones @ $$+4
+? Evaluate expression
+?$? Help for variables used in expressions
+$$: Here
+$s: File size
+$b: Block size
+$l: Opcode length
+$j: When $$ is at a jmp, $j is the address where we are going to jump to
+$f: Same for jmp fail address
+$m: Opcode memory reference (e.g. mov eax,[0x10] => 0x10)
+??? Help for ? command
+?i Takes input from stdin. Eg ?i username
+?? Result from previous operations
+?s from to [step]: Generates sequence from to every
+?p: Get physical address for given virtual address
+?P: Get virtual address for given physical one
+?v Show hex value of math expr
+?l str: Returns the length of string
+@@: Used for iterations
+
+# position
+s address: Move cursor to address or symbol
+       s-5 (5 bytes backwards)
+       s- undo seek
+       s+ redo seek
+
+# block size
+
+b size: Change block size
+
+# analyze
+
+aa: Analyze all (fcns + bbs) same that running r2 with -A
+ahl <length> <range>: fake opcode length for a range of bytes
+ad: Analyze data
+       ad@rsp (analyze the stack)
+
+af: Analyze functions
+afl: List all functions
+       number of functions: afl~?
+afi: Returns information about the functions we are currently at
+afr: Rename function: structure and flag
+afr off: Restore function name set by r2
+afn: Rename function
+       afn strlen 0x080483f0
+af-: Removes metadata generated by the function analysis
+af+: Define a function manually given the start address and length
+       af+ 0xd6f 403 checker_loop
+axt: Returns cross references to (xref to)
+axf: Returns cross references from (xref from)
+
+d, f: Function analysis
+d, u: Remove metadata generated by function analysis
+
+
+# info
+
+
+iI: File info
+iz: Strings in data section
+izz: Strings in the whole binary
+iS: Sections
+       iS~w returns writable sections
+is: Symbols
+       is~FUNC exports
+il: Linked libraries
+ii: Imports
+ie: Entrypoint
+
+i~pic : check if the binary has position-independent-code
+i~nx : check if the binary has non-executable stack
+i~canary : check if the binary has canaries
+
+# print
+
+psz n @ offset: Print n zero terminated String
+px n @ offset: Print hexdump (or just x) of n bytes
+pxw n @ offset: Print hexdump of n words
+       pxw size@offset  prints hexadecimal words at address
+pd n @ offset: Print n opcodes disassembled
+pD n @ offset: Print n bytes disassembled
+pi n @ offset: Print n instructions disassembled (no address, XREFs, etc. just instructions)
+pdf @ offset: Print disassembled function
+       pdf~XREF (grep: XREFs)
+       pdf~call (grep: calls)
+pcp n @ offset: Print n bytes in python string output.
+       pcp 0x20@0x8048550
+       import struct
+       buf = struct.pack ("32B",
+       0x55,0x89,0xe5,0x83,0xzz,0xzz,0xzz,0xzz,0xf0,0x00,0x00,
+       0x00,0x00,0xc7,0x45,0xf4,0x00,0x00,0x00,0x00,0xeb,0x20,
+       0xc7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xzz,0xzz)
+p8 n @ offset: Print n bytes (8bits) (no hexdump)
+pv: Print file contents as IDA bar and shows metadata for each byte (flags , ...)
+pt: Interpret data as dates
+pf: Print with format
+pf.: list all formats
+p=: Print entropy ascii graph
+
+# write
+
+wx: Write hex values in current offset
+       wx 123456
+       wx ff @ 4
+wa: Write assembly
+       wa jnz 0x400d24
+wc: Write cache commit
+wv: Writes value doing endian conversion and padding to byte
+wo[x]: Write result of operation
+       wow 11223344 @102!10
+               write looped value from 102 to 102+10
+               0x00000066  1122 3344 1122 3344 1122 0000 0000 0000
+       wox 0x90
+               XOR the current block with 0x90. Equivalent to wox 0x90 $$!$b (write from current position, a whole block)
+       wox 67 @4!10
+               XOR from offset 4 to 10 with value 67
+wf file: Writes the content of the file at the current address or specified offset (ASCII characters only)
+wF file: Writes the content of the file at the current address or specified offset
+wt file [sz]: Write to file (from current seek, blocksize or sz bytes)
+       Eg: Dump ELF files with wt @@ hit0* (after searching for ELF headers: \x7fELF)
+wopO 41424344 : get the index in the De Bruijn Pattern of the given word
+
+# flags
+
+f: List flags
+f label @ offset: Define a flag `label` at offset
+       f str.pass_len @ 0x804999c
+f-label: Removes flag
+fr: Rename flag
+fd: Returns position from nearest flag (looking backwards). Eg => entry+21
+fs: Show all flag spaces
+fs flagspace: Change to the specified flag space
+
+# yank & paste
+
+y n: Copies n bytes from current position
+y: Shows yank buffer content with address and length where each entry was copied from
+yp: Prints yank buffer
+yy offset: Paste the contents of the yank buffer at the specified offset
+yt n target @ source: Yank to. Copy n bytes from source to target address
+
+
+# visual mode
+
+q: Exits visual mode
+hjkl: move around (or HJKL) (left-down-up-right)
+o: go/seek to given offset
+?: Help
+.: Seek EIP
+<enter>: Follow address of the current jump/call
+:cmd: Enter radare commands. Eg: x @ esi
+d[f?]: Define cursor as a string, data, code, a function, or simply to undefine it.
+       dr: Rename a function
+       df: Define a function
+v: Get into the visual code analysis menu to edit/look closely at the current function.
+p/P: Rotate print (visualization) modes
+    hex, the hexadecimal view
+    disasm, the disassembly listing
+               Use numbers in [] to follow jump
+               Use "u" to go back
+    debug, the debugger
+    words, the word-hexidecimal view
+    buf, the C-formatted buffer
+    annotated, the annotated hexdump.
+c: Changes to cursor mode or exits the cursor mode
+    select: Shift+[hjkl]
+    i: Insert mode
+    a: assembly inline
+    A: Assembly in visual mode
+    y: Copy
+    Y: Paste
+    f: Creates a flag where cursor points to
+    <tab> in the hexdump view to toggle between hex and strings columns
+V: View ascii-art basic block graph of current function
+W: WebUI
+x, X: XREFs to current function. ("u" to go back)
+t: track flags (browse symbols, functions..)
+gG: Begin or end of file
+HUD
+       _ Show HUD
+       backspace: Exits HUD
+       We can add new commands to HUD in: radare2/shlr/hud/main
+;[-]cmt: Add/remove comment
+m<char>: Define a bookmark
+'<char>: Go to previously defined bookmark
+'
+
+# rop
+
+/R opcodes: Search opcodes
+       /R pop,pop,ret
+/Rl opcodes: Search opcodes and print them in linear way
+       /Rl jmp eax,call ebx
+/a: Search assembly
+       /a jmp eax
+pda: Returns a library of gadgets that can be use. These gadgets are obtained by disassembling byte per byte instead of obeying to opcode length
+
+
+# searching
+
+/ bytes: Search bytes
+       \x7fELF
+
+# compare files
+
+r2 -m 0xf0000 /etc/fstab       ; Open source file
+o /etc/issue                           ; Open file2 at offset 0
+o                                                      ; List both files
+cc offset: Diff by columns between current offset address and "offset"
+
+# graphs
+
+af: Load function metadata
+ag $$ > a.dot: Dump basic block graph to file
+ag $$ | xdot -: Show current function basic block graph
+
+
+af: Load function metadata
+agc $$ > b.dot: Dump basic block graph to file
+
+dot -Tpng -o /tmp/b.png b.dot
+
+radiff2 -g main crackme.bin crackme.bin > /tmp/a
+xdot /tmp/a
+
+# debugger
+
+r2 -d [pid|cmd|ptrace] (if command contains spaces use quotes: r2 -d "ls /")
+
+ptrace://pid (debug backend does not notice, only access to mapped memory)
+
+r2 -d rarun2 program=pwn1 arg1=$(python exploit.py)
+
+
+r2 -d rarun2 program=/bin/ls stdin=$(python exploit.py)
+
+do: Reopen program
+dp: Shows debugged process, child processes and threads
+dc: Continue
+dcu <address or symbol>: Continue until symbol (sets bp in address, continua until bp and remove bp)
+dc[sfcp]: Continue until syscall(eg: write), fork, call, program address (To exit a library)
+ds: Step in
+dso: Step out
+dss: Skip instruction
+dr register=value: Change register value
+dr(=)?: Show register values
+db address: Sets a breakpoint at address
+       db sym.main add breakpoint into sym.main
+       db 0x804800 add breakpoint
+       db -0x804800 remove breakpoint
+dsi (conditional step): Eg: "dsi eax==3,ecx>0"
+dbt: Shows backtrace
+drr: Display in colors and words all the refs from registers or memory
+dm: Shows memory map (* indicates current section)
+       [0xb776c110]> dm
+       sys 0x08048000 - 0x08062000 s r-x /usr/bin/ls
+       sys 0x08062000 - 0x08064000 s rw- /usr/bin/ls
+       sys 0xb776a000 - 0xb776b000 s r-x [vdso]
+       sys 0xb776b000 * 0xb778b000 s r-x /usr/lib/ld-2.17.so
+       sys 0xb778b000 - 0xb778d000 s rw- /usr/lib/ld-2.17.so
+       sys 0xbfe5d000 - 0xbfe7e000 s rw- [stack]
+
+
+```
+
+# GHIDRA
+
+```shell
+
+sudo apt-get install openjdk-17-jdk 
+
+
+wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_10.2_build/ghidra_10.2_PUBLIC_20221101.zip 
+
+
+unzip ghidra_10.2_PUBLIC_20221101.zip -d <target>
+```
+
+# WIRESHARK
+
+```shell
+
+sudo apt install wireshark 
+
+
+```
+
+# TSHARK
+
+```shell
+
+sudo apt install tshark
+
+```
+
+
+# TCP DUMP TCPDUMP UDP DUMP
+
+```shell
+
+sudo tcpdump -i $IFACE -A -X -c 20 port $PORT
+
+
+```
+
+```shell
+
+# udpdump
+
+sudo tcpdump -i $IFACE -A -X -c 20 -n udp port 23232
+
+
+```
+
+# TOR
+
+```shell
+
+# download tar or 
+
+
+wget https://www.torproject.org/dist/torbrowser/11.5.7/tor-browser-linux64-11.5.7_en-US.tar.xz 
+
+
+tar -xvf tor-browser-linux64-11.5.7_en-US.tar.xz 
+
+# install command line
+
+apt install apt-transport-https
+
+```
+
+
+```shell
+
+# /etc/apt/sources.list.d/tor.list
+
+   deb     [arch=amd64 signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org jammy main
+   deb-src [arch=amd64 signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org jammy main
+
+```
+
+```shell
+
+wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | sudo tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null
+
+
+apt update
+
+apt install tor deb.torproject.org-keyring
+
+```
+
+# METASPLOIT AND SECURITY TOOLS 
+
+```shell
+
+
+curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall 
+
+
+sudo chmod 755 msfinstall 
+
+
+sudo ./msfinstall 
+
+
+sudo apt install nmap 
+
+
+git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev 
+
+
+sudo apt install nikto -y 
+
+```
+
+# NGROK
+
+```shell
+
+sudo snap install ngrok
+
+ngrok tcp <port>
+```
+
+# BURPESUITE
+
+```shell
+
+
+# download .sh 
+
+
+sudo ./burpsuite_community_linux_v2022_9_5.sh  
+
+
+```
+
+# OWASP ZAP
+
+```shell
+
+# download .zip 
+
+
+tar -xzf ZAP_2.12.0_Linux.tar.gz 
+
+
+```
+
+# MITMPROXY 
+
+```shell
+
+apt-get -y remove mitmproxy
+
+apt-get -y install python3-pip
+
+pip3 install mitmproxy
+
+export http_proxy=${http_thing}
+export https_proxy=${https_thing}
+
+# brower http://mitm.it -> get ca cert
+
+/bin/cp -Rf mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy.crt
+
+update-ca-certificates
+
+mitmproxy
+
+```
+
+
+# OLD KEY STORE FIX
+
+```shell
+
+for KEY in $(apt-key --keyring /etc/apt/trusted.gpg list | grep -E "(([ ]{1,2}(([0-9A-F]{4}))){10})" | tr -d " " | grep -E "([0-9A-F]){8}\b" ); do K=${KEY:(-8)}; apt-key export $K | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/imported-from-trusted-gpg-$K.gpg; done
+
+
+```
+
+# CLUSTER DEBUGGER
+
+```yaml
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: clusterdebugger
+spec:
+  selector:
+    matchLabels:
+      app: clusterdebugger
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: clusterdebugger
+    spec:
+      containers:
+        - name: clusterdebugger
+          image: seantywork/clusterdebugger
+          imagePullPolicy: Always
+          ports:
+          - containerPort: 6700
+```
+
+
+```yaml
+
+version: "3"
+
+
+services:
+
+        clusterdebugger:
+
+                build: .
+
+
+                container_name: clusterdebugger
+
+                ports:
+
+                        - "6700:6700"
+
+```
+
+```shell
+FROM ubuntu:20.04
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt update && apt install -y ca-certificates curl gnupg lsb-release wget iptables supervisor git vim
+
+RUN apt install -y python3-pip
+
+RUN pip3 install gunicorn
+
+RUN pip3 install flask
+
+RUN pip3 install requests
+
+RUN pip3 install Flask-Session
+
+RUN pip3 install mysql-connector-python
+
+CMD ["tail", "-f", "/dev/null"]
+
+```
+
+# CONTAINER DEBUGGER
+
+```shell
+
+FROM ubuntu:20.04
+
+
+RUN apt-get update
+
+RUN apt-get install -y build-essential ca-certificates curl git vim
+
+RUN mkdir -p /workspace
+
+WORKDIR /workspace
+
+CMD ["tail","-f","/dev/null"]
+```
+
+
+```yaml
+version: "3"
+
+services:
+
+    debugger:
+      build: .
+      container_name: debugger
+
+
+```
+
+# ELASTIC SEARCH
+
+```shell
+
+FROM elasticsearch:8.6.1
+
+ENV xpack.security.enabled=true
+ENV discovery.type=single-node
+ENV ES_JAVA_OPTS="-Xms2g -Xmx2g"
+ENV ELASTIC_PASSWORD=estest
+
+EXPOSE 9200
+
+```
+
+```yaml
+
+
+version: "3"
+
+
+services:
+
+        elasticsearch:
+
+                build: ./elasticsearch
+
+
+                container_name: elasticsearch
+
+                ports:
+
+                        - "9200:9200"
+
+                volumes:
+
+                        - ./elasticsearch/data:/usr/share/elasticsearch/data
+
+```
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+  name: elasticsearch
+  labels:
+    app: elasticsearch
+spec:
+  type: ClusterIP
+  ports:
+  - port: 9200
+    targetPort: 9200
+    protocol: TCP
+  selector:
+    app: elasticsearch
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: elasticsearch
+spec:
+  selector:
+    matchLabels:
+      app: elasticsearch
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: elasticsearch
+    spec:
+      volumes:
+        - name: elasticsearch-storage
+          persistentVolumeClaim:
+            claimName: pvc-16g-elasticsearch
+      imagePullSecrets:
+        - name: harbor-secret
+      containers:
+        - name: elasticsearch
+          image: seantywork/elasticsearch
+          imagePullPolicy: Always
+          ports:
+          - containerPort: 9200
+          volumeMounts:
+          - mountPath: /usr/share/elasticsearch/data
+            name: elasticsearch-storage
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: pvc-16g-elasticsearch
+spec:
+  storageClassName: nfs-default-storageclass
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 16Gi
+
+```
+
+```yaml
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-16g-elasticsearch
+spec:
+  capacity:
+    storage: 16Gi
+  volumeMode: Filesystem
+  accessModes:
+    - ReadWriteOnce
+  persistentVolumeReclaimPolicy: Delete
+  storageClassName: nfs-default-storageclass
+  mountOptions:
+    - hard
+    - nfsvers=4.1
+  nfs:
+    path: /data1/nfs-cluster-vol/es-kbn/elastic/elasticsearch/data
+    server: 192.168.0.100
+
+
+```
+
+# GITLAB
+
+```yaml
+
+version: "3"
+services:
+  gitlab:
+    image: gitlab/gitlab-ce:15.4.6-ce.0
+    restart: always
+    container_name: gitlab
+    hostname: 'gitlab.usagecorpus.com'
+    environment:
+      GITLAB_OMNIBUS_CONFIG: |
+        external_url 'http://gitlab.usagecorpus.com'
+    ports:
+      - '9367:80'
+    volumes:
+      - './gitlab-data/config:/etc/gitlab'
+      - './gitlab-data/logs:/var/log/gitlab'
+      - './gitlab-data/data:/var/opt/gitlab'
+    shm_size: '256m'
+
+```
+
+
+# GPU SET
+
+```shell
+
+#!/bin/bash
+
+
+# Adjust versions, or, you might even have to directly download driver installtion script 
+
+sudo apt-get install linux-headers-$(uname -r)
+
+
+
+distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
+
+
+
+wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.0-1_all.deb
+
+
+
+sudo dpkg -i cuda-keyring_1.0-1_all.deb
+
+
+
+sudo apt-get update
+
+
+
+sudo apt-get -y install cuda-drivers
+
+
+
+export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}
+
+
+
+export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64\
+
+                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
+
+
+
+sudo systemctl enable nvidia-persistenced
+
+
+
+/usr/bin/nvidia-persistenced --verbose
+
+
+
+sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
+
+
+
+echo "Now configure container runtime"
+echo "Go to the link below to get detailed guidance"
+echo "https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html"
+
+```
+
+# HARBOR
+
+```shell
+
+# get the zip? tar?
+
+# untar
+
+# edit harbor.yml
+
+```
+
+```yaml
+# harbor.yml
+
+...
+
+hostname: harbor.usagecorpus.com
+
+# http related config
+http:
+  # port for http, default is 80. If https enabled, this port will redirect to https port
+  port: 5001
+
+# https related config
+#https:
+#  # https port for harbor, default is 443
+#  port: 443
+#  # The path of cert and key files for nginx
+#  certificate: /your/certificate/path
+#  private_key: /your/private/key/path
+
+# # Uncomment following will enable tls communication between all harbor components
+# internal_tls:
+#   # set enabled to true means internal tls is enabled
+#   enabled: true
+#   # put your cert and key files on dir
+#   dir: /etc/harbor/tls/internal
+
+# Uncomment external_url if you want to enable external proxy
+# And when it enabled the hostname will no longer used
+external_url: https://harbor.usagecorpus.com
+
+# The initial password of Harbor admin
+# It only works in first time to install harbor
+# Remember Change the admin password from UI after launching Harbor.
+harbor_admin_password: Harbor12345
+
+# Harbor DB configuration
+database:
+  # The password for the root user of Harbor DB. Change this before any production use.
+  password: root123
+  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
+  max_idle_conns: 100
+  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
+  # Note: the default number of connections is 1024 for postgres of harbor.
+  max_open_conns: 900
+  # The maximum amount of time a connection may be reused. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's age.
+  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
+  conn_max_lifetime: 5m
+  # The maximum amount of time a connection may be idle. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's idle time.
+  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
+  conn_max_idle_time: 0
+
+# The default data volume
+data_volume: /data2/harbor/harbor_data
+
+...
+
+
+```
+
+
+# JENKINS CONTAINER
+
+```shell
+FROM ubuntu:20.04
+
+RUN apt update
+
+RUN apt install -y openjdk-11-jre openjdk-11-jdk wget gnupg2 curl
+
+RUN wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | apt-key add -
+
+RUN sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
+
+RUN apt update
+
+RUN apt install -y jenkins
+
+
+RUN curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+
+RUN chmod +x /usr/local/bin/docker-compose
+
+RUN apt update
+
+RUN apt install -y apt-transport-https ca-certificates curl
+
+RUN curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
+
+RUN echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
+
+RUN apt update
+
+RUN apt install -y ca-certificates curl gnupg lsb-release
+
+RUN mkdir -p /etc/apt/keyrings
+
+RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
+
+RUN echo \
+  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
+  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
+
+RUN apt update
+
+RUN apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
+
+RUN mkdir /root/.ssh
+
+
+EXPOSE 8080
+
+VOLUME /var/run/docker.sock
+VOLUME /root/.jenkins
+VOLUME /root/.ssh
+
+WORKDIR /home
+
+CMD ["jenkins"]
+
+```
+
+```yaml
+
+version: "3"
+
+services:
+        jenkins:
+                build: ./JK
+                container_name: jenkins
+                ports:
+
+                        - "8080:8080"
+             
+
+
+                volumes:
+                        - /var/run/docker.sock:/var/run/docker.sock
+                        - ./JK/jenkins_data:/root/.jenkins
+                        - /home/tomcat/.ssh:/root/.ssh
+
+
+```
+
+
+# JUPYTER LAB
+
+```yaml
+version: "3"
+
+services:
+
+        jupyter:
+                build: ./build_jupyter
+                container_name: jupyter
+                ports:
+                        - "8888:8888"
+                volumes:
+                        - ./jupyter:/root
+
+
+```
+
+```shell
+FROM ubuntu:20.04
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt update
+
+RUN apt install -y git
+
+RUN apt install -y vim
+
+RUN apt install -y curl
+
+RUN apt install -y gnupg
+
+RUN apt install -y python3-pip
+
+RUN pip3 install jupyterlab==3.5.1
+RUN pip3 install gekko==1.0.5
+RUN pip3 install beautifulsoup4==4.11.2
+RUN pip3 install keras==2.11.0
+RUN pip3 install matplotlib==3.6.2
+RUN pip3 install numpy==1.23.5
+RUN pip3 install opencv-python==4.6.0.66
+RUN pip3 install pandas==1.5.2
+RUN pip3 install plotly==5.11.0
+RUN pip3 install torch==1.13.1
+RUN pip3 install torchvision==0.14.1
+RUN pip3 install scikit-learn==1.1.3
+RUN pip3 install scipy==1.9.3
+RUN pip3 install seaborn==0.12.1
+RUN pip3 install statsmodels==0.13.5
+RUN pip3 install tensorflow==2.11.0
+RUN pip3 install xgboost==1.7.1
+RUN pip3 install requests==2.28.1
+RUN pip3 install urllib3==1.26.13
+RUN pip3 install selenium==4.7.2
+RUN pip3 install mysql-connector-python==8.0.31
+RUN pip3 install elasticsearch==8.5.2
+RUN pip3 install kafka-python==2.0.2
+
+
+CMD ["jupyter","lab","--ip","0.0.0.0","--no-browser","--port=8888","--allow-root"]
+
+
+```
+
+```yaml
+
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: ingress-jupyter
+  annotations:
+      nginx.ingress.kubernetes.io/proxy-body-size: "0"
+
+spec:
+  rules:
+  - host: jupyter.usagecorpus.com
+    http:
+      paths:
+        - path: /
+          pathType: Prefix
+          backend:
+            service:
+              name: jupyter
+              port:
+                number: 8888
+```
+
+
+```yaml
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: jupyter
+  labels:
+    app: jupyter
+spec:
+  type: ClusterIP
+  ports:
+  - port: 8888
+    targetPort: 8888
+    protocol: TCP
+  selector:
+    app: jupyter
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: jupyter
+spec:
+  selector:
+    matchLabels:
+      app: jupyter
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: jupyter
+    spec:
+      nodeSelector:
+        gpu-ready1: ready
+      volumes:
+        - name: jupyter-storage-jupyter
+          persistentVolumeClaim:
+            claimName: pvc-8g-jupyter-jupyter
+      imagePullSecrets:
+      - name: harbor-secret
+      containers:
+        - name: jupyter
+          image: seantywork/jupyter
+          resources:
+            limits:
+              nvidia.com/gpu: 1
+          imagePullPolicy: Always
+          ports:
+          - containerPort: 8888
+          volumeMounts:
+          - mountPath: /root
+            name: jupyter-storage-jupyter
+```
+
+
+```yaml
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-8g-jupyter-jupyter
+spec:
+  capacity:
+    storage: 8Gi
+  volumeMode: Filesystem
+  accessModes:
+    - ReadWriteOnce
+  persistentVolumeReclaimPolicy: Delete
+  storageClassName: nfs-default-storageclass
+  mountOptions:
+    - hard
+    - nfsvers=4.1
+  nfs:
+    path: /data1/nfs-cluster-vol/jupyter/jupyter
+    server: 192.168.0.100
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: pvc-8g-jupyter-jupyter
+spec:
+  storageClassName: nfs-default-storageclass
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 8Gi
+
+```
+
+
+```yaml
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-16g-jupyter-mldldb
+spec:
+  capacity:
+    storage: 16Gi
+  volumeMode: Filesystem
+  accessModes:
+    - ReadWriteOnce
+  persistentVolumeReclaimPolicy: Delete
+  storageClassName: nfs-default-storageclass
+  mountOptions:
+    - hard
+    - nfsvers=4.1
+  nfs:
+    path: /data1/nfs-cluster-vol/jupyter/mldldb
+    server: 192.168.0.100
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: pvc-16g-jupyter-mldldb
+spec:
+  storageClassName: nfs-default-storageclass
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 16Gi
+
+```
+# KUBERNETES K8S DEV
+
+```shell
+
+# install basic dependencies
+
+sudo apt-get install build-essential make openssl libssl-dev
+
+```
+
+
+```shell
+
+# bootstrap and install container runtime 
+
+sudo swapoff -a
+
+
+(crontab -l 2>/dev/null; echo "@reboot /sbin/swapoff -a") | crontab - || true
+sudo apt-get update -y
+
+cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
+overlay
+br_netfilter
+EOF
+
+sudo modprobe overlay
+sudo modprobe br_netfilter
+
+
+cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
+net.bridge.bridge-nf-call-iptables  = 1
+net.ipv4.ip_forward                 = 1
+net.bridge.bridge-nf-call-ip6tables = 1
+EOF
+
+sudo sysctl --system
+
+
+apt-get update
+apt-get install -y software-properties-common curl
+
+mkdir -p /etc/apt/keyrings
+
+KUBERNETES_VERSION=v1.30
+PROJECT_PATH=prerelease:/main
+
+curl -fsSL https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
+
+echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
+
+curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/$PROJECT_PATH/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
+
+echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/$PROJECT_PATH/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
+
+apt-get update
+
+apt-get install -y cri-o 
+
+systemctl daemon-reload
+systemctl enable crio --now
+
+systemctl start crio 
+
+
+```
+
+
+```shell
+
+# install go
+
+
+
+curl -OL https://golang.org/dl/go1.23.2.linux-amd64.tar.gz
+
+sudo tar -C /usr/local -xvf go1.23.2.linux-amd64.tar.gz
+
+rm -rf *.tar.gz
+
+echo "export PATH=\$PATH:/usr/local/go/bin" >> $HOME/.profile
+
+
+source ~/.profile
+
+```
+
+
+
+
+```shell
+
+
+# install cfssl
+
+go install github.com/cloudflare/cfssl/cmd/...@latest
+
+```
+
+
+```shell
+
+# clone kubenernetes repo
+
+
+git clone --filter=blob:none https://github.com/seantywork/kubernetes.git
+
+
+
+
+```
+
+
+
+```shell
+
+
+# install etcd
+
+
+./hack/install-etcd.sh
+
+sudo nano ~/.profile
+
+export KUBE_ROOT=/root/kubernetes
+export GOPATH=/usr/local/go
+export PATH=$PATH:$GOPATH/bin
+export PATH="$KUBE_ROOT/third_party/etcd:${PATH}"
+
+
+source ~/.profile
+
+```
+
+
+```shell
+
+# modify and run
+
+
+cat <<EOF > /tmp/resolv.conf
+nameserver 8.8.8.8
+nameserver 8.8.4.4
+EOF
+
+
+export CONTAINER_RUNTIME_ENDPOINT="unix:///run/crio/crio.sock"
+
+
+make
+
+# ./hack/local-up-cluster.sh
+
+KUBELET_RESOLV_CONF="/tmp/resolv.conf" KUBELET_FLAGS="--cgroup-driver=systemd" ./hack/local-up-cluster.sh
+
+```
+
+
+
+```shell
+
+export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig
+
+cd _output/local/bin/linux/amd64
+
+
+./kubectl apply -f your.yaml
+./kubectl get pods 
+
+
+```
+
+
+# KUBERNETES K8S
+
+
+```shell
+#!/bin/bash
+
+set -euxo pipefail
+
+
+######## wj
+
+
+HOME="/root" 
+
+
+sudo swapoff -a
+
+
+(crontab -l 2>/dev/null; echo "@reboot /sbin/swapoff -a") | crontab - || true
+sudo apt-get update -y
+
+
+
+#OS="xUbuntu_20.04"
+
+OS="$2"
+
+#VERSION="1.25"
+
+VERSION="$3"
+
+cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
+overlay
+br_netfilter
+EOF
+
+sudo modprobe overlay
+sudo modprobe br_netfilter
+
+
+cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
+net.bridge.bridge-nf-call-iptables  = 1
+net.ipv4.ip_forward                 = 1
+net.bridge.bridge-nf-call-ip6tables = 1
+EOF
+
+sudo sysctl --system
+
+
+curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v$VERSION/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
+
+echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v$VERSION/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
+
+
+sudo apt-get update
+sudo apt-get install cri-o -y
+
+sudo systemctl daemon-reload
+sudo systemctl enable crio --now
+
+echo "Container runtime installed susccessfully"
+
+sudo apt-get update
+sudo apt-get install -y apt-transport-https ca-certificates curl
+
+sudo mkdir -p /etc/apt/keyrings
+
+
+sudo curl -fsSL "https://pkgs.k8s.io/core:/stable:/v$VERSION/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
+
+echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v$VERSION/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
+
+sudo apt-get update -y
+sudo apt-get install -y kubelet kubectl kubeadm
+sudo apt-get update -y
+sudo apt-get install -y jq
+
+
+
+local_ip=$1
+cat > /etc/default/kubelet << EOF
+KUBELET_EXTRA_ARGS=--node-ip=$local_ip
+EOF
+
+
+MASTER_IP=$local_ip
+LB_IP=$local_ip
+IP_NO_DOT=$(echo "$local_ip" | sed "s/\./-/g")
+PORT="3446"
+NODENAME="$(hostname -s)"
+NODENAME="lead-$NODENAME-$IP_NO_DOT-$(openssl rand -hex 8)"
+POD_CIDR="10.10.0.0/16"
+
+sudo kubeadm config images pull 
+
+echo "Preflight Check Passed: Downloaded All Required Images"
+
+sudo kubeadm init --apiserver-advertise-address=$MASTER_IP --apiserver-cert-extra-sans="$MASTER_IP,$LB_IP" --pod-network-cidr=$POD_CIDR --node-name "$NODENAME" --control-plane-endpoint "$LB_IP:$PORT" --ignore-preflight-errors Swap 
+mkdir -p "$HOME"/.kube
+sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
+sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
+
+if [ -z ${INSTALL_CALICO+x} ]
+then
+  # cilium
+  CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
+  CLI_ARCH=amd64
+  if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
+  curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
+  sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
+  sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
+  rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
+
+  cilium install --version 1.14.5
+
+else
+  # calico
+  kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
+fi
+
+
+kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
+
+
+
+kubectl label node $NODENAME ingress-ready=true 
+
+```
+
+
+```shell
+
+#!/bin/bash
+
+
+set -euxo pipefail
+
+
+
+HOME="/root" 
+
+sudo swapoff -a
+
+
+(crontab -l 2>/dev/null; echo "@reboot /sbin/swapoff -a") | crontab - || true
+sudo apt-get update -y
+
+
+
+OS="$2"
+
+VERSION="$3"
+
+
+cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
+overlay
+br_netfilter
+EOF
+
+sudo modprobe overlay
+sudo modprobe br_netfilter
+
+
+cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
+net.bridge.bridge-nf-call-iptables  = 1
+net.ipv4.ip_forward                 = 1
+net.bridge.bridge-nf-call-ip6tables = 1
+EOF
+
+sudo sysctl --system
+
+
+curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v$VERSION/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
+
+echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v$VERSION/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
+
+
+sudo apt-get update
+sudo apt-get install cri-o -y
+
+sudo systemctl daemon-reload
+sudo systemctl enable crio --now
+
+echo "Container runtime installed susccessfully"
+
+
+sudo apt-get update
+
+sudo apt-get install -y apt-transport-https ca-certificates curl
+
+sudo mkdir -p /etc/apt/keyrings
+
+sudo curl -fsSL "https://pkgs.k8s.io/core:/stable:/v$VERSION/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
+
+echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v$VERSION/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
+
+sudo apt-get update -y
+sudo apt-get install -y kubelet kubectl kubeadm
+sudo apt-get update -y
+sudo apt-get install -y jq
+
+
+
+local_ip=$1
+cat > /etc/default/kubelet << EOF
+KUBELET_EXTRA_ARGS=--node-ip=$local_ip
+EOF
+```
+
+```shell
+
+#!/bin/bash
+
+sudo apt-get update
+
+sudo apt-get install -y  haproxy 
+
+```
+
+```shell
+#!/bin/bash
+
+helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
+
+helm repo update
+
+cd ./prom-grafana-charts/charts
+
+helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack -f ./default-kube-prom-custom-value.yaml --version 42.2.0
+
+
+```
+
+
+```shell
+#!/bin/bash
+
+helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
+
+
+helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
+    --set nfs.server=192.168.0.25 \
+    --set nfs.path=/data
+
+
+```
+
+```shell
+#!/bin/bash
+
+helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
+
+
+
+helm repo update
+
+
+
+helm upgrade -i nvdp nvdp/nvidia-device-plugin \
+
+  --namespace nvidia-device-plugin \
+
+  --create-namespace \
+
+  --version 0.13.0
+
+
+
+
+
+```
+
+```yaml
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: ingress-grafana
+
+spec:
+  rules:
+  - host: grafana.mipllab.com
+    http:
+      paths:
+        - path: /
+          pathType: Prefix
+          backend:
+            service:
+              name: kube-prometheus-stack-grafana
+              port:
+                number: 80
+
+```
+
+
+```shell
+...
+
+#---------------------------------------------------------------------
+# main frontend which proxys to the backends
+#---------------------------------------------------------------------
+frontend kubernetes
+    bind *:3446
+    option tcplog
+    mode tcp
+    default_backend kube_master_nodes    
+
+
+#---------------------------------------------------------------------
+# static backend for serving up images, stylesheets and such
+#---------------------------------------------------------------------
+#backend static
+#    balance     roundrobin
+#    server      static 127.0.0.1:4331 check
+
+#---------------------------------------------------------------------
+# round robin balancing between the various backends
+#---------------------------------------------------------------------
+backend kube_master_nodes
+    mode tcp
+    balance     roundrobin
+    option tcp-check
+    server  -> check fall 3 rise 2
+
+
+
+...
+
+
+
+
+```
+
+
+```shell
+
+#!/bin/bash
+
+
+ufw allow from 192.168.0.1/24 
+
+ufw allow from 10.10.0.0/16
+
+
+
+```
+
+
+```shell
+
+#!/bin/bash
+
+firewall-cmd --permanent --add-port=3446/tcp
+
+firewall-cmd --permanent --add-port=6443/tcp
+
+firewall-cmd --permanent --add-port=2379-2380/tcp
+
+firewall-cmd --permanent --add-port=10250/tcp
+
+firewall-cmd --permanent --add-port=10259/tcp
+
+firewall-cmd --permanent --add-port=10257/tcp
+
+firewall-cmd --permanent --add-port=10250/tcp
+
+firewall-cmd --permanent --add-port=30000-32767/tcp
+
+firewall-cmd --permanent --add-port=80/tcp
+
+firewall-cmd --permanent --add-port=443/tcp
+
+firewall-cmd --zone=trusted --add-source=192.168.0.1/24 --permanent
+
+firewall-cmd --zone=trusted --add-source=10.10.0.0/16 --permanent
+
+```
+
+
+```yaml
+
+kind: StorageClass
+apiVersion: storage.k8s.io/v1
+metadata:
+  annotations:
+    storageclass.kubernetes.io/is-default-class: "true"
+  name: nfs-default-storageclass
+provisioner: cluster.local/nfs-subdir-external-provisioner
+reclaimPolicy: Delete
+allowVolumeExpansion: true
+volumeBindingMode: Immediate
+
+```
+
+```yaml
+
+alertmanager:
+  alertmanagerSpec:
+    storage:
+     volumeClaimTemplate:
+       spec:
+         storageClassName: nfs-default-storageclass
+         accessModes: ["ReadWriteOnce"]
+         resources:
+           requests:
+             storage: 4Gi
+grafana:
+  persistence:
+    enabled: true
+    type: pvc
+    storageClassName: nfs-default-storageclass
+    accessModes:
+    - ReadWriteOnce
+    size: 4Gi
+prometheus:
+  prometheusSpec:
+    storageSpec:
+      volumeClaimTemplate:
+        spec:
+          storageClassName: nfs-default-storageclass
+          accessModes: ["ReadWriteOnce"]
+          resources:
+            requests:
+              storage: 4Gi
+```
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+  name: clusterdebugger
+  labels:
+    app: clusterdebugger
+spec:
+  type: ClusterIP
+  ports:
+  - port: 6700
+    targetPort: 6700
+    protocol: TCP
+  selector:
+    app: clusterdebugger
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: clusterdebugger
+spec:
+  selector:
+    matchLabels:
+      app: clusterdebugger
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: clusterdebugger
+    spec:
+      imagePullSecrets:
+        - name: harbor-secret
+      containers:
+        - name: clusterdebugger
+          image: harbor.mipllab.com/library/clusterdebugger
+          imagePullPolicy: Always
+          ports:
+          - containerPort: 6700
+
+
+```
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+  name: clusterdebuggergpu
+  labels:
+    app: clusterdebuggergpu
+spec:
+  type: ClusterIP
+  ports:
+  - port: 6700
+    targetPort: 6700
+    protocol: TCP
+  selector:
+    app: clusterdebuggergpu
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: clusterdebuggergpu
+spec:
+  selector:
+    matchLabels:
+      app: clusterdebuggergpu
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: clusterdebuggergpu
+    spec:
+      nodeSelector:
+        gpu-ready1: ready
+      imagePullSecrets:
+        - name: harbor-secret
+      containers:
+        - name: clusterdebuggergpu
+          image: harbor.mipllab.com/library/clusterdebugger
+          resources:
+            limits:
+              nvidia.com/gpu: 1
+          imagePullPolicy: Always
+          ports:
+          - containerPort: 6700
+
+
+```
+
+
+```shell
+#!/bin/bash
+
+
+USER=tomcat # customizable
+mkdir -p /etc/kubernetes/pki/etcd
+mv /home/${USER}/ca.crt /etc/kubernetes/pki/
+mv /home/${USER}/ca.key /etc/kubernetes/pki/
+mv /home/${USER}/sa.pub /etc/kubernetes/pki/
+mv /home/${USER}/sa.key /etc/kubernetes/pki/
+mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
+mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/
+mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
+mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
+mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf
+
+
+
+```
+
+```shell
+#!/bin/bash
+
+USER=tomcat # customizable
+# Set the control_plane_ips to all other master node ips or hostnames
+CONTROL_PLANE_IPS="192.168.0.102 192.168.0.103"
+for host in ${CONTROL_PLANE_IPS}; do
+    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
+    scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
+    scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
+    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
+    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
+    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
+    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
+    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
+    scp /etc/kubernetes/admin.conf "${USER}"@$host:
+done
+
+
+
+```
+
+# KAFKA
+
+```shell
+#!/bin/bash
+
+
+
+helm repo add bitnami https://charts.bitnami.com/bitnami
+
+
+
+
+helm install zookeeper bitnami/zookeeper --set replicaCount=1 --set auth.enabled=false --set allowAnonymousLogin=true
+
+
+
+helm install kafka bitnami/kafka --set zookeeper.enabled=false --set replicaCount=1 --set externalZookeeper.servers=ZOOKEEPER-SERVICE-NAME
+
+
+```
+# KIBANA
+
+
+```yaml
+
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: ingress-kibana
+  annotations:
+      nginx.ingress.kubernetes.io/proxy-body-size: "0"
+
+spec:
+  rules:
+  - host: kibana.usagecorpus.com
+    http:
+      paths:
+        - path: /
+          pathType: Prefix
+          backend:
+            service:
+              name: kibana
+              port:
+                number: 5601
+
+
+
+```
+
+```yaml
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: kibana
+  labels:
+    app: kibana
+spec:
+  type: ClusterIP
+  ports:
+  - port: 5601
+    targetPort: 5601
+    protocol: TCP
+  selector:
+    app: kibana
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: kibana
+spec:
+  selector:
+    matchLabels:
+      app: kibana
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: kibana
+    spec:
+      imagePullSecrets:
+        - name: harbor-secret
+      containers:
+        - name: kibana
+          image: seantywork/kibana
+          imagePullPolicy: Always
+          ports:
+          - containerPort: 5601
+
+
+
+```
+
+
+```yaml
+
+version: "3"
+services:
+    kibana:
+        build: ./kibana
+        container_name: kibana
+        restart: always
+        ports:
+            - 5601:5601
+        networks:
+            - network1
+
+networks:
+    network1:
+        name: elastic_default
+        external: true
+```
+
+```shell
+FROM kibana:8.5.3
+
+ENV ELASTICSEARCH_USERNAME="kibana_system"
+ENV ELASTICSEARCH_PASSWORD="estest"
+ENV ELASTICSEARCH_HOSTS=http://elasticsearch:9200
+ENV XPACK_MONITORING_ENABLED=true
+ENV XPACK_MONITORING_COLLECTION_ENABLED=true
+ENV XPACK_SECURITY_ENABLED=true
+
+EXPOSE 5601
+
+
+```
+
+# MONGO DB
+
+```yaml
+version: "3"
+services:
+        mongodb:
+                build: ./mdb
+                container_name: mongodb
+                ports:
+                        - 27017:27017
+                volumes:
+                        - ./mdb/data:/data/db
+
+
+```
+
+
+```shell
+FROM mongo:4.4.19-rc1
+
+ENV MONGO_INITDB_ROOT_USERNAME root
+ENV MONGO_INITDB_ROOT_PASSWORD youdonthavetoknow
+
+EXPOSE 27017
+
+```
+
+# OPENSTACK
+
+
+```shell
+
+# devstack
+
+sudo useradd -s /bin/bash -d /opt/stack -m stack
+echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
+sudo -u stack -i
+
+git clone https://opendev.org/openstack/devstack
+cd devstack
+
+# local.conf
+
+[[local|localrc]]
+ADMIN_PASSWORD=openstack
+DATABASE_PASSWORD=openstack
+RABBIT_PASSWORD=openstack
+SERVICE_PASSWORD=openstack
+HOST_IP=$IP_ADDR_OF_VM
+
+./stack.sh
+
+user: admin
+password: openstack
+
+```
+
+
+
+
+
+# NFS
+
+```shell
+
+#!/bin/bash
+
+sudo dnf install nfs-utils
+
+
+
+sudo systemctl start nfs-server.service
+
+
+sudo systemctl enable --now nfs-server.service
+
+
+## /etc/exports
+
+## exportfs -a
+
+
+```
+
+```shell
+#!/bin/bash
+
+apt update
+
+apt install -y nfs-kernel-server
+
+apt install -y nfs-common
+
+apt install -y jq
+
+mkdir -p /kw_data
+
+chown -R root:root /kw_data
+
+chmod -R 777 /kw_data
+
+
+
+local_ip=$1
+
+IP=$local_ip
+
+cat << EOF > /etc/exports
+
+/kw_data $IP/24(rw,sync,no_subtree_check,no_root_squash) 10.10.0.0/16(rw,sync,no_subtree_check,no_root_squash)
+
+EOF
+
+exportfs -a
+
+systemctl restart nfs-kernel-server
+
+```
+
+
+# NGINX CONF
+
+```shell
+
+user www-data;
+worker_processes auto;
+pid /run/nginx.pid;
+#include /etc/nginx/modules-enabled/*.conf;
+
+events {
+        worker_connections 768;
+        # multi_accept on;
+}
+
+http {
+
+        ##
+        # Basic Settings
+        ##
+
+        sendfile on;
+        tcp_nopush on;
+        tcp_nodelay on;
+        reset_timedout_connection on;
+        client_body_timeout 10;
+        send_timeout 2;
+
+        keepalive_timeout 30;
+        keepalive_requests 100000;
+
+        client_max_body_size 10G;
+
+
+        include /etc/nginx/mime.types;
+        default_type application/octet-stream;
+
+        ##
+        # SSL Settings
+        ##
+
+        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
+        ssl_prefer_server_ciphers on;
+
+        ##
+        # Logging Settings
+        ##
+
+        access_log /var/log/nginx/access.log;
+        error_log /var/log/nginx/error.log;
+
+        ##
+        # Gzip Settings
+        ##
+
+        #gzip on;
+
+        #gzip_comp_level  2;
+        #gzip_min_length  1000;
+        #gzip_proxied     expired no-cache no-store private auth;
+        #gzip_types       text/plain application/x-javascript text/xml text/css application/xml;
+
+        include /etc/nginx/conf.d/*.conf;
+
+}
+```
+
+```shell
+
+
+
+server
+{
+        
+        listen 80;
+
+        server_name  exhibit-nginx.usagecorpus.com;
+
+        location / {
+             add_header Content-Type text/plain;
+             return 200 'okay';           
+
+        }
+
+
+}
+
+```
+
+```shell
+
+upstream  EXNGINX{
+        ip_hash;
+        #least_conn;
+
+        server  127.0.0.1:8000;
+        server  127.0.0.1:8001;
+
+}
+
+server
+{
+        listen       80;
+        server_name      exhibit-nginx.usagecorpus.com;
+        return 301 https://$host$request_uri;
+}
+
+
+
+server
+{
+        
+        server_name  exhibit-nginx.usagecorpus.com;
+
+        location / {
+             #add_header Content-Type text/plain;
+             #return 200 'okay';           
+
+             proxy_pass http://EXNGINX;
+             proxy_set_header X-Real-IP $remote_addr;
+             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+             proxy_set_header X-Forwarded-For $remote_addr;
+             proxy_set_header X-Forwarded-Proto $scheme;
+             proxy_set_header Host $http_host;
+
+             proxy_read_timeout 300s;
+             proxy_connect_timeout 75s;
+             
+             proxy_buffering off;
+             proxy_request_buffering off;
+
+             proxy_http_version 1.1;
+             proxy_set_header   Upgrade $http_upgrade;
+             proxy_set_header   Connection "upgrade";
+        }
+
+
+
+
+
+
+
+    #listen 80; # managed by Certbot
+
+    listen 443 ssl; # managed by Certbot
+    ssl_certificate /etc/letsencrypt/live/exhibit-nginx.usagecorpus.com/fullchain.pem; # managed by Certbot
+    ssl_certificate_key /etc/letsencrypt/live/exhibit-nginx.usagecorpus.com/privkey.pem; # managed by Certbot
+    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
+    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
+
+}
+```
+
+```shell
+
+# add server without restart
+
+sudo nginx -s reload
+
+```
+
+
+```shell
+#!/bin/bash
+
+
+while true; do nc -l 0.0.0.0 8000 < resp; done
+
+
+```
+
+
+# CMAKELISTS TXT CMAKE
+
+```shell
+
+cd $PROJECT_DIR
+
+mkdir -p build
+
+cd build
+
+cmake ..
+
+make
+
+# blah blah after that
+
+
+```
+```shell
+# build lib
+
+
+cmake_minimum_required(VERSION 3.2)
+project(dynamiclink_print)
+set(CMAKE_BUILD_TYPE Release)
+
+include_directories(include)
+
+set(SOURCES src/crazything.cc)
+
+
+# target lib for .so
+add_library(crazything SHARED ${SOURCES})
+# target lib for .a
+add_library(something STATIC ${SOURCES})
+
+# for installing lib: sudo make install...
+install(TARGETS crazything DESTINATION /usr/lib)
+
+
+```
+
+
+```shell
+# build target
+
+# min ver
+cmake_minimum_required(VERSION 3.2)
+# project name
+project (main_lib_print)
+
+
+# include
+include_directories(
+    ../2_staticlink_print/include
+    ../3_dynamiclink_print/include
+    )
+
+# set var
+set ( PROJECT_LINK_LIBS libsomething.a libcrazything.so)
+
+# static or dynamic link dirs
+link_directories( 
+    ../2_staticlink_print/build
+    ../3_dynamiclink_print/build 
+    )
+
+
+# target bin
+add_executable(main.out main.cc)
+
+# linking to target bin
+target_link_libraries(main.out ${PROJECT_LINK_LIBS})
+
+```
+
+```shell
+
+# include another one
+
+include(another/cmakelists.txt)
+
+
+
+# source all
+file(
+  GLOB somefile
+  "${SRC_DIR}/*.c"
+)
+
+# -pthread
+
+Threads::Threads
+
+# export (when included in another CMakeLists.txt)
+install(
+  TARGETS thethinghere
+  EXPORT thethinghere
+  ARCHIVE DESTINATION lib
+  LIBRARY DESTINATION lib
+)
+
+install(
+  EXPORT thethinghere
+  DESTINATION lib
+  FILE agvcancomm-Config.cmake
+)
+
+
+
+```
+
+
+# JENKINSFILE
+
+
+```shell
+
+pipeline{
+
+    agent any
+
+        environment {
+
+            // Target Path
+
+            TARGET_PATH="/home/target"
+            TARGET_PREFIX="target_"
+
+            // Preparation Stage
+
+            GIT_ADDR="https://${GIT_ID}:${GIT_PW}@github.com/seantywork/nothing.git"
+            GIT_BRANCH="main"
+            
+            // Build Stage
+
+            REG_ADDR="docker.io -u ${REG_ID} -p ${REG_PW}"
+            IMG_1="${TARGET_PREFIX}nothing"
+            TAG_1="docker.io/seantywork/nothing"
+
+
+            // Deployment Stage
+
+            DEPLOYMENT_NODE="${DEPLOYMENT_NODE}"
+
+            APP_PATH_1="${TARGET_PATH}/k8s/app.yaml"
+
+
+            UPDATE_1="deployment/nothing"
+
+
+            
+            // ********* Safe Scripts **********
+
+            // stage Preparation_checkSafe
+            // --> USAGE: ${SAFE_PREP} ${TARGET_PATH} 
+            SAFE_PREP="/home/safe_preparation"
+
+            // stage Termination_checkSafe
+            // --> USAGE: ${SAFE_TERM} ${TAG_1} ${TAG_2} ...
+            SAFE_TERM="/home/safe_termination"
+
+
+        }
+
+    stages{
+
+
+
+        stage ('Preparation'){
+
+            steps {
+
+                sh ''' #!/bin/bash
+
+                    mkdir -p ${TARGET_PATH}
+
+                    git -C ${TARGET_PATH} init
+
+                    git -C ${TARGET_PATH} pull ${GIT_ADDR} ${GIT_BRANCH}
+
+                '''
+
+            }
+
+        }
+
+        stage ('Preparation-safety-check'){
+
+            steps {
+
+                sh ''' #!/bin/bash
+
+                    ${SAFE_PREP} ${TARGET_PATH} 
+
+                '''
+
+            }
+
+        }
+
+        stage ('Build'){
+
+            steps {
+
+                sh ''' #!/bin/bash
+
+                    docker login ${REG_ADDR}
+
+                    docker-compose -f "${TARGET_PATH}/docker-compose.yaml" up -d --build
+
+                    docker-compose -f "${TARGET_PATH}/docker-compose.yaml" down
+
+                    docker tag ${IMG_1} ${TAG_1}
+
+                    docker push ${TAG_1}
+
+                '''
+
+            }
+
+        }
+
+        stage ('Deployment'){
+
+            steps {
+
+                sh ''' #!/bin/bash
+
+                    scp ${APP_PATH_1} "${DEPLOYMENT_NODE}:/home/src"
+
+                    ssh ${DEPLOYMENT_NODE} "kubectl -n operation apply -f app.yaml"
+
+                    ssh ${DEPLOYMENT_NODE} "kubectl -n operatioin rollout restart ${UPDATE_1}"
+
+                    ssh ${DEPLOYMENT_NODE} "rm ./app.yaml"
+
+                '''
+            }
+
+        }
+
+        stage ('Termination'){
+
+            steps {
+
+                sh ''' #!/bin/bash
+
+                    rm -rf ${TARGET_PATH}
+
+                '''
+
+
+            }
+
+        }
+
+        stage ('Termination-safety-check'){
+
+            steps {
+
+                sh ''' #!/bin/bash
+
+                    ${SAFE_TERM} ${TAG_1} 
+
+                '''
+
+            }
+
+
+        }
+
+
+    }
+}
+
+
+```
+
+
+
+# GITHUB WORKFLOW
+
+```yaml
+
+name: self hosted runner
+
+on :
+  push:
+    branches: [ main ]
+
+jobs:
+
+  uc_self_hosted_build:
+    runs-on: self-hosted
+    steps: 
+      - run: mkdir -p /root/uc
+      - run: git -C /root/uc init
+      - run: git -C /root/uc pull https://github.com/seantywork/uc.git 
+      - run: docker-compose -f /root/uc/docker-compose.yaml up -d --build
+      - run: docker-compose -f /root/uc/docker-compose.yaml down
+      - run: docker tag uc_traffic seantywork/traffic
+      - run: docker tag uc_web seantywork/web
+      - run: docker tag uc_db seantywork/db
+      - run: docker push seantywork/traffic
+      - run: docker push seantywork/web
+      - run: docker push seantywork/db
+      - run: rm -r /root/uc
+
+  uc_self_hosted_deployment:
+    needs: uc_self_hosted_build
+    runs-on: self-hosted
+    steps:
+      - run: ssh $SSH_XY "git -C /home/seantywork/uc pull "
+      - run: ssh $SSH_XY "kind delete cluster --name kindcluster"
+      - run: ssh $SSH_XY "kind create cluster --name kindcluster --config /home/seantywork/uc/k8s/kindcluster.yaml --image=kindest/node:v1.27.2"
+      - run: ssh $SSH_XY "kubectl create namespace uc"
+      - run: ssh $SSH_XY "kubectl create secret generic docker-secret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n uc"
+      - run: ssh $SSH_XY "kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml"
+      - run: sleep 3
+      - run: echo "waiting...1"
+      - run: sleep 3
+      - run: echo "waiting...2"
+      - run: sleep 3
+      - run: echo "waiting...3"
+      - run: sleep 3
+      - run: echo "waiting...4"
+      - run: sleep 3
+      - run: echo "waiting...5"
+      - run: ssh $SSH_XY "kubectl -n uc apply -f /home/seantywork/uc/k8s/app.yaml"
+  uc_self_hosted_service:
+    needs: uc_self_hosted_deployment
+    runs-on: self-hosted
+    steps:
+      - run: sleep 3
+      - run: echo "waiting...1"
+      - run: sleep 3
+      - run: echo "waiting...2"
+      - run: sleep 3
+      - run: echo "waiting...3"
+      - run: sleep 3
+      - run: echo "waiting...4"
+      - run: sleep 3
+      - run: echo "waiting...5"
+      - run: ssh $SSH_XY "kubectl -n uc apply -f /home/seantywork/uc/k8s/ingress.yaml"
+  
+
+```
+
+
+# REDIS
+
+```yaml
+version: "3"
+
+services:
+
+    redis:
+      build: ./redis
+      container_name: redis
+      volumes:
+        - ./redis/data:/var/lib/redis/data
+        - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
+      ports:
+        - "6379:6379"
+
+
+```
+
+
+```shell
+
+FROM redis:7.0.8
+
+EXPOSE 6379
+
+CMD ["/bin/sh","-c","redis-server","--requirepass","youdonthavetoknow"]
+
+
+```
+
+
+```shell
+
+port              6379
+daemonize         yes
+save              60 1
+bind              0.0.0.0
+tcp-keepalive     300
+dbfilename        dump.rdb
+dir               ./
+rdbcompression    yes
+
+```
+
+
+# REMOTE DESKTOP
+
+```shell
+
+# remote server
+
+sudo apt install xrdp -y
+
+sudo systemctl restart xrdp
+
+
+# client
+
+sudo apt install remmina remmina-plugin-vnc
+
+
+
+```
+
+# GRPC SET UP
+
+
+```shell
+# install
+
+export MY_gRPC_DIR=$HOME/.local
+
+mkdir -p $MY_gRPC_DIR
+
+export PATH="$MY_gRPC_DIR/bin:$PATH"
+
+# cmake version should be 3.8+
+
+
+sudo apt install -y build-essential autoconf libtool pkg-config
+
+git clone --recurse-submodules -b v1.60.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
+
+
+cd grpc
+mkdir -p cmake/build
+pushd cmake/build
+cmake -DgRPC_INSTALL=ON \
+      -DgRPC_BUILD_TESTS=OFF \
+      -DCMAKE_INSTALL_PREFIX=$MY_gRPC_DIR \
+      ../..
+make -j 4
+sudo make install
+popd
+
+
+```
+
+
+```shell
+
+# build
+
+# src CMakeLists.txt and common.cmake update
+
+export MY_gRPC_DIR=$HOME/.local
+
+mkdir -p build
+
+cd build && cmake -DCMAKE_PREFIX_PATH=$MY_gRPC_DIR ..
+
+make -j 4
+
+
+```
+
+
+# ROS 2
+
+```shell
+
+# on ubuntu 22.04 ros2 humble hawksbill
+
+# takes up about 2G disk space
+
+locale  # check for UTF-8
+
+sudo apt update && sudo apt install locales
+sudo locale-gen en_US en_US.UTF-8
+sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
+export LANG=en_US.UTF-8
+
+locale  # verify settings
+
+
+
+sudo apt install software-properties-common
+sudo add-apt-repository universe
+
+
+sudo apt update && sudo apt install curl -y
+sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
+
+
+echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
+
+
+
+
+sudo apt update
+
+
+sudo apt upgrade
+
+
+sudo apt install ros-humble-desktop
+
+
+sudo apt install ros-humble-ros-base
+
+
+sudo apt install ros-dev-tools
+
+
+
+source /opt/ros/humble/setup.bash
+
+
+# check if installation is succeful
+
+
+# terminal 1
+
+source /opt/ros/humble/setup.bash
+ros2 run demo_nodes_cpp talker
+
+
+# terminal 2
+
+source /opt/ros/humble/setup.bash
+ros2 run demo_nodes_py listener
+
+
+```
+
+
+```shell
+
+# cartographer
+
+ros2 pkg list |grep cartographer
+
+# if none
+
+sudo apt install ros-$ROS_DISTRO-cartographer -y
+
+# turtlebot3
+
+sudo apt install ros-$ROS_DISTRO-turtlebot3* -y
+
+# simulation
+
+source /opt/ros/humble/setup.bash
+
+export TURTLEBOT3_MODEL=burger
+
+export GAZEBO_MODEL_PATH=`ros2 pkg \
+prefix turtlebot3_gazebo`/share/turtlebot3_gazebo/models/
+
+
+ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
+
+# troubleshoot
+# not sure if effective?
+gazebo -s libgazebo_ros_init.so -s libgazebo_ros_factory.so myworld.world
+
+
+# on terminal 2 remote pc: teleoperation node
+
+source /opt/ros/humble/setup.bash
+
+ros2 run turtlebot3_teleop teleop_keyboard
+
+# on terminal 3 remote pc: cartographer
+
+source /opt/ros/humble/setup.bash
+
+ros2 launch turtlebot3_cartographer \
+cartographer.launch.py \
+use_sim_time:=True
+
+```
+
+
+```shell
+
+# real
+
+# on turtlebot3 do below
+
+source .bashrc
+
+cd turtlebot3_ws
+
+#Set up ROS_DOMAIN_ID
+
+export ROS_DOMAIN_ID="Your Number"
+
+# e.g. export ROS_DOMAIN_ID=11
+
+source install/setup.bash
+
+ros2 launch turtlebot3_bringup robot.launch.py
+
+# on terminal2 : teleoperation node
+
+
+source /opt/ros/humble/setup.bash
+
+export ROS_DOMAIN_ID="Your Number"
+# e.g. export ROS_DOMAIN_ID=11
+
+ros2 run turtlebot3_teleop teleop_keyboard
+
+
+# on terminal3 : cartoprapher
+
+
+
+source /opt/ros/humble/setup.bash
+
+export ROS_DOMAIN_ID="Your Number"
+# e.g. export ROS_DOMAIN_ID=11
+
+ros2 run cartographer_ros occupancy_grid_node -resolution 0.05\
+-publish_period_sec 1.0
+
+ros2 run cartographer_ros cartographer_node\
+-configuration_directory]\ 
+install/turtlebot3_cartographer/share/turtlebot3_cartographer\
+/config -configuration_basename turtlebot3_lds_2d.lua
+
+
+```
+
+# ROS API
+
+```shell
+# term1
+
+mkdir -p ros2_ws/src
+
+
+source /opt/ros/humble/setup.bash
+
+# git clone https://github.com/ros/ros_tutorials.git -b humble
+
+# term1 dependency at ros2_ws
+
+rosdep install -i --from-path src --rosdistro humble -y
+
+# term1 build at ros2_ws
+
+colcon build --symlink-install
+
+# term2
+
+source /opt/ros/humble/setup.bash
+
+# term2 at ros2_ws
+
+source install/local_setup.bash
+
+```
+
+```shell
+
+# term1
+
+# package dev
+
+source /opt/ros/humble/setup.bash
+
+# package dec at ros2_ws/src
+
+ros2 pkg create --build-type ament_cmake --node-name $NODE_NAME $PKG_NAME
+
+# source goes to ros2_ws/src/$PKG_NAME/src
+
+# package.xml, CMakeLists.txt update
+
+# install dependency at ros2_ws
+
+rosdep install -i --from-path src --rosdistro humble -y
+
+# package build at ros2_ws
+
+colcon build --symlink-install --packages-select $PKG_NAME
+
+
+
+# term2
+
+source /opt/ros/humble/setup.bash
+
+# term2 at ros2_ws
+
+source install/local_setup.bash
+
+# run
+
+ros2 run $PKG_NAME $NODE_NAME
+
+
+
+```
+# ROS COLCON BUILD LAUNCH
+
+```shell
+# term 1
+
+source /opt/ros/directory/setup.bash
+
+colcon build --symlink-install
+
+```
+
+```shell
+# term 2
+
+source install/setup.bash
+
+ros2 launch $PAKCAGE_NAME $LAUNCHFILE_NAME
+
+
+```
+
+
+# ROS DOCKER
+
+```shell
+
+# pyslam v2
+
+nvidiactk
+
+# config.sh work dir 
+
+build.sh <NAME>
+
+xhost +
+
+run.sh <NAME>
+
+# $DISPLAY ?
+
+
+
+```
+
+
+# CAN NETWORK
+
+```shell
+
+# using gpio
+
+sudo apt-get install busybox
+
+
+# register up for a test
+
+sudo busybox devmem 0x0c303000 32 0x0000C400
+sudo busybox devmem 0x0c303008 32 0x0000C458
+sudo busybox devmem 0x0c303010 32 0x0000C400
+sudo busybox devmem 0x0c303018 32 0x0000C458
+
+
+sudo modprobe can
+sudo modprobe can_raw
+sudo modprobe mttcan
+
+
+# each second line optional?
+
+sudo ip link set can0 type can bitrate 500000 \
+    dbitrate 2000000 berr-reporting on fd on
+sudo ip link set can1 type can bitrate 500000 \
+    dbitrate 2000000 berr-reporting on fd on
+
+
+sudo ip link set up can0
+sudo ip link set up can1
+
+
+# cron the sh file at reboot
+
+```
+```shell
+
+# vcan
+
+sudo modprobe vcan
+
+ip link add dev vcan0 type vcan
+
+ip link set up vcan0
+
+```
+
+```shell
+# can utils
+
+sudo apt-get install can-utils
+
+# send to if with id
+cansend vcan0 101#41424344
+
+# dump all incoming data
+
+candump -t Absolute vcan0
+
+# send random frame continuously
+
+cangen vcan0
+
+
+```
+
+# CANOPEN
+
+```shell
+
+git clone https://github.com/CANopenNode/CANopenLinux.git
+cd CANopenLinux
+git submodule init
+git submodule update
+
+
+sudo modprobe can
+sudo modprobe can_raw
+sudo modprobe mttcan
+
+
+
+
+sudo ip link set can0 type can bitrate 500000 \
+    dbitrate 2000000 berr-reporting on fd on
+
+
+sudo ip link set up can0
+
+cd CANopenLinux
+
+make
+
+sudo make install
+
+canopend --help
+
+# send SDO, PDO according to the motor driver vendor manual
+
+```
+
+
+# MQTT
+
+```shell
+# docker compose
+
+version: "3.7"
+
+services:
+  mosquitto:
+    image: eclipse-mosquitto
+    container_name: mosquitto
+    restart: unless-stopped
+    ports:
+      - "1883:1883"
+      - "9001:9001"
+    volumes:
+      - ./mosquitto:/etc/mosquitto
+      - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
+
+```
+
+
+```shell
+
+# volume config
+
+listener 1883
+allow_anonymous true
+# password_file /etc/mosquitto/passwd
+
+```
+
+# RASPBERRY PI
+
+```shell
+# gpio pins for rpi 4
+
+| #  |           | PIN  |    |    | PIN  |          | #  |
+|----|-----------|------|----|----|------|----------|----|
+| 1  | 3v3 Power | `1`  | 🟧 | 🔴 | `2`  | 5v Power | 20 |
+| 2  | GPIO 2    | `3`  | 🔵 | 🔴 | `4`  | 5v Power | 19 |
+| 3  | GPIO 3    | `5`  | 🔵 | ⚫ | `6`  | *Ground* | 18 |
+| 4  | GPIO 4    | `7`  | 🟢 | 🟣 | `8`  | GPIO 14  | 17 |
+| 5  | *Ground*  | `9`  | ⚫ | 🟣 | `10` | GPIO 15  | 16 |
+| 6  | GPIO 17   | `11` | 🟢 | 🟤 | `12` | GPIO 18  | 15 |
+| 7  | GPIO 27   | `13` | 🟢 | ⚫ | `14` | *Ground* | 14 |
+| 8  | GPIO 22   | `15` | 🟢 | 🟢 | `16` | GPIO 23  | 13 |
+| 9  | 3v3 Power | `17` | 🟠 | 🟢 | `18` | GPIO 24  | 12 |
+| 10 | GPIO 10   | `19` | 🟡 | ⚫ | `20` | *Ground* | 11 |
+| 11 | GPIO 9    | `21` | 🟡 | 🟢 | `22` | GPIO 25  | 10 |
+| 12 | GPIO 11   | `23` | 🟡 | 🟡 | `24` | GPIO 8   | 9  |
+| 13 | *Ground*  | `25` | ⚫ | 🟡 | `26` | GPIO 7   | 8  |
+| 14 | GPIO 0    | `27` | 🔵 | 🔵 | `28` | GPIO 1   | 7  |
+| 15 | GPIO 5    | `29` | 🟢 | ⚫ | `30` | *Ground* | 6  |
+| 16 | GPIO 6    | `31` | 🟢 | 🟢 | `32` | GPIO 12  | 5  |
+| 17 | GPIO 13   | `33` | 🟢 | ⚫ | `34` | *Ground* | 4  |
+| 18 | GPIO 19   | `35` | 🟤 | 🟢 | `36` | GPIO 16  | 3  |
+| 19 | GPIO 26   | `37` | 🟢 | 🟤 | `38` | GPIO 20  | 2  |
+| 20 | *Ground*  | `39` | ⚫ | 🟤 | `40` | GPIO 21  | 1  |
+
+**Legend:**
+
+* 🟢 GPIO (General Purpose IO)
+* 🟡 SPI (Serial Peripheral Interface)
+* 🔵 I2C (Inter-integrated Circuit)
+* 🟣 UART (Universal Asyncronous)
+* 🟤 PCM (Pulse Code Modulation)
+* ⚫ Ground
+* 🔴 5v (Power)
+* 🟠 3.3v (Power)
+
+```
+
+
+```shell
+
+# get real pin number (device tree)
+
+
+cat /sys/kernel/debug/gpio
+
+```
+
+```shell
+
+# pgpio
+
+# install pigpio
+wget https://github.com/joan2937/pigpio/archive/master.zip
+unzip master.zip
+cd pigpio-master
+make
+sudo make install
+
+# wiringpi
+
+sudo apt install wiringpi
+
+# ir receiver
+
+# S
+# > OUT
+# > POWER
+# > GND
+# -
+
+# OUT to GPIO 4
+# POWER to PIN 1
+# GND to PIN 9
+```
+```shell
+# lirc
+
+# ir transmitter
+
+# > DAT
+# > VCC
+# > GND
+
+# DAT to GPIO 23
+# VCC to PIN 2
+# GND to PIN 20
+
+# install lirc
+
+sudo apt-get update 
+
+sudo apt-get install lirc -y
+
+
+```shell
+# on xU22.04
+# /boot/firmware/config.txt
+# below last [all]
+
+[all]
+...
+dtoverlay=gpio-ir,gpio_pin=4
+dtoverlay=gpio-ir-tx,gpio_pin=23
+...
+
+# 4 receive < in
+
+# 23 transmit > out
+```
+
+```shell
+# /etc/lirc/hardware.conf
+
+LIRCD_ARGS="--uinput --listen"
+LOAD_MODULES=true
+DRIVER="default"
+DEVICE="/dev/lirc0"
+MODULES="lirc_rpi"
+
+# /etc/lirc/lirc_options.conf
+
+#driver         = devinput
+#device         = auto
+driver          = default
+device          = /dev/lirc0
+```
+```shell
+
+# check incoming infrared signal
+
+sudo systemctl stop lircd
+
+sudo mode2 -m -d /dev/lirc1 > *.lirc.conf
+
+# *.lirc.conf format
+
+begin remote
+
+  name LG_AC
+  flags RAW_CODES|CONST_LENGTH
+  eps 30
+  aeps 100
+
+  gap 513079
+
+      begin raw_codes
+
+  name AC_ON
+
+     3044     9814      495     1569      465      548
+      469      548      469      550      467     1592
+      441      549      525      496      494      520
+      466      551      469      548      469      550
+      467      548      465      577      468      549
+      466      552      465      550      466      550
+      450     1612      468     1566      443     1620
+      418      571      467      550      520      497
+      498      519      494      523      467     1620
+      420     1614      442     1619      464   
+
+  name AC_OFF
+
+     3075     9815      493     1593      442      548
+      470      549      470      546      468     1591
+      441      575      470      547      467      550
+      467     1595      439     1594      439      553
+      468      550      465      573      466      551
+      444      573      443      574      446      570
+      444      572      444      573      443      574
+      444      572      444     1617      440      556
+      462     1593      445      572      445      575
+      468      572      444     1617      418   
+
+      end raw_codes
+
+end remote
+
+
+# cp
+
+sudo cp lgac.lirc.conf /etc/lirc/lircd.conf.d/
+
+
+# mv 
+
+sudo mv /etc/lirc/lircd.conf.d/devinput.lircd.conf /etc/lirc/lircd.conf.d/devinput.lircd.conf.bak
+
+# reboot
+
+# list
+
+sudo irsend LIST LG_AC ""
+
+# send
+
+sudo irsend SEND_ONCE LG_AC AC_ON
+
+```
+
+# DT DTS DTBO 
+
+```shell
+# gpiosk.dts
+/dts-v1/;
+/plugin/;
+
+/ {
+    compatible = "brcm,bcm2711";
+
+    fragment@0 {
+        target = <&gpio>;
+        __overlay__ {
+            pinctrl-names = "default";
+            pinctrl-0 = <&gpiosk_pins_in>;
+
+            gpiosk_pins_in: gpiosk_pins_in {
+                brcm,pins = <17>;     /* GPIO17 */
+                brcm,function = <0>; /* Input */
+            };
+        };
+    };
+};
+
+```
+
+```shell
+# compile 
+dtc -@ -I dts -O dtb -o gpiosk.dtbo gpiosk.dts
+
+```
+
+# JETSON XAVIER NX
+
+```shell
+
+# first flash
+
+# recovery mode
+
+# check if recovery mode
+
+lsusb 
+
+# get jetson linux bsp and rootfs
+
+# 35.4.1 (ubuntu20)
+
+# https://developer.nvidia.com/embedded/jetson-linux-r3541
+
+# un bzip2 un tar both and get the rootfs using sudo tar into BSP/rootfs
+
+sudo ./apply_binaries.sh
+
+sudo ./nvautoflash.sh
+
+# now on jetson
+
+fdisk /dev/nvme0n
+
+mkfs.ext4 /dev/nvme0np1
+
+
+# copy to volume and then switch rootfs when booting
+
+sudo mount /dev/nvme0n1p1 /mnt
+
+sudo rsync -axHAWX --numeric-ids --info=progress2 --exclude={"/dev/","/proc/","/sys/","/tmp/","/run/","/mnt/","/media/*","/lost+found"} / /mnt
+
+
+sudo cp setssdroot.service /etc/systemd/system
+sudo cp setssdroot.sh /sbin
+sudo chmod 777 /sbin/setssdroot.sh
+systemctl daemon-reload
+sudo systemctl enable setssdroot.service
+
+
+sudo cp /etc/systemd/system/setssdroot.service /mnt/etc/systemd/system/setssdroot.service
+sudo cp /sbin/setssdroot.sh /mnt/sbin/setssdroot.sh
+
+
+sudo touch /etc/setssdroot.conf
+
+```
+
+```shell
+# setssdroot.service
+
+[Unit]
+Description=Change rootfs to SSD in M.2 key M slot (nvme0n1p1)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=systemd-remount-fs.service
+Before=local-fs-pre.target local-fs.target shutdown.target
+Wants=local-fs-pre.target
+ConditionPathExists=/dev/nvme0n1p1
+ConditionPathExists=/etc/setssdroot.conf
+ConditionVirtualization=!container
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/sbin/setssdroot.sh
+[Install]
+WantedBy=default.target
+
+```
+
+```shell
+# setssdroot.sh
+#!/bin/sh
+NVME_DRIVE="/dev/nvme0n1p1"
+CHROOT_PATH="/nvmeroot"
+
+INITBIN=/lib/systemd/systemd
+EXT4_OPT="-o defaults -o errors=remount-ro -o discard"
+
+modprobe ext4
+
+mkdir -p ${CHROOT_PATH}
+mount -t ext4 ${EXT4_OPT} ${NVME_DRIVE} ${CHROOT_PATH}
+
+cd ${CHROOT_PATH}
+/bin/systemctl --no-block switch-root ${CHROOT_PATH}
+```
+
+```shell
+
+# install jetpack
+
+sudo apt update
+sudo apt install nvidia-jetpack
+
+
+```
+
+
+# VIDEO LIVE STREAM FFMPEG GSTREAMER RTMP NGINX
+
+```shell
+
+sudo apt install -y ffmpeg v4l-utils
+
+sudo apt install libnginx-mod-rtmp
+
+
+```
+
+```shell
+
+# gstreamer
+
+apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
+
+# gstreamer arm
+
+ + gstreamer1.0-libcamera
+
+
+```
+
+
+```shell
+# /etc/nginx/nginx.conf
+
+# for ssl
+stream{
+
+        upstream RTMP_SERVER {
+                server 192.168.0.32:1936;
+        }
+
+
+        server {
+                listen 1935 ssl;
+                proxy_pass RTMP_SERVER;
+                ssl_certificate /etc/letsencrypt/live/feebdaed.xyz/fullchain.pem;
+                ssl_certificate_key /etc/letsencrypt/live/feebdaed.xyz/privkey.pem;
+        }
+}
+
+rtmp {
+        server {
+                listen 1936;
+                allow publish 192.168.0.32;
+
+                # allow publish feebdaed.xyz
+
+                application live {
+                        live on;
+                        interleave on;
+                        record off;
+                        hls on;
+                        hls_path /tmp/hls;
+                        hls_fragment 15s;
+
+                        # external auth server
+                        on_publish http://localhost:5000/auth;
+                        notify_method get;
+
+                }
+        }
+}
+
+# /etc/nginx/conf.d/hls.conf
+
+server
+{
+
+        listen      8080 ssl;
+        ssl_certificate /etc/letsencrypt/live/feebdaed.xyz/fullchain.pem; # managed by Certbot
+        ssl_certificate_key /etc/letsencrypt/live/feebdaed.xyz/privkey.pem; # managed by Certbot
+        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
+        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
+
+        location /hls {
+            types {
+                application/vnd.apple.mpegurl m3u8;
+                video/mp2t ts;
+            }
+            root /tmp;
+            add_header Cache-Control no-cache;
+
+            # for file:// testing only
+            add_header Access-Control-Allow-Origin *;
+
+        }
+}
+
+
+```
+
+
+```shell
+
+# stream to rtmp server
+
+
+ffmpeg -f v4l2 -i /dev/video0 \
+  -f alsa -i hw:0,0 \
+  -c:v libx264 -pix_fmt yuv420p -framerate 15 -g 30 -b:v 500k \
+  -c:a aac -b:a 128k -ar 44100 -ac 2 \
+  -f flv -flvflags no_duration_filesize \
+  "rtmps://$HOST/live/MyWebCam?puser=$PUSER"
+
+#  -preset ultrafast -tune zerolatency                             \
+
+
+```
+
+
+```shell
+# stream to rtp server
+
+
+ffmpeg -i /dev/video0 -r 24 -video_size 640x480 -vcodec libvpx -cpu-used 5 -deadline 1 -g 10 -error-resilient 1 -auto-alt-ref 1 -f rtp 'rtp://127.0.0.1:5004?pkt_size=1200'
+
+
+```
+
+```shell
+
+# stream to rtmp server
+
+gst-launch-1.0 -e v4l2src device=/dev/video0 ! queue ! videoconvert ! videoscale ! video/x-raw,width=960,height=720 ! x264enc speed-preset=ultrafast tune=zerolatency key-int-max=20 ! flvmux streamable=true ! queue ! rtmpsink location='rtmp://localhost:8084/publish/foobar'
+
+# youtube
+
+gst-launch-1.0 v4l2src device=/dev/video0 ! queue ! videoconvert ! videoscale ! video/x-raw,width=640,height=480 ! x264enc speed-preset=ultrafast tune=zerolatency key-int-max=20 ! flvmux streamable=true name=mux ! queue ! rtmpsink location='rtmp://a.rtmp.youtube.com/live2/qbm8-a0dq-x7z5-hks7-3m6w' audiotestsrc is-live=true ! lamemp3enc ! mpegaudioparse ! mux.
+
+```
+
+# ETHERCAT
+
+```shell
+
+# 2.8
+
+# download linuxcnc image
+
+# https://linuxcnc.org/iso/
+
+# unzip and flash image
+
+dd sudo dd if=2021-01-20-linuxcnc-pi4.img of=/dev/sda bs=1M status=progress
+
+# modify if needed as follow
+
+
+```
+
+```shell
+# if needed on pi3
+
+[pi4]
+kernel=vmlinuz-4.19.71-rt24-v7l+
+force_turbo=1
+
+to this:
+
+[pi3b]
+kernel=vmlinuz-4.19.71-rt24-v7l+
+force_turbo=1
+
+# free prevention
+
+# add to cmdline.txt
+
+dwc_otg.fiq_fsm_enable=0 dwc_otg.fiq_enable=0 dwc_otg.nak_holdoff=0
+
+
+```
+
+```shell
+# on newly installed rpi
+
+uname -a
+sudo apt update
+sudo apt upgrade
+sudo reboot
+
+
+# etherlab master
+
+uname -a
+apt-cache search 4.19.71
+sudo apt install linux-headers-4.19.71-rt24-v7l
+
+sudo apt install mercurial build-essential automake tree dkms bison flex
+
+
+git clone github.com/icshwi/etherlabmaster
+cd etherlabmaster
+make init
+echo "ENABLE_CYCLES = NO" > configure/CONFIG_OPTIONS.local
+make build
+make install
+echo "ETHERCAT_MASTER0=eth0" > ethercatmaster.local
+make dkms_add
+make dkms_build
+make dkms_install
+make setup
+
+sudo mkdir -p /usr/include/linuxcnc
+sudo ln -s /opt/etherlab/include/*.h /usr/include/linuxcnc/
+sudo ln -s /opt/etherlab/lib/lib* /usr/lib/
+
+sudo reboot
+
+
+# linuxcnc ethercat
+
+sudo apt install linuxcnc-uspace-dev
+
+git clone github.com/sittner/linuxcnc-ethercat
+cd linuxcnc-ethercat
+make configure
+make
+sudo make install
+
+linuxcnc
+```
+
+```shell
+# 2.9
+# download linuxcnc image
+
+# https://linuxcnc.org/iso/
+
+# unzip and flash iso
+
+sudo apt update
+sudo apt install  linuxcnc-ethercat
+
+sudo apt install ethercat-master libethercat-dev  linuxcnc-ethercat
+
+sudo geany /etc/ethercat.conf
+
+MASTER0_DEVICE="xx:aa:yy:zz:bb:cc"
+DEVICE_MODULES="generic"
+
+sudo systemctl enable ethercat.service
+sudo systemctl start ethercat.service
+sudo systemctl status ethercat.service
+sudo chmod 666 /dev/EtherCAT0
+
+
+# check
+
+ethercat slaves
+
+sudo geany /etc/udev/rules.d/99-ethercat.rules
+
+KERNEL=="EtherCAT[0-9]", MODE="0777"
+
+sudo udevadm control --reload-rules
+
+reboot
+
+```
+
+
+```shell
+# direct from etherlab
+
+
+sudo apt install -y autoconf automake libtool
+
+git clone https://gitlab.com/etherlab.org/ethercat.git
+
+cd ethercat
+
+git switch -c stable-1.5 origin/stable-1.5
+
+# may have to set proper ethercat compatible driver
+
+./bootstrap
+
+# on intel
+
+./configure --enable-cycles --enable-8139too=no --sysconfdir=/etc
+
+# on others
+
+./configure --sysconfdir=/etc
+
+
+make -j$(nproc) all modules
+
+sudo make modules_install install
+
+sudo depmod
+
+sudo vim /etc/ethercat.conf
+
+MASTER0_DEVICE="xx:aa:yy:zz:bb:cc"
+DEVICE_MODULES="generic"
+
+sudo systemctl enable ethercat.service
+
+sudo systemctl start ethercat.service
+
+sudo vim /etc/udev/rules.d/99-ethercat.rules
+
+KERNEL=="EtherCAT[0-9]", MODE="0777"
+
+sudo udevadm control --reload-rules
+
+```
+
+
+```shell
+# after the above
+
+# get servo motor xml from vendor site
+
+# pdo mapping (get offset)
+
+# sdo send (set parameters)
+
+# logic...
+
+```
+
+
+# SERIAL SPI I2C UART
+
+
+```shell
+
+# on rpi4
+
+sudo vim /boot/config.txt
+
+
+# add or uncomment for i2c
+dtparam=i2c_arm=on
+
+
+# add or uncomment for spi
+dtparam=spi=on
+dtoverlay=spi1-1cs
+
+# add or uncomment for uart
+enable_uart=1
+
+...
+
+arm_boost=1
+
+[all]
+
+# add or uncomment for freq stabilization
+force_turbo=1
+
+
+
+
+sudo reboot
+
+
+```
+
+# BUILDROOT
+
+```shell
+
+sudo apt-get update
+
+sudo apt-get -y install make binutils build-essential diffutils patch gzip bzip2 perl tar cpio unzip rsync file bc findutils wget libelf-dev libncurses5-dev python-is-python3
+
+git clone git://git.busybox.net/buildroot
+
+cd buildroot
+
+git switch -c lts origin/2019.08.x
+
+find ./configs -name '*_defconfig'
+
+# make the defconfig
+
+# ex)
+
+make qemu_x86_64_defconfig
+
+make menuconfig
+
+# target options
+
+# build options
+
+# toolchain options
+
+# system configuration
+
+# kernel
+
+# targat packages
+
+# filesystem images
+
+make -j$(nproc)
+
+# output
+
+./output/images
+
+# vm
+
+# hypervisor
+
+i440fx
+
+bios
+
+# os
+
+generic
+
+# boot options
+
+
+# at start-qemu.sh
+
+direct kernel boot
+
+kernel path: bzimage
+kernel args: rootwait root=/dev/vda console=tty1 console=ttyS0 ip=dhcp
+
+# storage
+
+change ide to virtio disk
+
+# network interface
+
+model virtio
+
+# serial 1
+
+# and delete all other hardwares
+
+```
+
+
+# YOCTO 
+
+
+```shell
+
+# https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html
+
+
+sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev python3-subunit mesa-common-dev zstd liblz4-tool file locales libacl1
+
+sudo locale-gen en_US.UTF-8
+
+
+git clone git://git.yoctoproject.org/poky
+
+
+
+# check lts
+
+# https://wiki.yoctoproject.org/wiki/Releases
+
+git switch -c scarthgap origin/scarthgap
+
+source oe-init-build-env
+
+# tweak conf?
+
+bitbake core-image-sato
+
+
+# create vm
+
+# disk, bzimage at
+
+# tmp/deploy/images
+
+# direct kernel boot
+
+# kernel args 
+
+root=/dev/sda ip=dhcp
+
+# nic
+
+e1000
+
+```
+
+
+# VPN IPSEC LIBRESWAN XL2TPD
+
+
+```shell
+# script ubuntu/debian
+
+# server
+
+vpn-socks5/server-install/swan.sh
+
+```
+
+```shell
+
+# server
+
+# open udp port 500, 4500
+
+# add
+
+# /etc/ipsec.d/ikev2.conf
+
+authby=rsa-sha1
+
+sudo service ipsec restart
+```
+
+```shell
+
+# client
+
+sudo apt-get update
+sudo apt-get install strongswan libcharon-extra-plugins
+
+# get p12
+
+openssl pkcs12 -in vpnclient.p12 -cacerts -nokeys -out ca.cer
+openssl pkcs12 -in vpnclient.p12 -clcerts -nokeys -out client.cer
+openssl pkcs12 -in vpnclient.p12 -nocerts -nodes  -out client.key
+
+
+sudo cp ca.cer /etc/ipsec.d/cacerts
+
+sudo cp client.cer /etc/ipsec.d/certs
+
+sudo cp client.key /etc/ipsec.d/private
+
+sudo vim /etc/ipsec.conf
+
+# ipsec.conf - strongSwan IPsec configuration file
+
+# basic configuration
+
+config setup
+        # strictcrlpolicy=yes
+        # uniqueids = no
+
+# Add connections here.
+
+conn ikev2-rw
+    right=34.83.103.130
+    rightid=%34.83.103.130
+    rightsubnet=0.0.0.0/0
+    rightauth=pubkey
+    leftsourceip=%config
+    leftauth=pubkey
+    leftcert=client.cer
+    #eap_identity=username, only if leftauth=eap (e.g. peer)
+    auto=add
+
+
+sudo vim /etc/ipsec.secrets
+
+# This file holds shared secrets or RSA private keys for authentication.
+
+# RSA private key for this host, authenticating it to any other host
+# which knows the public part.
+#
+
+: RSA client.key
+
+
+sudo ipsec restart
+
+sudo ipsec status
+
+sudo ipsec up ikev2-rw
+
+sudo ipsec down ikev2-rw
+
+
+
+# do manual resolvectl if not set 
+
+sudo resolvectl dns enp1s0 8.8.8.8 8.8.4.4
+
+
+```
+
+
+
+```shell
+
+# client nmcli
+
+sudo apt-get update
+sudo apt-get install network-manager-strongswan
+
+# get p12
+
+openssl pkcs12 -in vpnclient.p12 -cacerts -nokeys -out ca.cer
+openssl pkcs12 -in vpnclient.p12 -clcerts -nokeys -out client.cer
+openssl pkcs12 -in vpnclient.p12 -nocerts -nodes  -out client.key
+
+
+nano /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf 
+
+
+[keyfile]
+unmanaged-devices=none
+
+sudo systemctl restart NetworkManager
+
+sudo nmcli d
+
+# if not managed
+
+sudo nmcli dev set enp1s0 managed yes
+
+sudo nmcli c add type vpn ifname -- vpn-type strongswan connection.id VPN connection.autoconnect no vpn.data 'address = 34.27.245.236, certificate = /home/seantywork/ca.cer, encap = no, esp = aes128gcm16, ipcomp = no, method = key, proposal = yes, usercert = /home/seantywork/client.cer, userkey = /home/seantywork/client.key, virtual = yes'
+
+
+sudo nmcli c up 'Wired connection 1'
+
+sudo nmcli c up VPN
+
+sudo nmcli c down VPN
+
+```
+
+# VPN STRONGSWAN 
+
+
+```shell
+# server
+
+
+apt install strongswan libcharon-extra-plugins strongswan-pki -y
+
+ipsec pki --gen --size 4096 --type rsa --outform pem > ca.key.pem
+ipsec pki --self --in ca.key.pem --type rsa --dn "CN=VPN Server CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
+ipsec pki --gen --size 4096 --type rsa --outform pem > server.key.pem
+ipsec pki --pub --in server.key.pem --type rsa | ipsec pki --issue --lifetime 2750 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpn.example.com" --san "vpn.example.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
+
+cp -f ca.cert.pem /etc/ipsec.d/cacerts/
+cp -f server.cert.pem /etc/ipsec.d/certs/
+cp -f ca.key.pem /etc/ipsec.d/private/
+cp -f server.key.pem /etc/ipsec.d/private/
+
+# for client
+ipsec pki --gen --type rsa --size 4096 --outform pem > client.key.pem
+ipsec pki --pub --in client.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpnclient" --san vpnclient --outform pem > client.cert.pem
+openssl pkcs12 -export -inkey client.key.pem -in client.cert.pem -name "vpnclient" -certfile ca.cert.pem -caname "VPN Server CA" -out client.p12
+sudo /bin/cp -Rf client.p12 /tmp/client.p12
+sudo chmod 777 /tmp/client.p12
+
+vim  /etc/ipsec.conf
+
+config setup
+        charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2, mgr 2"
+        strictcrlpolicy=no
+        uniqueids=never
+        cachecrls=no
+        
+conn ipsec-ikev2-vpn
+      auto=add
+      compress=no
+      type=tunnel  # defines the type of connection, tunnel.
+      keyexchange=ikev2
+      fragmentation=yes
+      forceencaps=yes
+      dpdaction=clear
+      dpddelay=300s
+      rekey=no
+      left=%any
+      leftid=@vpn.example.com    # if using IP, define it without the @ sign
+      leftcert=server.cert.pem  # reads the VPN server cert in /etc/ipsec.d/certs
+      leftsendcert=always
+      leftsubnet=0.0.0.0/0
+      right=%any
+      rightid=%any
+      rightauth=pubkey
+      rightsourceip=192.168.43.0/24
+      rightdns=8.8.8.8 #DNS to be assigned to clients
+      rightsendcert=always
+      esp=aes256-sha256-modp2048
+
+vi /etc/ipsec.secret
+
+: RSA "server.key.pem"
+
+
+
+```
+
+```shell
+
+# client 
+
+# get p12
+
+scp server@server.com:/tmp/client.p12 .
+
+# from client
+sudo apt update
+sudo apt install strongswan libcharon-extra-plugins libssl-dev -y
+suod cp -f client.p12 /etc/ipsec.d/private
+
+# /etc/ipsec.conf 
+conn ipsec-ikev2-vpn-client
+    auto=start
+    right=192.168.10.25
+    rightid=vpn.example.com
+    rightsubnet=0.0.0.0/0
+    rightauth=pubkey
+    leftsourceip=%config
+    leftid=vpnclient
+    leftauth=pubkey
+    mediation=no
+
+# /etc/ipsec.secret 
+: P12 client.p12 ""
+
+```
+
+
+```shell
+
+# swanctl
+
+
+sudo apt-get update
+
+sudo apt-get -y install strongswan-swanctl charon-systemd strongswan-pki libcharon-extra-plugins libstrongswan-standard-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd-dev
+
+
+sudo pki --gen --size 4096 --type rsa --outform pem > ca.key.pem
+sudo pki --self --in ca.key.pem --type rsa --dn "CN=VPN Server CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
+sudo pki --gen --size 4096 --type rsa --outform pem > server.key.pem
+sudo pki --pub --in server.key.pem --type rsa | pki --issue --lifetime 2750 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpn.example.com" --san "vpn.example.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
+
+sudo /bin/cp -Rf ca.cert.pem /etc/swanctl/x509ca/
+sudo /bin/cp -Rf server.cert.pem /etc/swanctl/x509/
+sudo /bin/cp -Rf server.key.pem /etc/swanctl/private/
+
+# for client
+
+sudo pki --gen --type rsa --size 4096 --outform pem > client.key.pem
+sudo pki --pub --in client.key.pem --type rsa | pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=test.client" --san test.client --outform pem > client.cert.pem
+
+
+sudo /bin/cp -Rf ca.cert.pem /tmp/ca.cert.pem
+sudo /bin/cp -Rf client.cert.pem /tmp/client.cert.pem
+sudo /bin/cp -Rf client.key.pem /tmp/client.key.pem
+
+sudo chmod 777 /tmp/ca.cert.pem
+sudo chmod 777 /tmp/client.cert.pem
+sudo chmod 777 /tmp/client.key.pem
+
+# for client done
+
+
+# /etc/swanctl/swanctl.conf
+
+connections {
+
+   rw {
+      local_addrs  = %any
+      pools = rw_pool
+      version = 2
+      proposals = aes256-sha256-modp2048
+      unique = never
+      encap = yes
+
+      local {
+         auth = pubkey
+         certs = server.cert.pem
+         id = vpn.example.com
+      }
+      remote {
+         auth = pubkey
+      }
+      children {
+         net {
+            local_ts  = 10.168.0.0/24
+            mode = tunnel
+            esp_proposals = aes256-sha256
+            dpd_action = restart
+            rekey_time = 0
+         }
+      }
+   }
+}
+
+pools{
+       rw_pool {
+               addrs = 10.168.0.0/24
+       }
+}
+
+
+sudo systemctl restart strongswan
+
+
+
+```
+
+
+
+
+```shell
+
+# swanctl whitelist, attr-sql
+
+
+sudo apt-get update
+
+sudo apt-get -y install build-essential make libgmp-dev libsystemd-dev libcurl4-openssl-dev libldap-dev libtss2-dev libgcrypt20-dev libpam0g-dev libip4tc-dev pkg-config init sqlite3 libsqlite3-dev
+
+
+curl -L https://github.com/strongswan/strongswan/releases/download/6.0.0/strongswan-6.0.0.tar.gz -o strongswan-6.0.0.tar.gz
+
+tar -xzf strongswan-6.0.0.tar.gz
+
+pushd strongswan-6.0.0
+
+
+./configure --prefix=/usr --sysconfdir=/etc --enable-charon --enable-systemd \
+--disable-defaults \
+--enable-static \
+--enable-test-vectors \
+--enable-pki --enable-ikev2 --enable-vici --enable-swanctl \
+--enable-ldap \
+--enable-pkcs11 \
+--enable-tpm \
+--enable-aesni \
+--enable-aes \
+--enable-rc2 \
+--enable-sha2 \
+--enable-sha1 \
+--enable-md5 \
+--enable-mgf1 \
+--enable-rdrand \
+--enable-random \
+--enable-nonce \
+--enable-x509 \
+--enable-revocation \
+--enable-constraints \
+--enable-pubkey \
+--enable-pkcs1 \
+--enable-pkcs7 \
+--enable-pkcs8 \
+--enable-pkcs12 \
+--enable-pgp \
+--enable-dnskey \
+--enable-sshkey \
+--enable-pem \
+--enable-openssl \
+--enable-gcrypt \
+--enable-af-alg \
+--enable-fips-prf  \
+--enable-gmp  \
+--enable-curve25519 \
+--enable-agent \
+--enable-chapoly \
+--enable-xcbc \
+--enable-cmac \
+--enable-hmac \
+--enable-ctr \
+--enable-ccm \
+--enable-gcm \
+--enable-ntru \
+--enable-drbg \
+--enable-curl \
+--enable-attr \
+--enable-kernel-netlink \
+--enable-resolve \
+--enable-socket-default \
+--enable-connmark \
+--enable-forecast \
+--enable-farp \
+--enable-stroke \
+--enable-vici \
+--enable-updown \
+--enable-eap-identity \
+--enable-eap-aka \
+--enable-eap-md5 \
+--enable-eap-gtc \
+--enable-eap-mschapv2 \
+--enable-eap-dynamic \
+--enable-eap-radius \
+--enable-eap-tls \
+--enable-eap-ttls \
+--enable-eap-peap \
+--enable-eap-tnc \
+--enable-xauth-generic \
+--enable-xauth-eap \
+--enable-xauth-pam \
+--enable-tnc-tnccs \
+--enable-dhcp \
+--enable-lookip \
+--enable-error-notify \
+--enable-certexpire \
+--enable-led \
+--enable-addrblock \
+--enable-unity \
+--enable-counters \
+--enable-whitelist \ 
+--enable-sqlite \
+--enable-attr-sql 
+
+make 
+
+make install
+
+popd
+
+sudo pki --gen --size 4096 --type rsa --outform pem > ca.key.pem
+sudo pki --self --in ca.key.pem --type rsa --dn "CN=VPN Server CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
+sudo pki --gen --size 4096 --type rsa --outform pem > server.key.pem
+sudo pki --pub --in server.key.pem --type rsa | pki --issue --lifetime 2750 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpn.example.com" --san "vpn.example.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
+
+sudo /bin/cp -Rf ca.cert.pem /etc/swanctl/x509ca/
+sudo /bin/cp -Rf server.cert.pem /etc/swanctl/x509/
+sudo /bin/cp -Rf server.key.pem /etc/swanctl/private/
+
+# for client
+
+sudo pki --gen --type rsa --size 4096 --outform pem > client.key.pem
+sudo pki --pub --in client.key.pem --type rsa | pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=test.client@test.org" --san "test.client@test.org" --outform pem > client.cert.pem
+
+
+sudo /bin/cp -Rf ca.cert.pem /tmp/ca.cert.pem
+sudo /bin/cp -Rf client.cert.pem /tmp/client.cert.pem
+sudo /bin/cp -Rf client.key.pem /tmp/client.key.pem
+
+sudo chmod 777 /tmp/ca.cert.pem
+sudo chmod 777 /tmp/client.cert.pem
+sudo chmod 777 /tmp/client.key.pem
+
+# for client done
+
+
+# /etc/swanctl/swanctl.conf
+
+connections {
+
+   rw {
+      local_addrs  = %any
+      pools = rw_pool
+      version = 2
+      proposals = aes256-sha256-modp2048
+      unique = never
+      encap = yes
+
+      local {
+         auth = pubkey
+         certs = server.cert.pem
+         id = vpn.example.com
+      }
+      remote {
+         auth = pubkey
+      }
+      children {
+         net {
+            local_ts  = 10.168.0.0/24
+            mode = tunnel
+            esp_proposals = aes256-sha256
+            dpd_action = restart
+            rekey_time = 0
+         }
+      }
+   }
+}
+
+pools{
+       rw_pool {
+               addrs = 10.168.0.0/24
+       }
+}
+
+
+sudo systemctl restart strongswan
+
+
+
+# whitelist 
+
+sudo /usr/libexec/ipsec/whitelist enable
+
+sudo /usr/libexec/ipsec/whitelist add test.client@test.org 
+
+sudo /usr/libexec/ipsec/whitelist list
+
+sudo /usr/libexec/ipsec/whitelist disable
+
+
+# attr-sql 
+
+# setup 
+
+pushd strongswan-6.0.0
+
+sqlite3 ${DB_PATH} < scr/pool/sqlite.sql 
+
+sudo vim /etc/strongswan.d/charon/attr-sql.conf
+
+database = sqlite://${DB_PATH}
+
+load = yes 
+
+sudo systemctl restart strongswan 
+
+# cmd
+
+sudo ipsec pool --status 
+
+udo ipsec pool --add rw_pool --addresses ./address.txt
+
+# address.txt example
+
+10.168.100.12=test.client@test.org
+
+udo ipsec pool --del rw_pool
+
+
+
+```
+
+
+```shell
+
+# swanctl client
+
+sudo apt-get update
+
+
+sudo apt-get -y install strongswan-swanctl charon-systemd strongswan-pki libcharon-extra-plugins libstrongswan-standard-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd-dev 
+
+
+
+sudo /bin/cp -Rf ca.cert.pem /etc/swanctl/x509ca
+sudo /bin/cp -Rf client.cert.pem /etc/swanctl/x509
+sudo /bin/cp -Rf client.key.pem /etc/swanctl/private
+
+
+connections {
+    home {
+      remote_addrs = 192.168.101.25
+      vips = 0.0.0.0
+      version = 2
+      proposals = aes256-sha256-modp2048
+
+      local {
+        auth = pubkey
+        certs = client.cert.pem
+        id = test.client
+      }
+      remote {
+        auth = pubkey
+        id = vpn.example.com
+      }
+      children {
+        home {
+          remote_ts  = 10.168.0.0/24
+          start_action = start
+          esp_proposals = aes256-sha256
+        }
+      }
+    }
+}
+
+sudo systemctl restart strongswan
+
+
+sudo swanctl --initiate --child $NAME
+
+sudo swanctl --list-sas
+
+sudo swanctl --terminate --ike-id $ID
+
+```
+
+# VPN OPENVPN
+
+```shell
+
+# ubuntu 
+
+vpn-socks5/server-install/openvpn.sh
+
+
+```
+
+
+```shell
+
+# client 
+
+sudo apt update
+# sudo apt install openvpn
+
+sudo apt-get install openvpn
+
+
+sudo openvpn --config ovclient.ovpn 
+```
+
+
+
+
+# VPN WIREGURAD
+
+```shell
+# ubuntu
+
+vpn-socks5/server-install/wireguard.sh
+
+```
+
+```shell
+
+# client
+
+sudo apt update
+sudo apt install wireguard
+
+# paste generated client conf
+sudo vim /etc/wireguard/wgclient.conf
+
+
+
+# tunnel
+
+sudo vim /etc/wireguard/wgclient.conf
+
+PostUp = ip rule add table 200 from 192.168.0.13
+PostUp = ip route add table 200 default via 192.168.0.1
+PreDown = ip rule delete table 200 from 192.168.0.13
+PreDown = ip route delete table 200 default via 192.168.0.1
+
+
+[Peer]
+
+
+# up
+
+sudo wg-quick up wgclient
+
+# down
+
+sudo wg-quick down wgclient
+
+
+```
+
+
+# UDP BUFFER SIZE
+
+```shell
+
+sudo sysctl -w net.core.rmem_max=7500000
+
+sudo sysctl -w net.core.wmem_max=7500000
+
+```
+
+
+# GUI FYNE
+
+```shell
+
+# after installing go, gcc
+
+sudo apt-get update
+
+sudo apt-get install -y libgl1-mesa-dev xorg-dev
+
+
+
+```
+
+
+# GUI AUTOMATION ROBOT 
+
+```shell
+
+# after installing go, gcc
+
+# x11
+sudo apt install libx11-dev xorg-dev libxtst-dev
+
+# Clipboard
+sudo apt install xsel xclip
+
+# Bitmap
+sudo apt install libpng++-dev
+
+# GoHook
+sudo apt install xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxkbcommon-dev
+
+
+```
+
+# TURN SERVER COTURN WEBRTC
+
+
+```shell
+
+sudo apt-get update
+
+sudo apt-get install coturn
+
+
+sudo nano /etc/default/coturn
+
+TURNSERVER_ENABLED=1
+
+sudo systemctl start coturn
+
+
+nano /etc/turnserver.conf
+
+listening-ip=0.0.0.0
+
+listening-port=3478
+
+external-ip=feebdaed.xyz/192.168.0.1
+
+min-port=3479
+max-port=3579
+
+
+verbose
+
+
+fingerprint
+
+user=test:test123
+
+lt-cred-mech
+
+realm=feebdaed.xyz
+
+
+sudo systemctl restart coturn
+
+
+```
+
+```shell
+
+# webrtc ports
+
+
+# server udp mux: 8006 (custom)
+
+# turn udp : 3478
+
+# turn relay udp: 3479-3579
+
+# ephemeral udp range : 31000-31100 (custom)
+
+
+```
+
+
+
+# VIM NEOVIM NVIM
+
+```shell
+
+# copy
+# $LINENUMyy
+
+99yy
+
+# paste
+
+p
+
+# set number
+
+:set nu
+
+# unset number
+
+:set nonu
+
+# set paste
+
+:set paste
+
+# goto
+# :$LINENUM
+
+:33
+
+# search
+
+/$BLAH
+
+# set tab spaces
+set expandtab ts=4 sw=4 ai
+
+
+```
+
+
+# RAYLIB
+
+```shell
+
+sudo apt install libasound2-dev libx11-dev libxrandr-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libxcursor-dev libxinerama-dev libwayland-dev libxkbcommon-dev
+
+```
+
+# KANIKO
+
+```shell
+
+apiVersion: v1
+kind: Pod
+metadata:
+  name: kaniko
+spec:
+  containers:
+  - name: kaniko
+    image: gcr.io/kaniko-project/executor:latest
+    args: ["--dockerfile=Dockerfile",
+            "--context=git://github.com/seantywork/target.git",
+                 "--context-sub-path=subdir/",
+            "--destination=seantywork.com/library/test"] 
+    volumeMounts:
+      - name: kaniko-secret
+        mountPath: /kaniko/.docker
+    env:
+      - name: GIT_USERNAME
+        value: "$YOUR_ID"
+      - name: GIT_PASSWORD
+        value: "$YOUR_PASS"
+  restartPolicy: Never
+  volumes:
+    - name: kaniko-secret
+      secret:
+        secretName: regcred
+        items:
+          - key: .dockerconfigjson
+            path: config.json
+
+
+```
+
+
+# DPDK
+
+```shell
+
+# qemu kvm
+# fstack
+
+# Install dependencies for F-Stack
+sudo apt install build-essential make libssl-dev python3 python-is-python3 
+
+# get fstack release
+
+# Install libnuma-dev
+yum install numactl-devel          # on Centos
+#sudo apt-get install libnuma-dev  # on Ubuntu
+
+# Install dependencies (FreeBSD only)
+#pkg install meson pkgconf py38-pyelftools
+
+cd f-stack
+# Compile DPDK
+
+# fix for virtual machine
+
+$FSTACK_DIR/dpdk/kernel/linux/igb_uio/igb_uio.c
+
+-   if (pci_intx_mask_supported(udev->pdev)) {
++   if (true || pci_intx_mask_supported(udev->pdev)) {
+
+cd dpdk/usertools
+./dpdk-setup.sh # compile with x86_64-native-linuxapp-gcc
+
+# Set hugepage (Linux only)
+# single-node system
+echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
+
+# or NUMA (Linux only)
+echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
+echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
+
+# Using Hugepage with the DPDK (Linux only)
+mkdir /mnt/huge
+mount -t hugetlbfs nodev /mnt/huge
+
+# Close ASLR; it is necessary in multiple process (Linux only)
+echo 0 > /proc/sys/kernel/randomize_va_space
+
+# Install python for running DPDK python scripts
+sudo apt install python # On ubuntu
+#sudo pkg install python # On FreeBSD
+
+# Offload NIC
+# For Linux:
+modprobe uio
+insmod /data/f-stack/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
+insmod /data/f-stack/dpdk/x86_64-native-linuxapp-gcc/kmod/rte_kni.ko carrier=on # carrier=on is necessary, otherwise need to be up `veth0` via `echo 1 > /sys/class/net/veth0/carrier`
+python dpdk-devbind.py --status
+ip link set dev eth0 down
+python dpdk-devbind.py --bind=igb_uio eth0 # assuming that use 10GE NIC and eth0
+
+# Install DPDK
+cd ../x86_64-native-linuxapp-gcc
+make install
+
+# On Ubuntu, use gawk instead of the default mawk.
+#sudo apt-get install gawk  # or execute `sudo update-alternatives --config awk` to choose gawk.
+
+# Install dependencies for F-Stack
+sudo apt install gcc make libssl-dev                            # On ubuntu
+#sudo pkg install gcc gmake openssl pkgconf libepoll-shim       # On FreeBSD
+
+
+
+# Compile F-Stack
+export FF_PATH=/$FSTACK_DIR
+export FF_DPDK=/$FSRACK_DIR/dpdk/x86_64-native-linuxapp-gcc
+cd ../../lib/
+
+# disable RSS in source code
+
+#lib/ff_dpdk_if.c 
+#edit
+
+port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
+
+make    # On Linux
+#gmake   # On FreeBSD
+
+# Install F-STACK
+# libfstack.a will be installed to /usr/local/lib
+# ff_*.h will be installed to /usr/local/include
+# start.sh will be installed to /usr/local/bin/ff_start
+# config.ini will be installed to /etc/f-stack.conf
+make install    # On Linux
+#gmake install   # On FreeBSD
+
+
+# kni
+ip link set dev veth0 up
+
+ip addr add 192.168.1.2/24 dev veth0
+
+ip route add 0.0.0.0 via 192.168.1.1 dev veth0
+
+```
+
+
+```shell
+
+# gcloud tutorial
+
+# https://cloud.google.com/compute/docs/networking/use-dpdk
+
+
+# create vpc for data plane
+
+## new subnet > region name (ex us-west1) , ipv4 range (ex 10.0.0.0/24)
+
+# create vpc for control plane
+
+## new subnet > region name (must be same as dp, ex us-west1), ipv4 range (must be different from dp, ex 10.0.1.0/24), enable ssh firewall rule
+
+
+# create vm
+
+## region must be same as dp
+
+## going with e2-medium
+
+## ubuntu 22 x64
+
+## network card: virtio
+
+## add two interfaces, control plane, data plane
+
+
+# connect to vm
+
+# get env
+
+sudo apt-get update && sudo apt-get upgrade -yq
+sudo apt-get install -yq build-essential ninja-build python3-pip linux-headers-$(uname -r) pkg-config libnuma-dev
+sudo pip install pyelftools meson
+
+# get dpdk
+
+wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
+tar xvf dpdk-23.07.tar.xz
+cd dpdk-23.07
+
+# build dpdk
+
+meson setup -Dexamples=all build
+
+sudo ninja -C build install; sudo ldconfig
+
+
+# check iommu-less vfio
+
+cat /boot/config-$(uname -r) | grep NOIOMMU
+
+CONFIG_VFIO_NOIOMMU=y
+
+## load noiommu, vfio
+
+sudo modprobe vfio enable_unsafe_noiommu_mode=1
+
+sudo modprobe vfio-pci
+
+## enable noiommu
+
+sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
+
+# alternative, uio
+
+## install uio
+
+git clone https://dpdk.org/git/dpdk-kmods
+
+pushd dpdk-kmods/linux/igb_uio
+sudo make
+sudo depmod && sudo insmod igb_uio.ko
+popd
+
+## or 
+
+sudo apt-get install -y dpdk-igb-uio-dkms
+
+sudo modprobe igb_uio
+
+
+# bind dpdk
+
+## check pci, get data plane slot
+
+sudo lspci | grep -e "gVNIC" -e "Virtio network device"
+
+## down
+
+sudo ip link set ens5 down
+
+## bind
+
+sudo dpdk-devbind.py --bind=vfio-pci 00:05.0
+
+## or, if uio
+
+sudo dpdk-devbind.py --bind=igb_uio 00:05.0
+
+## create huge page
+
+sudo mkdir /mnt/huge
+
+sudo mount -t hugetlbfs -o pagesize=1G none /mnt/huge
+
+sudo bash -c 'echo 4 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages'
+sudo bash -c 'echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages'
+
+## test
+
+sudo ./build/app/dpdk-testpmd
+
+# unbind dpdk
+
+sudo dpdk-devbind.py -u 00:05.0
+
+## if virtio-pci
+
+sudo bash -c 'echo 00:05.0 > /sys/bus/pci/drivers/virtio-pci/bind'
+
+## if gvnic
+
+sudo bash -c 'echo 00:05.0 > /sys/bus/pci/drivers/gvnic/bind'
+
+sudo ip link set ens5 up
+
+```
+
+
+# RUST
+
+```shell
+
+# install
+
+curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+
+# .profile
+
+export PATH="$PATH:$HOME/.cargo/env"
+export PATH="$PATH:$HOME/.cargo/bin"
+
+source .profile
+
+```
+
+# SCRCPY ANDROID SCREEN MIRRORING
+
+```shell
+
+# enable usb debugging
+
+snap install scrcpy
+
+scrcpy
+
+```
+
+# DBEAVER 
+
+
+```shell
+
+
+
+# download ce
+
+sudo apt install ./dbeaver
+
+# public key retrieval by url
+
+jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true
+
+```
+
+# IFTOP
+```shell
+
+iftop
+
+```
+# PERF
+
+```shell
+
+perf stat -d command
+```
+
+# IPERF
+
+```shell
+
+# tcp client
+
+iperf -c $ADDR -t 60 -i 1
+
+# tcp server
+
+iperf -s
+
+# udp client
+
+iperf -c $ADDR -u -b 10G -t 60 -i 1
+
+```
+
+# KOREAN ON LINUX
+
+```shell
+
+sudo apt install fcitx5 fcitx5-hangul
+
+# go to settings > region & language 
+
+# change keyboard input to fctix5
+
+# go to settings > keyboard
+
+# add input source as hangul
+
+sudo reboot
+
+```
+
+```shell 
+
+apt-get install locales-all fonts-nanum 
+
+```
+
+```shell
+
+# debian
+
+sudo apt install fcitx5 fcitx5-hangul
+
+# enter fcitx5 configuration in menu
+
+# set as you knoe
+
+sudo reboot
+
+```
+
+# LAPTOP LID CLOSE DO NOTHNG 
+
+
+```shell
+
+sudo vim /etc/systemd/logind.conf
+
+# uncomment
+# HandleLidSwitch=ignore
+
+sudo systemctl restart systemd-logind
+
+```
+
+# IO URING IOURING
+
+```shell
+
+sudo apt install liburing
+
+```
+
+
+# AVALANCHE DUT SETUP
+
+```shell
+
+sysctl -w net.ipv4.ip_forward=1
+sysctl -w net.ipv4.conf.enp134s0f2.accept_redirects=0
+sysctl -w net.ipv4.conf.enp134s0f2.send_redirects=0
+sysctl -w net.ipv4.conf.enp134s0f0.accept_redirects=0
+sysctl -w net.ipv4.conf.enp134s0f0.send_redirects=0
+
+ethtool -G enp134s0f0 rx 4096
+ethtool -G enp134s0f0 tx 4096
+ethtool -G enp134s0f2 rx 4096
+ethtool -G enp134s0f2 tx 4096
+
+net.ipv4.neigh.default.gc_stale_time=57600
+net.ipv4.neigh.default.gc_thresh1 = 32768
+net.ipv4.neigh.default.gc_thresh2 = 32768
+net.ipv4.neigh.default.gc_thresh3 = 32768
+
+
+##########################################
+#                                        #
+#                  DUT                   #
+#  10.4.11.237/16     192.168.200.237/16 #
+## if0 ############## if1 ################
+   #                  #
+   #                  #
+   #                  #
+   #                  #
+   #                  #
+10.1.5.0/16 + 20000   192.168.200.0 + ? (8, 16...) 
+   #
+tun(192.168.0.0/16 + 20000)  
+
+# height means tunnel per sec
+# if 8 cores, set it to the multiples of 8
+# 8, 16, 24, 32, 64...
+# and client action and server count shoud match, 8
+# if server count and client action doubled, tunnel per sec doubles also
+# responder ips should be server ips
+
+
+```
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644 (file)
index c144659..0000000
+++ /dev/null
@@ -1,13603 +0,0 @@
-# linuxyz
-
-***crap compilation of mostly Linux stuff***
-
-
-**Disclaimer : I am not liable for any misuse of this code Only use it on machines and in environments that you have explicit permissions and authrizations to do so**
-
-
-# LINUX
-
-```shell
-
-
-# process & memory (arch_mem)
-   process, hardware interrupt (timer) -> kernel -> process -> hardware interrupt(timer)..., threads, scheduling, pcb
-   memory, kernel space, user space, virtual address (page num + distance), physical address, page table, page, frame, mmu, tlb, major fault, minor fault
-   ps, top, lsof, strace, ltrace, renice, uptime, trace-cmd, kernelshark
-   vmstat, iostat, iotop, pidstat
-   cgroup, /proc/self/cgroup, /sys/fs/cgroup
-
-# device (driver)
-   rootfs, /bin, /dev, /etc, /home, /lib, /proc, /run, /sys, /sbin, /tmp, /usr, /var, /boot, /media, /opt
-   /dev, block, character, pipe, socket, user i/o oriented, /sys/devices, actual device info
-     udev, devtmpfs, kernel sends uevent to udev, udev initializes and registers devices, in devtmpfs when booting
-     udevadm info --query=all --name=/dev/sda, udevadm monitor
-     kernel block device interface < - > scsi device driver < - > bus < - > (ATA, USB...) bridge driver < - > device
-   disk, partition table -> partition -> fs data structure -> fs (maybe rootfs) data
-     parted -l, fdisk /dev/sdd, mkfs -t ext4 /dev/sdf2, mount -t ext4 /dev/sdf2 /home/some, umount /home/some, blkid, /etc/fstab
-     lvm, pvs, pvdisaply, vgs, vgdisplay, lvs, lvdisplay, pvcreate,vgcreate, vgextend, lvcreate, lvextend
-     block device (kernel) > devmapper (kernel) > lvm (user)
-     inode (data pointer), block bitmap (allocation pointer), fsck > inode != block bitmap > lost + found
-   network, physical, internet, transport, application, ipv4, ipv6
-     ping, host, ip, iw, linux network interface
-     netplan, /etc/netplan, networkmanager, /etc/NetworkManager
-     /etc/hosts, /etc/resolv.conf, /etc/nsswitch.conf
-     netstat, tcp, udp
-     iptables
-     user process < - > kernel socket (system call) < - > network
-     ipc (inter process communication) > unix domain socket > eg) mysql.sock
-     rsync
-# syscall & user mode (os)
-  shell
-  build-essential
-  go
-  make
-  git
-  curl
-  podman
-  chrome
-  libreoffice
-  vscode
-  virsh
-  wireshark
-  gh
-
-
-harware (interrupt)
-
-kernel vas
-
-  interrupt (hard, soft irq)
-
-  process 
-
-process vas
-
-  user (syscall)
-
-
-```
-
-
-```shell
-
-# process & memory
-
-# procfs : /proc/*
-
-# kernel stacks
-
-cat /proc/$PID/stack
-
-# user stacks
-
-gdb
-
-# both
-
-# use eBPF
-
-sudo stackcount-bpfcc -p $PID -v -d
-
-# device
-
-# sysfs: /sys/*
-
-```
-
-```shell
-
-# network protocol
-
-# l2 link
-
-(ethernet)
-preamble
-src
-dst
-type/len
-data (payload)
-
-switch > mac address table > flooding, filtering and forwarding, ageing
-
-# l3 network
-
-(ipv4)
-version
-headlen
-servicetype
-packetlen
-identifier
-flagmentation offset
-ttl
-proto
-header csum
-src 
-dst
-option
-padding
-data(payload)
--
-(ipv6)
-version
-traffic class
-flow label
-payload len
-next header
-hop limitation
-src
-dst
-data(payload)
--
-(arp)
-hardware type
-proto type
-hardware addrlen
-proto addr len
-op code
-src hardware addr
-src proto addr
-dst hardware addr
-dst proto addr
-
--
-router > routing table > NAT, NAPT
-
-
-# l4 transport
-
-(icmp)
--
-(tcp)
-src port
-dst port
-sequence
-confirmation reply number
-data offset
-reserved
-control bit (syn, ack, fin…)
-window
-checksum
-emergency ptr
-option
-data (payload)
--
-(udp)
-src port
-dst port
-len
-checksum
-data(payload)
-
-```
-
-
-# LINUX KERNEL MODULE
-
-```shell
-
-lsmod
-
-insmod
-rmmod
-
-depmod
-
-modprobe
-
-modprobe -r
-
-
-
-```
-```shell
-# auto load:  insert module load command to
-
-# /etc/modules-load.d/foo.conf
-# or
-# /etc/modprobe.d/foo.conf
-foo
-
-```
-
-```shell
-
-# blacklist: insert line to
-
-# /etc/modules-load.d/foo.conf
-# or
-# /etc/modprobe.d/foo.conf
-blacklist foo
-
-```
-
-```shell
-
-# dkms
-# autobuild when kernel update
-
-# add dkms.conf
-dkms add . -m $MODULE_NAME -v $VERSION
-
-dkms autoinstall
-
-# or
-
-dkms build $MODULE -v $VERSION
-
-dkms install $MODULE -v $VERSION
-
-
-```
-
-```shell
-# manually create dev without using udev
-
-sudo mknod "${DEVNM}" c ${MAJOR} ${MINOR}
-
-```
-
-# LINUX BOOT
-
-```shell
-boot (firm)
-
-bios | uefi -> grub -> vmlinuz, initramfs -> device and drivers -> rootfs mount -> init (pid 1, systemd, user space) -> log in
-
-kernel inspection, cpu, memory, device bus, device, aux kernel subsys(networking...), rootfs, user space
-
-init(systemd)
-  systemctl, unit, /etc/systemd, /lib/systemd, /usr/systemd...
-    target, service, socket, mount...
-```
-
-# GRUB
-
-```shell
-# check partition and images
-
-ls
-
-linux (hd0,1)/vmlinuz root=/dev/sda1
-
-initrd (hd0,1)/initrd.img
-
-boot
-
-```
-
-# LINUX KERNEL BUILD
-
-```shell
-
-# packages
-
-sudo apt update
-
-
-sudo apt install -y git fakeroot build-essential tar ncurses-dev \
-    tar xz-utils libssl-dev bc stress python3-distutils libelf-dev \
-    linux-headers-$(uname -r) bison flex libncurses5-dev util-linux net-tools "linux-tools-$(uname -r)" exuberant-ctags cscope \
-    sysfsutils gnome-system-monitor curl perf-tools-unstable \
-    gnuplot rt-tests indent tree psmisc smem libnuma-dev numactl \
-    hwloc bpfcc-tools sparse flawfinder cppcheck bsdmainutils \
-    trace-cmd virt-what dwarves 
-
-
-# get source
-
-curl -o /tmp/linux-5.5.1.tar.xz https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.5.1.tar.xz
-
-# or clone
-
-git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
-
-mv /tmp/linux-5.5.1.tar.xz ~
-
-cd ~
-
-tar -xf linux-5.5.1.tar.xz
-
-# default
-    LLKD_KSRC="$HOME/linux-5.5.1"
-    cp /boot/config-5.4.0-148-generic "$LLKD_KSRC/.config"
-    cd "$LLKD_KSRC"
-    make menuconfig
-
-# localmod
-    LLKD_KSRC="$HOME/linux-5.5.1"
-    lsmod > /tmp/lsmod.now
-    cd "$LLKD_KSRC"
-    make LSMOD=/tmp/lsmod.now localmodconfig
-    make menuconfig
-
-# ubuntu specific
-
-scripts/config --disable SYSTEM_TRUSTED_KEYS
-scripts/config --disable SYSTEM_REVOCATION_KEYS
-
-# change config
-
-LLKD_KSRC="$HOME/linux-5.5.1"
-
-cp "$LLKD_KSRC/init/Kconfig" "$LLKD_KSRC/init/Kconfig.orig"
-
-vim "$LLKD_KSRC/init/Kconfig"
-
-# build
-
-cd "$LLKD_KSRC"
-
-time make -j4
-
-
-# module install
-
-cd "$LLKD_KSRC"
-
-sudo make modules_install
-
-ls /lib/modules
-
-
-# boot image and initramfs
-
-LLKD_KSRC="$HOME/linux-5.5.1"
-
-
-cd "$LLKD_KSRC"
-
-sudo make install
-
-
-# boot update 
-
-sudo cp /etc/default/grub /etc/default/grub.orig
-
-sudo vim /etc/default/grub
-
-sudo update-grub
-
-
-# ui mode switch
-
-Ctrl + Alt + F2
-
-
-# make iso
-
-sudo apt install genisofs
-
-mkdir /bck
-
-# with isolinux at the top "/boot" directroy - relative to source path
-
-mkisofs -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -joliet-long -R -x /bck -x /proc -x /tmp -x /mnt -x /dev -x /sys -x /run -x /media -x /var/log -x /var/cache/apt/archives -o /bck/<name>.iso /
-
-# then extract iso using scp or whatever
-
-sudo isohybrid /bck/<output>.iso
-
-
-```
-
-# LINUX KERNEL BUILD DEB PKG PATCH REAL TIME
-
-```shell
-
-
-sudo apt install build-essential git libssl-dev libelf-dev flex bison
-
-# first find the closest available rt patch for current kernel(uname -a)
-# then get
-
-wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.143.tar.xz
-
-wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.143-rt64.patch.xz
-
-
-tar -xf linux-5.4.143.tar.xz
-cd linux-5.4.143
-xzcat ../patch-5.4.143-rt64-rc2.patch.xz | patch -p1
-
-cp /boot/config-5.4.0-81-generic .config
-make oldconfig
-
-# preempt_rt > Y
-
-vim .config
-
-# delete value as below
-
-CONFIG_SYSTEM_TRUSTED_KEYS=""
-CONFIG_MODULE_SIG_KEY=""
-CONFIG_SYSTEM_REVOCATION_KEYS=""
-
-# comment out
-
-CONFIG_MODULE_SIG_FORCE
-CONFIG_DEBUG_INFO_BTF
-CONFIG_MODULE_SIG_ALL
-
-# build kernel
-# with git repo
-make -j4 deb-pkg
-# not with git repo
-make -j4 bindeb-pkg
-
-# install
-
-sudo dpkg -i ../linux-headers-5.4.143-rt64-rc2_5.4.143-rt64-1_amd64.deb ../linux-image-5.4.143-rt64_5.4.143-rt64-1_amd64.deb ../linux-libc-dev_5.4.143-rt64-1_amd64.deb
-
-
-reboot
-
-```
-
-# LINUX KERNEL MODULE DRIVER CHANGE
-
-```shell
-
-# net example
-
-sudo mv /lib/modules/$(uname -r)/kernel/drivers/net/igb/igb.ko{,.bak}
-
-echo 'blacklist igb' > /etc/modprobe.d/blacklist.conf
-
-# build and install new driver module
-
-depmod
-
-sudo update-initramfs -c -k $(uname -r)
-
-```
-
-
-# LINUX DIAGNOSTIC
-
-```shell
-journalctl -f
-journalctl -xe
-journalctl -k
-journalctl -b
-dmesg
-dmest -wH
-efibootmgr
-```
-
-# LINUX KERNEL PANIC KDUMP
-
-```shell
-
-# should be enabled
-# /boot/config-$(uname -r)
-
-CONFIG_RELOCATABLE=y
-CONFIG_KEXEC=y
-CONFIG_CRASH_DUMP=y
-CONFIG_DEBUG_INFO=y
-
-
-sudo apt update
-
-sudo apt install kdump-tools crash kexec-tools makedumpfile
-
-# dbg symbol package
-
-sudo apt install ubuntu-dbgsym-keyring
-
-sudo echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
-deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
-deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
-sudo tee -a /etc/apt/sources.list.d/ddebs.list
-
-sudo apt update
-
-sudo apt install linux-image-$(uname -r)-dbgsym
-
-# yes
-
-# reboot
-
-sudo grep USE_KDUMP /etc/default/kdump-tools
-
-sudo grep LOAD_KEXEC /etc/default/kexec
-
-# check
-
-sudo kdump-config show
-
-# after panic and reboot
-
-sudo -i
-
-cd /var/crash/$CRASH_TIMESTAMP
-
-root@ubuntu24-8:/var/crash/xx# ls
-dmesg.xx  dump.xx
-
-# read dump
-
-crash /usr/lib/debug/boot/vmlinux-$(uname -r) dump.xx
-```
-
-# GCC G++ CLANG COMPILE
-
-```shell
-
-# install 
-
-sudo apt install build-essential clang llvm clang-tidy cppcheck
-
---std=c99 
-
---std=c++11
-
---std=c++14
-
--g  # for gdb
-
--Wall
-
--l # for linking
-
--c # for unlinked object file
-
--I # inlcude dir
-
--L # library directory
-
--Wl,-rpath=  # library directory (for dynamic loader)
-
--c -fPIC # for .so
-
--shared # for .so
-
-# ex) 
-# gcc -c -Wall -o solimod.o -fpic lib/sorrylinusmod/mod/solimod.c
-# gcc -shared -o libsolimod.so solimod.o
-
-ar rcs # for .a
-
-# ex)
-# gcc -c -o out.o out.c
-# ar rcs libout.a out.o
-
--D  # define variable
-
--fanalyzer # on static analysis
-
-clang-tidy # clang static analysis
-
-clang-tidy src/main.c -- -I.
-
-cppcheck # yet another static analysis
-
-cppcheck --enable=all -I. src/main.c
-
-```
-
-
-# GDB DEBUGGER C C++ GO BINARY DEBUG
-
-```shell
-Startup 
-% gdb -help            print startup help, show switches
-*% gdb object          normal debug 
-*% gdb object core     core debug (must specify core file)
-%% gdb object pid      attach to running process
-% gdb                  use file command to load object 
-
-Help
-*(gdb) help            list command classes
-(gdb) help running      list commands in one command class
-(gdb) help run         bottom-level help for a command "run" 
-(gdb) help info         list info commands (running program state)
-(gdb) help info line    help for a particular info command
-(gdb) help show         list show commands (gdb state)
-(gdb) help show commands        specific help for a show command
-
-Breakpoints
-*(gdb) break main       set a breakpoint on a function
-*(gdb) break 101        set a breakpoint on a line number
-*(gdb) break basic.c:101        set breakpoint at file and line (or function)
-*(gdb) info breakpoints        show breakpoints
-*(gdb) delete 1         delete a breakpoint by number
-(gdb) delete           delete all breakpoints (prompted)
-(gdb) clear             delete breakpoints at current line
-(gdb) clear function    delete breakpoints at function
-(gdb) clear line        delete breakpoints at line
-(gdb) disable 2         turn a breakpoint off, but don't remove it
-(gdb) enable 2          turn disabled breakpoint back on
-(gdb) tbreak function|line        set a temporary breakpoint
-(gdb) commands break-no ... end   set gdb commands with breakpoint
-(gdb) ignore break-no count       ignore bpt N-1 times before activation
-(gdb) condition break-no expression         break only if condition is true
-(gdb) condition 2 i == 20         example: break on breakpoint 2 if i equals 20
-(gdb) watch expression        set software watchpoint on variable
-(gdb) info watchpoints        show current watchpoints
-
-Running the program
-*(gdb) run             run the program with current arguments
-*(gdb) run args redirection        run with args and redirection
-(gdb) set args args...        set arguments for run 
-(gdb) show args        show current arguments to run
-*(gdb) cont            continue the program
-*(gdb) step            single step the program; step into functions
-(gdb) step count       singlestep \fIcount\fR times
-*(gdb) next            step but step over functions 
-(gdb) next count       next \fIcount\fR times
-*(gdb) CTRL-C          actually SIGINT, stop execution of current program 
-*(gdb) attach process-id        attach to running program
-*(gdb) detach        detach from running program
-*(gdb) finish        finish current function's execution
-(gdb) kill           kill current executing program 
-
-Core 
-(gdb) generate-core-file  generate core dump file
-
-Thread
-(gdb) info threads             get threads 
-(gdb) thread id                switch to thread with id
-(gdb) thread apply id action   apply action to thread id
-
-Stack backtrace
-*(gdb) bt              print stack backtrace
-(gdb) frame            show current execution position
-(gdb) up               move up stack trace  (towards main)
-(gdb) down             move down stack trace (away from main)
-*(gdb) info locals      print automatic variables in frame
-(gdb) info args         print function parameters 
-
-Browsing source
-*(gdb) list 101                list 10 lines around line 101
-*(gdb) list 1,10        list lines 1 to 10
-*(gdb) list main       list lines around function 
-*(gdb) list basic.c:main        list from another file basic.c
-*(gdb) list -          list previous 10 lines
-(gdb) list *0x22e4      list source at address
-(gdb) cd dir           change current directory to \fIdir\fR
-(gdb) pwd              print working directory
-(gdb) search regexpr    forward current for regular expression
-(gdb) reverse-search regexpr        backward search for regular expression
-(gdb) dir dirname       add directory to source path
-(gdb) dir              reset source path to nothing
-(gdb) show directories        show source path
-
-Browsing Data
-*(gdb) print expression        print expression, added to value history
-*(gdb) print/x expressionR        print in hex
-(gdb) print array[i]@count        artificial array - print array range
-(gdb) print $          print last value
-(gdb) print *$->next    print thru list
-(gdb) print $1         print value 1 from value history
-(gdb) print ::gx        force scope to be global
-(gdb) print 'basic.c'::gx        global scope in named file (>=4.6)
-(gdb) print/x &main     print address of function
-(gdb) x/countFormatSize address        low-level examine command
-(gdb) x/x &gx          print gx in hex
-(gdb) x/4wx &main       print 4 longs at start of \fImain\fR in hex
-(gdb) x/gf &gd1         print double
-(gdb) help x           show formats for x
-*(gdb) info locals      print local automatics only
-(gdb) info functions regexp         print function names
-(gdb) info variables  regexp        print global variable names
-*(gdb) ptype name        print type definition
-(gdb) whatis expression       print type of expression
-*(gdb) set variable = expression        assign value
-(gdb) display expression        display expression result at stop
-(gdb) undisplay        delete displays
-(gdb) info display     show displays
-(gdb) show values      print value history (>= gdb 4.0)
-(gdb) info history     print value history (gdb 3.5)
-
-Object File manipulation
-(gdb) file object                      load new file for debug (sym+exec)
-(gdb) file                             discard sym+exec file info
-(gdb) symbol-file object        load only symbol table
-(gdb) exec-file object                 specify object to run (not sym-file)
-(gdb) core-file core                   post-mortem debugging
-
-Signal Control
-(gdb) info signals             print signal setup
-(gdb) handle signo actions      set debugger actions for signal
-(gdb) handle INT print          print message when signal occurs
-(gdb) handle INT noprint        don't print message
-(gdb) handle INT stop          stop program when signal occurs
-(gdb) handle INT nostop         don't stop program
-(gdb) handle INT pass          allow program to receive signal
-(gdb) handle INT nopass         debugger catches signal; program doesn't
-(gdb) signal signo             continue and send signal to program
-(gdb) signal 0                 continue and send no signal to program
-
-Machine-level Debug
-(gdb) info registers           print registers sans floats
-(gdb) info all-registers        print all registers
-(gdb) print/x $pc              print one register
-(gdb) stepi                    single step at machine level
-(gdb) si                       single step at machine level
-(gdb) nexti                    single step (over functions) at machine level
-(gdb) ni                       single step (over functions) at machine level
-(gdb) display/i $pc            print current instruction in display
-(gdb) x/x &gx                  print variable gx in hex
-(gdb) info line 22             print addresses for object code for line 22
-(gdb) info line *0x2c4e         print line number of object code at address
-(gdb) x/10i main               disassemble first 10 instructions in \fImain\fR
-(gdb) disassemble addr          dissassemble code for function around addr
-
-History Display
-(gdb) show commands            print command history (>= gdb 4.0)
-(gdb) info editing             print command history (gdb 3.5)
-(gdb) ESC-CTRL-J               switch to vi edit mode from emacs edit mode
-(gdb) set history expansion on       turn on c-shell like history
-(gdb) break class::member       set breakpoint on class member. may get menu
-(gdb) list class::member        list member in class
-(gdb) ptype class               print class members
-(gdb) print *this              print contents of this pointer
-(gdb) rbreak regexpr           useful for breakpoint on overloaded member name
-
-Miscellaneous
-(gdb) define command ... end        define user command
-*(gdb) RETURN                  repeat last command
-*(gdb) shell command args       execute shell command 
-*(gdb) source file             load gdb commands from file
-*(gdb) quit                    quit gdb
-
-```
-
-
-# VALGRIND DYNAMIC ANALYSIS
-
-```shell
-
-valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose ./main.out 
-
-
-```
-
-# CORE DUMP
-
-```shell
-
-# check
-
-ulimit -c
-
-# set unlimited 
-
-ulimit -c unlimited
-
-
-```
-
-# SYSTEMCTL SYSTEMD
-
-```shell
-# /root/1234.sh
-
-ncat -lv 1234
-
-```
-
-```shell
-
-/etc/systemd/system/nc1234.service
-```
-
-
-```shell
-# /etc/systemd/system/nc1234.service
-
-[Unit]
-Description=nc1234 demo service
-After=network.target
-StartLimitIntervalSec=0
-[Service]
-Type=simple
-Restart=always
-RestartSec=1
-User=root
-ExecStart=/root/1234.sh
-
-[Install]
-WantedBy=multi-user.target
-
-```
-
-```shell
-systemctl enable nc1234
-
-systemctl start nc1234
-
-```
-
-# CPU NUMA 
-
-```shell
-
-# from numa nodes 0,1 use 1 if possible
-numactl --cpubind=0,1 --preferred=1 $EXECUTABLE
-
-
-```
-
-
-# EBPF LINUX LIBBPF
-
-
-
-```shell
-
-
-# install bcc
-# ubuntu 22.04
-
-sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
-  libllvm14 llvm-14-dev libclang-14-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
-  liblzma-dev libdebuginfod-dev arping netperf iperf
-
-
-git clone https://github.com/iovisor/bcc.git
-
-mkdir bcc/build
-cd bcc/build
-cmake ..
-make
-sudo make install
-
-# build python3 binding
-
-cmake -DPYTHON_CMD=python3 .. 
-pushd src/python/
-make
-sudo make install
-popd
-
-
-```
-
-
-```shell
-# libbpf
-
-apt install clang libelf1 libelf-dev zlib1g-dev
-
-git clone --recurse-submodules https://github.com/libbpf/libbpf-bootstrap
-
-cd libbpf-bootstrap 
-
-git submodule update --init --recursive   
-
-
-
-```
-
-
-# XDP LINUX EBPF
-
-```shell
-# in project dir ex) xdp
-
-git clone https://github.com/xdp-project/xdp-tools
-
-# git clone https://github.com/libbpf/libbpf
-
-sudo apt install clang llvm libelf-dev libpcap-dev build-essential libc6-dev-i386 m4
-
-# To install the ‘perf’ utility, run this on Debian:
-
-sudo apt install linux-perf
-# or this on Ubuntu:
-
-sudo apt install linux-tools-$(uname -r)
-
-# kernel header
-
-sudo apt install linux-headers-$(uname -r)
-
-# etc
-
-sudo apt install linux-tools-common linux-tools-generic
-sudo apt install tcpdump
-
-
-cd xdp-tools
-
-./configure
-
-make
-
-sudo make install
-
-cd lib/libbpf/src
-
-sudo make install
-
-# compile 
-
-clang -O2 -g -Wall -c -target bpf -o test_xdp.o test_xdp.c
-
-# create veth or on interface
-
-# load module
-
-sudo ip link set veth1 xdpgeneric obj test_xdp.o sec xdp_drop
-
-# or
-
-sudo xdp-loader load -m skb -s xdp_drop veth1 test_xdp.o
-
-
-# unload
-
-sudo ip link set veth1 xdpgeneric off
-
-# or 
-
-sudo xdp-loader unload -a veth1
-
-# check 
-
-sudo bpftool map show
-
-sudo bpftool map dump id 13
-
-# bpf printk out
-
-sudo cat /sys/kernel/tracing/trace
-
-```
-
-
-
-# PROFILE PATH PERMANENT
-
-```shell
-
-vim .profile
-
-source .profile
-
-```
-# GIT
-
-```shell
-
-# local branch
-
-git switch -c <loc_name> <remote_name>/<branch>
-
-# local merge
-# on target branch
-
-git merge <loc_name>
-
-# on forked remote branch's local branch
-# pulling equivalent
-
-git remote add <upstream_name> <upstream_addr>
-
-git fetch <upstream_name>
-
-git rebase <upstream_name>/<branch>
-
-git add .
-
-git commit
-
-git push -f <forked_origin> <forked_origin_branch>
-
-# then PR
-
-# squash commits
-
-git log
-
-git reset --soft HEAD~<last_commits_count>
-
-ex) git reset --soft HEAD~5
-
-# config 
-
-git config --global credential.helper store
-
-# then clone or pull or whatever to store
-
-# squash commits using editor
-
-git rebase -i my_first_commit~
-
-# prefix `pick` to use commit
-# prefix `squash` to get it meld into previous commit
-
-
-# git diff
-
-
-git diff commit_a commit_b
-
-# or just the current and latest commit
-
-git diff
-
-
-# git create patch file for latest commit
-
-git format-patch -1 HEAD
-
-# signoff
-
-git commit --signoff
-
-# stat patch before applying
-
-git apply --stat a_file.patch
-
-# check patch before applying
-
-git apply --check a_file.patch
-
-# apply patch 
-
-git am --signoff < a_file.path
-
-# git submodule
-
-git submodule add <repository.git>
-
-# git submodule pull all
-
-git submodule update --recursive
-
-# git submodule clone
-
-git clone <repository.git>
-
-git submodule init
-
-git submodule update
-
-# private repo
-# automatic with go
-
-git config --global set url."https://$ID:$PW@github.com/org".instreadOf "https://github.com/org"
-
-# github workflow self hosted runner 
-
-# Create a folder
-mkdir actions-runner && cd actions-runner
-
-# Download the latest runner package
-
-curl -o actions-runner-linux-x64-2.306.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.306.0/actions-runner-linux-x64-2.306.0.tar.gz
-
-# Optional: Validate the hash
-
-echo "b0a090336f0d0a439dac7505475a1fb822f61bbb36420c7b3b3fe6b1bdc4dbaa  actions-runner-linux-x64-2.306.0.tar.gz" | shasum -a 256 -c
-
-# Extract the installer
-
-tar xzf ./actions-runner-linux-x64-2.306.0.tar.gz
-
-# Create the runner and start the configuration experience
-
-./config.sh --url https://github.com/seantywork/k8s-base-cluster-setup --token <TOKEN>
-
-# Last step, run it!
-
-./run.sh
-
-```
-
-
-```shell
-
-# install github cli
-
-curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg 
-
-sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
-
-echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null 
-
-sudo apt update
-
-sudo apt install gh -y
-
-```
-
-```shell
-
-# some commands
-
-gh pr list
-
-gh pr edit <num> --add-reviewer seantywork
-
-gh pr edit <num> --add-assignee seantywork
-
-gh pr merge <num> --merge
-
-gh pr view <num> --json state,author,assignees,reviews,reviewRequests,mergeable
-
-```
-
-```shell
-
-# git lfs
-
-git lfs install
-
-
-git lfs track "*.png" "*.jpg" "*.docx" "*.zip"
-
-git add .
-
-git commit -m "lfs"
-
-
-
-```
-
-
-```shell
-
-# git server
-
-# on git server
-
-sudo mkdir /git
-
-
-sudo adduser git
-
-sudo chown git:git /git
-
-su git
-cd
-mkdir .ssh && chmod 700 .ssh
-touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
-
-
-cd /git
-
-mkdir boxproject.git
-
-git init --bare
-
-
-
-# on git user computer
-
-ssh-copy-id git@gitserver
-
-mkdir boxproject
-
-git init
-git add .
-git commit -m 'init'
-git branch -M main
-git remote add origin git@gitserver:/git/boxproject.git
-git push -u origin main
-
-
-# on another user computer
-
-
-git clone git@gitserver:/git/boxproject.git
-
-cd boxproject
-
-git fetch --all
-
-git switch -c main origin/main
-
-```
-
-```shell
-
-# remove submodule
-
-# delete in .gitmodules 
-
-git add .gitmodules
-
-# delete in .git/config.
-
-git rm --cached path_to_submodule 
-
-rm -rf .git/modules/path_to_submodule
-
-git commit -m "Removed submodule <name>"
-
-rm -rf path_to_submodule
-
-```
-
-
-```shell
-
-# git email
-
-sudo apt update
-
-sudo apt install git-email
-
-# might have to install perl dependency
-
-cpan Authen::SASL MIME::Base64 Net::SMTP::SSL
-
-# configure $HOME/.gitconfig
-
-[sendemail]
-    smtpServer = smtp.gmail.com
-    smtpServerPort = 587
-    smtpEncryption = tls
-    smtpUser = my_email@gmail.com
-    # (Optional: we'll leave this commented out and use a different way)
-    # smtpPass = PASSWORD
-
-# generate google app password for gmail
-# goto acoount manager, search app password
-
-# add pass to .gitconfig
-
-git send-email --to=my_email@gmail.com something.patch
-
-```
-
-# NGINX SETTING
-
-
-```shell
-sudo mkdir -pv /var/www/<project_name>/static/ 
-
-sudo chown -cR ubuntu:ubuntu /var/www/<project_name>/  
-
-
-django setting.py debug false 
-
-python manage.py collectstatic 
-```
-
-# HTTPS
-
-```shell
-
-# Nginx configuration: /etc/nginx/sites-available/<nginx_config_name> 
-
-server_tokens               off; 
-
-access_log                  /var/log/nginx/<nginx_config_name>.access.log; 
-
-error_log                   /var/log/nginx/<nginx_config_name>.error.log; 
-
-
-server { 
-
-  server_name               .<domain_name>; 
-
-  listen                    80; 
-
-  return                    307 https://$host$request_uri; 
-
-} 
-
-
-server { 
-
-  location / { 
-
-    proxy_pass              http://localhost:8000; 
-
-    proxy_set_header        Host $host; 
-
-    proxy_set_header    X-Forwarded-Proto $scheme; 
-
-  } 
-
-
-  location /static { 
-
-    autoindex on; 
-
-    alias <static_location>; 
-
-  } 
-
-
-  listen 443 ssl; 
-
-  ssl_certificate /etc/letsencrypt/live/www.supersecure.codes/fullchain.pem; 
-
-  ssl_certificate_key /etc/letsencrypt/live/www.supersecure.codes/privkey.pem; 
-
-  include /etc/letsencrypt/options-ssl-nginx.conf; 
-
-  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
-
-} 
-
-
-```
-
-```shell
-
-sudo systemctl restart nginx 
-
-
-cd /etc/nginx/sites-enabled 
-
-sudo ln -s ../sites-available/<nginx_config_name> . 
-
-
-sudo vi /etc/nginx/nginx.conf 
-
-ssl_protocols TLSv1.2 TLSv1.3; 
-
-include /etc/nginx/sites-enabled/<nginx_config_name> 
-
-sudo systemctl restart nginx 
-
-
-sudo snap install --classic certbot 
-
-sudo ln -s /snap/bin/certbot /usr/bin/certbot 
-
-sudo certbot --nginx --rsa-key-size 4096 --no-redirect 
-
-
-sudo systemctl restart nginx 
-
-
-
-```
-
-
-# AWS RESTART
-
-```shell
-# ip and dns check 
-
-# aws new ssh domain and ip check  
-
-# namecheap DNS relinking 
-
-```
-
-
-# NGINX CHECK 
-
-```shell
-
-
-
-
-stream { 
-
-        upstream galera_cluster { 
-
-            server 127.0.0.1:33061; #node1 
-
-            server 127.0.0.1:33062; #node2 
-
-            server 127.0.0.1:33063; #node3 
-
-            zone tcp_mem 64k; 
-
-            least_conn; 
-
-        } 
-
-
-        server { 
-
-            listen 3306; # MySQL default 
-
-            proxy_pass galera_cluster; 
-
-        } 
-
-} 
-
-
-
-http  
-
-
-        sendfile on; 
-
-        tcp_nopush on; 
-
-        tcp_nodelay on; 
-
-        reset_timedout_connection on; 
-
-        client_body_timeout 3600; 
-
-        send_timeout 2; 
-
-
-        keepalive_timeout 30; 
-
-        keepalive_requests 100000; 
-
-
-        #types_hash_max_size 2048; 
-
-        # server_tokens off; 
-
-
-        client_max_body_size 40G; 
-
-        client_body_buffer_size 16K; 
-
-        client_header_buffer_size 1K; 
-
-
-        proxy_request_buffering off; 
-
-
-        proxy_send_timeout 3600; 
-
-
-server 
-
-
-location 
-
-
-                proxy_pass http://agc_server; 
-
-                proxy_read_timeout 300s; 
-
-                proxy_connect_timeout 75s; 
-
-                proxy_set_header X-Real-IP $remote_addr; 
-
-                #proxy_set_header Host $host; 
-
-                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
-
-                proxy_set_header X-Forwarded-For $remote_addr; 
-
-                proxy_set_header X-Forwarded-Proto $scheme; 
-
-                proxy_set_header Host $http_host; 
-
-                proxy_http_version 1.1; 
-
-                proxy_set_header   Upgrade $http_upgrade; 
-
-                proxy_set_header   Connection "upgrade"; 
-
-
-
-```
-
-
-```shell
-# or
-
-upstream UC {
-
-  server 0.0.0.0:8888;
-
-}
-
-upstream PTT {
-
-  server 0.0.0.0:8888;
-
-}
-
-
-server
-{
-        listen       80;
-        server_name      usagecorpus.com www.usagecorpus.com;
-        return 301 https://$host$request_uri;
-}
-
-server
-{
-        listen       80;
-        server_name      ptt.usagecorpus.com;
-        return 301 https://$host$request_uri;
-}
-
-
-
-server
-{
-        server_name  usagecorpus.com www.usagecorpus.com;
-        client_max_body_size 0;
-
-        location / {
-            # add_header Content-Type text/plain;
-            # return 200 'okay';
-
-             proxy_pass http://UC;
-             proxy_set_header X-Real-IP $remote_addr;
-             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-             proxy_set_header X-Forwarded-For $remote_addr;
-             proxy_set_header X-Forwarded-Proto $scheme;
-             proxy_set_header Host $http_host;
-
-       #      proxy_buffering off;
-       #      proxy_request_buffering off;
-
-       #      proxy_http_version 1.1;
-       #      proxy_set_header   Upgrade $http_upgrade;
-       #      proxy_set_header   Connection "upgrade";
-
-
-      }
-
-
-    #listen 80; # managed by Certbot
-
-    listen 443 ssl; # managed by Certbot
-    ssl_certificate /etc/letsencrypt/live/usagecorpus.com/fullchain.pem; # managed by Certbot
-    ssl_certificate_key /etc/letsencrypt/live/usagecorpus.com/privkey.pem; # managed by Certbot
-    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
-    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
-
-
-}
-
-server
-{
-        server_name  ptt.usagecorpus.com;
-        client_max_body_size 0;
-
-        location / {
-            # add_header Content-Type text/plain;
-            # return 200 'okay';
-
-             proxy_pass http://PTT;
-             proxy_set_header X-Real-IP $remote_addr;
-             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-             proxy_set_header X-Forwarded-For $remote_addr;
-             proxy_set_header X-Forwarded-Proto $scheme;
-             proxy_set_header Host $http_host;
-
-       #      proxy_buffering off;
-       #      proxy_request_buffering off;
-
-       #      proxy_http_version 1.1;
-       #      proxy_set_header   Upgrade $http_upgrade;
-       #      proxy_set_header   Connection "upgrade";
-
-
-       }
-
-
-    #listen 80; # managed by Certbot
-
-    listen 443 ssl; # managed by Certbot
-    ssl_certificate /etc/letsencrypt/live/usagecorpus.com/fullchain.pem; # managed by Certbot
-    ssl_certificate_key /etc/letsencrypt/live/usagecorpus.com/privkey.pem; # managed by Certbot
-    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
-    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
-
-}
-
-```
-
-```shell
-sudo systemctl start nginx 
-
-sudo systemctl restart nginx 
-
-
-```
-
-# CGROUP
-
-```shell
-# cgroup 
-
-# check cgroup mount location
-
-mount | grep cgroup2
-
-# if not change kernel parameters in grub to see
-
-# cgroup_no_v1=all
-
-cat /proc/cmdline
-
-# check controllers
-
-cat /sys/fs/cgroup/cgroup.controllers
-
-# add controller , here SOMETHING being cpu 
-
-echo "+$SOMETHING" >> /sys/fs/cgroup/cgroup.subtree_control  
-
-# add sub group
-
-mkdir /sys/fs/cgroup/$SOME_GROUP
-
-# give cpu max
-
-echo "$MAX $PERIOD" > /sys/fs/cgroup/$SOME_GROUP/cpu.max
-
-# revoke group
-
-rmdir /sys/fs/cgroup/$SOME_GROUP
-
-
-```
-
-
-# PROCESS NAMESPACE
-
-```shell
-
-
-unshare --user --pid --map-root-user --mount-proc --fork bash 
-
-```
-
-# OVERLAYFS
-
-```shell
-sudo mkdir /tmp/upper /tmp/overlay /mnt/merged_directories
-
-sudo mount -t overlay overlay -olowerdir=/path/to/dir1:/path/to/dir2,upperdir=/tmp/upper,workdir=/tmp/overlay /mnt/merged_directories
-
-```
-
-# NETWORK NAMESPACE
-
-```shell
-
-# bridge, veth with peer
-
-sudo ip link add br-blah01 type bridge 
-
-sudo ip link add dev vm1 type veth peer name vm2
-
-sudo ip link set vm1 master br-blah01
-
-sudo ip addr add 10.0.0.1/24 dev br-blah01
-
-sudo ip addr add 10.0.0.2/24 dev vm2
-
-sudo ip link set br-blah01 up
-
-sudo ip link set vm1 up
-
-sudo ip link set vm2 up
-
-# veth with peer namespace 
-
-sudo ip netns add blahnet
-
-sudo ip link set vm2 netns blahnet 
-
-sudo ip netns exec blahnet ip link set dev lo up
-
-sudo ip netns exec blahnet ip a
-
-sudo iptables -t nat -A POSTROUTING -o br-blah01 -j MASQUERADE
-sudo iptables -t nat -A POSTROUTING -o wlo1 -j MASQUERADE
-
-sudo ip netns exec blahnet /bin/bash
-
-ip addr add 10.0.0.2/24 dev vm2
-
-ip link set dev vm2 up
-
-ip route add default via 10.0.0.1
-
-echo "nameserver 8.8.8.8" >> /etc/resolv.conf
-echo "nameserver 8.8.4.4" >> /etc/resolv.conf
-
-```
-
-
-# ROUTER/MODEM LAN
-
-```shell
-
-
-
-ethernet 
-
-
-wifi 
-
-
-mac
-
-ip
-
-dns (check /etc/resolv.conf) 
-
-
-dhcp (alongside static) 
-
-# ethernet wan
-
- plug the cable into wan port
-
-# ethernet hub/ap mode & ethernet extension
-
- turn off dhcp, enable hub/ap mode
-
- set internal new ip avoiding collision, under the default gateway cidr, set default gateway and dns
-
- plug the cable into lan port
-
-
-# wireless wan
-
-wifi wan
-
-dont turn off dhcp
-
-set internal new ip, for a new cidr range connect to the main ap with wisp
-
-
-# wireless multibridge
-
-wifi extension
-
-set internal new ip avoiding collision, under the default gateway cidr
-
-turn off dhcp
-
-connect to the main ap with repeater
-
-
-port forward 
-
-
-
-```
-
-# NETWORK INTERFACE ADDRESS NETPLAN SYSTEMD-NETWORKD
-
-```shell
-
-# netplan
-
-# below is the default configuration
-
-# craete other ones if needed
-
-```
-```shell
-# /etc/netplan/01-network-manager-all.yaml 
-
-network:
- version: 2
- renderer: NetworkManager # or systemd-networkd
- ethernets:  # or wifis, bridges, modems
-   eth0:
-     dhcp4: no 
-     addresses: [172.23.207.254/20]
-     gateway4: 192.168.1.1
-     nameservers:
-         addresses: [8.8.8.8,8.8.8.4]
-```
-```shell
-sudo netplan try
-
-# sudo netplan generate
-sudo netplan apply
-```
-
-
-```shell
-
-# disable cloud init network config if necessary
-
-
-
-```
-
-```shell
-
-sudo nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
-
-network: {config: disabled}
-
-```
-
-```shell
-
-# /etc/network/interfaces
-
-auto eth0
-iface eth0 inet static 
-address 192.168.2.1
-netmask 255.255.255.0
-gateway 192.1.2.254
-
-# or dhcp
-
-auto eth0
-iface eth0 inet dhcp
-
-
-```
-
-
-```shell
-
-# /etc/NetworkManager
-
-
-```
-
-# DISABLE/ENABLE WIFI IF
-
-```shell
-# disable
-```
-
-```shell
-# /etc/network/interfaces
-iface <interface_name> inet manual
-```
-
-```shell
-# enable
-# undo above
-
-```
-# ARP
-
-```shell
-
-# delete 
-sudo ip -s -s neigh flush all
-
-arp -d 192.168.1.1
-
-# add
-
-arp -i interface -s ip mac
-
-```
-
-```shell
-# longer cache expiration
-
-net.ipv4.neigh.default.gc_stale_time=57600
-
-# larger garbage collection threshold
-
-net.ipv4.neigh.default.gc_thresh1 = 32768
-net.ipv4.neigh.default.gc_thresh2 = 32768
-net.ipv4.neigh.default.gc_thresh3 = 32768
-
-
-```
-
-# REDIRECT
-
-```shell
-
-sysctl -w net.ipv4.conf.enp134s0f2.accept_redirects=0
-sysctl -w net.ipv4.conf.enp134s0f2.send_redirects=0
-sysctl -w net.ipv4.conf.enp134s0f0.accept_redirects=0
-sysctl -w net.ipv4.conf.enp134s0f0.send_redirects=0
-
-
-```
-
-# ETHTOOL
-
-
-```shell
-
-# queue
-
-ethtool -l devname 
-
-# only use one combined rxtx channel
-
-ethtool -L devname combined 1
-
-
-```
-
-```shell
-
-# ring buffer
-
-ethtool -G enp134s0f0 rx 4096
-ethtool -G enp134s0f0 tx 4096
-ethtool -G enp134s0f2 rx 4096
-ethtool -G enp134s0f2 tx 4096
-
-```
-
-```shell
-
-# flow
-
-ethtool -N eth0 rx-flow-hash udp4 fn
-ethtool -N eth0 flow-type udp4 src-port 4242 dst-port 4242 action 16
-
-```
-
-
-# IP INTERFACE IPTABLES NAT PORT FORWARD NETFILTER
-
-```shell
-
-# link, addr
-
-sudo modprobe dummy
-
-sudo ip link add deth0 type dummy
-
-sudo ip link set dev deth0 address C8:D7:4A:4E:47:50
-
-sudo ip addr add 192.168.1.100/24 brd + dev deth0 # label deth0:0
-
-sudo ip link set dev deth0 up
-
-sudo ip link set dev deth0 down
-
-sudo ip addr del 192.168.1.100/24 brd + dev deth0 # label deth0:0
-
-sudo ip link delete deth0 type dummy
-
-sudo modprobe -r dummy
-
-# route
-
-# to NAT
-
-ip addr add 192.168.10.2/24 dev enp3s0
-
-ip link set dev enp3s0 up
-
-# enp3s0 being the interface the router is connected to
-# router WAN IP being 192.168.10.2/24 or something
-# router default gateway 192.168.10.1
-# router LAN IP being 192.168.100.1/24 or something
-
-# from NAT
-
-ip route add 192.168.10.0/24 via 192.168.100.1 dev eth0
-
-# eth0 being an interface with a connection to the router
-# using eth0 gateway router (192.168.100.1) to route to 192.168.10.0/24 network
-
-# route with table 
-# ex) add rule as table number 5
-
-ip route add 192.168.10.0/24 dev enp3s0 table 5
-
-# flush to apply 
-
-ip route flush cache
-
-# nexthop different network
-
-sudo ip route add 192.168.122.87 dev enp1s0
-
-sudo ip route add 10.0.2.0/24 via 192.168.122.87 dev enp1s0
-
-# rule 
-
-# all 
-
-ip rule add preference 100 from all lookup 5
-
-# fwmark
-# ex) lookup table 5 if marked 5 
-
-ip rule add preference 100 fwmark 5 table 5
-
-# by source 
-
-ip rule add preference 100 from 192.168.0.0/24 lookup 100
-
-```
-
-```shell
-
-# forward
-
-# ephemeral
-
-echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
-
-echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
-
-# permanent
-cat <<EOF | sudo tee /etc/sysctl.d/99-ipv4-forward.conf
-net.ipv4.ip_forward                 = 1
-EOF
-
-cat <<EOF | sudo tee /etc/sysctl.d/99-ipv6-forward.conf
-net.ipv6.conf.all.forwarding                 = 1
-EOF
-
-sudo sysctl -p
-
-sudo sysctl --system
-
-```
-```shell
-
-# routing steps
-
-# incoming mangle prerouting, fwmark
-
-sudo iptables -t mangle -A PREROUTING -p udp -s 192.168.10.5 -j MARK --set-mark 5
-
-# incoming prerouting
-
-sudo iptables -t nat -A PREROUTING -i wlo1 -p tcp --dport 8888 -j DNAT --to-destination 192.168.1.100:8000
-
-# route decision incoming
-
-# incoming input 
-
-sudo iptables -t nat -A INPUT -i enp3s0 -p udp -s 192.168.10.5 -j SNAT --to-source 192.168.10.50
-
-
-# route forward if no local 
-
-# forward init rule
-sudo iptables -A FORWARD -i wlo1 -o deth0 -p tcp --syn --dport 8888 -m conntrack --ctstate NEW -j ACCEPT
-
-# forward allow all tcp init rule
-
-sudo iptables -A FORWARD -i wlo1 -o deth0 -p tcp -m conntrack --ctstate NEW -j ACCEPT
-
-# forward rules
-sudo iptables -A FORWARD -i wlo1 -o deth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-sudo iptables -A FORWARD -i deth0 -o wlo1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-# forward default DROP
-
-sudo iptables -P FORWARD DROP
-
-
-# outgoing mangle output 
-
-sudo iptables -t mangle -A OUTPUT -p udp -d 192.168.10.5 -j MARK --set-mark 5
-
-# outgoing output 
-
-sudo iptables -t nat -A OUTPUT -p udp -d 192.168.10.50 -j DNAT --to-destination 192.168.10.5
-
-# route decision out
-
-# outbound including forward
-
-# outgoing postrouting
-
-sudo iptables -t nat -A POSTROUTING -o wlo1 -p tcp -j MASQUERADE
-
-# outgoing postrouting
-
-sudo iptables -t nat -A POSTROUTING -o wlo1 -p tcp -s 192.168.10.50 -j SNAT --to-source 192.168.10.5
-
-
-# permanent rule
-
-sudo service netfilter-persistent save
-
-# delete 
-
-sudo iptables -S 
-
-iptables -L -n -t nat
-
-sudo iptables -D [ -t nat ] $A_SPEC
-
-# or
-
-sudo iptables -L --line-numbers
-
-sudo iptables -D INPUT $LINE_NUM
-
-
-# netfilter queue
-
-sudo iptables -I FORWARD -p tcp -j NFQUEUE --queue-num 100
-
-# netfilter queue dev
-
-sudo apt install libnetfilter-queue-dev
-
-```
-
-
-```shell
-
-# gateway - LAN route scenario
-sudo ip netns add net1
-
-sudo ip link add dev veth1 type veth peer name veth2 netns net1
-
-sudo ip link set up veth1
-
-sudo ip netns exec net1 ip link set up veth2
-
-sudo ip addr add 192.168.62.5/24 dev veth1
-
-sudo ip netns exec net1 ip addr add 192.168.62.6/24 dev veth2
-
-
-sudo ip netns add net2
-
-sudo ip link add dev veth21 type veth peer name veth22 netns net2
-
-sudo ip link set up veth21
-
-sudo ip netns exec net2 ip link set up veth22
-
-sudo ip addr add 192.168.26.5/24 dev veth21
-
-sudo ip netns exec net2 ip addr add 192.168.26.6/24 dev veth22
-
-sudo sysctl -w net.ipv4.ip_forward=1
-
-sudo iptables -P FORWARD ACCEPT
-
-sudo ip netns exec net1 ip route add 192.168.26.0/24 via 192.168.62.5 dev veth2
-
-sudo ip netns exec net2 ip route add 192.168.62.0/24 via 192.168.26.5 dev veth22
-
-```
-
-```shell
-# gateway - WAN route scenario 
-
-sudo ip netns add net1
-
-sudo ip link add dev veth1 type veth peer name veth2 netns net1
-
-sudo ip link set up veth1
-
-sudo ip netns exec net1 ip link set up veth2
-
-sudo ip netns exec net1 ip link set up lo
-
-sudo ip addr add 192.168.62.5/24 dev veth1
-
-sudo ip netns exec net1 ip addr add 192.168.62.6/24 dev veth2
-
-sudo ip netns exec net1 ip route add default via 192.168.62.5 dev veth2
-
-sudo ip route add 192.168.64.0/24 via 192.168.62.6 dev veth1
-
-sudo ip netns add net2
-
-sudo ip link add dev veth3 type veth peer name veth4 netns net2
-
-sudo ip link set veth3 netns net1
-
-sudo ip netns exec net1 ip link set up veth3
-
-sudo ip netns exec net2 ip link set up veth4
-
-sudo ip netns exec net1 ip addr add 192.168.122.1/24 dev veth3
-
-sudo ip netns exec net2 ip addr add 192.168.122.6/24 dev veth4
-
-sudo ip netns exec net2 ip route add default via 192.168.122.1 dev veth4
-
-sudo ip netns exec net1 ip route add 192.168.122.0/24 via 192.168.122.1 dev veth3
-
-sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
-
-
-sudo ip netns exec net1 iptables -P FORWARD ACCEPT
-
-
-sudo iptables -I FORWARD -p all -i veth1 -m conntrack --ctstate NEW -j ACCEPT
-
-sudo iptables -I FORWARD -p all -i veth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-sudo iptables -I FORWARD -p all -o veth1 -m conntrack --ctstate NEW -j ACCEPT
-
-sudo iptables -I FORWARD -p all -o veth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-sudo iptables -t nat -I POSTROUTING -p all -o veth1 -j MASQUERADE
-
-sudo iptables -t nat -I POSTROUTING -p all -o ens3 -j MASQUERADE
-
-
-sudo iptables -P FORWARD DROP
-
-sudo ip rule add preference 200 from all lookup 200 
-
-sudo ip route add 192.168.122.6/32 via 192.168.62.6 dev veth1 table 200
-
-```
-
-```shell
-
-# gateway - forward scenario
-
-sudo ip netns add net1
-
-sudo ip link add dev veth1 type veth peer name veth2 netns net1
-
-sudo ip link set up veth1
-
-sudo ip netns exec net1 ip link set up veth2
-
-sudo ip netns exec net1 ip link set up lo
-
-sudo ip addr add 192.168.62.5/24 dev veth1
-
-sudo ip netns exec net1 ip addr add 192.168.62.6/24 dev veth2
-
-sudo ip netns exec net1 ip route add default via 192.168.62.5 dev veth2
-
-# sudo ip route add 192.168.64.0/24 via 192.168.62.6 dev veth1
-
-sudo ip netns add net2
-
-sudo ip link add dev veth3 type veth peer name veth4 netns net2
-
-sudo ip link set veth3 netns net1
-
-sudo ip netns exec net1 ip link set up veth3
-
-sudo ip netns exec net2 ip link set up veth4
-
-sudo ip netns exec net1 ip addr add 192.168.64.1/24 dev veth3
-
-sudo ip netns exec net2 ip addr add 192.168.64.6/24 dev veth4
-
-sudo ip netns exec net2 ip route add default via 192.168.64.6 dev veth4
-
-sudo ip netns exec net1 ip route add 192.168.64.0/24 via 192.168.64.1 dev veth3
-
-sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
-
-
-#tcp
-
-sudo ip netns exec net1 iptables -t nat -I PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 192.168.64.6:8000
-
-
-sudo ip netns exec net1 iptables -I FORWARD -p tcp --syn -i veth3 -m conntrack --ctstate NEW -j ACCEPT
-
-sudo ip netns exec net1 iptables -I FORWARD -p tcp -i veth3 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-sudo ip netns exec net1 iptables -I FORWARD -p tcp --syn -o veth3 -m conntrack --ctstate NEW -j ACCEPT
-
-sudo ip netns exec net1 iptables -I FORWARD -p tcp -o veth3 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-
-sudo ip netns exec net1 iptables -P FORWARD DROP
-
-#sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth3 -j SNAT --to-source 192.168.64.1
-
-# or
-
-sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth2 -j MASQUERADE
-
-sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth3 -j MASQUERADE
-
-```
-
-
-
-```shell
-
-# gateway - NAT scenario
-
-sudo ip netns add net1
-
-sudo ip link add dev veth1 type veth peer name veth2 netns net1
-
-sudo ip link set up veth1
-
-sudo ip netns exec net1 ip link set up veth2
-
-sudo ip netns exec net1 ip link set up lo
-
-sudo ip addr add 192.168.62.5/24 dev veth1
-
-sudo ip netns exec net1 ip addr add 192.168.62.6/24 dev veth2
-
-sudo ip netns exec net1 ip route add default via 192.168.62.5 dev veth2
-
-sudo ip route add 192.168.64.0/24 via 192.168.62.6 dev veth1
-
-sudo ip netns add net2
-
-sudo ip link add dev veth3 type veth peer name veth4 netns net2
-
-sudo ip link set veth3 netns net1
-
-sudo ip netns exec net1 ip link set up veth3
-
-sudo ip netns exec net2 ip link set up veth4
-
-sudo ip netns exec net1 ip addr add 192.168.64.1/24 dev veth3
-
-sudo ip netns exec net2 ip addr add 192.168.64.6/24 dev veth4
-
-sudo ip netns exec net2 ip route add default via 192.168.64.6 dev veth4
-
-sudo ip netns exec net1 ip route add 192.168.64.0/24 via 192.168.64.1 dev veth3
-
-sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
-
-#tcp
-
-
-sudo ip netns exec net1 iptables -I FORWARD -p tcp --syn -i veth2 -m conntrack --ctstate NEW -j ACCEPT
-
-sudo ip netns exec net1 iptables -I FORWARD -p tcp -i veth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-sudo ip netns exec net1 iptables -I FORWARD -p tcp --syn -o veth2 -m conntrack --ctstate NEW -j ACCEPT
-
-sudo ip netns exec net1 iptables -I FORWARD -p tcp -o veth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth3 -j MASQUERADE
-
-sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p tcp -o veth2 -j MASQUERADE
-
-
-#all
-
-
-#sudo ip netns exec net1 iptables -I FORWARD -p all -i veth2 -m conntrack --ctstate NEW -j ACCEPT
-
-#sudo ip netns exec net1 iptables -I FORWARD -p all -i veth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-#sudo ip netns exec net1 iptables -I FORWARD -p all -o veth2 -m conntrack --ctstate NEW -j ACCEPT
-
-#sudo ip netns exec net1 iptables -I FORWARD -p all -o veth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
-#sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p all -o veth3 -j MASQUERADE
-
-#sudo ip netns exec net1 iptables -t nat -I POSTROUTING -p all -o veth2 -j MASQUERADE
-
-
-sudo ip netns exec net1 iptables -P FORWARD DROP
-
-```
-
-```shell
-
-# gateway - bridge scenario
-
-
-sudo ip netns add net1
-
-sudo ip link add dev veth1 type veth peer name veth2 netns net1
-
-sudo ip link set up veth1
-
-sudo ip netns exec net1 ip link set up lo
-
-sudo ip addr add 192.168.64.1/24 dev veth1
-
-sudo ip route add 192.168.64.0/24 via 192.168.64.2 dev veth1
-
-sudo ip netns add net2
-
-sudo ip link add dev veth3 type veth peer name veth4 netns net2
-
-sudo ip link set veth3 netns net1
-
-sudo ip netns exec net2 ip link set up veth4
-
-sudo ip netns exec net2 ip addr add 192.168.64.6/24 dev veth4
-
-sudo ip netns exec net2 ip route add default via 192.168.64.1 dev veth4
-
-sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
-
-
-sudo ip netns exec net1 ip link add br0 type bridge stp_state 0
-
-sudo ip netns exec net1 ip link set br0 address 12:34:56:78:9a:bc
-
-sudo ip netns exec net1 ip link set veth2 master br0 
-
-sudo ip netns exec net1 ip link set veth3 master br0
-
-sudo ip netns exec net1 ip addr add 192.168.64.2/24 dev br0
-
-sudo ip netns exec net1 ip link set br0 up
-
-sudo ip netns exec net1 ip link set veth2 up 
-
-sudo ip netns exec net1 ip link set veth3 up
-
-sudo ip netns exec net1 ip route add default via 192.168.64.1 dev br0
-
-sudo ip netns exec net1 ip route add 192.168.64.0/24 via 192.168.64.2 dev br0 proto static
-
-
-```
-
-```shell
-
-# gateway - bridge vlan trunk scenario
-
-
-sudo ip netns add net1
-
-sudo ip link add dev veth1 type veth peer name veth2 netns net1
-
-sudo ip link set up veth1
-
-sudo ip netns exec net1 ip link set up lo
-
-sudo ip addr add 192.168.64.1/24 dev veth1
-
-sudo ip route add 192.168.64.0/24 dev veth1
-
-sudo ip netns add net2
-
-sudo ip link add dev veth3 type veth peer name veth4 netns net2
-
-sudo ip link set veth3 netns net1
-
-sudo ip netns exec net2 ip link set up veth4
-
-sudo ip netns exec net2 ip addr add 192.168.64.6/24 dev veth4
-
-sudo ip netns exec net2 ip route add default via 192.168.64.1 dev veth4
-
-sudo ip netns exec net1 sysctl -w net.ipv4.ip_forward=1
-
-
-sudo ip netns exec net1 ip link add br0 type bridge stp_state 0
-
-sudo ip netns exec net1 ip link set br0 address 12:34:56:78:9a:bc
-
-sudo ip netns exec net1 ip link set veth2 master br0 
-
-sudo ip netns exec net1 ip link set veth3 master br0
-
-sudo ip netns exec net1 ip addr add 192.168.64.2/24 dev br0
-
-sudo ip netns exec net1 ip link set br0 up
-
-sudo ip netns exec net1 ip link set veth2 up 
-
-sudo ip netns exec net1 ip link set veth3 up
-
-#sudo ip netns exec net1 ip route add default via 192.168.64.1 dev br0
-
-sudo ip netns exec net1 ip route add default dev br0
-
-sudo ip netns exec net1 ip route add 192.168.64.0/24 dev br0 proto static
-
-
-# 
-
-sudo ip netns exec net1 ip link set br0 type bridge vlan_filtering 1
-
-sudo ip netns add net3
-
-sudo ip link add dev veth5 type veth peer name veth6 netns net3
-
-sudo ip link set veth5 netns net1
-
-sudo ip netns exec net1 ip link set veth5 master br0
-
-sudo ip netns exec net1 ip link set veth5 up
-
-sudo ip netns exec net3 ip link set up veth6
-
-sudo ip netns exec net3 ip addr add 192.168.66.6/24 dev veth6
-
-sudo ip netns exec net3 ip link set dev veth6 up
-
-sudo ip netns exec net3 ip route add default via 192.168.66.1 dev veth6
-
-sudo ip netns exec net1 bridge vlan add dev veth5 vid 5 pvid untagged master
-
-sudo ip netns exec net1 bridge vlan add dev veth2 vid 5 master
-
-sudo ip netns exec net1 ip route add 192.168.66.0/24 dev br0 proto static
-
-
-#
-
-sudo ip link add link veth1 name veth1.5 type vlan id 5
-
-sudo ip addr add 192.168.66.1/24 dev veth1.5
-
-sudo ip link set veth1.5 up
-
-```
-
-
-```shell
-# gateway redirect scenario 
-
-
-# 10.168.0.29 being NAT 
-
-# 10.168.0.26 being default gateway 
-
-# 10.168.0.100 being default gateway's default gateway
-
-# on NAT 
-
-sudo ip netns add vnet 
-
-sudo ip link set enp7s0 netns vnet 
-
-sudo ip netns exec vnet ip addr add 10.168.0.29/24 dev enp7s0
-
-sudo ip netns exec vnet ip link set up dev enp7s0 
-
-sudo ip netns exec vnet ip route add default via 10.168.0.26
-# on default gateway 
-
-sudo ip rule add preference 221 from 10.168.0.0/24 lookup 221
-
-sudo ip route add default via 10.168.0.100 dev enp7s0 table 221
-
-echo 0 | tee /proc/sys/net/ipv4/conf/*/send_redirects
-
-
-```
-
-```shell
-
-# host to different NAT with same ip scenario
-
-# nat1
-sudo ip netns add net0
-
-sudo ip link add dev veth01 type veth peer name veth02 netns net0
-
-sudo ip link set up veth01
-
-sudo ip netns exec net0 ip link set up veth02
-
-sudo ip addr add 192.168.10.20/24 dev veth01
-
-sudo ip netns exec net0 ip addr add 192.168.10.2/24 dev veth02
-
-# nat2
-
-sudo ip netns add net1
-
-sudo ip link add dev veth11 type veth peer name veth12 netns net1
-
-sudo ip link set up veth11
-
-sudo ip netns exec net1 ip link set up veth12
-
-sudo ip addr add 192.168.10.30/24 dev veth11
-
-sudo ip netns exec net1 ip addr add 192.168.10.2/24 dev veth12
-
-sudo ip rule add preference 100 from all lookup local
-
-sudo ip rule del preference 0
-
-sudo ip rule add preference 92 fwmark 2 table 92
-sudo ip rule add preference 93 fwmark 3 table 93
-
-sudo ip route add default via 192.168.10.20 dev veth01 table 92
-sudo ip route add default via 192.168.10.30 dev veth11 table 93
-
-
-sudo iptables -t nat -A INPUT -p tcp -i veth02 -j SNAT --to-source 192.168.10.3
-sudo iptables -t mangle -A OUTPUT -p tcp -d 192.168.10.2 -j MARK --set-mark 2
-sudo iptables -t mangle -A OUTPUT -p tcp -d 192.168.10.3 -j MARK --set-mark 3
-sudo iptables -t nat -A OUTPUT -p tcp -d 192.168.10.3 -j DNAT --to-destination 192.168.10.2
-
-sudo ip route flush cache
-
-
-# test
-
-# in net0
-sudo ip netns exec net0 nc -l 192.168.10.2 9999
-
-# in net1 
-sudo ip netns exec net1 nc -l 192.168.10.2 9999
-
-# on host
-nc 192.168.10.2 9999 
-
-# on host
-nc 192.168.10.3 9999
-
-
-```
-
-```shell
-
-# network namespace
-
-sudo ip netns add net1
-
-sudo ip netns del net1
-
-sudo ip -all netns exec ip link show
-
-# veth namespace
-
-ip link add veth1 netns net1 type veth
-
-ip link add veth1 netns net1 type veth peer name veth2 netns net2
-
-# veth
-
-sudo ip link add veth1 type veth
-
-
-sudo ip addr add 192.168.1.1/24 brd + dev veth0
-
-sudo ip addr add 192.168.1.5/24 brd + dev veth1
-
-sudo ip link set dev veth0 up
-
-sudo ip link set dev veth1 up
-
-sudo ip link set dev veth1 down
-
-sudo ip link set dev veth0 down
-
-sudo ip addr del 192.168.1.1/24 brd + dev veth0
-
-sudo ip addr del 192.168.1.5/24 brd + dev veth1
-
-sudo ip link del veth1 type veth
-
-# veth with peer
-
-sudo ip link add br-blah01 type bridge 
-
-sudo ip link add dev vm1 type veth peer name vm2
-
-sudo ip link set vm1 master br-blah01
-
-sudo ip addr add 10.0.0.1/24 dev br-blah01
-
-sudo ip addr add 10.0.0.2/24 dev vm2
-
-sudo ip link set br-blah01 up
-
-sudo ip link set vm1 up
-
-sudo ip link set vm2 up
-
-
-```
-```shell
-
-# bridge
-
-sudo ip link add br0 type bridge 
-
-ip link set br0 type bridge stp_state 1
-
-# ip link set br0 type bridge vlan_filtering 1
-
-ip link set eth1 master br0
-
-ip link set eth1 up
-
-ip link set br0 up
-
-
-```
-
-```shell
-
-# tuntap
-
-sudo ip tuntap add mode tap tap0
-
-sudo ip addr add 192.168.1.100/24 brd + dev tap0
-
-sudo ip link set tap0 master br0
-
-sudo ip link set dev tap0 up
-
-```
-
-
-```shell
-
-# vlan
-
-sudo apt-get install vlan
-
-sudo modprobe 8021q
-
-# permanent
-
-echo "8021q" >> /etc/modules
-
-sudo ip link add link eth0 name eth0.100 type vlan id 5
-
-sudo ip link set eth0.100 up
-
-
-
-
-
-# del
-
-sudo ip link set eth0.100 down
-
-sudo ip link del eth0.100
-
-
-```
-
-
-```shell
-
-# vxlan
-
-# on host1
-
-sudo ip netns add top
-
-sudo ip link add top-in type veth peer name top-out
-
-sudo ip link set top-in netns top
-
-sudo ip netns exec top ip addr add 10.10.5.2/16 dev top-in
-
-sudo ip netns exec top ip link set top-in up
-
-# on host1: bridge
-
-sudo ip link add middle type bridge
-
-sudo ip addr add 10.10.5.1/16 dev middle
-
-sudo ip link set top-out master middle
-
-sudo ip link set top-out up
-
-sudo ip link set middle up
-
-# on host1: route
-
-sudo ip netns exec top ip route add default via 10.10.5.1
-
-# on host1: vxlan
-
-sudo ip link add vxlan-top type vxlan id 100 local 192.168.99.1 remote 192.168.99.2 dev eth0
-
-sudo ip link set vxlan-top master middle
-
-sudo ip link set vxlan-top up
-
-
-# on host2
-
-sudo ip netns add bottom
-
-sudo ip link add bottom-in type veth peer name bottom-out
-
-sudo ip link set bottom-in netns bottom
-
-sudo ip netns exec bottom ip addr add 10.10.5.12/16 dev bottom-in
-
-sudo ip netns exec bottom ip link set bottom-in up
-
-# on host2: bridge
-
-sudo ip link add middle type bridge
-
-sudo ip addr add 10.10.5.11/16 dev middle
-
-sudo ip link set bottom-out master middle
-
-sudo ip link set bottom-out up
-
-sudo ip link set middle up
-
-# on host2: route
-
-sudo ip netns exec bottom ip route add default via 10.10.5.11
-
-
-# on host1: vxlan
-
-sudo ip link add vxlan-bottom type vxlan id 100 local 192.168.99.2 remote 192.168.99.1 dev eth0
-
-sudo ip link set vxlan-bottom master middle
-
-sudo ip link set vxlan-bottom up
-
-# test
-
-# on host1
-sudo ip netns exec top ncat -l 10.10.5.2 9999
-
-# on host2
-
-
-sudo ip netns exec bottom ncat 10.10.5.2 9999
-
-```
-
-
-```shell
-# macvlan
-
-ip link add macvlan1 link eth0 type macvlan mode bridge
-
-ip netns add net1
-
-ip link set macvlan1 netns net1
-
-ip netns exec net1 ip link set macvlan1 up 
-
-ip netns exec net1 ip link addr add 192.168.0.16 dev macvlan1
-
-
-```
-
-```shell
-
-# bond 
-
-#ip link add bond1 type bond miimon 100 mode active-backup
-ip link add bond1 type bond miimon 100 mode balance-xor
-ip link addr add $ETH0_ADDR dev bond1 
-ip link set eth0 master bond1
-ip link set eth1 master bond1
-ip link set bond1 up
-```
-
-```shell
-
-# netkit
-
-sudo ip netns add net1
-
-sudo ip link add nkpeer0 type netkit
-
-sudo ip link set nkpeer0 netns net1
-
-sudo ip link set dev nk0 up
-
-sudo ip netns exec net1 ip link set dev nkpeer0 up
-
-sudo ip addr add 10.168.0.1/24 dev nk0
-
-sudo ip netns exec net1 ip addr add 10.168.0.2/24 dev nkpeer0
-
-
-```
-
-```shell
-
-
-# xfrm
-
-# xfrm ip addr
-
-
-sudo ip netns add vnet
-sudo ip link add dev veth01 type veth peer name veth02 netns vnet
-sudo ip addr add 192.168.10.1/24 dev veth01
-sudo ip addr add 10.168.66.1/24 dev veth01
-sudo ip link set up veth01
-sudo ip netns exec vnet ip addr add 192.168.10.2/24 dev veth02
-sudo ip netns exec vnet ip addr add 10.168.66.2/24 dev veth02
-sudo ip netns exec vnet ip link set up veth02
-
-# xfrm state, policy
-
-# client
-
-ip xfrm state add \
-    src 10.168.66.1/24 dst 10.168.66.2/24 proto esp spi 0x01000000 reqid 0x01000000 mode tunnel flag af-unspec \
-    aead 'rfc4106(gcm(aes))' 0xaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeff 128 \
-    sel src 10.168.66.1/24 dst 10.168.66.2/24 
-
-
-ip xfrm state add \
-    src 10.168.66.2/24 dst 10.168.66.1/24 proto esp spi 0x02000000 reqid 0x02000000 mode tunnel flag af-unspec \
-    aead 'rfc4106(gcm(aes))' 0xaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeff 128 \
-    sel src 10.168.66.2/24 dst 10.168.66.1/24 
-
-ip xfrm policy add \
-    src 10.168.66.1/24 dst 10.168.66.2/24 dir out \
-    tmpl src 10.168.66.1/24 dst 10.168.66.2/24 proto esp reqid 0x01000000 mode tunnel
-
-ip xfrm policy add \
-    src 10.168.66.2/24 dst 10.168.66.1/24 dir in \
-    tmpl src 10.168.66.2/24 dst 10.168.66.1/24 proto esp reqid 0x02000000 mode tunnel
-
-
-# server
-
-ip netns exec vnet ip xfrm state add \
-    src 10.168.66.1/24 dst 10.168.66.2/24 proto esp spi 0x01000000 reqid 0x01000000 mode tunnel flag af-unspec \
-    aead 'rfc4106(gcm(aes))' 0xaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeff 128 \
-    sel src 10.168.66.1/24 dst 10.168.66.2/24
-
-
-ip netns exec vnet ip xfrm state add \
-    src 10.168.66.2/24 dst 10.168.66.1/24 proto esp spi 0x02000000 reqid 0x02000000 mode tunnel flag af-unspec \
-    aead 'rfc4106(gcm(aes))' 0xaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeffaabbccddeeff 128 \
-    sel src 10.168.66.2/24 dst 10.168.66.1/24 
-
-ip netns exec vnet ip xfrm policy add \
-    src 10.168.66.1/24 dst 10.168.66.2/24 dir in \
-    tmpl src 10.168.66.1/24 dst 10.168.66.2/24 proto esp reqid 0x01000000 mode tunnel
-
-ip netns exec vnet ip xfrm policy add \
-    src 10.168.66.2/24 dst 10.168.66.1/24 dir out \
-    tmpl src 10.168.66.2/24 dst 10.168.66.1/24 proto esp reqid 0x02000000 mode tunnel
-
-
-
-```
-
-
-```shell
-# gre
-
-
-sudo sysctl -w net.ipv4.ip_forward=1
-
-sudo ip tunnel add gre1 mode gre remote <HOST_B_IP> local <HOST_A_IP> ttl 25
-
-sudo ip addr add <HOST_A_PRIV_IP> dev gre1
-
-sudo ip link set gre1 up
-
-```
-
-# NFTABLES NFT
-
-
-```shell
-
-# iptables translate, outputs nftables equivalent
-
-iptables-translate -A INPUT -i enp1s0 -p tcp --dport 22 -j ACCEPT
-
-# list
-
-sudo nft list ruleset
-
-# default file at
-# /etc/nftools.conf
-# or /etc/nftables.conf
-
-# can use include syntax 
-
-include "ipv4-ipv5-webserver-rules.nft"
-
-
-```
-
-# CONNTRACK
-
-
-```shell
-
-sudo apt-get install conntrack
-
-
-sudo conntrack -L
-
-# delete
-conntrack -D -p tcp --dport 993
-
-```
-
-
-# FIREWALL  
-
-```shell
-
-
-# ubuntu 
-
-
-
-sudo ufw default allow incoming 
-
-sudo ufw default allow outgoing 
-
-
-sudo ufw allow ssh 
-
-sudo ufw allow https 
-
-
-sudo ufw allow 22 
-
-sudo ufw allow 443 
-
-
-sudo ufw allow 6000:6007/tcp 
-
-
-sudo ufw allow from 203.0.113.4 to any port 22 
-
-
-sudo ufw allow from 203.0.113.0/24 
-
-
-sudo ufw deny from 203.0.113.4 
-
-
-sudo ufw enable 
-
-
-sudo ufw disable 
-
-
-
-# centos 
-
-
-systemctl enable firewalld 
-
-
-sudo firewall-cmd --permanent --add-service={http,https} --permanent 
-
-
-sudo firewall-cmd --add-port=7070/tcp --permanent 
-
-
-firewall-cmd --zone=trusted --add-source=192.168.0.1/24 --permanent 
-
-
-firewall-cmd --zone=trusted --add-source=10.10.0.0/16 --permanent 
-
-```
-
-# SSH 
-
-```shell
-# use identity
-
-# private key at
-# ~/.ssh/identity
-
-# .ssh/config
-
-Host 192.168.101.171
-  HostName 192.168.101.171
-  User thy
-  IdentityFile       ~/.ssh/identity
-
-```
-
-# SSH TUNNEL 
-
-```shell
-
-ssh -f user@ssh.server.com -L 2000:ssh.server.com:2005 -N
-
-ssh -f -L 2000:ssh.server.com:2005 user@ssh.server.com -N
-
-```
-
-
-# SSH KEY DISTRIBUTE
-
-```shell
-ssh-keygen -t rsa 
-
-
-ssh-copy-id username@node_name 
-
-
-# move id_rsa to the client 
-
-# add id_rsa.pub to authrized_keys 
-
-# on client move id_rsa to ~/.ssh 
-
-
-```
-
-# NCAT
-
-```shell
-
-apt install -y ncat 
-
-
-ncat -lvp <port> 
-
-
-ncat <addr> <port> -e /bin/bash
-```
-
-
-# AP
-
-```shell
-sudo apt-get install hostapd dnsmasq
-
-sudo vim /etc/hostapd/hostapd.conf
-```
-
-```shell
-# /etc/hostapd/hostapd.conf
-interface=wlan0
-driver=nl80211
-ssid=MyWiFiNetwork
-hw_mode=g
-channel=7
-wmm_enabled=0
-macaddr_acl=0
-auth_algs=1
-ignore_broadcast_ssid=0
-wpa=2
-wpa_passphrase=12345678
-wpa_key_mgmt=WPA-PSK
-wpa_pairwise=TKIP
-rsn_pairwise=CCMP
-```
-
-```shell
-sudo vim /etc/default/hostapd
-```
-
-```shell
-# /etc/default/hostapd
-
-DAEMON_CONF="/etc/hostapd/hostapd.conf"
-```
-
-```shell
-
-sudo systemctl unmask hostapd
-sudo systemctl enable hostapd
-sudo systemctl start hostapd
-
-
-sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.org
-
-sudo vim /etc/dnsmasq.conf
-
-```
-
-```shell
-# /etc/dnsmasq.conf
-port=5353
-interface=wlan0
-dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
-```
-```shell
-
-sudo systemctl enable hostapd
-sudo systemctl start hostapd
-sudo systemctl reload dnsmasq
-
-sudo vim /lib/systemd/system/dnsmasq.service
-```
-
-```shell
-# /lib/systemd/system/dnsmasq.service
-
-After=network-online.target
-Wants=network-online.target
-```
-
-```shell
-sudo vim /etc/netplan/50-cloud-init.yaml
-```
-
-```yaml
-network:
-    ethernets:
-        eth0:
-            dhcp4: true
-            optional: true
-        wlan0:
-            dhcp4: false
-            addresses:
-            - 192.168.4.1/24
-    version: 2
-```
-
-```shell
-sudo reboot
-
-# to internet
-
-# file
-sudo nano /etc/sysctl.d/routed-ap.conf
-# or
-sudo nano /etc/sysctl.conf
-
-# Enable IPv4 routing
-net.ipv4.ip_forward=1
-# instant enabling
-sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
-
-sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-
-# save using command
-sudo netfilter-persistent save
-# or
-sudo bash -c "iptables-save > /etc/iptables.ipv4.nat"
-
-sudo nano /etc/rc.local
-# add above exit0
-iptables-restore < /etc/iptables.ipv4.nat
-
-# or simply with iptables-save
-
-sudo iptables-save > /etc/iptables/rules.v4
-sudo ip6tables-save > /etc/iptables/rules.v6
-
-
-
-sudo reboot
-
-
-```
-
-# DHCP SERVER
-
-```shell
-sudo apt install isc-dhcp-server
-
-```
-
-```shell
-# interface
-
-sudo vim /etc/default/isc-dhcp-server
-----
-INTERFACESv4="enp0s8"
-----
-
-
-# /etc/dhcp/dhcpd.conf
-
-# comment if not using dns server
-
-#option domain-name "example.org";
-#option domain-name-servers ns1.example.org, ns2.example.org;
-
-# uncomment if the official dhcp server for the local network
-authoritative;
-# define subnet per interface
-
-subnet 10.1.1.0 netmask 255.255.255.0 {
-  range 10.1.1.3 10.1.1.254;
-}
-
-subnet 192.168.0.0 netmask 255.255.0.0 {
-}
-```
-
-```shell
-
-
-# /etc/dhcp/dhcpd.conf
-
-default-lease-time 600;
-max-lease-time 7200;
-
-# define dns server
-
-
-subnet 10.1.1.0 netmask 255.255.255.0 {
-  range 10.1.1.3 10.1.1.254;
-  option domain-name-servers 10.1.1.1, 8.8.8.8;
-}
-
-subnet 192.168.0.0 netmask 255.255.0.0 {
-}
-
-# define default gateway
-
-subnet 10.1.1.0 netmask 255.255.255.0 {
-  range 10.1.1.3 10.1.1.254;
-  option routers 10.1.1.1;
-}
-
-
-# define static ip
-host web-server {
-  hardware ethernet 00:17:a4:c2:44:22;
-  fixed-address 10.1.1.200;
-}
-
-```
-
-```shell
-sudo systemctl enable isc-dhcp-server
-sudo systemctl start isc-dhcp-server
-```
-
-```shell
-
-# to internet
-
-# file
-sudo nano /etc/sysctl.d/routed-ap.conf
-# or
-sudo nano /etc/sysctl.conf
-
-# Enable IPv4 routing
-net.ipv4.ip_forward=1
-# instant enabling
-sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
-
-sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
-
-# save using command
-sudo netfilter-persistent save
-# or
-sudo bash -c "iptables-save > /etc/iptables.ipv4.nat"
-
-sudo nano /etc/rc.local
-# add above exit0
-iptables-restore < /etc/iptables.ipv4.nat
-
-# or simply with iptables-save
-
-sudo iptables-save > /etc/iptables/rules.v4
-sudo ip6tables-save > /etc/iptables/rules.v6
-
-
-
-sudo reboot
-
-```
-
-# DNS SERVER
-
-```shell
-
-sudo apt-get install bind9
-
-# /etc/default/bind9
-
-# ipv4
-OPTIONS="-4 -u bind"
-
-# ipv6
-OPTIONS="-6 -u bind"
-
-# /etc/bind/named.conf.options
-
-acl "trusted" {
-        192.168.50.43;    # ns1 - can be set to localhost
-        192.168.50.44;    # ns2
-        192.168.50.24;  # host1
-        192.168.50.25;  # host2
-};
-
-...
-
-options {
-        directory "/var/cache/bind";
-        recursion yes;                 # enables resursive queries
-        allow-recursion { trusted; };  # allows recursive queries from "trusted" clients
-        listen-on { 192.168.50.43; };   # ns1 private IP address - listen on private network only
-        allow-transfer { none; };      # disable zone transfers by default
-
-        forwarders {
-                8.8.8.8;
-                8.8.4.4;
-        };
-};
-
-
-# /etc/bind/named.conf.local
-
-# forward
-zone "hey.example.com" {
-    type master;
-    file "/etc/bind/zones/db.hey.example.com"; # zone file path
-    allow-transfer { 192.168.50.44; };         # ns2 private IP address - secondary
-};
-
-# reverse
-
-zone "50.168.192.in-addr.arpa" {
-    type master;
-    file "/etc/bind/zones/db.192.168.50";  # 192.168.50.0/24 subnet
-    allow-transfer { 192.168.50.44; };  # ns2 private IP address - secondary
-};
-
-
-
-sudo mkdir /etc/bind/zones
-
-# forward zone
-cd /etc/bind/zones
-sudo cp ../db.local ./db.hey.example.com
-
-
-sudo vim db.hey.example.com
-
-# replace SOA first to ns1 FQDN
-# replace SOA second to admin.${domain}
-# increase serial by 1
-
-@       IN      SOA     ns1.hey.example.com. admin.hey.example.com. (
-                              3         ; Serial
-
-# delete NS, A, AAA
-
-# add NS
-
-; name servers - NS records
-    IN      NS      ns1.hey.example.com.
-    IN      NS      ns2.hey.example.com.
-
-# add A
-
-; name servers - A records
-ns1.hey.example.com.          IN      A       192.168.50.43
-ns2.hey.example.com.          IN      A       192.168.50.44
-
-; 10.128.0.0/16 - A records
-host1.hey.example.com.        IN      A      192.168.50.24
-host2.hey.example.com.        IN      A      192.168.50.25
-
-
-
-# reverse zone
-cd /etc/bind/zones
-sudo cp ../db.127 ./db.192.168.50
-
-# do the same as forward with SOA
-# but here match the serial with the forward
-@       IN      SOA     ns1.hey.example.com. admin.hey.example.com. (
-                              3         ; Serial
-
-# delete NS, PTR
-
-# add NS
-
-; name servers - NS records
-      IN      NS      ns1.hey.example.com.
-      IN      NS      ns2.hey.example.com.
-
-# add PTR
-# add PTR records for all of your servers whose IP addresses are on the subnet of the zone file that you are editing
-
-; PTR Records
-43   IN      PTR     ns1.hey.example.com.    ; 192.168.50.43
-44   IN      PTR     ns2.hey.example.com.    ; 192.168.50.44
-24   IN      PTR     host1.hey.example.com.  ; 192.168.50.24
-25   IN      PTR     host2.hey.example.com.  ; 192.168.50.25
-
-# subnet /16 example
-#; PTR Records
-#11.10   IN      PTR     ns1.nyc3.example.com.    ; 10.128.10.11
-#12.20   IN      PTR     ns2.nyc3.example.com.    ; 10.128.20.12
-#101.100 IN      PTR     host1.nyc3.example.com.  ; 10.128.100.101
-#102.200 IN      PTR     host2.nyc3.example.com.  ; 10.128.200.102
-
-
-# configuration check
-
-sudo named-checkconf
-
-# zone file check
-
-sudo named-checkzone
-
-# forward zone check
-
-sudo named-checkzone hey.example.com db.hey.example.com
-
-# reverse zone check
-
-sudo named-checkzone 50.168.192.in-addr.arpa /etc/bind/zones/db.192.168.50
-
-
-# restart to apply
-
-sudo systemctl restart bind9
-
-
-
-# dns client
-
-sudo apt install resolvconf
-
-sudo vim /etc/resolvconf/resolv.conf.d/head
-
-search hey.example.com  # your private domain
-nameserver 192.168.50.43  # ns1 private IP address
-nameserver 192.168.50.44  # ns2 private IP address
-
-# regen /etc/resolv.conf
-
-sudo resolvconf -u
-
-# or you can use netplan, interface, ip ...
-
-
-# forward lookup
-
-nslookup host1.hey.example.com
-
-# reverse lookup
-
-nslookup 192.168.50.24
-
-
-# adding new
-
-# Forward zone file: Add an “A” record for the new host, increment the value of “Serial”
-# Reverse zone file: Add a “PTR” record for the new host, increment the value of “Serial”
-# Add your new host’s private IP address to the “trusted” ACL (named.conf.options)
-
-
-# adding ns2
-
-
-# same /etc/bind/named.conf.options but change listen-on
-
-# /etc/bind/named.conf.local
-
-zone "hey.example.com" {
-    type slave;
-    file "slaves/db.hey.example.com";
-    masters { 192.168.50.43; };  # ns1 private IP
-};
-
-zone "50.168.192.in-addr.arpa" {
-    type slave;
-    file "slaves/db.192.168.50";
-    masters { 192.168.50.43; };  # ns1 private IP
-};
-
-# adding new on slave
-
-# Add your new host’s private IP address to the “trusted” ACL (named.conf.options)
-
-
-
-```
-
-# BGP BIRD
-
-```shell
-
-sudo apt update
-sudo apt install bird
-
-# on machine1
-# /etc/bird/bird.conf 
-
-router id 10.168.0.29;
-
-protocol kernel {
-  metric 0;
-  import none;
-  learn;
-  export all;
-}
-
-protocol device {
-}
-
-protocol direct {
-}
-
-protocol bgp peer2 {
-  local as 64512;
-  neighbor 10.168.0.26 as 64513;
-  import all;
-  export all;
-}
-
-# on machine2
-# /etc/bird/bird.conf
-
-router id 10.168.0.26;
-
-
-protocol kernel {
-  metric 0;
-  import none;
-  learn;
-  export all;
-
-}
-
-protocol device {
-}
-
-protocol direct {
-}
-
-protocol bgp peer1 {
-  local as 64513;
-  neighbor 10.168.0.29 as 64512;
-  import all;
-  export all;
-}
-
-# check 
-
-birdc show protocols 
-
-birdc show protocols all peer2
-
-birdc show route
-
-
-
-```
-
-
-# GRPC
-
-```shell
-# golang
-
-apt install -y protobuf-compiler
-
-apt install golang-goprotobuf-dev -y
-
-go install google.golang.org/protobuf/cmd/protoc-gen-go
-
-go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
-
-export PATH="$PATH:$(go env GOPATH)/bin"
-
-protoc --go_out=. --go_opt=paths=source_relative \
-    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
-    ./chat.proto
-```
-
-# FS MOUNT
-
-```shell
-
-
-lsblk 
-
-
-mkfs.<fs> <drive> 2>/dev/null 
-
-
-mkfs.xfs /dev/sdb 2>/dev/null 
-
-
-mkdir <dir> 
-
-
-mount <drive> <dir> 
-
-
-df 
-
-
-/etc/fstab 
-
-```
-
-
-# RAID
-
-```shell
-
-
-mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc  
-
-
-mkfs.<fs> <drive> 2>/dev/null 
-
-
-mkdir <dir> 
-
-
-mount <drive> <dir> 
-
-
-df 
-
-
-/etc/fstab 
-
-```
-
-# LVM DISK EXTENSION
-
-```shell
-
-# resize 
-
-
-sudo lvremove /dev/ubuntu-box-SOMETHING 
-
-
-sudo lvm lvextend -l +100%FREE /dev/ubuntu-box-1-vg 
-
-
-sudo resize2fs -p /dev/ubuntu-box-1-vg 
-
-
-# xfs 
-
-sudo xfs_growfs /dev/ubuntu-box-1-vg 
-
-
-# extend 
-
-
-sudo pvcreate /dev/vdb 
-
-
-sudo vgextend ubuntu-box-1-vg /dev/vdb 
-
-
-sudo lvm lvextend -l +100%FREE /dev/ubuntu-box-1-vg 
-
-
-sudo resize2fs -p /dev/ubuntu-box-1-vg 
-
-
-# xfs 
-
-sudo xfs_growfs /dev/ubuntu-box-1-vg 
-
-
-/etc/fstab 
-
-```
-
-# NFS
-
-```shell
-
-
-# on nfs server 
-
-
-sudo apt install nfs-kernel-server 
-
-
-sudo apt install nfs-common 
-
-
-mkdir -p /nfs/data 
-
-
-sudo chown nobody:nogroup /nfs/data 
-
-
-sudo vim /etc/exports   
-
-
-```
-
-```shell
-# /etc/exports   
-
-
-... 
-
-/nfs/data    <client-addr>(rw,sync,no_subtree_check)  
-
-
-```
-
-```shell
-
-exportfs -a 
-
-
-sudo systemctl restart nfs-kernel-server  
-
-
-# on nfs client 
-
-
-sudo apt install nfs-common 
-
-
-mkdir -p /nfsclient/upload 
-
-
-sudo mount <nfs-server-addr>:/nfs/data /nfsclient/upload 
-
-
-# disconnect  
-
-
-sudo umount /nfsclient/upload 
-
-
-
-```
-
-# SSHFS
-
-
-```shell
-
-sudo apt install sshfs
-
-# mount local to remote
-
-sshfs -p $PORT /data/local user@host:/data/remote
-
-# unmount 
-
-sudo umount /data/local
-
-# make permanent
-
-sudo nano /etc/fstab
-
-
-user@host:/data/remote /data/local  fuse.sshfs noauto,x-systemd.automount,_netdev,reconnect,identityfile=/home/sammy/.ssh/id_rsa,allow_other,default_permissions, port=$PORTNUMBER 0 0
-
-```
-
-
-
-
-# CHECK FILE SYSTEM FS INTEGRITY
-
-```shell
-fsck
-
-```
-
-# DD FORMAT DISK FDISK
-
-```shell
-# check disk
-
-fdisk -l
-
-
-# unmount
-
-umount /dev/sdb
-
-
-# format
-sudo dd if=/dev/zero of=/dev/sdb bs=1m
-
-# create new partition
-
-fdisk
-n
-
-# write save
-
-fdisk
-w
-
-# format iso on usb
-
-sudo dd bs=4M if=filename.iso of=/dev/sdb status=progress
-
-# format fs
-
-sudo mkfs.vfat /dev/sdb1 
-
-# eject
-
-sudo eject /dev/sdb
-```
-
-# APT
-
-```shell
-
-# hash sum mismatch
-
-sudo rm -rf /var/lib/apt/lists/*
-
-sudo apt clean
-
-sudo apt update
-
-
-```
-
-# APT KEY
-
-```shell
-
-# apt-key 
-
-
-sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys <> 
-
-
-# wget or curl 
-
-
-sudo wget -q -O /usr/share/keyrings/<>.gpg https://<>/<>.gpg 
-
-
-echo "deb [signed-by=/usr/share/keyrings/<>.gpg] https://packages.cloud.google.com/apt kubernetes-xenial" | sudo tee -a /etc/apt/sources.list.d/cloud-google.list 
-
-
-```
-
-# DB SYNC REPLICATION
-
-```shell
-
-
-
-sudo apt install mysql-server mysql-client 
-
-
-mysql_secure_installation 
-
-
-# dump 
-
-
-mysqldump -u username -p database_name > data-dump.sql 
-
-
-mysql -u username -p new_database < data-dump.sql 
-
-
-# sync 
-
-
-# master 
-
-
-sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 
-```
-
-```shell
-bind-address    =0.0.0.0 
-
-
-server-id       =1 
-
-... 
-
-log_bin = /var/log/mysql/mysql-bin.log 
-
-log_bin_index =/var/log/mysql/mysql-bin.log.index 
-
-relay_log = /var/log/mysql/mysql-relay-bin 
-
-relay_log_index = /var/log/mysql/mysql-relay-bin.index 
-```
-
-```shell
-
-sudo systemctl restart mysql 
-
-
-sudo mysql -u root -p 
-
-
-CREATE USER 'replication_user'@'*' IDENTIFIED BY 'replica_password'; 
-
-
-GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'*'; 
-
-
-SHOW MASTER STATUS\G 
-
-
-// Get File (MASTER_LOG_FILE), Position (MASTER_LOG_POS) 
-
-
-# slave 
-
-
-sudo vim  /etc/mysql/mysql.conf.d/mysqld.cnf 
-```
-
-```shell
-# /etc/mysql/mysql.conf.d/mysqld.cnf 
-
-bind-address           = 0.0.0.0 
-
-
-server-id              =2  
-
-
-log_bin = /var/log/mysql/mysql-bin.log 
-
-log_bin_index =/var/log/mysql/mysql-bin.log.index 
-
-relay_log = /var/log/mysql/mysql-relay-bin 
-
-relay_log_index = /var/log/mysql/mysql-relay-bin.index 
-
-
-```
-
-```shell
-
-sudo mysql -u root -p 
-
-
-STOP SLAVE;  
-
-
-CHANGE MASTER TO MASTER_HOST ='MASTER_IP', MASTER_USER ='replication_user', MASTER_PASSWORD ='replica_password', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 1643; 
-
-
-START SLAVE; 
-
-
-# MGR 
-
-
-uuidgen 
-
-
-sudo vim  /etc/mysql/mysql.conf.d/mysqld.cnf 
-
-```
-
-```shell
-
-[mysqld] 
-
-
-# General replication settings 
-
-disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" 
-
-gtid_mode = ON 
-
-enforce_gtid_consistency = ON 
-
-master_info_repository = TABLE 
-
-relay_log_info_repository = TABLE 
-
-binlog_checksum = NONE 
-
-log_slave_updates = ON 
-
-log_bin = binlog 
-
-binlog_format = ROW 
-
-transaction_write_set_extraction = XXHASH64 
-
-loose-group_replication_bootstrap_group = OFF 
-
-loose-group_replication_start_on_boot = OFF 
-
-loose-group_replication_ssl_mode = REQUIRED 
-
-loose-group_replication_recovery_use_ssl = 1 
-
-
-# Shared replication group configuration 
-
-loose-group_replication_group_name = "" # uuidgen value 
-
-loose-group_replication_ip_whitelist = "ip1,ip2,ip3" # group ips 
-
-loose-group_replication_group_seeds = "ip1:port,ip2:port,ip3:port" # group ips with ports # port usually 33061 
-
-
-# Single or Multi-primary mode? Uncomment these two lines 
-
-# for multi-primary mode, where any host can accept writes 
-
-#loose-group_replication_single_primary_mode = OFF  # for multi primary group uncomment 
-
-#loose-group_replication_enforce_update_everywhere_checks = ON # for multi primary group uncomment 
-
-
-# Host specific replication configuration 
-
-server_id =    # id 
-
-bind-address = "" # bind-address 
-
-report_host = "" # bind-address  
-
-loose-group_replication_local_address = "" # bind-address:port # port usually 33061 
-
-
-```
-
-```shell
-
-
-systemctl restart mysql 
-
-
-# on all members 
-
-
-mysql 
-
-
-SET SQL_LOG_BIN=0; 
-
-
-CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL; 
-
-
-GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; 
-
-
-FLUSH PRIVILEGES; 
-
-
-SET SQL_LOG_BIN=1; 
-
-
-CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; 
-
-# or 
-
-CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; 
-
-
-INSTALL PLUGIN group_replication SONAME 'group_replication.so'; 
-
-
-# on one member (maybe first) 
-
-
-SET GLOBAL group_replication_bootstrap_group=ON; 
-
-
-START GROUP_REPLICATION; 
-
-
-SET GLOBAL group_replication_bootstrap_group=OFF; 
-
-
-# on the other members 
-
-
-START GROUP_REPLICATION; 
-
-
-```
-
-# MONGODB
-
-```shell
-
-curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add - 
-
-
-echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list 
-
-
-sudo apt update 
-
-
-sudo apt install mongodb-org 
-
-
-mkdir -p ~/data/db 
-
-
-sudo mongod --dbpath ~/data/db 
-
-
-```
-
-
-# CHROME
-
-```shell
-
-# download .deb 
-
-
-sudo apt install ./<file>.deb 
-
-
-```
-
-
-# VSCODE
-
-```shell
-# download .deb 
-
-
-sudo apt install ./<file>.deb 
-```
-
-# GOLANG
-
-```shell
-curl -OL https://golang.org/dl/go1.16.7.linux-amd64.tar.gz 
-
-
-sudo tar -C /usr/local -xvf go1.16.7.linux-amd64.tar.gz 
-
-
-sudo nano ~/.profile 
-
-
-```
-
-```shell
-. . . 
-
-export PATH=$PATH:/usr/local/go/bin 
-```
-
-```shell
-source ~/.profile 
-
-```
-
-```shell
-
-# private module
-
-# $HOME/.gitconfig
-
-[url "https://${ID}:${PW}@private.git.com"]
-        insteadOf = https://private.git.com
-
-# or
-
-git config --global url."https://${ID}:${PW}@private.git.com".insteadOf "https://private.git.com"
-
-export GONOPROXY=private.git.com
-export GONOSUMDB=private.git.com
-export GOPRIVATE=private.git.com
-
-# subgroup
-
-git config --global url."https://${ID}:${PW}@private.git.com/sub".insteadOf "https://private.git.com/sub"
-
-export GONOPROXY=private.git.com/sub
-export GONOSUMDB=private.git.com/sub
-export GOPRIVATE=private.git.com/sub
-
-```
-
-# JMETER
-
-```shell
-
-# install openjdk
-
-# create thread group
-
-# add sampler
-
-jmeter -n -t <ThreadGroup.jmx> -l <report.csv> -e -o <report>
-
-```
-
-# CRYPTO
-
-```shell
-
-openssl
-
-
-# issuer(ca) keygen
-
-openssl genrsa -out ca_priv.pem 2048
-
-openssl rsa -in ca_priv.pem -outform PEM -pubout -out ca_pub.pem
-
-# ec 
-
-openssl genpkey -algorithm ed25519 -out ./certs/ca_priv.pem 
-
-openssl pkey -in ./certs/ca_priv.pem -outform PEM -pubout -out ./certs/ca_pub.pem
-
-# gencert
-
-openssl req -x509 -new -key ca_priv.pem -days 365 -out ca.crt -subj "/CN=issuerforseantywork.com"
-
-
-# subject(issuer) keygen
-
-openssl genrsa -out sub_priv.pem 2048
-
-openssl rsa -in sub_priv.pem -outform PEM -pubout -out sub_pub.pem
-
-# ec
-
-openssl genpkey -algorithm ed25519 -out ./certs/server.key 
-
-openssl pkey -in ./certs/server.key -outform PEM -pubout -out ./certs/server.pub
-
-
-
-# subject csr
-
-openssl req -key sub_priv.pem -new -sha256 -out sub.csr -subj "/CN=subjectforseantywork.com"
-
-# issuer signing
-
-openssl  x509 -req -days 180 -in sub.csr -CA ca.crt -CAkey ca_priv.pem -CAcreateserial -sha256 -out sub.crt
-
-# issuer signing with sans
-
-openssl  x509 -req -extfile <(printf "subjectAltName = DNS:some.thing") -days 180 -in sub.csr -CA ca.crt -CAkey ca_priv.pem -CAcreateserial -sha256 -out sub.crt
-
-# read csr, certificate
-
-openssl x509 -in <csr,crt> -text -noout
-
-# verify subject cert against issuer cert
-
-openssl verify -CAfile ca.crt sub.crt
-
-
-# ca extension
-
-
-CONFIG="[ v3_req ]\n" && \
-CONFIG="${CONFIG}subjectKeyIdentifier=hash\n" && \
-CONFIG="${CONFIG}authorityKeyIdentifier=keyid:always,issuer\n" && \
-CONFIG="${CONFIG}basicConstraints=CA:TRUE\n" && \
-CONFIG="${CONFIG}keyUsage=keyCertSign,cRLSign\n" && \
-openssl req -new -x509 -days 3650 \
-       -sha256 -key root.key \
-       -out root.crt \
-       -subj "/CN=ROOT CA" \
-       -config <(printf "${CONFIG}") \
-       -extensions v3_req 
-
-
-# cert extension
-
-EXTFILE="subjectKeyIdentifier=hash\n" && \
-EXTFILE="${EXTFILE}authorityKeyIdentifier=keyid,issuer\n" && \
-EXTFILE="${EXTFILE}basicConstraints=CA:FALSE\n" && \
-EXTFILE="${EXTFILE}subjectAltName=email:copy\n" && \
-EXTFILE="${EXTFILE}extendedKeyUsage=serverAuth\n" && \
-openssl  x509 -req -days 365 \
-       -in ./server.csr \
-       -extfile <(printf "${EXTFILE}") \
-       -CA ./root.crt \
-       -CAkey ./root.key \
-  -sha256 \
-       -out ./server.crt 
-
-
-
-# x509
-
- certificate and public key send, root ca on the authenticate requester side, chained authentication
-
- if done, use the pub key to send symmetric key
-
-# gpg
-
-gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
-
-gpg --output un_encrypted.data --decrypt encrypted.data
-
-
-# john
-
-./john --format=raw-MD5-opencl --wordlist=../passwords.txt --rules ../md5.txt
-
-# hashcat
-
-./hashcat.bin -m 17400 ../sha3_256.txt ../passwords.txt -r ../password_rule.rule -w 3 --force
-
-
-
-
-# quantum safe
-
-# get suitable openssl
-
-OSSLV="openssl-3.4.1"
-
-
-curl -L "https://github.com/openssl/openssl/releases/download/openssl-$OSSLV/openssl-$OSSLV.tar.gz" -o "openssl-$OSSLV.tar.gz"
-
-tar -zxf "openssl-$OSSLV.tar.gz"
-
-cd "openssl-$OSSLV"
-
-./config
-
-make
-
-make test
-
-sudo make install
-
-sudo ldconfig /usr/local/lib64/
-
-# get oqs
-
-LIBOQSV="0.12.0"
-OQSPROVV="0.8.0"
-
-rm -rf liboqs* oqs-provider* *.tar.gz
-
-sudo apt update 
-
-sudo apt install astyle cmake gcc ninja-build python3-pytest python3-pytest-xdist unzip xsltproc doxygen graphviz python3-yaml valgrind
-
-curl -L https://github.com/open-quantum-safe/liboqs/archive/refs/tags/$LIBOQSV.tar.gz -o $LIBOQSV.tar.gz
-
-
-curl -L https://github.com/open-quantum-safe/oqs-provider/archive/refs/tags/$OQSPROVV.tar.gz -o $OQSPROVV.tar.gz
-
-
-tar xzf $LIBOQSV.tar.gz
-
-tar xzf $OQSPROVV.tar.gz
-
-mv "liboqs-$LIBOQSV" liboqs
-
-mv "oqs-provider-$OQSPROVV" oqs-provider
-
-pushd liboqs
-
-mkdir build 
-
-pushd build 
-
-cmake -GNinja .. 
-
-ninja 
-
-sudo ninja install
-
-popd 
-
-popd 
-
-pushd oqs-provider
-
-cmake -S . -B _build && cmake --build _build && ctest --test-dir _build && sudo cmake --install _build
-
-popd
-
-# add below to /usr/local/ssl/openssl.cnf
-
-openssl_conf = openssl_init
-
-[openssl_init]
-providers = provider_sect
-
-[provider_sect]
-oqsprovider = oqsprovider_sect
-default = default_sect
-fips = fips_sect
-
-[default_sect]
-activate = 1
-
-[fips_sect]
-activate = 1
-
-[oqsprovider_sect]
-activate = 1
-
-
-# check
-
-openssl list -providers
-
-
-
-# pq certgen
-
-openssl req -x509 -new -newkey dilithium3 -keyout dilithium3_CA.key -out dilithium3_CA.crt -nodes -subj "/CN=test CA" -days 365
-
-openssl genpkey -algorithm dilithium3 -out dilithium3_srv.key
-
-openssl req -new -newkey dilithium3 -keyout dilithium3_srv.key -out dilithium3_srv.csr -nodes -subj "/CN=test server" 
-
-openssl x509 -req -in dilithium3_srv.csr -out dilithium3_srv.crt -CA dilithium3_CA.crt -CAkey dilithium3_CA.key -CAcreateserial -days 365
-
-
-# server test
-
-openssl s_server -port 9999 -cert dilithium3_srv.crt -key dilithium3_srv.key -tls1_3 -groups frodo640shake
-
-# client test 
-
-openssl s_client -connect 192.168.64.6:9999 -CAfile certs/dilithium3_ca.crt -groups frodo640shake
-```
-
-
-
-# DOCKER INSTALL
-
-```shell
-
-
-apt remove docker docker-engine docker.io containerd runc 
-
-apt update 
-
-apt install \ 
-
-    ca-certificates \ 
-
-    curl \ 
-
-    gnupg \ 
-
-    lsb-release 
-
-mkdir -p /etc/apt/keyrings 
-
-curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 
-
-echo \ 
-
-  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ 
-
-  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 
-
-apt update 
-
-apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin 
-
-```
-
-# INSTALL DOCKER-COMPOSE
-
-```shell
-
-curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
-
-chmod +x /usr/local/bin/docker-compose 
-
-
-```
-
-# PODMAN
-
-```shell
-
-sudo apt-get install -y podman
-
-sudo apt-get install -y podman-compose
-
-# /etc/containers/registries.conf
-
-unqualified-search-registries = ["docker.io"]
-
-
-
-
-```
-
-
-# PREPARE DOCKER IMAGE
-
-```shell
-
-
-
-docker-compose up  
-
-
-docker-compose down 
-
-
-docker login 
-
-
-docker tag IMAGEID seantywork/NAME 
-
-
-docker push seantywork/NAME
-
-```
-
-# DOCKER PRIVATE
-
-```shell
-
-docker login <address:port> 
-```
-
-
-# DOCKER 
-
-```shell
-
-
-# in case of podman
-
-
-vim ~/.config/containers/registries.conf
-
-unqualified-search-registries = ["docker.io"]
-
-
-# login
-
-docker login
-
-# logout 
-
-docker logout
-
-# pull 
-
-docker pull image:tag
-
-# tag 
-
-docker tag orgimg/test newimg/test 
-
-# push 
-
-docker push newimg/test
-
-# build 
-
-docker build -t image-name:tag .
-
-# export 
-
-docker save localhost/image-name:latest -o test.tar.gz
-
-# import 
-
-docker load -i test.tar.gz
-
-# util
-
-docker image ...
-docker container ...
-docker network ...
-docker volume ... 
-
-# network
-
-docker network create --driver=bridge cbr0
-
-# network ls
-
-docker network ls
-
-# network rm 
-
-docker network rm cbr0
-
-# run with name
-
-docker run --rm --name name0  -p 8080:80 localhost/image-name
-
-# run with network
-
-docker run --rm --network cbr0  -p 8080:80 localhost/image-name
-
-# run with port
-
-docker run --rm -p 8080:80 localhost/image-name
-
-# run with volume
-
-docker run --rm -v ./local:/workspace localhost/image-name
-
-# run detached
-
-docker run --rm -d localhost/image-name
-
-# run with command
-
-docker run --rm -t -v ./local:/usr/workspace localhost/image-name /bin/bash -c 'cd test && ./hello.sh'
-
-# run with interactive 
-
-docker run --rm -it -v ./local:/usr/workspace localhost/image-name /bin/bash -c 'cd test && ./hello.sh'
-
-# run with environment 
-
-docker run --rm -e MYENV=hello localhost/image-name
-
-
-# exec
-
-docker exec -it container /bin/bash
-
-# stop 
-
-docker stop container
-
-```
-
-
-# DOCKER-COMPOSE
-
-```shell
-
-# build, name, port,  
-
-# image , volume, runtime 
-
-```
-
-
-# DOCKER REMOTE
-
-```shell
-
-
-
-# on docker daemon host 
-
-
-ssh-keygen 
-
-
-# move id_rsa to the client 
-
-# add id_rsa.pub to authrized_keys 
-
-# on client move id_rsa to ~/.ssh 
-
-
-docker -H ssh://user@host <command> 
-
-
-```
-
-# DOCKER REMOTE CONTEXT
-
-```shell
-
-
-docker context create \ 
-
-    --docker host=ssh://user@host \ 
-
-    docker-remote 
-
-
-docker context use docker-remote 
-
-
-docker context use default 
-
-```
-
-
-# KIND INSTALL
-
-```shell
-
-
-curl -Lo ./kind "https://kind.sigs.k8s.io/dl/v0.14.0/kind-$(uname)-amd64" 
-
-
-chmod +x ./kind 
-
-
-sudo mv ./kind /usr/local/bin/ 
-
-```
-
-
-
-
-# JOIN TOKEN CREATION
-
-```shell
-kubeadm token create --print-join-command 
-
-```
-
-
-# WORKER NODE JOIN
-
-```shell
-
-sudo kubeadm join 10.128.0.37:6443 --token j4eice.33vgvgyf5cxw4u8i \ 
-
-    --discovery-token-ca-cert-hash sha256:37f94469b58bcc8f26a4aa44441fb17196a585b37288f85e22475b00c36f1c61 
-
-
-```
-
-
-# LABEL WORKER
-
-
-```shell
-sudo kubectl label node worker-node01  node-role.kubernetes.io/worker=worker 
-
-
-sudo kubectl label node worker-node01  ingress-ready=true 
-
-
-
-```
-
-
-# IN CASE OF DNS MESSED UP
-
-```shell
-
-
-sudo kubectl -n kube-system rollout restart deployment coredns 
-
-
-```
-
-
-# MASTER NODE SCHEDULING
-
-
-```shell
-kubectl taint nodes --all node-role.kubernetes.io/master- 
-
-# or
-
-sudo kubectl taint node <master> node-role.kubernetes.io/control-plane:NoSchedule-
-
-sudo kubectl taint node <master> node-role.kubernetes.io/master:NoSchedule-
-
-
-```
-
-# PREVENT SCHEDULING
-
-
-```shell
-sudo kubectl cordon <node> 
-
-
-```
-
-
-# TEAR DOWN CLUSTER
-
-
-```shell
-
-sudo kubectl drain <node> --delete-local-data --force --ignore-daemonsets 
-
-```
-
-
-# RE-SCHEDULE NODE
-
-```shell
-sudo kubectl uncordon <node> 
-
-```
-
-# ON EACH NODE
-
-```shell
-
-sudo kubeadm reset 
-```
-
-# HA CLUSTER
-
-
-```shell
-
-sudo apt-get update 
-
-sudo apt-get install haproxy 
-
-
-sudo vim /etc/haproxy/haproxy.cfg 
-
-```
-
-```shell
-# /etc/haproxy/haproxy.cfg 
-
-
-
-global 
-
-... 
-
-default 
-
-... 
-
-frontend kubernetes 
-
-bind <kube-lb-domain-or-ip>:<kube-lb-port> # *:<kube-lb-port> 
-
-option tcplog 
-
-mode tcp 
-
-#default_backend kubernetes-master-nodes 
-
-
-
-#acl kubernetes-master-rule hdr(host) -i k8s.cluster.com 
-
-
-
-#use_backend kubernetes-master-nodes if kubernetes-master-rule 
-
-
-
-backend kubernetes-master-nodes 
-
-mode tcp 
-
-balance roundrobin 
-
-option tcp-check 
-
-server k8s-master-0 <kube-master-0>:6443 check fall 3 rise 2 
-
-server k8s-master-1 <kube-master-1>:6443 check fall 3 rise 2 
-
-server k8s-master-2 <kube-master-2>:6443 check fall 3 rise 2 
-
-```
-
-```shell
-
-
-sudo systemctl restart haproxy 
-
-
-
-# same wj.sh on all nodes 
-
-
-# different mj.sh on the first master node 
-
-
-sudo kubeadm init --apiserver-advertise-address=$MASTER_IP --apiserver-cert-extra-sans="$MASTER_IP,$KUBELBADDR" --pod-network-cidr=$POD_CIDR --control-plane-endpoint "$KUBELBADDR:$KUBELBPORT"  --node-name "$NODENAME" --ignore-preflight-errors Swap 
-
-```
-
-# SCP CERTS
-
-
-```shell
-
-
-USER=<user-on-host> # customizable 
-
-# Set the control_plane_ips to all other master node ips or hostnames 
-
-CONTROL_PLANE_IPS="<addr1> <addr2>" 
-
-for host in ${CONTROL_PLANE_IPS}; do 
-
-    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host: 
-
-    scp /etc/kubernetes/pki/ca.key "${USER}"@$host: 
-
-    scp /etc/kubernetes/pki/sa.key "${USER}"@$host: 
-
-    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host: 
-
-    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host: 
-
-    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host: 
-
-    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt 
-
-    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key 
-
-    scp /etc/kubernetes/admin.conf "${USER}"@$host: 
-
-done 
-
-
-
-```
-
-
-# MV CERTS ON EACH MASTER NODE
-
-
-```shell
-
-
-USER=<user-on-host> # customizable 
-
-mkdir -p /etc/kubernetes/pki/etcd 
-
-mv /home/${USER}/ca.crt /etc/kubernetes/pki/ 
-
-mv /home/${USER}/ca.key /etc/kubernetes/pki/ 
-
-mv /home/${USER}/sa.pub /etc/kubernetes/pki/ 
-
-mv /home/${USER}/sa.key /etc/kubernetes/pki/ 
-
-mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/ 
-
-mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/ 
-
-mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt 
-
-mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key 
-
-mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf 
-
-
-```
-
-
-# JOIN MASTER NODE
-
-
-```shell
-
-
-sudo kubeadm join 10.128.0.37:6443 --token j4eice.33vgvgyf5cxw4u8i \ 
-
-    --discovery-token-ca-cert-hash sha256:37f94469b58bcc8f26a4aa44441fb17196a585b37288f85e22475b00c36f1c61 \ 
-
-    --control-plane --node-name <name> 
-
-
-# admin.conf -> .kube/config 
-```
-
-
-# JOIN WORKER NODE
-
-
-```shell
-sudo kubeadm join 10.128.0.37:6443 --token j4eice.33vgvgyf5cxw4u8i \ 
-
-    --discovery-token-ca-cert-hash sha256:37f94469b58bcc8f26a4aa44441fb17196a585b37288f85e22475b00c36f1c61 \ 
-
-    --node-name <name> 
-
-
-
-```
-
-# CNIS
-
-
-```shell
-
-kubectl apply -f  <CNI> ex) https://docs.projectcalico.org/manifests/calico.yaml , "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" , https://raw.githubusercontent.com/aojea/kindnet/master/install-kindnet.yaml 
-
-```
-
-
-# KIND RUN
-
-
-```yaml
-
-# Kind yaml structure example
-
-
-
-kindcluster.yaml 
-
-
-kind: Cluster 
-
-
-apiVersion: kind.x-k8s.io/v1alpha4 
-
-
-nodes: 
-
-
- - role: control-plane 
-
-     kubeadmConfigPatches: 
-
-  - | 
-
-    kind: InitConfiguration 
-
-    nodeRegistration: 
-
-      kubeletExtraArgs: 
-
-        node-labels: "ingress-ready=true" 
-
-  extraPortMappings: 
-
-  - containerPort: 80 
-
-    hostPort: 80 
-
-    protocol: TCP 
-
-  - containerPort: 443 
-
-    hostPort: 443 
-
-    protocol: TCP 
-
- - role: worker 
-
-
- - role: worker
-```
-
-```shell
-kind create cluster --name kindcluster --config ./kindcluster.yaml --image=kindest/node:v1.21.12 
-
-```
-
-# KUBECTL DEPLOYMENT
-
-
-```shell
-kubectl apply -f <yamls> 
-```
-
-# PORT FORWARD
-
-```shell
-kubectl port-forward resource/name port
-```
-
-
-# KUBECTL INGRESS
-
-
-```shell
-kubectl label node <node> ingress-ready=true 
-
-
-kubectl apply -f <controller> ex) https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml 
-
-
-kubectl apply -f ingress.yaml 
-
-
-```
-
-# TLS INGRESS NEED SECRET
-
-
-```shell
-
-
-# self singed certs 
-
-
-openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=localhost" 
-
-
-kubectl create secret tls --save-config tls-openssl --key ./tls.key --cert ./tls.crt 
-
-
-# include $HOME .kube config -- remote kubectl and switching 
-
-
-kubectl config use-context <context-name
-
-```
-
-
-# TURNING OFF
-
-```shell
-
-kubectl delete --all ingress, services, deployments 
-
-
-kind delete cluster --name NAME 
-
-
-docker system prune -a  
-
-```
-
-
-# CHECK
-
-
-```shell
-systemctl status docker 
-
-systemctl status kubelet 
-
-```
-
-# SECRET REG
-
-
-```shell
-
-kubectl create secret generic <regcred> \ 
-
-    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ 
-
-    --type=kubernetes.io/dockerconfigjson 
-
-
-kubectl create secret docker-registry <pull_secret_name> \ 
-
-    --docker-server=<registry_server> \ 
-
-    --docker-username=<user_name> \ 
-
-    --docker-password=<password> \ 
-
-```
-
-
-# K8S COMPONENTS
-
-```shell
-
-
-ingress controller -> ingress -> svc 
-
-svc -> dpl, stf  
-
-secret -> tls, reg -> cert&key, credentials 
-
-vol -> pv[k8sdiskpath], storageclass -> stf, volmount[containerpath] = volclaim = storageclass 
-
-```
-
-# DEPLOYMENT EXAMPLE
-
-
-```yaml
-apiVersion: apps/v1 
-
-kind: Deployment 
-
-metadata: 
-
-  name: db 
-
-spec: 
-
-  selector: 
-
-    matchLabels: 
-
-      app: db 
-
-  replicas: 1 
-
-  template: 
-
-    metadata: 
-
-      labels: 
-
-        app: db 
-
-    spec: 
-
-      imagePullSecrets: 
-
-        - name: docker-secret 
-
-      containers: 
-
-        - name: db 
-
-          image: seantywork/db 
-
-          ports: 
-
-          - containerPort: 3306 
-
-```
-
-
-# SERVICE EXAMPLE
-
-
-```yaml
-
-apiVersion: v1 
-
-kind: Service 
-
-metadata: 
-
-  name: db 
-
-  labels: 
-
-    app: db 
-
-spec: 
-
-  type: ClusterIP 
-
-  ports: 
-
-  - port: 3306 
-
-    targetPort: 3306 
-
-    protocol: TCP 
-
-  selector: 
-
-    app: db 
-
-```
-
-
-# SERVICE IN DIFFERENT NAMESPACE
-
-
-```shell
-
-<serivce_name>.<namespace_name> 
-```
-
-# NODE SELECTOR & AFFINITY
-
-
-```yaml
-
-
-apiVersion: v1 
-
-kind: Pod 
-
-
-.... 
-
-
-spec: 
-
-  nodeSelector:  
-
-    region: east 
-
-    type: user-node 
-
-```
-
-
-```yaml
-
-apiVersion: v1 
-
-kind: Pod 
-
-metadata: 
-
-  name: with-node-affinity 
-
-spec: 
-
-  affinity: 
-
-    nodeAffinity: 
-
-      requiredDuringSchedulingIgnoredDuringExecution: 
-
-        nodeSelectorTerms: 
-
-        - matchExpressions: 
-
-          - key: topology.kubernetes.io/zone 
-
-            operator: In 
-
-            values: 
-
-            - antarctica-east1 
-
-            - antarctica-west1 
-
-
-
-```
-
-
-# ENV
-
-
-```yaml
-apiVersion: apps/v1 
-
-kind: Deployment 
-
-
-.... 
-
-
-
-    spec: 
-
-      containers: 
-
-        - name: kibana 
-
-          image: docker.elastic.co/kibana/kibana:7.11.0 
-
-          env: 
-
-          - name: ELASTICSEARCH_HOSTS 
-
-            value: http://elasticsearch:9200 
-
-          imagePullPolicy: Always 
-
-          ports: 
-
-          - containerPort: 5601 
-
-
-```
-
-
-# COMMAND
-
-
-```yaml
-
-.... 
-
-
-containers: 
-
-  - name: mysqldump 
-
-    image: mysql 
-
-    command: ["/bin/sh", "-c"] 
-
-    args: 
-
-      - echo starting; 
-
-        ls -la /backups; 
-
-        mysqldump --host=... -r /backups/file.sql db_name; 
-
-        ls -la /backups; 
-
-        echo done; 
-
-    volumeMounts: 
-
-      - ... 
-
-
-```
-
-# NODEPORT
-
-
-```yaml
-kind: Service
-apiVersion: v1
-metadata:
-  name: nodeport-test
-spec:
-  type: NodePort
-  selector:
-    app: tgtraffic
-  ports:
-    - nodePort: 30505
-      port: 5005
-      targetPort: 5005
-
-```
-
-# INGRESS
-
-```yaml
-
-apiVersion: networking.k8s.io/v1 
-
-kind: Ingress 
-
-metadata: 
-
-  name: ingress 
-
-spec: 
-
-  tls: 
-
-  - hosts: 
-
-    - usagecorpus.com 
-
-    secretName: uc-tls-secret 
-
-  - hosts: 
-
-    - www.usagecorpus.com 
-
-    secretName: uc-tls-secret 
-
-  - hosts: 
-
-    - ptt.usagecorpus.com 
-
-    secretName: ptt-tls-secret 
-
-  rules: 
-
-  - host: "usagecorpus.com" 
-
-    http: 
-
-      paths: 
-
-        - path: / 
-
-          pathType: Prefix 
-
-          backend: 
-
-            service: 
-
-              name: traffic 
-
-              port: 
-
-                number: 5005 
-
-  - host: "www.usagecorpus.com" 
-
-    http: 
-
-      paths: 
-
-        - path: / 
-
-          pathType: Prefix 
-
-          backend: 
-
-            service: 
-
-              name: traffic 
-
-              port: 
-
-                number: 5005 
-
-  - host: "ptt.usagecorpus.com" 
-
-    http: 
-
-      paths: 
-
-        - path: / 
-
-          pathType: Prefix 
-
-          backend: 
-
-            service: 
-
-              name: trafficph 
-
-              port: 
-
-                number: 5006 
-
-
-```
-
-
-# CONFIGMAP
-
-
-```yaml
-
-apiVersion: v1
-data:
-  allow-snippet-annotations: "true"
-  use-forwarded-headers: "true"
-  compute-full-forwarded-for: "true"
-  keep-alive: "20"
-kind: ConfigMap
-metadata:
-  annotations:
-    kubectl.kubernetes.io/last-applied-configuration: |
-      {"apiVersion":"v1","data":{"allow-snippet-annotations":"true","use-forwarded-headers":"true"},"kind":"ConfigMap","metadata":{"annotations":{},"creationTimestamp":"2022-11-23T07:56:59Z","labels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/part-of":"ingress-nginx","app.kubernetes.io/version":"1.5.1"},"name":"ingress-nginx-controller","namespace":"ingress-nginx","resourceVersion":"383","uid":"08673e9a-bdba-4a5a-9dda-a7f470d6214e"}}
-  creationTimestamp: "2022-11-23T07:56:59Z"
-  labels:
-    app.kubernetes.io/component: controller
-    app.kubernetes.io/instance: ingress-nginx
-    app.kubernetes.io/name: ingress-nginx
-    app.kubernetes.io/part-of: ingress-nginx
-    app.kubernetes.io/version: 1.5.1
-  name: ingress-nginx-controller
-  namespace: ingress-nginx
-  resourceVersion: "24225834"
-  uid: 08673e9a-bdba-4a5a-9dda-a7f470d6214e
-```
-
-```yaml
-
-
-apiVersion: v1 
-
-kind: ConfigMap 
-
-metadata: 
-
-  namespace: logging 
-
-  name: elasticsearch-data-config 
-
-  labels: 
-
-    app: elasticsearch 
-
-    role: data 
-
-data: 
-
-  elasticsearch.yml: |- 
-
-    cluster.name: ${CLUSTER_NAME} 
-
-    node.name: ${NODE_NAME} 
-
-    discovery.seed_hosts: ${NODE_LIST} 
-
-    cluster.initial_master_nodes: ${MASTER_NODES} 
-
-    network.host: 0.0.0.0 
-
-    node: 
-
-      master: false 
-
-      data: true 
-
-      ingest: false 
-
-    xpack.security.enabled: true 
-
-    xpack.monitoring.collection.enabled: true 
-
-
-```
-
-
-```shell
-
-# create
-
-
-kubectl create configmap ${CONFIGMAP_NAME} --from-file=${FILE} --from-file=${FILE}
-
-
-```
-
-
-```shell
-# mount
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: clusterdebugger
-spec:
-  selector:
-    matchLabels:
-      app: clusterdebugger
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: clusterdebugger
-    spec:
-      imagePullSecrets:
-        - name: harbor-secret
-      containers:
-        - name: clusterdebugger
-          image: harbor.mipllab.com/library/clusterdebugger
-          volumeMounts:
-          - mountPath: /tmp
-            name: debugger-mount
-          imagePullPolicy: Always
-          ports:
-          - containerPort: 6700
-      volumes:
-      - name: debugger-mount
-        configMap: 
-          name: debugger-mount
-          items:
-            - key: usercontent.c
-              path: usercontent.c
-            - key: usercontent.input
-              path: usercontent.input
-
-```
-
-
-
-# SECRET EXAMPLE (TLS)
-
-```shell
-apiVersion: v1 
-
-data: 
-
-  tls.crt: ./tls.crt 
-
-  tls.key: ./tls.key 
-
-kind: Secret 
-
-metadata: 
-
-  name: uc-tls-secret 
-
-  namespace: default 
-
-type: kubernetes.io/tls 
-
-```
-
-# ANNOTATION
-
-```yaml
-
-apiVersion: networking.k8s.io/v1 
-
-kind: Ingress 
-
-metadata: 
-
-  name: minimal-ingress 
-
-  annotations: 
-    nginx.ingress.kubernetes.io/proxy-body-size: "0"
-    nginx.ingress.kubernetes.io/proxy-http-version : "1.1"
-    nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
-    nginx.ingress.kubernetes.io/proxy-buffering: "off"
-    nginx.ingress.kubernetes.io/rewrite-target: / 
-
-spec: 
-
-  ingressClassName: nginx-example 
-
-  rules: 
-
-  - http: 
-
-      paths: 
-
-      - path: /testpath 
-
-        pathType: Prefix 
-
-        backend: 
-
-          service: 
-
-            name: test 
-
-            port: 
-
-              number: 80 
-
-
-```
-
-# DEPLOYMENT EXAMPLE (VOLUME)
-
-
-```yaml
-
-apiVersion: apps/v1 
-
-kind: Deployment 
-
-metadata: 
-
-  name: db 
-
-spec: 
-
-  selector: 
-
-    matchLabels: 
-
-      app: db 
-
-  replicas: 1 
-
-  template: 
-
-    metadata: 
-
-      labels: 
-
-        app: db 
-
-    spec: 
-
-      imagePullSecrets: 
-
-        - name: docker-secret 
-
-      volumes: 
-
-        - name: db-pv-storage 
-
-          persistentVolumeClaim: 
-
-            claimName: dbpvc 
-
-      containers: 
-
-        - name: db 
-
-          image: seantywork/db 
-
-          ports: 
-
-          - containerPort: 3306 
-
-          volumeMounts: 
-
-          - mountPath: "/var/lib/mysql" 
-
-            name: db-pv-storage 
-
-```
-
-# STATEFULSET EXAMPLE
-
-
-```yaml
-apiVersion: apps/v1 
-
-kind: StatefulSet 
-
-metadata: 
-
-  name: dbstf 
-
-spec: 
-
-  selector: 
-
-    matchLabels: 
-
-      app: dbstf 
-
-  serviceName: "dbstf" 
-
-  replicas: 1 
-
-  template: 
-
-    metadata: 
-
-      labels: 
-
-        app: dbstf 
-
-    spec: 
-
-      terminationGracePeriodSeconds: 10 
-
-      containers: 
-
-      - name: dbstf 
-
-        image: seantywork/db 
-
-        ports: 
-
-        - containerPort: 3306 
-
-        volumeMounts: 
-
-        - name: dbpvc 
-
-          mountPath: /var/lib/mysql 
-
-  volumeClaimTemplates: 
-
-  - metadata: 
-
-      name: dbpvc 
-
-    spec: 
-
-      accessModes: ["ReadWriteOnce"] 
-
-      storageClassName: "manual" 
-
-      resources: 
-
-        requests: 
-
-          storage: 3Gi 
-
-
-```
-
-# STORAGECLASS EXAMPLE (DEFAULT)
-
-```shell
-
-kind: StorageClass 
-
-apiVersion: storage.k8s.io/v1 
-
-metadata: 
-
-  annotations: 
-
-    storageclass.kubernetes.io/is-default-class: "true" 
-
-  name: pv2-local-storageclass 
-
-provisioner: kubernetes.io/no-provisioner 
-
-volumeBindingMode: WaitForFirstConsumer 
-
-```
-
-
-# STORAGECLASS EXAMPLE (DEFAULT NFS)
-
-```shell
-
-helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ 
-
-
-helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ 
-
-    --set nfs.server=x.x.x.x \ 
-
-    --set nfs.path=/exported/path 
-
-# yaml
-```
-
-```yaml
-kind: StorageClass 
-
-apiVersion: storage.k8s.io/v1 
-
-metadata: 
-
-  annotations: 
-
-    storageclass.kubernetes.io/is-default-class: "true" 
-
-  name: nfs-default-storageclass 
-
-provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # cluster.local/nfs-subdir-external-provisioner 
-
-allowVolumeExpansion: true 
-
-volumeBindingMode: Immediate 
-
-```
-
-# PERSISTENT VOLUME EXAMPLE (HOSTPATH)
-
-```yaml
-
-apiVersion: v1 
-
-kind: PersistentVolume 
-
-metadata: 
-
-  name: dbpv 
-
-  labels: 
-
-    type: local 
-
-spec: 
-
-  storageClassName: manual 
-
-  capacity: 
-
-    storage: 10Gi 
-
-  accessModes: 
-
-    - ReadWriteOnce 
-
-  hostPath: 
-
-    path: "/home/styw/project/k8s/vol_host" 
-
-```
-
-# PERSISTENT VOLUME EXAMPLE (LOCALSTORAGE) 
-
-```yaml
-
-apiVersion: v1 
-
-kind: PersistentVolume 
-
-metadata: 
-
-  name: pv1-local 
-
-spec: 
-
-  capacity: 
-
-    storage: 64Gi 
-
-  accessModes: 
-
-  - ReadWriteOnce 
-
-  persistentVolumeReclaimPolicy: Recycle 
-
-  storageClassName: local-storage 
-
-  local: 
-
-    path: /data/volumes/pv1 
-
-  nodeAffinity: 
-
-    required: 
-
-      nodeSelectorTerms: 
-
-      - matchExpressions: 
-
-        - key: kubernetes.io/hostname 
-
-          operator: In 
-
-          values: 
-
-          - worker1-lw 
-
-```
-
-# PERSISTENT VOLUME EXAMPLE (NFS) 
-
-```yaml
-apiVersion: v1 
-
-kind: PersistentVolume 
-
-metadata: 
-
-  name: dbpv 
-
-spec: 
-
-  capacity: 
-
-    storage: 10Gi 
-
-  volumeMode: Filesystem 
-
-  accessModes: 
-
-    - ReadWriteMany 
-
-  persistentVolumeReclaimPolicy: Recycle 
-
-  storageClassName: nfs 
-
-  mountOptions: 
-
-    - hard 
-
-    - nfsvers=4.1 
-
-  nfs: 
-
-    path: /opt/k8s-pods/data 
-
-    server: 192.168.1.40 
-
-
-```
-
-# PERSISTENT VOLUME CLAIM EXAMPLE (HOSTPATH) 
-
-```yaml
-
-apiVersion: v1 
-
-kind: PersistentVolumeClaim 
-
-metadata: 
-
-  name: dbpvc 
-
-spec: 
-
-  storageClassName: manual 
-
-  accessModes: 
-
-    - ReadWriteOnce 
-
-  resources: 
-
-    requests: 
-
-      storage: 3Gi 
-
-```
-
-# PERSISTENT VOLUME CLAIM EXAMPLE (LOCALSTORAGE) 
-
-```yaml
-kind: PersistentVolumeClaim 
-
-apiVersion: v1 
-
-metadata: 
-
-  name: pv1-local-claim 
-
-spec: 
-
-  accessModes: 
-
-  - ReadWriteOnce 
-
-  storageClassName: local-storage 
-
-  resources: 
-
-    requests: 
-
-      storage: 64Gi 
-
-```
-
-# PERSISTENT VOLUME CLAIM EXAMPLE (NFS) 
-
-```yaml
-
-apiVersion: v1 
-
-kind: PersistentVolumeClaim 
-
-metadata: 
-
-  name: dbpvc 
-
-spec: 
-
-  storageClassName: nfs 
-
-  accessModes: 
-
-    - ReadWriteMany 
-
-  resources: 
-
-    requests: 
-
-      storage: 10Gi 
-
-```
-
-# SYSBOX - FOR DIND 
-
-```shell
-
-
-# install 
-
-wget https://downloads.nestybox.com/sysbox/releases/v0.5.0/sysbox-ce_0.5.0-0.linux_amd64.deb 
-
-
-apt install jq 
-
-apt install ./sysbox-ce_0.5.0-0.linux_amd64.deb 
-
-
-systemctl status docker 
-
-systemctl status sysbox 
-
-
-docker-compose.yaml -- add runtime: sysbox-runc
-
-```
-
-# ON K8S
-
-```shell
-kubectl label node <node-name> sysbox-install=yes 
-
-kubectl apply -f https://raw.githubusercontent.com/nestybox/sysbox/master/sysbox-k8s-manifests/sysbox-install.yaml 
-
-
-```
-
-# REMOTE KUBECTL
-
-```shell
-
-
-
-kubectl -n kube-system create serviceaccount <service-account-name> 
-
-
-kubectl create clusterrolebinding <clusterrolebinding-name> --clusterrole=cluster-admin --serviceaccount=kube-system:<service-account-name> 
-
-
-export TOKENNAME=$(kubectl -n kube-system get serviceaccount/<service-account-name> -o jsonpath='{.secrets[0].name}') 
-
-
-export TOKEN=$(kubectl -n kube-system get secret $TOKENNAME -o jsonpath='{.data.token}' | base64 --decode) 
-
-
-curl -k -H "Authorization: Bearer $TOKEN" -X GET "https://<KUBE-API-IP>:6443/api/v1/nodes" | json_pp 
-
-
-kubectl config set-credentials <service-account-name> --token=$TOKEN 
-
-
-kubectl config set-context --current --user=<service-account-name> 
-
-
-# erase TLS auth info and add to cluster the option insecure-skip-tls-verify: true 
-
-
-# then copy and paste the $HOME .kube config and modify server address 
-
-
-# or just copy the whole config with a correct API server address 
-
-
-```
-
-
-# KUBE PROXY
-
-```shell
-
-kubectl proxy --address 0.0.0.0 --accept-hosts '.*' --port=<port> 
-
-```
-
-# KUBECTL REMOTE WITH TLS AND CUSTOM DOMAIN, IP
-
-```shell
-
-kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml 
-
-
-# edit certSANS 
-
-
-# on control plane 
-
-# remove below 
-
-
-/etc/kubernetes/pki/apiserver.{crt,key} ~ 
-
-
-kubeadm init phase certs apiserver --config kubeadm.yaml 
-
-
-docker ps | grep kube-apiserver | grep -v pause 
-
-
-docker kill <containerID> 
-
-
-# or 
-
-
-crictl pods | grep kube-apiserver | cut -d' ' -f1 
-
-
-crictl stopp <pod-id> 
-
-
-crictl rmp <pod-id> 
-
-
-# wait till kube-system pods to restart and accessible by the dns 
-
-# or
-
-# on all master nodes
-
-# remove current apiserver certificates
-sudo rm /etc/kubernetes/pki/apiserver.*
-
-# generate new certificates
-sudo kubeadm init phase certs apiserver --apiserver-cert-extra-sans="ADDR1,ADDR2,ADDR3"
-
-
-```
-
-# KUBEADM RENEW CERTIFICATE
-
-```shell
-
-# on all control plane nodes
-
-kubeadm certs renew all
-
-# then restart
-
-mv /etc/kubernetes/manifest/* mv /etc/kubernetes/manifest_tmp
-
-# wait 20+ seconds
-
-mv /etc/kubernetes/manifest_tmp/* mv /etc/kubernetes/manifest
-
-
-```
-
-# KUBEADM UPGRADE
-
-```shell
-
-# on the first master nodes
-
-sudo apt-mark unhold kubeadm && \
-sudo apt-get update && sudo apt-get install -y kubeadm=1.27.x-00 && \
-sudo apt-mark hold kubeadm
-
-sudo kubeadm upgrade apply v1.27.x
-
-sudo kubectl drain <node-to-drain> --ignore-daemonsets
-
-sudo apt-mark unhold kubelet kubectl && \
-sudo apt-get update && sudo apt-get install -y kubelet=1.27.x-00 kubectl=1.27.x-00 && \
-sudo apt-mark hold kubelet kubectl
-
-sudo systemctl daemon-reload
-sudo systemctl restart kubelet
-
-sudo kubectl uncordon <node-to-uncordon>
-
-# on other master nodes 
-
-sudo apt-mark unhold kubeadm && \
-sudo apt-get update && sudo apt-get install -y kubeadm=1.27.x-00 && \
-sudo apt-mark hold kubeadm
-
-sudo kubeadm upgrade node
-
-sudo kubectl drain <node-to-drain> --ignore-daemonsets
-
-sudo apt-mark unhold kubelet kubectl && \
-sudo apt-get update && sudo apt-get install -y kubelet=1.27.x-00 kubectl=1.27.x-00 && \
-sudo apt-mark hold kubelet kubectl
-
-sudo systemctl daemon-reload
-sudo systemctl restart kubelet
-
-sudo kubectl uncordon <node-to-uncordon>
-
-# on worker nodes
-
-sudo apt-mark unhold kubeadm && \
-sudo apt-get update && sudo apt-get install -y kubeadm=1.27.x-00 && \
-sudo apt-mark hold kubeadm
-
-sudo kubeadm upgrade node
-
-sudo kubectl drain <node-to-drain> --ignore-daemonsets
-
-sudo apt-mark unhold kubelet kubectl && \
-sudo apt-get update && sudo apt-get install -y kubelet=1.27.x-00 kubectl=1.27.x-00 && \
-sudo apt-mark hold kubelet kubectl
-
-sudo systemctl daemon-reload
-sudo systemctl restart kubelet
-
-sudo kubectl uncordon <node-to-uncordon>
-
-
-```
-
-# VM 
-
-```shell
-
-# iso 
-
-# processor 
-
-# memory 
-
-# storage 
-
-# network: bridge  
-
-```
-
-
-# CLOUD (AWS)
-
-```shell
-
-# EC2: create EC2 instance  
-
-# instance details: check instace details to get access 
-
-# elastic block store: it has volume, instance info 
-
-# network & security: check network & security  
-
-# network interface: it has vpc, subnet, instance info 
-
-# vpc: EC2 must be created in a same vpc 
-
-# subnet: EC2 must be created in a same subnet under the same vpc 
-
-# security group: each EC2 must share the same security(inbound, outbound) rule 
-
-# instance: take care of firewall 
-
-```
-
-# CLOUD (GCP)
-
-```shell
-
-# api 
-
-# oauth 
-```
-
-# AWS EKS
-
-```shell
-# eksctl version 0.106.0 
-
-# create IAM user and role related to EKS and Adminaccess 
-
-
-curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" 
-
-unzip awscliv2.zip 
-
-sudo ./aws/install 
-
-
-curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp 
-
-
-mv /tmp/eksctl /usr/local/bin 
-
-
-aws configure 
-
-
-eksctl create cluster -f ekscluster.yaml 
-
-```
-
-# CUSTOM REGISTRY - HARBOR 
-
-```shell
-
-
-curl -s https://api.github.com/repos/goharbor/harbor/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep '\.tgz$' | wget -i - 
-
-
-tar xvzf harbor-offline-installer*.tgz 
-
-
-cp harbor.yml.tmpl harbor.yml 
-
-
-# change necessary info 
-
-
-
-```
-
-```shell
-
-# kubernetes private nodeport
-
-helm repo add harbor https://helm.goharbor.io
-
-
-helm install go-harbor harbor/harbor --set expose.type=nodePort --set expose.tls.auto.commonName=192.168.50.94 --set externalURL=https://192.168.50.94:30003 --set persistence.enabled=false --set imagePullPolicy=Always # --set persistence.enabled=true --set persistence.persistentVolumeClaim.registry.size=10Gi --set persistence.persistentVolumeClaim.chartmuseum.size=5Gi --set persistence.persistentVolumeClaim.jobservice.size=5Gi --set persistence.persistentVolumeClaim.database.size=5Gi --set persistence.persistentVolumeClaim.redis.size=5Gi
-
-
-sudo kubectl exec go-harbor-nginx-9556767d6-tm89q -- cat /etc/nginx/cert/ca.crt > ca.crt 
-
-
-mkdir -p /etc/docker/certs.d/192.168.50.94:30003
-
-/bin/cp -Rf ca.crt /etc/docker/certs.d/192.168.50.94:30003/
-
-
-
-```
-
-# HELM
-
-```shell
-
-curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -  
-
-
-sudo apt install apt-transport-https --yes  
-
-
-echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list  
-
-
-sudo apt update  
-
-
-sudo apt install helm  
-```
-
-# JENKINS
-
-```shell
-
-sudo apt install -y openjdk-11-jdk openjdk-11-jre 
-
-
-wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - 
-
-
-sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' 
-
-
-sudo apt update 
-
-
-sudo apt -y install jenkins 
-
-
-# on k8s 
-
-
-helm repo add jenkins https://charts.jenkins.io 
-
-
-helm repo update 
-
-
-helm install jkns jenkins/jenkins 
-
-```
-
-
-# PROMETHEUS & GRAFANA 
-
-```shell
-
-helm repo add prometheus-community https://prometheus-community.github.io/helm-charts  
-
-  
-
-helm repo add stable https://charts.helm.sh/stable  
-
-
-helm repo update  
-
-
-helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack -f ./kube-prometheus-stack/value.yaml 
-
-
-
-kubectl port-forward deployment/prometheus-grafana 3000 
-
-
-# Prometheus alone 
-
-
-helm repo add prometheus-community https://prometheus-community.github.io/helm-charts 
-
-
-helm repo update 
-
-
-helm install prometheus prometheus-community/prometheus 
-
-
-# Grafana local 
-
-
-sudo apt install -y apt-transport-https 
-
-
-sudo apt install -y software-properties-common wget 
-
-
-sudo wget -q -O /usr/share/keyrings/grafana.key https://packages.grafana.com/gpg.key 
-
-
-echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list 
-
-
-sudo apt update 
-
-
-sudo apt install grafana-enterprise 
-
-
-sudo service grafana-server start 
-
-
-config -> /etc/grafana/grafana.ini 
-
-
-# localhost:3000 
-
-
-username: admin 
-
-password: prom-operator 
-
-
-```
-
-# OCTANT
-
-```shell
-
-wget https://github.com/vmware-tanzu/octant/releases/download/v0.24.0/octant_0.24.0_Linux-64bit.deb 
-
-
-dpkg -i octant_0.24.0_Linux-64bit.deb 
-
-
-```
-
-
-# REDIS
-
-```yaml
-
-version: "3"
-
-services:
-
-    redis:
-      image: redis:7.0.8
-      container_name: redis
-      command:
-        - /bin/sh
-        - -c
-        - redis-server --requirepass "youdonthavetoknow"
-      volumes:
-        - ./redis:/var/lib/redis/data
-        - ./redis.conf:/usr/local/etc/redis/redis.conf
-      ports:
-        - "6379:6379"
-```
-
-```shell
-
-# redis.conf
-
-port              6379
-daemonize         yes
-save              60 1
-bind              0.0.0.0
-tcp-keepalive     300
-dbfilename        dump.rdb
-dir               ./
-rdbcompression    yes
-
-```
-
-# KAFKA & ZOOKEEPER
-
-```shell
-helm repo add bitnami https://charts.bitnami.com/bitnami 
-
-
-helm install zookeeper bitnami/zookeeper --set replicaCount=1 --set auth.enabled=false --set allowAnonymousLogin=true 
-
-
-helm install kafka bitnami/kafka --set zookeeper.enabled=false --set replicaCount=1 --set externalZookeeper.servers=ZOOKEEPER-SERVICE-NAME 
-
-
-kubectl --namespace default exec -it $POD_NAME -- kafka-console-consumer.sh --bootstrap-server KAFKA-SERVICE-NAME:9092 --topic mytopic 
-
-
-kubectl --namespace default exec -it $POD_NAME -- kafka-console-producer.sh --broker-list KAFKA-SERVICE-NAME:9092 --topic mytopic 
-
-
-# or kafkacat like below 
-
-
-kafkacat -P -b KAFKA-SERVICE-NAME:9092 -t mytopic 
-
-
-kafkacat -C -b KAFKA-SERVICE-NAME:9092 -t mytopic 
-
-```
-```yaml
-# single node
-
----
-
-version: "3"
-services:
-  zookeeper:
-    image: 'bitnami/zookeeper:3.7'
-    container_name: zookeeper
-    ports:
-      - '2181:2181'
-    environment:
-      - ALLOW_ANONYMOUS_LOGIN=yes
-    volumes:
-      - ./zook:/data
-  kafka:
-    image: 'bitnami/kafka:3.3'
-    container_name: kafka
-    ports:
-      - '9092:9092'
-    environment:
-      - KAFKA_BROKER_ID=1
-      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
-      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://172.17.80.95:9092
-      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
-      - ALLOW_PLAINTEXT_LISTENER=yes
-    volumes:
-      - ./data:/var/lib/kafka/data
-    depends_on:
-      - zookeeper
-
-
-```
-
-# ELASTIC SEARCH & KIBANA 
-
-```shell
-
-helm repo add bitnami https://charts.bitnami.com/bitnami 
-
-
-sudo helm install elasticsearch  bitnami/elasticsearch 
-
-
-sudo helm install kibana bitnami/kibana --set elasticsearch.hosts[0]=elasticsearch --set elasticsearch.port=9200 
-
-
-```
-
-```yaml
-
-version: "3"
-
-
-
-services:
-
-        elasticsearch:
-
-                image: elasticsearch:8.6.1
-
-                environment:
-
-                        - xpack.security.enabled=true
-
-                        - discovery.type=single-node
-
-                        - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
-
-                        - ELASTIC_PASSWORD=youdonthavetoknow
-
-
-                container_name: elasticsearch
-
-                ports:
-
-                        - "9200:9200"
-
-                volumes:
-
-                        - elastic_data:/usr/share/elasticsearch/data
-
-volumes:
-
-        elastic_data:
-
-```
-```shell
-# set password for kibana
-
-docker exec -it elasticsearch /bin/bash
-
-bin/elasticsearch-set-password [ auto | interactive ]
-
-```
-
-```yaml
-
-version: "3"
-services:
-    kibana:
-        image: kibana:8.5.3
-        container_name: kibana
-        restart: always
-        ports:
-            - 5601:5601
-        environment:
-            - ELASTICSEARCH_USERNAME="kibana_system"
-            - ELASTICSEARCH_PASSWORD="youdonthavetoknow"
-            - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
-            - XPACK_MONITORING_ENABLED=true
-            - XPACK_MONITORING_COLLECTION_ENABLED=true
-            - XPACK_SECURITY_ENABLED=true
-        networks:
-            - network1
-
-networks:
-    network1:
-        name: elastic_default
-        external: true
-
-
-```
-
-# GPU
-
-```shell
-
-# nvidia cuda driver
-
-# build prerequisite
-
-sudo apt-get install linux-headers-$(uname -r) build-essential
-
-# simple way
-
-# curl from https://www.nvidia.com/download/index.aspx 
-
-# and install run
-
-# host driver 
-
-# ubuntu 
-
-sudo apt-get install linux-headers-$(uname -r) 
-
-
-distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g') 
-
-
-wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.0-1_all.deb 
-
-
-sudo dpkg -i cuda-keyring_1.0-1_all.deb 
-
-
-sudo apt-get update 
-
-
-sudo apt-get -y install cuda-drivers 
-
-
-#centos 
-
-sudo dnf install -y tar bzip2 make automake gcc gcc-c++ pciutils elfutils-libelf-devel libglvnd-devel iptables firewalld vim bind-utils wget 
-
-
-sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
-
-
-distribution=rhel7 
-
-
-ARCH=$( /bin/arch ) 
-
-
-sudo yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/$distribution/${ARCH}/cuda-$distribution.repo 
-
-
-sudo yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r) 
-
-
-sudo yum clean expire-cache 
-
-
-sudo yum install -y nvidia-driver-latest-dkms 
-
-
-# post install 
-
-
-export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}} 
-
-
-export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64\ 
-
-                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 
-
-
-sudo systemctl enable nvidia-persistenced 
-
-
-
-/usr/bin/nvidia-persistenced --verbose 
-
-
-cat /proc/driver/nvidia/version 
-
-# disable noveau
-
-sudo nano /etc/modprobe.d/blacklist-nouveau.conf
-
-```
-```shell
-# /etc/modprobe.d/blacklist-nouveau.conf
-blacklist nouveau
-options nouveau modeset=0
-```
-```shell
-sudo update-initramfs -u
-sudo reboot
-```
-
-
-# GPU DRIVER INSTALL UNINSTALL
-
-
-```shell
-
-sudo ubuntu-drivers list
-
-# or, for servers:
-
-sudo ubuntu-drivers list --gpgpu
-
-# install
-sudo ubuntu-drivers install nvidia:525
-
-# or for servers:
-
-sudo ubuntu-drivers install --gpgpu nvidia:525-server
-
-# or install GPU API
-
-sudo sh cuda_<VERSION>_linux.run
-
-# or run file
-
-sudo NVIDIA_<VERSION>.run 
-
-```
-
-
-```shell
-# uninstall
-
-sudo apt-get --purge remove "*nvidia*"
-
-sudo /usr/bin/nvidia-uninstall
-
-# or runfile
-
-sudo NVIDIA_<VERSION>.run --uninstall
-
-```
-
-# GPU API
-
-```shell
-
-# nvidia cuda toolkit
-
-# check nvidia-smi cuda version
-
-# visit corresponding https://developer.nvidia.com/cuda-downloads 
-
-wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
-
-sudo sh cuda_12.2.0_535.54.03_linux.run
-
-# add path and ld path
-
-export PATH="/usr/local/cuda-12.2/bin:$PATH"
-
-# /etc/ld.so.conf
-
-...
-include /usr/local/cuda-12.2/lib64
-...
-
-sudo ldconfig
-
-
-# uninstall
-
-
-/usr/local/cuda/bin/<uninstaller>
-
-
-```
-
-
-# GPU CONTAINER
-
-
-
-```shell
-
-
-# install nvidia container toolkit 
-
-
-sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit 
-
-
-```
-
-```toml
-# containerd daemon config /etc/containerd/config.toml
-
-
-version = 2 
-
-[plugins] 
-
-  [plugins."io.containerd.grpc.v1.cri"] 
-
-    [plugins."io.containerd.grpc.v1.cri".containerd] 
-
-      default_runtime_name = "nvidia" 
-
-  
-
-      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] 
-
-        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] 
-
-          privileged_without_host_devices = false 
-
-          runtime_engine = "" 
-
-          runtime_root = "" 
-
-          runtime_type = "io.containerd.runc.v2" 
-
-          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] 
-
-            BinaryName = "/usr/bin/nvidia-container-runtime" 
-
-```
-
-```shell
-sudo systemctl restart containerd 
-
-``` 
-
-```shell
-# crio daemon
-
-# /etc/crio/crio.conf.d/crio.conf
-
-[crio]
-
-  [crio.runtime]
-    default_runtime = "nvidia"
-
-    [crio.runtime.runtimes]
-
-      [crio.runtime.runtimes.nvidia]
-        runtime_path = "/usr/bin/nvidia-container-runtime"
-        runtime_type = "oci"
-
-# or
-
-# /etc/crio/crio.conf
-
- hooks_dir = [
-        "/usr/share/containers/oci/hooks.d",
-        "/run/containers/oci/hooks.d",
-        "/etc/containers/oci/hooks.d",
- ]
- ```
-
-```shell
-
-$ sudo mkdir -p /usr/share/containers/oci/hooks.d 
-
-# or
-
-$ sudo mkdir -p /run/containers/oci/hooks.d
-
-  
-
-$ sudo bash -c  
-
-cat > /usr/share/containers/oci/hooks.d/oci-nvidia-hook.json << EOF 
-
-{ 
-
-    "version": "1.0.0", 
-
-    "hook": { 
-
-        "path": "/usr/bin/nvidia-container-toolkit", 
-
-        "args": ["nvidia-container-toolkit", "prestart"] ,
-        
-        "env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]
-
-    }, 
-
-    "when": { 
-
-        "always": true, 
-
-        "commands": [".*"] 
-
-    }, 
-
-    "stages": ["prestart"] 
-
-} 
-
-EOF 
-
-
-
-# or you could use simplified command
-
-curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
-  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
-    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
-    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
-  && \
-    sudo apt-get update
-    
-    
-sudo apt-get install -y nvidia-container-toolkit
-
-
-sudo nvidia-ctk runtime configure --runtime=docker
-
-sudo systemctl restart docker
-
-
-sudo nvidia-ctk runtime configure --runtime=containerd
-
-
-sudo systemctl restart containerd
-
-sudo nvidia-ctk runtime configure --runtime=crio
-
-
-sudo systemctl restart crio
-
-# crio 
-
-/etc/crio/crio.conf.d/99-nvidia.conf
-
-[crio]
-
-  [crio.runtime]
-    default_runtime = "nvidia"
-
-    [crio.runtime.runtimes]
-
-      [crio.runtime.runtimes.nvidia]
-        runtime_path = "/usr/bin/nvidia-container-runtime"
-        runtime_type = "oci"
-
-
-sudo nvidia-ctk runtime configure --runtime=crio --set-as-default --config=/etc/crio/crio.conf.d/99-nvidia.conf
-
-/etc/nvidia-container-runtime/config.toml
-
-[nvidia-container-runtime]
-runtimes = ["crun", "docker-runc", "runc"]
-
-sudo systemctl restart crio
-
-# docker 
-
-
-sudo docker --gpus all 
-
-# docker-compose
-
-services:
-  jupyterlabc:
-    image: seantywork/jupyterlabc
-    deploy:
-      resources:
-        reservations:
-          devices:
-            - driver: nvidia
-              count: 1
-              capabilities: [gpu] 
-
-# kubernetes 
-
-
-kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml 
-
-
-# helm 
-
-
-helm repo add nvdp https://nvidia.github.io/k8s-device-plugin 
-
-
-helm repo update 
-
-
-helm upgrade -i nvdp nvdp/nvidia-device-plugin \ 
-
-  --namespace nvidia-device-plugin \ 
-
-  --create-namespace \ 
-
-  --version 0.13.0 
-
-
-
-```
-
-```yaml
-# gpu deployment 
-
-apiVersion: apps/v1 
-
-kind: Deployment 
-
-metadata: 
-
-  name: clusterdebuggergpu 
-
-spec: 
-
-  selector: 
-
-    matchLabels: 
-
-      app: clusterdebuggergpu 
-
-  replicas: 1 
-
-  template: 
-
-    metadata: 
-
-      labels: 
-
-        app: clusterdebuggergpu 
-
-    spec: 
-
-      nodeSelector: 
-
-        gpu-ready: ready 
-
-      imagePullSecrets: 
-
-        - name: harbor-secret 
-
-      containers: 
-
-        - name: clusterdebuggergpu 
-
-          image: harbor.mipllab.com/library/clusterdebugger 
-
-          resources: 
-
-            limits: 
-
-              nvidia.com/gpu: 1 
-
-          imagePullPolicy: Always 
-
-          ports: 
-
-          - containerPort: 6700 
-
-
-
-```
-
-
-
-# LIB TORCH
-
-```shell
-
-# https://pytorch.org/get-started/locally/
-
-# cpu
-
-wget https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.1.1%2Bcpu.zip
-
-unzip 
-
-mv libtorch libtorch-cpu
-
-# gpu
-
-wget https://download.pytorch.org/libtorch/cu121/libtorch-cxx11-abi-shared-with-deps-2.1.1%2Bcu121.zip
-
-
-# build 
-
-mkdir build
-cd build
-cmake -DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch .. 
-# cmake -DCMAKE_PREFIX_PATH=/home/seantywork/hack/torch-cc/libtorch .. (2.1)
-
-
-
-cmake --build . --config Release
-
-```
-
-
-
-# VIRTUAL MACHINE QEMU
-
-```shell
-sudo apt install qemu-kvm virt-manager virtinst libvirt-clients bridge-utils libvirt-daemon-system -y
-
-sudo systemctl enable --now libvirtd
-
-sudo systemctl start libvirtd
-
-sudo usermod -aG kvm $USER
-
-sudo usermod -aG libvirt $USER
-
-sudo virt-manager
-
-# aarch64 on x64
-
-# adding to the above first line
-
-sudo apt-get install qemu-system-arm qemu-efi
-
-# and set arch as aarch64 virt
-
-# then set UEFI to aarch64
-
-
-```
-
-
-# VM QEMU
-
-```shell
-
-virsh shutdown <vm>
-
-virsh start <vm>
-
-# create vm
-
-virsh dumpxml guest1 > guest1.xml
-
-# do some needed editing
-# delete uuid
-
-# hard new 
-virsh define guest1.xml
-
-# or
-# soft new
-
-virsh create guest1.xml
-
-# delete
-
-virsh destroy <vm>
-
-virsh undefine <vm>
-
-rm -rf /var/lib/libvirt/images/<vm>.qcow2
-
-
-# check device
-
-virsh nodedev-list --cap pci
-
-virsh nodedev-dumpxml pci_0000_00_19_0
-
-# add device
-
-virsh attach-device vm_name --file device.xml --config # --config also persistent, --persistent
-
-# remove device
-
-
-virsh detach-device vm_name device.xml
-
-# clone 
-
-virt-clone --original ubuntu-box1 --auto-clone
-
-# edit
-
-virsh edit guest
-
-# export/import
-
-# on host 1
-
-
-virsh list --all
-
-virsh shutdown target_guest_machine
-
-virsh dumpxml target_guest_machine > /root/target_guest_machine.xml
-
-# disk location
-
-virsh domblklist target_guest_name
-
-scp /root/target_guest_machine.xml destination_host_ip:/etc/libvirt/qemu
-
-scp /var/lib/libvirt/images/target_guest_name.qcow2 destination_host_ip:/var/lib/libvirt/images/
-
-
-# on host 2
-
-# specify qcow2 location
-
-virsh define target_guest_machine.xml
-
-virsh start target_guest_machine
-
-
-# install
-
-virt-install \
--n ubuntu20-gpu \
---description "ubuntu20-gpu" \
---os-type=Linux \
---os-variant=ubuntu20.04 \
---ram=4096 \
---vcpus=4 \
---disk path=/var/lib/libvirt/images/ubuntu20-gpu.qcow2,format=qcow2,bus=virtio,size=32 \
-# --graphics none \
---cdrom /home/seantywork/box/ubuntu-20-server.iso \
---network bridge:br0
-# --boot uefi
-
-# vm uefi
-
-sudo apt install ovmf
-
-```
-
-```shell
-# clone with xml
-
-virsh shutdown "$source_vm"
-
-virsh dumpxml "$source_vm" > "/tmp/$new_vm.xml"
-
-sed -i /uuid/d "/tmp/$new_vm.xml"
-sed -i '/mac address/d' "/tmp/$new_vm.xml"
-
-sed -i "s/$source_vm/$new_vm/" "/tmp/$new_vm.xml"
-
-cp /var/lib/libvirt/images/ubuntu22.04.qcow2 /var/lib/libvirt/images/new.qcow2
-
-virsh define "/tmp/$new_vm.xml"
-
-```
-
-# VM QEMU NETWORK BRIDGE
-
-```shell
-
-# /etc/sysctl.d/10-bridge.conf
-
-net.bridge.bridge-nf-call-ip6tables=0
-net.bridge.bridge-nf-call-iptables=0
-net.bridge.bridge-nf-call-arptables=0
-
-```
-
-```shell
-
-
-echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
-
-reboot
-
-virsh net-destroy default
-virsh net-undefine default
-
-# save /etc/netplan/01-network-manager-all.yaml
-
-```
-
-```yaml
-
-# netplan
-
-# /etc/netplan/00-installer-config.yaml 
-
-network:
-  ethernets:
-    enx44a92c521758:
-      dhcp4: false
-      dhcp6: false
-  bridges:
-    br0:
-      interfaces: [ enx44a92c521758 ]
-      addresses: [192.168.0.32/24]
-      gateway4: 192.168.0.1
-      mtu: 1500
-      nameservers:
-        addresses: [168.126.63.1,8.8.8.8]
-      parameters:
-        stp: true
-        forward-delay: 4
-      dhcp4: no
-      dhcp6: no
-  version: 2
-
-
-```
-
-```shell
-#sudo netplan generate
-sudo netplan apply
-
-
-```
-
-```shell
-
-# network/interfaces
-# /etc/network/interfaces
-
-# The primary network interface
-auto eno1
-
-#make sure we don't get addresses on our raw device
-iface eno1 inet manual
-iface eno1 inet6 manual
-
-#set up bridge and give it a static ip
-auto br0
-allow-hotplug eno1
-iface br0 inet static
-        address 192.168.0.100
-        netmask 255.255.255.0
-        network 192.168.0.0
-        broadcast 192.168.0.255
-        gateway 192.168.0.1
-        bridge_ports eno1
-        bridge_stp off
-        bridge_fd 0
-        bridge_maxwait 0
-        dns-nameservers 8.8.8.8
-
-#allow autoconf for ipv6
-iface br0 inet6 auto
-        accept_ra 1
-
-
-
-```
-
-```shell
-
-sudo systemctl restart networking
-
-```
-
-```shell
-# host-bridge.xml
-
-<network>
-    <name>host-bridge</name>
-    <bridge name='br0'/>
-    <forward mode="bridge"/>
-</network>
-
-```
-
-```shell
-
-virsh net-define host-bridge.xml
-virsh net-autostart host-bridge
-virsh net-start host-bridge
-virsh net-list --all
-
-```
-
-# VM QEMU GPU PASSTHROUGH
-
-```shell
-
-# v
-# locations
-# /etc/default/grub
-# /etc/modules
-# /etc/modprobe.d/vfio.conf
-# /etc/modprobe.d/iommu_unsafe_interrupts.conf
-# /etc/modprobe.d/kvm.conf
-# /etc/modprobe.d/blacklist.conf
-
-efibootmgr
-
-# vt-x & vt-d enabled
-
-# or amd-v & amd-iommu
-
-# grub iommu config
-
-# v (worked set)
-/etc/default/grub
-GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
-
-# or 
-
-GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt vfio-pci.ids=<I:D>,<I:D>"
-
-# or (overkill, explicit)
-
-GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt vfio-pci.ids=<I:D>,<I:D> nofb nomodeset initcall_blacklist=sysfb_init video=vesafb:off video=efifb:off video=simplefb:off"
-
-# or (overkill, explicit, unsafe)
-
-GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt vfio-pci.ids=<I:D>,<I:D> pcie_acs_override=downstream,multifunction nofb nomodeset initcall_blacklist=sysfb_init video=vesafb:off video=efifb:off video=simplefb:off"
-
-
-update-grub
-
-reboot
-
-dmesg | grep -e IOMMU
-
-# vfio config
-# v
-echo "vfio" >> /etc/modules
-echo "vfio_iommu_type1" >> /etc/modules
-echo "vfio_pci" >> /etc/modules
-echo "vfio_virqfd" >> /etc/modules
-echo "vfio_nvidia" >> /etc/modules
-
-update-initramfs -u -k all
-
-systemctl reboot
-
-dmesg | grep -i vfio
-
-dmesg | grep 'remapping'
-
-# in case of no remapping
-# v
-echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
-
-
-# nvidia stability
-# v
-echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf
-
-# amd stability
-
-apt install pve-headers-$(uname -r)
-apt install git dkms build-essential
-git clone https://github.com/gnif/vendor-reset.git
-cd vendor-reset
-dkms install .
-echo "vendor-reset" >> /etc/modules
-update-initramfs -u
-shutdown -r now
-
-lspci -nn | grep 'AMD'  # <DEVICE_ID> ex) 01:00.0
-
-cat << EOF >>  /etc/systemd/system/vreset.service
-[Unit]
-Description=AMD GPU reset method to 'device_specific'
-After=multi-user.target
-[Service]
-ExecStart=/usr/bin/bash -c 'echo device_specific > /sys/bus/pci/devices/0000:<DEVICE_ID>/reset_method'
-[Install]
-WantedBy=multi-user.target
-EOF
-systemctl enable vreset.service && systemctl start vreset.service
-
-
-# gpu isolation and drivers
-
-lspci -nn | grep 'NVIDIA' # or 'AMD'
-
-
-#v
-echo "options vfio-pci ids=<ID>,<ID2>,..." > /etc/modprobe.d/vfio.conf
-
-
-ex)
-
-echo "options vfio-pci ids=1002:67df,1002:aaf0" > /etc/modprobe.d/vfio.conf
-
-# softdep
-# v
-echo "softdep snd_hda_intel pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
-echo "softdep xhci_hcd pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
-echo "softdep xhci_pci pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
-echo "softdep nvidia-gpu pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
-echo "softdep i2c_nvidia_gpu pre: vfio-pci" >> /etc/modprobe.d/vfio.conf
-
-# blacklist
-
-# AMD drivers
-echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
-echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf
-# NVIDIA drivers
-# if snd_hda_intel present
-# echo "blacklist snd_hda_intel" >> /etc/modprobe.d/blacklist.conf
-# v
-echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
-echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
-echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
-echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
-# Intel drivers
-echo "blacklist snd_hda_intel" >> /etc/modprobe.d/blacklist.conf
-echo "blacklist snd_hda_codec_hdmi" >> /etc/modprobe.d/blacklist.conf
-echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf
-
-
-
-
-# gpu in vm
-
-#v
-# bios ovmf (uefi)
-
-# machine q35
-
-# display vmware compatible (proxmox)
-# or
-# v
-# video QXL and Display Spice Listen type Address (qemu/kvm)
-
-# add all pci devices within iommu group
-
-# edit if necessary
-
-# (qemu/kvm)
-
-virsh edit vm-gpu
-
-  <features>
-    <acpi/>
-    <apic/>
-    <hyperv>
-      <vendor_id state="on" value="whatever"/>
-    </hyperv>
-    <kvm>
-      <hidden state='on'/>
-    </kvm>
-    <vmport state='off'/>
-    <ioapic driver='kvm'/>
-  </features>
-
-# boot vm without secure boot (esc || f2)
-
-# check
-
-lspci -nn
-
-# noveau blacklist
-
-sudo nano /etc/modprobe.d/blacklist-nouveau.conf
-
-blacklist nouveau
-options nouveau modeset=0
-
-sudo update-initramfs -u
-
-
-# install corresponding gpu drivers
-
-https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html
-
-# or 
-
-https://www.nvidia.com/download/index.aspx
-
-# gpu reset at reboot
-# if necessary
-
-```
-
-```shell
-# /root/reset_pci_gpu.sh
-#!/bin/bash
-echo 1 > /sys/bus/pci/devices/0000\:09\:00.0/remove
-echo 1 > /sys/bus/pci/rescan
-
-crontab -e
-
-@reboot /root/reset_pci_gpu.sh
-
-```
-
-```shell
-# gpu reset method disable 
-# if necessary
-
-echo > /sys/bus/pci/devices/0000\:09\:00.0/reset_method
-
-```
-
-# VM CLUSTER
-
-```shell
-
-# proxmox
-
-
-# export/import
-
-qm list
-
-vzdump <id> --compress gzip --storage local
-
-# usually /var/lib/vz/dump
-
-qmrestore /var/lib/vz/dump/vzdump-qemu-<id>.vma.gz <new-id>
-
-
-
-# from different
-
-create vm
-
-import vm
-
-import disk
-
-qm importdisk <VM_ID> <OVA_DISK.vmdk> <VOL_NAME> -format qcow2
-
-ex) qm importdisk 101 ubuntu20-disk001.vmdk local-lvm -format qcow2
-
-create cluster
-
-join cluster
-
-
-# delete cluster
-
-systemctl stop pve-cluster corosync
-
-pmxcfs -l
-
-rm /etc/corosync/*
-
-rm /etc/pve/corosync.conf
-
-killall pmxcfs
-
-systemctl start pve-cluster
-
-```
-
-# IDA
-
-```shell
-
-
-# download run 
-
-
-chmod  
-
-
-sudo ./ida.run 
-
-```
-
-# RADARE2 R2
-
-```shell
-
-git clone https://github.com/radareorg/radare2
-
-cd radare2 ; sys/install.sh
-
-```
-
-```shell
-
-# cmd opts
-
--L: List of supported IO plugins
--q: Exit after processing commands
--w: Write mode enabled
--i [file]: Interprets a r2 script
--A: Analyze executable at load time (xrefs, etc)
--n: Bare load. Do not load executable info as the entrypoint
--c 'cmds': Run r2 and execute commands (eg: r2 -wqc'wx 3c @ main')
--p [prj]: Creates a project for the file being analyzed (CC add a comment when opening a file as a project)
--: Opens r2 with the malloc plugin that gives a 512 bytes memory area to play with (size can be changed)
-       Similar to r2 malloc://512
-
-
-# basic
-
-
-; Command chaining: x 3;s+3;pi 3;s+3;pxo 4;
-| Pipe with shell commands: pd | less
-! Run shell commands: !cat /etc/passwd
-!! Escapes to shell, run command and pass output to radare buffer
-` Radare commands: wx `!ragg2 -i exec`
-~ grep
-~! grep -v
-~[n] grep by columns afl~[0]
-~:n grep by rows afl~:0
-.. repeats last commands (same as enter \n)
-( Used to define and run macros
-$ Used to define alias
-$$: Resolves to current address
-Offsets (@) are absolute, we can use $$ for relative ones @ $$+4
-? Evaluate expression
-?$? Help for variables used in expressions
-$$: Here
-$s: File size
-$b: Block size
-$l: Opcode length
-$j: When $$ is at a jmp, $j is the address where we are going to jump to
-$f: Same for jmp fail address
-$m: Opcode memory reference (e.g. mov eax,[0x10] => 0x10)
-??? Help for ? command
-?i Takes input from stdin. Eg ?i username
-?? Result from previous operations
-?s from to [step]: Generates sequence from to every
-?p: Get physical address for given virtual address
-?P: Get virtual address for given physical one
-?v Show hex value of math expr
-?l str: Returns the length of string
-@@: Used for iterations
-
-# position
-s address: Move cursor to address or symbol
-       s-5 (5 bytes backwards)
-       s- undo seek
-       s+ redo seek
-
-# block size
-
-b size: Change block size
-
-# analyze
-
-aa: Analyze all (fcns + bbs) same that running r2 with -A
-ahl <length> <range>: fake opcode length for a range of bytes
-ad: Analyze data
-       ad@rsp (analyze the stack)
-
-af: Analyze functions
-afl: List all functions
-       number of functions: afl~?
-afi: Returns information about the functions we are currently at
-afr: Rename function: structure and flag
-afr off: Restore function name set by r2
-afn: Rename function
-       afn strlen 0x080483f0
-af-: Removes metadata generated by the function analysis
-af+: Define a function manually given the start address and length
-       af+ 0xd6f 403 checker_loop
-axt: Returns cross references to (xref to)
-axf: Returns cross references from (xref from)
-
-d, f: Function analysis
-d, u: Remove metadata generated by function analysis
-
-
-# info
-
-
-iI: File info
-iz: Strings in data section
-izz: Strings in the whole binary
-iS: Sections
-       iS~w returns writable sections
-is: Symbols
-       is~FUNC exports
-il: Linked libraries
-ii: Imports
-ie: Entrypoint
-
-i~pic : check if the binary has position-independent-code
-i~nx : check if the binary has non-executable stack
-i~canary : check if the binary has canaries
-
-# print
-
-psz n @ offset: Print n zero terminated String
-px n @ offset: Print hexdump (or just x) of n bytes
-pxw n @ offset: Print hexdump of n words
-       pxw size@offset  prints hexadecimal words at address
-pd n @ offset: Print n opcodes disassembled
-pD n @ offset: Print n bytes disassembled
-pi n @ offset: Print n instructions disassembled (no address, XREFs, etc. just instructions)
-pdf @ offset: Print disassembled function
-       pdf~XREF (grep: XREFs)
-       pdf~call (grep: calls)
-pcp n @ offset: Print n bytes in python string output.
-       pcp 0x20@0x8048550
-       import struct
-       buf = struct.pack ("32B",
-       0x55,0x89,0xe5,0x83,0xzz,0xzz,0xzz,0xzz,0xf0,0x00,0x00,
-       0x00,0x00,0xc7,0x45,0xf4,0x00,0x00,0x00,0x00,0xeb,0x20,
-       0xc7,0x44,0x24,0x04,0x01,0x00,0x00,0x00,0xzz,0xzz)
-p8 n @ offset: Print n bytes (8bits) (no hexdump)
-pv: Print file contents as IDA bar and shows metadata for each byte (flags , ...)
-pt: Interpret data as dates
-pf: Print with format
-pf.: list all formats
-p=: Print entropy ascii graph
-
-# write
-
-wx: Write hex values in current offset
-       wx 123456
-       wx ff @ 4
-wa: Write assembly
-       wa jnz 0x400d24
-wc: Write cache commit
-wv: Writes value doing endian conversion and padding to byte
-wo[x]: Write result of operation
-       wow 11223344 @102!10
-               write looped value from 102 to 102+10
-               0x00000066  1122 3344 1122 3344 1122 0000 0000 0000
-       wox 0x90
-               XOR the current block with 0x90. Equivalent to wox 0x90 $$!$b (write from current position, a whole block)
-       wox 67 @4!10
-               XOR from offset 4 to 10 with value 67
-wf file: Writes the content of the file at the current address or specified offset (ASCII characters only)
-wF file: Writes the content of the file at the current address or specified offset
-wt file [sz]: Write to file (from current seek, blocksize or sz bytes)
-       Eg: Dump ELF files with wt @@ hit0* (after searching for ELF headers: \x7fELF)
-wopO 41424344 : get the index in the De Bruijn Pattern of the given word
-
-# flags
-
-f: List flags
-f label @ offset: Define a flag `label` at offset
-       f str.pass_len @ 0x804999c
-f-label: Removes flag
-fr: Rename flag
-fd: Returns position from nearest flag (looking backwards). Eg => entry+21
-fs: Show all flag spaces
-fs flagspace: Change to the specified flag space
-
-# yank & paste
-
-y n: Copies n bytes from current position
-y: Shows yank buffer content with address and length where each entry was copied from
-yp: Prints yank buffer
-yy offset: Paste the contents of the yank buffer at the specified offset
-yt n target @ source: Yank to. Copy n bytes from source to target address
-
-
-# visual mode
-
-q: Exits visual mode
-hjkl: move around (or HJKL) (left-down-up-right)
-o: go/seek to given offset
-?: Help
-.: Seek EIP
-<enter>: Follow address of the current jump/call
-:cmd: Enter radare commands. Eg: x @ esi
-d[f?]: Define cursor as a string, data, code, a function, or simply to undefine it.
-       dr: Rename a function
-       df: Define a function
-v: Get into the visual code analysis menu to edit/look closely at the current function.
-p/P: Rotate print (visualization) modes
-    hex, the hexadecimal view
-    disasm, the disassembly listing
-               Use numbers in [] to follow jump
-               Use "u" to go back
-    debug, the debugger
-    words, the word-hexidecimal view
-    buf, the C-formatted buffer
-    annotated, the annotated hexdump.
-c: Changes to cursor mode or exits the cursor mode
-    select: Shift+[hjkl]
-    i: Insert mode
-    a: assembly inline
-    A: Assembly in visual mode
-    y: Copy
-    Y: Paste
-    f: Creates a flag where cursor points to
-    <tab> in the hexdump view to toggle between hex and strings columns
-V: View ascii-art basic block graph of current function
-W: WebUI
-x, X: XREFs to current function. ("u" to go back)
-t: track flags (browse symbols, functions..)
-gG: Begin or end of file
-HUD
-       _ Show HUD
-       backspace: Exits HUD
-       We can add new commands to HUD in: radare2/shlr/hud/main
-;[-]cmt: Add/remove comment
-m<char>: Define a bookmark
-'<char>: Go to previously defined bookmark
-'
-
-# rop
-
-/R opcodes: Search opcodes
-       /R pop,pop,ret
-/Rl opcodes: Search opcodes and print them in linear way
-       /Rl jmp eax,call ebx
-/a: Search assembly
-       /a jmp eax
-pda: Returns a library of gadgets that can be use. These gadgets are obtained by disassembling byte per byte instead of obeying to opcode length
-
-
-# searching
-
-/ bytes: Search bytes
-       \x7fELF
-
-# compare files
-
-r2 -m 0xf0000 /etc/fstab       ; Open source file
-o /etc/issue                           ; Open file2 at offset 0
-o                                                      ; List both files
-cc offset: Diff by columns between current offset address and "offset"
-
-# graphs
-
-af: Load function metadata
-ag $$ > a.dot: Dump basic block graph to file
-ag $$ | xdot -: Show current function basic block graph
-
-
-af: Load function metadata
-agc $$ > b.dot: Dump basic block graph to file
-
-dot -Tpng -o /tmp/b.png b.dot
-
-radiff2 -g main crackme.bin crackme.bin > /tmp/a
-xdot /tmp/a
-
-# debugger
-
-r2 -d [pid|cmd|ptrace] (if command contains spaces use quotes: r2 -d "ls /")
-
-ptrace://pid (debug backend does not notice, only access to mapped memory)
-
-r2 -d rarun2 program=pwn1 arg1=$(python exploit.py)
-
-
-r2 -d rarun2 program=/bin/ls stdin=$(python exploit.py)
-
-do: Reopen program
-dp: Shows debugged process, child processes and threads
-dc: Continue
-dcu <address or symbol>: Continue until symbol (sets bp in address, continua until bp and remove bp)
-dc[sfcp]: Continue until syscall(eg: write), fork, call, program address (To exit a library)
-ds: Step in
-dso: Step out
-dss: Skip instruction
-dr register=value: Change register value
-dr(=)?: Show register values
-db address: Sets a breakpoint at address
-       db sym.main add breakpoint into sym.main
-       db 0x804800 add breakpoint
-       db -0x804800 remove breakpoint
-dsi (conditional step): Eg: "dsi eax==3,ecx>0"
-dbt: Shows backtrace
-drr: Display in colors and words all the refs from registers or memory
-dm: Shows memory map (* indicates current section)
-       [0xb776c110]> dm
-       sys 0x08048000 - 0x08062000 s r-x /usr/bin/ls
-       sys 0x08062000 - 0x08064000 s rw- /usr/bin/ls
-       sys 0xb776a000 - 0xb776b000 s r-x [vdso]
-       sys 0xb776b000 * 0xb778b000 s r-x /usr/lib/ld-2.17.so
-       sys 0xb778b000 - 0xb778d000 s rw- /usr/lib/ld-2.17.so
-       sys 0xbfe5d000 - 0xbfe7e000 s rw- [stack]
-
-
-```
-
-# GHIDRA
-
-```shell
-
-sudo apt-get install openjdk-17-jdk 
-
-
-wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_10.2_build/ghidra_10.2_PUBLIC_20221101.zip 
-
-
-unzip ghidra_10.2_PUBLIC_20221101.zip -d <target>
-```
-
-# WIRESHARK
-
-```shell
-
-sudo apt install wireshark 
-
-
-```
-
-# TSHARK
-
-```shell
-
-sudo apt install tshark
-
-```
-
-
-# TCP DUMP TCPDUMP UDP DUMP
-
-```shell
-
-sudo tcpdump -i $IFACE -A -X -c 20 port $PORT
-
-
-```
-
-```shell
-
-# udpdump
-
-sudo tcpdump -i $IFACE -A -X -c 20 -n udp port 23232
-
-
-```
-
-# TOR
-
-```shell
-
-# download tar or 
-
-
-wget https://www.torproject.org/dist/torbrowser/11.5.7/tor-browser-linux64-11.5.7_en-US.tar.xz 
-
-
-tar -xvf tor-browser-linux64-11.5.7_en-US.tar.xz 
-
-# install command line
-
-apt install apt-transport-https
-
-```
-
-
-```shell
-
-# /etc/apt/sources.list.d/tor.list
-
-   deb     [arch=amd64 signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org jammy main
-   deb-src [arch=amd64 signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org jammy main
-
-```
-
-```shell
-
-wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | sudo tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null
-
-
-apt update
-
-apt install tor deb.torproject.org-keyring
-
-```
-
-# METASPLOIT AND SECURITY TOOLS 
-
-```shell
-
-
-curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall 
-
-
-sudo chmod 755 msfinstall 
-
-
-sudo ./msfinstall 
-
-
-sudo apt install nmap 
-
-
-git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev 
-
-
-sudo apt install nikto -y 
-
-```
-
-# NGROK
-
-```shell
-
-sudo snap install ngrok
-
-ngrok tcp <port>
-```
-
-# BURPESUITE
-
-```shell
-
-
-# download .sh 
-
-
-sudo ./burpsuite_community_linux_v2022_9_5.sh  
-
-
-```
-
-# OWASP ZAP
-
-```shell
-
-# download .zip 
-
-
-tar -xzf ZAP_2.12.0_Linux.tar.gz 
-
-
-```
-
-# MITMPROXY 
-
-```shell
-
-apt-get -y remove mitmproxy
-
-apt-get -y install python3-pip
-
-pip3 install mitmproxy
-
-export http_proxy=${http_thing}
-export https_proxy=${https_thing}
-
-# brower http://mitm.it -> get ca cert
-
-/bin/cp -Rf mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy.crt
-
-update-ca-certificates
-
-mitmproxy
-
-```
-
-
-# OLD KEY STORE FIX
-
-```shell
-
-for KEY in $(apt-key --keyring /etc/apt/trusted.gpg list | grep -E "(([ ]{1,2}(([0-9A-F]{4}))){10})" | tr -d " " | grep -E "([0-9A-F]){8}\b" ); do K=${KEY:(-8)}; apt-key export $K | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/imported-from-trusted-gpg-$K.gpg; done
-
-
-```
-
-# CLUSTER DEBUGGER
-
-```yaml
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: clusterdebugger
-spec:
-  selector:
-    matchLabels:
-      app: clusterdebugger
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: clusterdebugger
-    spec:
-      containers:
-        - name: clusterdebugger
-          image: seantywork/clusterdebugger
-          imagePullPolicy: Always
-          ports:
-          - containerPort: 6700
-```
-
-
-```yaml
-
-version: "3"
-
-
-services:
-
-        clusterdebugger:
-
-                build: .
-
-
-                container_name: clusterdebugger
-
-                ports:
-
-                        - "6700:6700"
-
-```
-
-```shell
-FROM ubuntu:20.04
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt update && apt install -y ca-certificates curl gnupg lsb-release wget iptables supervisor git vim
-
-RUN apt install -y python3-pip
-
-RUN pip3 install gunicorn
-
-RUN pip3 install flask
-
-RUN pip3 install requests
-
-RUN pip3 install Flask-Session
-
-RUN pip3 install mysql-connector-python
-
-CMD ["tail", "-f", "/dev/null"]
-
-```
-
-# CONTAINER DEBUGGER
-
-```shell
-
-FROM ubuntu:20.04
-
-
-RUN apt-get update
-
-RUN apt-get install -y build-essential ca-certificates curl git vim
-
-RUN mkdir -p /workspace
-
-WORKDIR /workspace
-
-CMD ["tail","-f","/dev/null"]
-```
-
-
-```yaml
-version: "3"
-
-services:
-
-    debugger:
-      build: .
-      container_name: debugger
-
-
-```
-
-# ELASTIC SEARCH
-
-```shell
-
-FROM elasticsearch:8.6.1
-
-ENV xpack.security.enabled=true
-ENV discovery.type=single-node
-ENV ES_JAVA_OPTS="-Xms2g -Xmx2g"
-ENV ELASTIC_PASSWORD=estest
-
-EXPOSE 9200
-
-```
-
-```yaml
-
-
-version: "3"
-
-
-services:
-
-        elasticsearch:
-
-                build: ./elasticsearch
-
-
-                container_name: elasticsearch
-
-                ports:
-
-                        - "9200:9200"
-
-                volumes:
-
-                        - ./elasticsearch/data:/usr/share/elasticsearch/data
-
-```
-
-```yaml
-apiVersion: v1
-kind: Service
-metadata:
-  name: elasticsearch
-  labels:
-    app: elasticsearch
-spec:
-  type: ClusterIP
-  ports:
-  - port: 9200
-    targetPort: 9200
-    protocol: TCP
-  selector:
-    app: elasticsearch
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: elasticsearch
-spec:
-  selector:
-    matchLabels:
-      app: elasticsearch
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: elasticsearch
-    spec:
-      volumes:
-        - name: elasticsearch-storage
-          persistentVolumeClaim:
-            claimName: pvc-16g-elasticsearch
-      imagePullSecrets:
-        - name: harbor-secret
-      containers:
-        - name: elasticsearch
-          image: seantywork/elasticsearch
-          imagePullPolicy: Always
-          ports:
-          - containerPort: 9200
-          volumeMounts:
-          - mountPath: /usr/share/elasticsearch/data
-            name: elasticsearch-storage
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  name: pvc-16g-elasticsearch
-spec:
-  storageClassName: nfs-default-storageclass
-  accessModes:
-    - ReadWriteOnce
-  resources:
-    requests:
-      storage: 16Gi
-
-```
-
-```yaml
-apiVersion: v1
-kind: PersistentVolume
-metadata:
-  name: pv-16g-elasticsearch
-spec:
-  capacity:
-    storage: 16Gi
-  volumeMode: Filesystem
-  accessModes:
-    - ReadWriteOnce
-  persistentVolumeReclaimPolicy: Delete
-  storageClassName: nfs-default-storageclass
-  mountOptions:
-    - hard
-    - nfsvers=4.1
-  nfs:
-    path: /data1/nfs-cluster-vol/es-kbn/elastic/elasticsearch/data
-    server: 192.168.0.100
-
-
-```
-
-# GITLAB
-
-```yaml
-
-version: "3"
-services:
-  gitlab:
-    image: gitlab/gitlab-ce:15.4.6-ce.0
-    restart: always
-    container_name: gitlab
-    hostname: 'gitlab.usagecorpus.com'
-    environment:
-      GITLAB_OMNIBUS_CONFIG: |
-        external_url 'http://gitlab.usagecorpus.com'
-    ports:
-      - '9367:80'
-    volumes:
-      - './gitlab-data/config:/etc/gitlab'
-      - './gitlab-data/logs:/var/log/gitlab'
-      - './gitlab-data/data:/var/opt/gitlab'
-    shm_size: '256m'
-
-```
-
-
-# GPU SET
-
-```shell
-
-#!/bin/bash
-
-
-# Adjust versions, or, you might even have to directly download driver installtion script 
-
-sudo apt-get install linux-headers-$(uname -r)
-
-
-
-distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
-
-
-
-wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.0-1_all.deb
-
-
-
-sudo dpkg -i cuda-keyring_1.0-1_all.deb
-
-
-
-sudo apt-get update
-
-
-
-sudo apt-get -y install cuda-drivers
-
-
-
-export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}
-
-
-
-export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64\
-
-                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
-
-
-
-sudo systemctl enable nvidia-persistenced
-
-
-
-/usr/bin/nvidia-persistenced --verbose
-
-
-
-sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
-
-
-
-echo "Now configure container runtime"
-echo "Go to the link below to get detailed guidance"
-echo "https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html"
-
-```
-
-# HARBOR
-
-```shell
-
-# get the zip? tar?
-
-# untar
-
-# edit harbor.yml
-
-```
-
-```yaml
-# harbor.yml
-
-...
-
-hostname: harbor.usagecorpus.com
-
-# http related config
-http:
-  # port for http, default is 80. If https enabled, this port will redirect to https port
-  port: 5001
-
-# https related config
-#https:
-#  # https port for harbor, default is 443
-#  port: 443
-#  # The path of cert and key files for nginx
-#  certificate: /your/certificate/path
-#  private_key: /your/private/key/path
-
-# # Uncomment following will enable tls communication between all harbor components
-# internal_tls:
-#   # set enabled to true means internal tls is enabled
-#   enabled: true
-#   # put your cert and key files on dir
-#   dir: /etc/harbor/tls/internal
-
-# Uncomment external_url if you want to enable external proxy
-# And when it enabled the hostname will no longer used
-external_url: https://harbor.usagecorpus.com
-
-# The initial password of Harbor admin
-# It only works in first time to install harbor
-# Remember Change the admin password from UI after launching Harbor.
-harbor_admin_password: Harbor12345
-
-# Harbor DB configuration
-database:
-  # The password for the root user of Harbor DB. Change this before any production use.
-  password: root123
-  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
-  max_idle_conns: 100
-  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
-  # Note: the default number of connections is 1024 for postgres of harbor.
-  max_open_conns: 900
-  # The maximum amount of time a connection may be reused. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's age.
-  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
-  conn_max_lifetime: 5m
-  # The maximum amount of time a connection may be idle. Expired connections may be closed lazily before reuse. If it <= 0, connections are not closed due to a connection's idle time.
-  # The value is a duration string. A duration string is a possibly signed sequence of decimal numbers, each with optional fraction and a unit suffix, such as "300ms", "-1.5h" or "2h45m". Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
-  conn_max_idle_time: 0
-
-# The default data volume
-data_volume: /data2/harbor/harbor_data
-
-...
-
-
-```
-
-
-# JENKINS CONTAINER
-
-```shell
-FROM ubuntu:20.04
-
-RUN apt update
-
-RUN apt install -y openjdk-11-jre openjdk-11-jdk wget gnupg2 curl
-
-RUN wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | apt-key add -
-
-RUN sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
-
-RUN apt update
-
-RUN apt install -y jenkins
-
-
-RUN curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
-RUN chmod +x /usr/local/bin/docker-compose
-
-RUN apt update
-
-RUN apt install -y apt-transport-https ca-certificates curl
-
-RUN curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
-
-RUN echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
-
-RUN apt update
-
-RUN apt install -y ca-certificates curl gnupg lsb-release
-
-RUN mkdir -p /etc/apt/keyrings
-
-RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
-
-RUN echo \
-  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
-  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
-
-RUN apt update
-
-RUN apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
-RUN mkdir /root/.ssh
-
-
-EXPOSE 8080
-
-VOLUME /var/run/docker.sock
-VOLUME /root/.jenkins
-VOLUME /root/.ssh
-
-WORKDIR /home
-
-CMD ["jenkins"]
-
-```
-
-```yaml
-
-version: "3"
-
-services:
-        jenkins:
-                build: ./JK
-                container_name: jenkins
-                ports:
-
-                        - "8080:8080"
-             
-
-
-                volumes:
-                        - /var/run/docker.sock:/var/run/docker.sock
-                        - ./JK/jenkins_data:/root/.jenkins
-                        - /home/tomcat/.ssh:/root/.ssh
-
-
-```
-
-
-# JUPYTER LAB
-
-```yaml
-version: "3"
-
-services:
-
-        jupyter:
-                build: ./build_jupyter
-                container_name: jupyter
-                ports:
-                        - "8888:8888"
-                volumes:
-                        - ./jupyter:/root
-
-
-```
-
-```shell
-FROM ubuntu:20.04
-
-ENV DEBIAN_FRONTEND=noninteractive
-
-RUN apt update
-
-RUN apt install -y git
-
-RUN apt install -y vim
-
-RUN apt install -y curl
-
-RUN apt install -y gnupg
-
-RUN apt install -y python3-pip
-
-RUN pip3 install jupyterlab==3.5.1
-RUN pip3 install gekko==1.0.5
-RUN pip3 install beautifulsoup4==4.11.2
-RUN pip3 install keras==2.11.0
-RUN pip3 install matplotlib==3.6.2
-RUN pip3 install numpy==1.23.5
-RUN pip3 install opencv-python==4.6.0.66
-RUN pip3 install pandas==1.5.2
-RUN pip3 install plotly==5.11.0
-RUN pip3 install torch==1.13.1
-RUN pip3 install torchvision==0.14.1
-RUN pip3 install scikit-learn==1.1.3
-RUN pip3 install scipy==1.9.3
-RUN pip3 install seaborn==0.12.1
-RUN pip3 install statsmodels==0.13.5
-RUN pip3 install tensorflow==2.11.0
-RUN pip3 install xgboost==1.7.1
-RUN pip3 install requests==2.28.1
-RUN pip3 install urllib3==1.26.13
-RUN pip3 install selenium==4.7.2
-RUN pip3 install mysql-connector-python==8.0.31
-RUN pip3 install elasticsearch==8.5.2
-RUN pip3 install kafka-python==2.0.2
-
-
-CMD ["jupyter","lab","--ip","0.0.0.0","--no-browser","--port=8888","--allow-root"]
-
-
-```
-
-```yaml
-
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: ingress-jupyter
-  annotations:
-      nginx.ingress.kubernetes.io/proxy-body-size: "0"
-
-spec:
-  rules:
-  - host: jupyter.usagecorpus.com
-    http:
-      paths:
-        - path: /
-          pathType: Prefix
-          backend:
-            service:
-              name: jupyter
-              port:
-                number: 8888
-```
-
-
-```yaml
-
-apiVersion: v1
-kind: Service
-metadata:
-  name: jupyter
-  labels:
-    app: jupyter
-spec:
-  type: ClusterIP
-  ports:
-  - port: 8888
-    targetPort: 8888
-    protocol: TCP
-  selector:
-    app: jupyter
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: jupyter
-spec:
-  selector:
-    matchLabels:
-      app: jupyter
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: jupyter
-    spec:
-      nodeSelector:
-        gpu-ready1: ready
-      volumes:
-        - name: jupyter-storage-jupyter
-          persistentVolumeClaim:
-            claimName: pvc-8g-jupyter-jupyter
-      imagePullSecrets:
-      - name: harbor-secret
-      containers:
-        - name: jupyter
-          image: seantywork/jupyter
-          resources:
-            limits:
-              nvidia.com/gpu: 1
-          imagePullPolicy: Always
-          ports:
-          - containerPort: 8888
-          volumeMounts:
-          - mountPath: /root
-            name: jupyter-storage-jupyter
-```
-
-
-```yaml
-apiVersion: v1
-kind: PersistentVolume
-metadata:
-  name: pv-8g-jupyter-jupyter
-spec:
-  capacity:
-    storage: 8Gi
-  volumeMode: Filesystem
-  accessModes:
-    - ReadWriteOnce
-  persistentVolumeReclaimPolicy: Delete
-  storageClassName: nfs-default-storageclass
-  mountOptions:
-    - hard
-    - nfsvers=4.1
-  nfs:
-    path: /data1/nfs-cluster-vol/jupyter/jupyter
-    server: 192.168.0.100
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  name: pvc-8g-jupyter-jupyter
-spec:
-  storageClassName: nfs-default-storageclass
-  accessModes:
-    - ReadWriteOnce
-  resources:
-    requests:
-      storage: 8Gi
-
-```
-
-
-```yaml
-apiVersion: v1
-kind: PersistentVolume
-metadata:
-  name: pv-16g-jupyter-mldldb
-spec:
-  capacity:
-    storage: 16Gi
-  volumeMode: Filesystem
-  accessModes:
-    - ReadWriteOnce
-  persistentVolumeReclaimPolicy: Delete
-  storageClassName: nfs-default-storageclass
-  mountOptions:
-    - hard
-    - nfsvers=4.1
-  nfs:
-    path: /data1/nfs-cluster-vol/jupyter/mldldb
-    server: 192.168.0.100
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  name: pvc-16g-jupyter-mldldb
-spec:
-  storageClassName: nfs-default-storageclass
-  accessModes:
-    - ReadWriteOnce
-  resources:
-    requests:
-      storage: 16Gi
-
-```
-# KUBERNETES K8S DEV
-
-```shell
-
-# install basic dependencies
-
-sudo apt-get install build-essential make openssl libssl-dev
-
-```
-
-
-```shell
-
-# bootstrap and install container runtime 
-
-sudo swapoff -a
-
-
-(crontab -l 2>/dev/null; echo "@reboot /sbin/swapoff -a") | crontab - || true
-sudo apt-get update -y
-
-cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
-overlay
-br_netfilter
-EOF
-
-sudo modprobe overlay
-sudo modprobe br_netfilter
-
-
-cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
-net.bridge.bridge-nf-call-iptables  = 1
-net.ipv4.ip_forward                 = 1
-net.bridge.bridge-nf-call-ip6tables = 1
-EOF
-
-sudo sysctl --system
-
-
-apt-get update
-apt-get install -y software-properties-common curl
-
-mkdir -p /etc/apt/keyrings
-
-KUBERNETES_VERSION=v1.30
-PROJECT_PATH=prerelease:/main
-
-curl -fsSL https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
-
-echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
-
-curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/$PROJECT_PATH/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
-
-echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/$PROJECT_PATH/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
-
-apt-get update
-
-apt-get install -y cri-o 
-
-systemctl daemon-reload
-systemctl enable crio --now
-
-systemctl start crio 
-
-
-```
-
-
-```shell
-
-# install go
-
-
-
-curl -OL https://golang.org/dl/go1.23.2.linux-amd64.tar.gz
-
-sudo tar -C /usr/local -xvf go1.23.2.linux-amd64.tar.gz
-
-rm -rf *.tar.gz
-
-echo "export PATH=\$PATH:/usr/local/go/bin" >> $HOME/.profile
-
-
-source ~/.profile
-
-```
-
-
-
-
-```shell
-
-
-# install cfssl
-
-go install github.com/cloudflare/cfssl/cmd/...@latest
-
-```
-
-
-```shell
-
-# clone kubenernetes repo
-
-
-git clone --filter=blob:none https://github.com/seantywork/kubernetes.git
-
-
-
-
-```
-
-
-
-```shell
-
-
-# install etcd
-
-
-./hack/install-etcd.sh
-
-sudo nano ~/.profile
-
-export KUBE_ROOT=/root/kubernetes
-export GOPATH=/usr/local/go
-export PATH=$PATH:$GOPATH/bin
-export PATH="$KUBE_ROOT/third_party/etcd:${PATH}"
-
-
-source ~/.profile
-
-```
-
-
-```shell
-
-# modify and run
-
-
-cat <<EOF > /tmp/resolv.conf
-nameserver 8.8.8.8
-nameserver 8.8.4.4
-EOF
-
-
-export CONTAINER_RUNTIME_ENDPOINT="unix:///run/crio/crio.sock"
-
-
-make
-
-# ./hack/local-up-cluster.sh
-
-KUBELET_RESOLV_CONF="/tmp/resolv.conf" KUBELET_FLAGS="--cgroup-driver=systemd" ./hack/local-up-cluster.sh
-
-```
-
-
-
-```shell
-
-export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig
-
-cd _output/local/bin/linux/amd64
-
-
-./kubectl apply -f your.yaml
-./kubectl get pods 
-
-
-```
-
-
-# KUBERNETES K8S
-
-
-```shell
-#!/bin/bash
-
-set -euxo pipefail
-
-
-######## wj
-
-
-HOME="/root" 
-
-
-sudo swapoff -a
-
-
-(crontab -l 2>/dev/null; echo "@reboot /sbin/swapoff -a") | crontab - || true
-sudo apt-get update -y
-
-
-
-#OS="xUbuntu_20.04"
-
-OS="$2"
-
-#VERSION="1.25"
-
-VERSION="$3"
-
-cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
-overlay
-br_netfilter
-EOF
-
-sudo modprobe overlay
-sudo modprobe br_netfilter
-
-
-cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
-net.bridge.bridge-nf-call-iptables  = 1
-net.ipv4.ip_forward                 = 1
-net.bridge.bridge-nf-call-ip6tables = 1
-EOF
-
-sudo sysctl --system
-
-
-curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v$VERSION/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
-
-echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v$VERSION/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
-
-
-sudo apt-get update
-sudo apt-get install cri-o -y
-
-sudo systemctl daemon-reload
-sudo systemctl enable crio --now
-
-echo "Container runtime installed susccessfully"
-
-sudo apt-get update
-sudo apt-get install -y apt-transport-https ca-certificates curl
-
-sudo mkdir -p /etc/apt/keyrings
-
-
-sudo curl -fsSL "https://pkgs.k8s.io/core:/stable:/v$VERSION/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
-
-echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v$VERSION/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
-
-sudo apt-get update -y
-sudo apt-get install -y kubelet kubectl kubeadm
-sudo apt-get update -y
-sudo apt-get install -y jq
-
-
-
-local_ip=$1
-cat > /etc/default/kubelet << EOF
-KUBELET_EXTRA_ARGS=--node-ip=$local_ip
-EOF
-
-
-MASTER_IP=$local_ip
-LB_IP=$local_ip
-IP_NO_DOT=$(echo "$local_ip" | sed "s/\./-/g")
-PORT="3446"
-NODENAME="$(hostname -s)"
-NODENAME="lead-$NODENAME-$IP_NO_DOT-$(openssl rand -hex 8)"
-POD_CIDR="10.10.0.0/16"
-
-sudo kubeadm config images pull 
-
-echo "Preflight Check Passed: Downloaded All Required Images"
-
-sudo kubeadm init --apiserver-advertise-address=$MASTER_IP --apiserver-cert-extra-sans="$MASTER_IP,$LB_IP" --pod-network-cidr=$POD_CIDR --node-name "$NODENAME" --control-plane-endpoint "$LB_IP:$PORT" --ignore-preflight-errors Swap 
-mkdir -p "$HOME"/.kube
-sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
-sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
-
-if [ -z ${INSTALL_CALICO+x} ]
-then
-  # cilium
-  CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
-  CLI_ARCH=amd64
-  if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
-  curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
-  sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
-  sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
-  rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
-
-  cilium install --version 1.14.5
-
-else
-  # calico
-  kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
-fi
-
-
-kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
-
-
-
-kubectl label node $NODENAME ingress-ready=true 
-
-```
-
-
-```shell
-
-#!/bin/bash
-
-
-set -euxo pipefail
-
-
-
-HOME="/root" 
-
-sudo swapoff -a
-
-
-(crontab -l 2>/dev/null; echo "@reboot /sbin/swapoff -a") | crontab - || true
-sudo apt-get update -y
-
-
-
-OS="$2"
-
-VERSION="$3"
-
-
-cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
-overlay
-br_netfilter
-EOF
-
-sudo modprobe overlay
-sudo modprobe br_netfilter
-
-
-cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
-net.bridge.bridge-nf-call-iptables  = 1
-net.ipv4.ip_forward                 = 1
-net.bridge.bridge-nf-call-ip6tables = 1
-EOF
-
-sudo sysctl --system
-
-
-curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v$VERSION/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
-
-echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/v$VERSION/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list
-
-
-sudo apt-get update
-sudo apt-get install cri-o -y
-
-sudo systemctl daemon-reload
-sudo systemctl enable crio --now
-
-echo "Container runtime installed susccessfully"
-
-
-sudo apt-get update
-
-sudo apt-get install -y apt-transport-https ca-certificates curl
-
-sudo mkdir -p /etc/apt/keyrings
-
-sudo curl -fsSL "https://pkgs.k8s.io/core:/stable:/v$VERSION/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
-
-echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v$VERSION/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
-
-sudo apt-get update -y
-sudo apt-get install -y kubelet kubectl kubeadm
-sudo apt-get update -y
-sudo apt-get install -y jq
-
-
-
-local_ip=$1
-cat > /etc/default/kubelet << EOF
-KUBELET_EXTRA_ARGS=--node-ip=$local_ip
-EOF
-```
-
-```shell
-
-#!/bin/bash
-
-sudo apt-get update
-
-sudo apt-get install -y  haproxy 
-
-```
-
-```shell
-#!/bin/bash
-
-helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
-
-helm repo update
-
-cd ./prom-grafana-charts/charts
-
-helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack -f ./default-kube-prom-custom-value.yaml --version 42.2.0
-
-
-```
-
-
-```shell
-#!/bin/bash
-
-helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
-
-
-helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
-    --set nfs.server=192.168.0.25 \
-    --set nfs.path=/data
-
-
-```
-
-```shell
-#!/bin/bash
-
-helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
-
-
-
-helm repo update
-
-
-
-helm upgrade -i nvdp nvdp/nvidia-device-plugin \
-
-  --namespace nvidia-device-plugin \
-
-  --create-namespace \
-
-  --version 0.13.0
-
-
-
-
-
-```
-
-```yaml
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: ingress-grafana
-
-spec:
-  rules:
-  - host: grafana.mipllab.com
-    http:
-      paths:
-        - path: /
-          pathType: Prefix
-          backend:
-            service:
-              name: kube-prometheus-stack-grafana
-              port:
-                number: 80
-
-```
-
-
-```shell
-...
-
-#---------------------------------------------------------------------
-# main frontend which proxys to the backends
-#---------------------------------------------------------------------
-frontend kubernetes
-    bind *:3446
-    option tcplog
-    mode tcp
-    default_backend kube_master_nodes    
-
-
-#---------------------------------------------------------------------
-# static backend for serving up images, stylesheets and such
-#---------------------------------------------------------------------
-#backend static
-#    balance     roundrobin
-#    server      static 127.0.0.1:4331 check
-
-#---------------------------------------------------------------------
-# round robin balancing between the various backends
-#---------------------------------------------------------------------
-backend kube_master_nodes
-    mode tcp
-    balance     roundrobin
-    option tcp-check
-    server  -> check fall 3 rise 2
-
-
-
-...
-
-
-
-
-```
-
-
-```shell
-
-#!/bin/bash
-
-
-ufw allow from 192.168.0.1/24 
-
-ufw allow from 10.10.0.0/16
-
-
-
-```
-
-
-```shell
-
-#!/bin/bash
-
-firewall-cmd --permanent --add-port=3446/tcp
-
-firewall-cmd --permanent --add-port=6443/tcp
-
-firewall-cmd --permanent --add-port=2379-2380/tcp
-
-firewall-cmd --permanent --add-port=10250/tcp
-
-firewall-cmd --permanent --add-port=10259/tcp
-
-firewall-cmd --permanent --add-port=10257/tcp
-
-firewall-cmd --permanent --add-port=10250/tcp
-
-firewall-cmd --permanent --add-port=30000-32767/tcp
-
-firewall-cmd --permanent --add-port=80/tcp
-
-firewall-cmd --permanent --add-port=443/tcp
-
-firewall-cmd --zone=trusted --add-source=192.168.0.1/24 --permanent
-
-firewall-cmd --zone=trusted --add-source=10.10.0.0/16 --permanent
-
-```
-
-
-```yaml
-
-kind: StorageClass
-apiVersion: storage.k8s.io/v1
-metadata:
-  annotations:
-    storageclass.kubernetes.io/is-default-class: "true"
-  name: nfs-default-storageclass
-provisioner: cluster.local/nfs-subdir-external-provisioner
-reclaimPolicy: Delete
-allowVolumeExpansion: true
-volumeBindingMode: Immediate
-
-```
-
-```yaml
-
-alertmanager:
-  alertmanagerSpec:
-    storage:
-     volumeClaimTemplate:
-       spec:
-         storageClassName: nfs-default-storageclass
-         accessModes: ["ReadWriteOnce"]
-         resources:
-           requests:
-             storage: 4Gi
-grafana:
-  persistence:
-    enabled: true
-    type: pvc
-    storageClassName: nfs-default-storageclass
-    accessModes:
-    - ReadWriteOnce
-    size: 4Gi
-prometheus:
-  prometheusSpec:
-    storageSpec:
-      volumeClaimTemplate:
-        spec:
-          storageClassName: nfs-default-storageclass
-          accessModes: ["ReadWriteOnce"]
-          resources:
-            requests:
-              storage: 4Gi
-```
-
-```yaml
-apiVersion: v1
-kind: Service
-metadata:
-  name: clusterdebugger
-  labels:
-    app: clusterdebugger
-spec:
-  type: ClusterIP
-  ports:
-  - port: 6700
-    targetPort: 6700
-    protocol: TCP
-  selector:
-    app: clusterdebugger
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: clusterdebugger
-spec:
-  selector:
-    matchLabels:
-      app: clusterdebugger
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: clusterdebugger
-    spec:
-      imagePullSecrets:
-        - name: harbor-secret
-      containers:
-        - name: clusterdebugger
-          image: harbor.mipllab.com/library/clusterdebugger
-          imagePullPolicy: Always
-          ports:
-          - containerPort: 6700
-
-
-```
-
-```yaml
-apiVersion: v1
-kind: Service
-metadata:
-  name: clusterdebuggergpu
-  labels:
-    app: clusterdebuggergpu
-spec:
-  type: ClusterIP
-  ports:
-  - port: 6700
-    targetPort: 6700
-    protocol: TCP
-  selector:
-    app: clusterdebuggergpu
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: clusterdebuggergpu
-spec:
-  selector:
-    matchLabels:
-      app: clusterdebuggergpu
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: clusterdebuggergpu
-    spec:
-      nodeSelector:
-        gpu-ready1: ready
-      imagePullSecrets:
-        - name: harbor-secret
-      containers:
-        - name: clusterdebuggergpu
-          image: harbor.mipllab.com/library/clusterdebugger
-          resources:
-            limits:
-              nvidia.com/gpu: 1
-          imagePullPolicy: Always
-          ports:
-          - containerPort: 6700
-
-
-```
-
-
-```shell
-#!/bin/bash
-
-
-USER=tomcat # customizable
-mkdir -p /etc/kubernetes/pki/etcd
-mv /home/${USER}/ca.crt /etc/kubernetes/pki/
-mv /home/${USER}/ca.key /etc/kubernetes/pki/
-mv /home/${USER}/sa.pub /etc/kubernetes/pki/
-mv /home/${USER}/sa.key /etc/kubernetes/pki/
-mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/
-mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/
-mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt
-mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
-mv /home/${USER}/admin.conf /etc/kubernetes/admin.conf
-
-
-
-```
-
-```shell
-#!/bin/bash
-
-USER=tomcat # customizable
-# Set the control_plane_ips to all other master node ips or hostnames
-CONTROL_PLANE_IPS="192.168.0.102 192.168.0.103"
-for host in ${CONTROL_PLANE_IPS}; do
-    scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:
-    scp /etc/kubernetes/pki/ca.key "${USER}"@$host:
-    scp /etc/kubernetes/pki/sa.key "${USER}"@$host:
-    scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:
-    scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:
-    scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:
-    scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt
-    scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key
-    scp /etc/kubernetes/admin.conf "${USER}"@$host:
-done
-
-
-
-```
-
-# KAFKA
-
-```shell
-#!/bin/bash
-
-
-
-helm repo add bitnami https://charts.bitnami.com/bitnami
-
-
-
-
-helm install zookeeper bitnami/zookeeper --set replicaCount=1 --set auth.enabled=false --set allowAnonymousLogin=true
-
-
-
-helm install kafka bitnami/kafka --set zookeeper.enabled=false --set replicaCount=1 --set externalZookeeper.servers=ZOOKEEPER-SERVICE-NAME
-
-
-```
-# KIBANA
-
-
-```yaml
-
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: ingress-kibana
-  annotations:
-      nginx.ingress.kubernetes.io/proxy-body-size: "0"
-
-spec:
-  rules:
-  - host: kibana.usagecorpus.com
-    http:
-      paths:
-        - path: /
-          pathType: Prefix
-          backend:
-            service:
-              name: kibana
-              port:
-                number: 5601
-
-
-
-```
-
-```yaml
-
-apiVersion: v1
-kind: Service
-metadata:
-  name: kibana
-  labels:
-    app: kibana
-spec:
-  type: ClusterIP
-  ports:
-  - port: 5601
-    targetPort: 5601
-    protocol: TCP
-  selector:
-    app: kibana
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: kibana
-spec:
-  selector:
-    matchLabels:
-      app: kibana
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: kibana
-    spec:
-      imagePullSecrets:
-        - name: harbor-secret
-      containers:
-        - name: kibana
-          image: seantywork/kibana
-          imagePullPolicy: Always
-          ports:
-          - containerPort: 5601
-
-
-
-```
-
-
-```yaml
-
-version: "3"
-services:
-    kibana:
-        build: ./kibana
-        container_name: kibana
-        restart: always
-        ports:
-            - 5601:5601
-        networks:
-            - network1
-
-networks:
-    network1:
-        name: elastic_default
-        external: true
-```
-
-```shell
-FROM kibana:8.5.3
-
-ENV ELASTICSEARCH_USERNAME="kibana_system"
-ENV ELASTICSEARCH_PASSWORD="estest"
-ENV ELASTICSEARCH_HOSTS=http://elasticsearch:9200
-ENV XPACK_MONITORING_ENABLED=true
-ENV XPACK_MONITORING_COLLECTION_ENABLED=true
-ENV XPACK_SECURITY_ENABLED=true
-
-EXPOSE 5601
-
-
-```
-
-# MONGO DB
-
-```yaml
-version: "3"
-services:
-        mongodb:
-                build: ./mdb
-                container_name: mongodb
-                ports:
-                        - 27017:27017
-                volumes:
-                        - ./mdb/data:/data/db
-
-
-```
-
-
-```shell
-FROM mongo:4.4.19-rc1
-
-ENV MONGO_INITDB_ROOT_USERNAME root
-ENV MONGO_INITDB_ROOT_PASSWORD youdonthavetoknow
-
-EXPOSE 27017
-
-```
-
-# OPENSTACK
-
-
-```shell
-
-# devstack
-
-sudo useradd -s /bin/bash -d /opt/stack -m stack
-echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
-sudo -u stack -i
-
-git clone https://opendev.org/openstack/devstack
-cd devstack
-
-# local.conf
-
-[[local|localrc]]
-ADMIN_PASSWORD=openstack
-DATABASE_PASSWORD=openstack
-RABBIT_PASSWORD=openstack
-SERVICE_PASSWORD=openstack
-HOST_IP=$IP_ADDR_OF_VM
-
-./stack.sh
-
-user: admin
-password: openstack
-
-```
-
-
-
-
-
-# NFS
-
-```shell
-
-#!/bin/bash
-
-sudo dnf install nfs-utils
-
-
-
-sudo systemctl start nfs-server.service
-
-
-sudo systemctl enable --now nfs-server.service
-
-
-## /etc/exports
-
-## exportfs -a
-
-
-```
-
-```shell
-#!/bin/bash
-
-apt update
-
-apt install -y nfs-kernel-server
-
-apt install -y nfs-common
-
-apt install -y jq
-
-mkdir -p /kw_data
-
-chown -R root:root /kw_data
-
-chmod -R 777 /kw_data
-
-
-
-local_ip=$1
-
-IP=$local_ip
-
-cat << EOF > /etc/exports
-
-/kw_data $IP/24(rw,sync,no_subtree_check,no_root_squash) 10.10.0.0/16(rw,sync,no_subtree_check,no_root_squash)
-
-EOF
-
-exportfs -a
-
-systemctl restart nfs-kernel-server
-
-```
-
-
-# NGINX CONF
-
-```shell
-
-user www-data;
-worker_processes auto;
-pid /run/nginx.pid;
-#include /etc/nginx/modules-enabled/*.conf;
-
-events {
-        worker_connections 768;
-        # multi_accept on;
-}
-
-http {
-
-        ##
-        # Basic Settings
-        ##
-
-        sendfile on;
-        tcp_nopush on;
-        tcp_nodelay on;
-        reset_timedout_connection on;
-        client_body_timeout 10;
-        send_timeout 2;
-
-        keepalive_timeout 30;
-        keepalive_requests 100000;
-
-        client_max_body_size 10G;
-
-
-        include /etc/nginx/mime.types;
-        default_type application/octet-stream;
-
-        ##
-        # SSL Settings
-        ##
-
-        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
-        ssl_prefer_server_ciphers on;
-
-        ##
-        # Logging Settings
-        ##
-
-        access_log /var/log/nginx/access.log;
-        error_log /var/log/nginx/error.log;
-
-        ##
-        # Gzip Settings
-        ##
-
-        #gzip on;
-
-        #gzip_comp_level  2;
-        #gzip_min_length  1000;
-        #gzip_proxied     expired no-cache no-store private auth;
-        #gzip_types       text/plain application/x-javascript text/xml text/css application/xml;
-
-        include /etc/nginx/conf.d/*.conf;
-
-}
-```
-
-```shell
-
-
-
-server
-{
-        
-        listen 80;
-
-        server_name  exhibit-nginx.usagecorpus.com;
-
-        location / {
-             add_header Content-Type text/plain;
-             return 200 'okay';           
-
-        }
-
-
-}
-
-```
-
-```shell
-
-upstream  EXNGINX{
-        ip_hash;
-        #least_conn;
-
-        server  127.0.0.1:8000;
-        server  127.0.0.1:8001;
-
-}
-
-server
-{
-        listen       80;
-        server_name      exhibit-nginx.usagecorpus.com;
-        return 301 https://$host$request_uri;
-}
-
-
-
-server
-{
-        
-        server_name  exhibit-nginx.usagecorpus.com;
-
-        location / {
-             #add_header Content-Type text/plain;
-             #return 200 'okay';           
-
-             proxy_pass http://EXNGINX;
-             proxy_set_header X-Real-IP $remote_addr;
-             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-             proxy_set_header X-Forwarded-For $remote_addr;
-             proxy_set_header X-Forwarded-Proto $scheme;
-             proxy_set_header Host $http_host;
-
-             proxy_read_timeout 300s;
-             proxy_connect_timeout 75s;
-             
-             proxy_buffering off;
-             proxy_request_buffering off;
-
-             proxy_http_version 1.1;
-             proxy_set_header   Upgrade $http_upgrade;
-             proxy_set_header   Connection "upgrade";
-        }
-
-
-
-
-
-
-
-    #listen 80; # managed by Certbot
-
-    listen 443 ssl; # managed by Certbot
-    ssl_certificate /etc/letsencrypt/live/exhibit-nginx.usagecorpus.com/fullchain.pem; # managed by Certbot
-    ssl_certificate_key /etc/letsencrypt/live/exhibit-nginx.usagecorpus.com/privkey.pem; # managed by Certbot
-    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
-    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
-
-}
-```
-
-```shell
-
-# add server without restart
-
-sudo nginx -s reload
-
-```
-
-
-```shell
-#!/bin/bash
-
-
-while true; do nc -l 0.0.0.0 8000 < resp; done
-
-
-```
-
-
-# CMAKELISTS TXT CMAKE
-
-```shell
-
-cd $PROJECT_DIR
-
-mkdir -p build
-
-cd build
-
-cmake ..
-
-make
-
-# blah blah after that
-
-
-```
-```shell
-# build lib
-
-
-cmake_minimum_required(VERSION 3.2)
-project(dynamiclink_print)
-set(CMAKE_BUILD_TYPE Release)
-
-include_directories(include)
-
-set(SOURCES src/crazything.cc)
-
-
-# target lib for .so
-add_library(crazything SHARED ${SOURCES})
-# target lib for .a
-add_library(something STATIC ${SOURCES})
-
-# for installing lib: sudo make install...
-install(TARGETS crazything DESTINATION /usr/lib)
-
-
-```
-
-
-```shell
-# build target
-
-# min ver
-cmake_minimum_required(VERSION 3.2)
-# project name
-project (main_lib_print)
-
-
-# include
-include_directories(
-    ../2_staticlink_print/include
-    ../3_dynamiclink_print/include
-    )
-
-# set var
-set ( PROJECT_LINK_LIBS libsomething.a libcrazything.so)
-
-# static or dynamic link dirs
-link_directories( 
-    ../2_staticlink_print/build
-    ../3_dynamiclink_print/build 
-    )
-
-
-# target bin
-add_executable(main.out main.cc)
-
-# linking to target bin
-target_link_libraries(main.out ${PROJECT_LINK_LIBS})
-
-```
-
-```shell
-
-# include another one
-
-include(another/cmakelists.txt)
-
-
-
-# source all
-file(
-  GLOB somefile
-  "${SRC_DIR}/*.c"
-)
-
-# -pthread
-
-Threads::Threads
-
-# export (when included in another CMakeLists.txt)
-install(
-  TARGETS thethinghere
-  EXPORT thethinghere
-  ARCHIVE DESTINATION lib
-  LIBRARY DESTINATION lib
-)
-
-install(
-  EXPORT thethinghere
-  DESTINATION lib
-  FILE agvcancomm-Config.cmake
-)
-
-
-
-```
-
-
-# JENKINSFILE
-
-
-```shell
-
-pipeline{
-
-    agent any
-
-        environment {
-
-            // Target Path
-
-            TARGET_PATH="/home/target"
-            TARGET_PREFIX="target_"
-
-            // Preparation Stage
-
-            GIT_ADDR="https://${GIT_ID}:${GIT_PW}@github.com/seantywork/nothing.git"
-            GIT_BRANCH="main"
-            
-            // Build Stage
-
-            REG_ADDR="docker.io -u ${REG_ID} -p ${REG_PW}"
-            IMG_1="${TARGET_PREFIX}nothing"
-            TAG_1="docker.io/seantywork/nothing"
-
-
-            // Deployment Stage
-
-            DEPLOYMENT_NODE="${DEPLOYMENT_NODE}"
-
-            APP_PATH_1="${TARGET_PATH}/k8s/app.yaml"
-
-
-            UPDATE_1="deployment/nothing"
-
-
-            
-            // ********* Safe Scripts **********
-
-            // stage Preparation_checkSafe
-            // --> USAGE: ${SAFE_PREP} ${TARGET_PATH} 
-            SAFE_PREP="/home/safe_preparation"
-
-            // stage Termination_checkSafe
-            // --> USAGE: ${SAFE_TERM} ${TAG_1} ${TAG_2} ...
-            SAFE_TERM="/home/safe_termination"
-
-
-        }
-
-    stages{
-
-
-
-        stage ('Preparation'){
-
-            steps {
-
-                sh ''' #!/bin/bash
-
-                    mkdir -p ${TARGET_PATH}
-
-                    git -C ${TARGET_PATH} init
-
-                    git -C ${TARGET_PATH} pull ${GIT_ADDR} ${GIT_BRANCH}
-
-                '''
-
-            }
-
-        }
-
-        stage ('Preparation-safety-check'){
-
-            steps {
-
-                sh ''' #!/bin/bash
-
-                    ${SAFE_PREP} ${TARGET_PATH} 
-
-                '''
-
-            }
-
-        }
-
-        stage ('Build'){
-
-            steps {
-
-                sh ''' #!/bin/bash
-
-                    docker login ${REG_ADDR}
-
-                    docker-compose -f "${TARGET_PATH}/docker-compose.yaml" up -d --build
-
-                    docker-compose -f "${TARGET_PATH}/docker-compose.yaml" down
-
-                    docker tag ${IMG_1} ${TAG_1}
-
-                    docker push ${TAG_1}
-
-                '''
-
-            }
-
-        }
-
-        stage ('Deployment'){
-
-            steps {
-
-                sh ''' #!/bin/bash
-
-                    scp ${APP_PATH_1} "${DEPLOYMENT_NODE}:/home/src"
-
-                    ssh ${DEPLOYMENT_NODE} "kubectl -n operation apply -f app.yaml"
-
-                    ssh ${DEPLOYMENT_NODE} "kubectl -n operatioin rollout restart ${UPDATE_1}"
-
-                    ssh ${DEPLOYMENT_NODE} "rm ./app.yaml"
-
-                '''
-            }
-
-        }
-
-        stage ('Termination'){
-
-            steps {
-
-                sh ''' #!/bin/bash
-
-                    rm -rf ${TARGET_PATH}
-
-                '''
-
-
-            }
-
-        }
-
-        stage ('Termination-safety-check'){
-
-            steps {
-
-                sh ''' #!/bin/bash
-
-                    ${SAFE_TERM} ${TAG_1} 
-
-                '''
-
-            }
-
-
-        }
-
-
-    }
-}
-
-
-```
-
-
-
-# GITHUB WORKFLOW
-
-```yaml
-
-name: self hosted runner
-
-on :
-  push:
-    branches: [ main ]
-
-jobs:
-
-  uc_self_hosted_build:
-    runs-on: self-hosted
-    steps: 
-      - run: mkdir -p /root/uc
-      - run: git -C /root/uc init
-      - run: git -C /root/uc pull https://github.com/seantywork/uc.git 
-      - run: docker-compose -f /root/uc/docker-compose.yaml up -d --build
-      - run: docker-compose -f /root/uc/docker-compose.yaml down
-      - run: docker tag uc_traffic seantywork/traffic
-      - run: docker tag uc_web seantywork/web
-      - run: docker tag uc_db seantywork/db
-      - run: docker push seantywork/traffic
-      - run: docker push seantywork/web
-      - run: docker push seantywork/db
-      - run: rm -r /root/uc
-
-  uc_self_hosted_deployment:
-    needs: uc_self_hosted_build
-    runs-on: self-hosted
-    steps:
-      - run: ssh $SSH_XY "git -C /home/seantywork/uc pull "
-      - run: ssh $SSH_XY "kind delete cluster --name kindcluster"
-      - run: ssh $SSH_XY "kind create cluster --name kindcluster --config /home/seantywork/uc/k8s/kindcluster.yaml --image=kindest/node:v1.27.2"
-      - run: ssh $SSH_XY "kubectl create namespace uc"
-      - run: ssh $SSH_XY "kubectl create secret generic docker-secret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson -n uc"
-      - run: ssh $SSH_XY "kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml"
-      - run: sleep 3
-      - run: echo "waiting...1"
-      - run: sleep 3
-      - run: echo "waiting...2"
-      - run: sleep 3
-      - run: echo "waiting...3"
-      - run: sleep 3
-      - run: echo "waiting...4"
-      - run: sleep 3
-      - run: echo "waiting...5"
-      - run: ssh $SSH_XY "kubectl -n uc apply -f /home/seantywork/uc/k8s/app.yaml"
-  uc_self_hosted_service:
-    needs: uc_self_hosted_deployment
-    runs-on: self-hosted
-    steps:
-      - run: sleep 3
-      - run: echo "waiting...1"
-      - run: sleep 3
-      - run: echo "waiting...2"
-      - run: sleep 3
-      - run: echo "waiting...3"
-      - run: sleep 3
-      - run: echo "waiting...4"
-      - run: sleep 3
-      - run: echo "waiting...5"
-      - run: ssh $SSH_XY "kubectl -n uc apply -f /home/seantywork/uc/k8s/ingress.yaml"
-  
-
-```
-
-
-# REDIS
-
-```yaml
-version: "3"
-
-services:
-
-    redis:
-      build: ./redis
-      container_name: redis
-      volumes:
-        - ./redis/data:/var/lib/redis/data
-        - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
-      ports:
-        - "6379:6379"
-
-
-```
-
-
-```shell
-
-FROM redis:7.0.8
-
-EXPOSE 6379
-
-CMD ["/bin/sh","-c","redis-server","--requirepass","youdonthavetoknow"]
-
-
-```
-
-
-```shell
-
-port              6379
-daemonize         yes
-save              60 1
-bind              0.0.0.0
-tcp-keepalive     300
-dbfilename        dump.rdb
-dir               ./
-rdbcompression    yes
-
-```
-
-
-# REMOTE DESKTOP
-
-```shell
-
-# remote server
-
-sudo apt install xrdp -y
-
-sudo systemctl restart xrdp
-
-
-# client
-
-sudo apt install remmina remmina-plugin-vnc
-
-
-
-```
-
-# GRPC SET UP
-
-
-```shell
-# install
-
-export MY_gRPC_DIR=$HOME/.local
-
-mkdir -p $MY_gRPC_DIR
-
-export PATH="$MY_gRPC_DIR/bin:$PATH"
-
-# cmake version should be 3.8+
-
-
-sudo apt install -y build-essential autoconf libtool pkg-config
-
-git clone --recurse-submodules -b v1.60.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
-
-
-cd grpc
-mkdir -p cmake/build
-pushd cmake/build
-cmake -DgRPC_INSTALL=ON \
-      -DgRPC_BUILD_TESTS=OFF \
-      -DCMAKE_INSTALL_PREFIX=$MY_gRPC_DIR \
-      ../..
-make -j 4
-sudo make install
-popd
-
-
-```
-
-
-```shell
-
-# build
-
-# src CMakeLists.txt and common.cmake update
-
-export MY_gRPC_DIR=$HOME/.local
-
-mkdir -p build
-
-cd build && cmake -DCMAKE_PREFIX_PATH=$MY_gRPC_DIR ..
-
-make -j 4
-
-
-```
-
-
-# ROS 2
-
-```shell
-
-# on ubuntu 22.04 ros2 humble hawksbill
-
-# takes up about 2G disk space
-
-locale  # check for UTF-8
-
-sudo apt update && sudo apt install locales
-sudo locale-gen en_US en_US.UTF-8
-sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
-export LANG=en_US.UTF-8
-
-locale  # verify settings
-
-
-
-sudo apt install software-properties-common
-sudo add-apt-repository universe
-
-
-sudo apt update && sudo apt install curl -y
-sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
-
-
-echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
-
-
-
-
-sudo apt update
-
-
-sudo apt upgrade
-
-
-sudo apt install ros-humble-desktop
-
-
-sudo apt install ros-humble-ros-base
-
-
-sudo apt install ros-dev-tools
-
-
-
-source /opt/ros/humble/setup.bash
-
-
-# check if installation is succeful
-
-
-# terminal 1
-
-source /opt/ros/humble/setup.bash
-ros2 run demo_nodes_cpp talker
-
-
-# terminal 2
-
-source /opt/ros/humble/setup.bash
-ros2 run demo_nodes_py listener
-
-
-```
-
-
-```shell
-
-# cartographer
-
-ros2 pkg list |grep cartographer
-
-# if none
-
-sudo apt install ros-$ROS_DISTRO-cartographer -y
-
-# turtlebot3
-
-sudo apt install ros-$ROS_DISTRO-turtlebot3* -y
-
-# simulation
-
-source /opt/ros/humble/setup.bash
-
-export TURTLEBOT3_MODEL=burger
-
-export GAZEBO_MODEL_PATH=`ros2 pkg \
-prefix turtlebot3_gazebo`/share/turtlebot3_gazebo/models/
-
-
-ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
-
-# troubleshoot
-# not sure if effective?
-gazebo -s libgazebo_ros_init.so -s libgazebo_ros_factory.so myworld.world
-
-
-# on terminal 2 remote pc: teleoperation node
-
-source /opt/ros/humble/setup.bash
-
-ros2 run turtlebot3_teleop teleop_keyboard
-
-# on terminal 3 remote pc: cartographer
-
-source /opt/ros/humble/setup.bash
-
-ros2 launch turtlebot3_cartographer \
-cartographer.launch.py \
-use_sim_time:=True
-
-```
-
-
-```shell
-
-# real
-
-# on turtlebot3 do below
-
-source .bashrc
-
-cd turtlebot3_ws
-
-#Set up ROS_DOMAIN_ID
-
-export ROS_DOMAIN_ID="Your Number"
-
-# e.g. export ROS_DOMAIN_ID=11
-
-source install/setup.bash
-
-ros2 launch turtlebot3_bringup robot.launch.py
-
-# on terminal2 : teleoperation node
-
-
-source /opt/ros/humble/setup.bash
-
-export ROS_DOMAIN_ID="Your Number"
-# e.g. export ROS_DOMAIN_ID=11
-
-ros2 run turtlebot3_teleop teleop_keyboard
-
-
-# on terminal3 : cartoprapher
-
-
-
-source /opt/ros/humble/setup.bash
-
-export ROS_DOMAIN_ID="Your Number"
-# e.g. export ROS_DOMAIN_ID=11
-
-ros2 run cartographer_ros occupancy_grid_node -resolution 0.05\
--publish_period_sec 1.0
-
-ros2 run cartographer_ros cartographer_node\
--configuration_directory]\ 
-install/turtlebot3_cartographer/share/turtlebot3_cartographer\
-/config -configuration_basename turtlebot3_lds_2d.lua
-
-
-```
-
-# ROS API
-
-```shell
-# term1
-
-mkdir -p ros2_ws/src
-
-
-source /opt/ros/humble/setup.bash
-
-# git clone https://github.com/ros/ros_tutorials.git -b humble
-
-# term1 dependency at ros2_ws
-
-rosdep install -i --from-path src --rosdistro humble -y
-
-# term1 build at ros2_ws
-
-colcon build --symlink-install
-
-# term2
-
-source /opt/ros/humble/setup.bash
-
-# term2 at ros2_ws
-
-source install/local_setup.bash
-
-```
-
-```shell
-
-# term1
-
-# package dev
-
-source /opt/ros/humble/setup.bash
-
-# package dec at ros2_ws/src
-
-ros2 pkg create --build-type ament_cmake --node-name $NODE_NAME $PKG_NAME
-
-# source goes to ros2_ws/src/$PKG_NAME/src
-
-# package.xml, CMakeLists.txt update
-
-# install dependency at ros2_ws
-
-rosdep install -i --from-path src --rosdistro humble -y
-
-# package build at ros2_ws
-
-colcon build --symlink-install --packages-select $PKG_NAME
-
-
-
-# term2
-
-source /opt/ros/humble/setup.bash
-
-# term2 at ros2_ws
-
-source install/local_setup.bash
-
-# run
-
-ros2 run $PKG_NAME $NODE_NAME
-
-
-
-```
-# ROS COLCON BUILD LAUNCH
-
-```shell
-# term 1
-
-source /opt/ros/directory/setup.bash
-
-colcon build --symlink-install
-
-```
-
-```shell
-# term 2
-
-source install/setup.bash
-
-ros2 launch $PAKCAGE_NAME $LAUNCHFILE_NAME
-
-
-```
-
-
-# ROS DOCKER
-
-```shell
-
-# pyslam v2
-
-nvidiactk
-
-# config.sh work dir 
-
-build.sh <NAME>
-
-xhost +
-
-run.sh <NAME>
-
-# $DISPLAY ?
-
-
-
-```
-
-
-# CAN NETWORK
-
-```shell
-
-# using gpio
-
-sudo apt-get install busybox
-
-
-# register up for a test
-
-sudo busybox devmem 0x0c303000 32 0x0000C400
-sudo busybox devmem 0x0c303008 32 0x0000C458
-sudo busybox devmem 0x0c303010 32 0x0000C400
-sudo busybox devmem 0x0c303018 32 0x0000C458
-
-
-sudo modprobe can
-sudo modprobe can_raw
-sudo modprobe mttcan
-
-
-# each second line optional?
-
-sudo ip link set can0 type can bitrate 500000 \
-    dbitrate 2000000 berr-reporting on fd on
-sudo ip link set can1 type can bitrate 500000 \
-    dbitrate 2000000 berr-reporting on fd on
-
-
-sudo ip link set up can0
-sudo ip link set up can1
-
-
-# cron the sh file at reboot
-
-```
-```shell
-
-# vcan
-
-sudo modprobe vcan
-
-ip link add dev vcan0 type vcan
-
-ip link set up vcan0
-
-```
-
-```shell
-# can utils
-
-sudo apt-get install can-utils
-
-# send to if with id
-cansend vcan0 101#41424344
-
-# dump all incoming data
-
-candump -t Absolute vcan0
-
-# send random frame continuously
-
-cangen vcan0
-
-
-```
-
-# CANOPEN
-
-```shell
-
-git clone https://github.com/CANopenNode/CANopenLinux.git
-cd CANopenLinux
-git submodule init
-git submodule update
-
-
-sudo modprobe can
-sudo modprobe can_raw
-sudo modprobe mttcan
-
-
-
-
-sudo ip link set can0 type can bitrate 500000 \
-    dbitrate 2000000 berr-reporting on fd on
-
-
-sudo ip link set up can0
-
-cd CANopenLinux
-
-make
-
-sudo make install
-
-canopend --help
-
-# send SDO, PDO according to the motor driver vendor manual
-
-```
-
-
-# MQTT
-
-```shell
-# docker compose
-
-version: "3.7"
-
-services:
-  mosquitto:
-    image: eclipse-mosquitto
-    container_name: mosquitto
-    restart: unless-stopped
-    ports:
-      - "1883:1883"
-      - "9001:9001"
-    volumes:
-      - ./mosquitto:/etc/mosquitto
-      - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
-
-```
-
-
-```shell
-
-# volume config
-
-listener 1883
-allow_anonymous true
-# password_file /etc/mosquitto/passwd
-
-```
-
-# RASPBERRY PI
-
-```shell
-# gpio pins for rpi 4
-
-| #  |           | PIN  |    |    | PIN  |          | #  |
-|----|-----------|------|----|----|------|----------|----|
-| 1  | 3v3 Power | `1`  | 🟧 | 🔴 | `2`  | 5v Power | 20 |
-| 2  | GPIO 2    | `3`  | 🔵 | 🔴 | `4`  | 5v Power | 19 |
-| 3  | GPIO 3    | `5`  | 🔵 | ⚫ | `6`  | *Ground* | 18 |
-| 4  | GPIO 4    | `7`  | 🟢 | 🟣 | `8`  | GPIO 14  | 17 |
-| 5  | *Ground*  | `9`  | ⚫ | 🟣 | `10` | GPIO 15  | 16 |
-| 6  | GPIO 17   | `11` | 🟢 | 🟤 | `12` | GPIO 18  | 15 |
-| 7  | GPIO 27   | `13` | 🟢 | ⚫ | `14` | *Ground* | 14 |
-| 8  | GPIO 22   | `15` | 🟢 | 🟢 | `16` | GPIO 23  | 13 |
-| 9  | 3v3 Power | `17` | 🟠 | 🟢 | `18` | GPIO 24  | 12 |
-| 10 | GPIO 10   | `19` | 🟡 | ⚫ | `20` | *Ground* | 11 |
-| 11 | GPIO 9    | `21` | 🟡 | 🟢 | `22` | GPIO 25  | 10 |
-| 12 | GPIO 11   | `23` | 🟡 | 🟡 | `24` | GPIO 8   | 9  |
-| 13 | *Ground*  | `25` | ⚫ | 🟡 | `26` | GPIO 7   | 8  |
-| 14 | GPIO 0    | `27` | 🔵 | 🔵 | `28` | GPIO 1   | 7  |
-| 15 | GPIO 5    | `29` | 🟢 | ⚫ | `30` | *Ground* | 6  |
-| 16 | GPIO 6    | `31` | 🟢 | 🟢 | `32` | GPIO 12  | 5  |
-| 17 | GPIO 13   | `33` | 🟢 | ⚫ | `34` | *Ground* | 4  |
-| 18 | GPIO 19   | `35` | 🟤 | 🟢 | `36` | GPIO 16  | 3  |
-| 19 | GPIO 26   | `37` | 🟢 | 🟤 | `38` | GPIO 20  | 2  |
-| 20 | *Ground*  | `39` | ⚫ | 🟤 | `40` | GPIO 21  | 1  |
-
-**Legend:**
-
-* 🟢 GPIO (General Purpose IO)
-* 🟡 SPI (Serial Peripheral Interface)
-* 🔵 I2C (Inter-integrated Circuit)
-* 🟣 UART (Universal Asyncronous)
-* 🟤 PCM (Pulse Code Modulation)
-* ⚫ Ground
-* 🔴 5v (Power)
-* 🟠 3.3v (Power)
-
-```
-
-
-```shell
-
-# get real pin number (device tree)
-
-
-cat /sys/kernel/debug/gpio
-
-```
-
-```shell
-
-# pgpio
-
-# install pigpio
-wget https://github.com/joan2937/pigpio/archive/master.zip
-unzip master.zip
-cd pigpio-master
-make
-sudo make install
-
-# wiringpi
-
-sudo apt install wiringpi
-
-# ir receiver
-
-# S
-# > OUT
-# > POWER
-# > GND
-# -
-
-# OUT to GPIO 4
-# POWER to PIN 1
-# GND to PIN 9
-```
-```shell
-# lirc
-
-# ir transmitter
-
-# > DAT
-# > VCC
-# > GND
-
-# DAT to GPIO 23
-# VCC to PIN 2
-# GND to PIN 20
-
-# install lirc
-
-sudo apt-get update 
-
-sudo apt-get install lirc -y
-
-
-```shell
-# on xU22.04
-# /boot/firmware/config.txt
-# below last [all]
-
-[all]
-...
-dtoverlay=gpio-ir,gpio_pin=4
-dtoverlay=gpio-ir-tx,gpio_pin=23
-...
-
-# 4 receive < in
-
-# 23 transmit > out
-```
-
-```shell
-# /etc/lirc/hardware.conf
-
-LIRCD_ARGS="--uinput --listen"
-LOAD_MODULES=true
-DRIVER="default"
-DEVICE="/dev/lirc0"
-MODULES="lirc_rpi"
-
-# /etc/lirc/lirc_options.conf
-
-#driver         = devinput
-#device         = auto
-driver          = default
-device          = /dev/lirc0
-```
-```shell
-
-# check incoming infrared signal
-
-sudo systemctl stop lircd
-
-sudo mode2 -m -d /dev/lirc1 > *.lirc.conf
-
-# *.lirc.conf format
-
-begin remote
-
-  name LG_AC
-  flags RAW_CODES|CONST_LENGTH
-  eps 30
-  aeps 100
-
-  gap 513079
-
-      begin raw_codes
-
-  name AC_ON
-
-     3044     9814      495     1569      465      548
-      469      548      469      550      467     1592
-      441      549      525      496      494      520
-      466      551      469      548      469      550
-      467      548      465      577      468      549
-      466      552      465      550      466      550
-      450     1612      468     1566      443     1620
-      418      571      467      550      520      497
-      498      519      494      523      467     1620
-      420     1614      442     1619      464   
-
-  name AC_OFF
-
-     3075     9815      493     1593      442      548
-      470      549      470      546      468     1591
-      441      575      470      547      467      550
-      467     1595      439     1594      439      553
-      468      550      465      573      466      551
-      444      573      443      574      446      570
-      444      572      444      573      443      574
-      444      572      444     1617      440      556
-      462     1593      445      572      445      575
-      468      572      444     1617      418   
-
-      end raw_codes
-
-end remote
-
-
-# cp
-
-sudo cp lgac.lirc.conf /etc/lirc/lircd.conf.d/
-
-
-# mv 
-
-sudo mv /etc/lirc/lircd.conf.d/devinput.lircd.conf /etc/lirc/lircd.conf.d/devinput.lircd.conf.bak
-
-# reboot
-
-# list
-
-sudo irsend LIST LG_AC ""
-
-# send
-
-sudo irsend SEND_ONCE LG_AC AC_ON
-
-```
-
-# DT DTS DTBO 
-
-```shell
-# gpiosk.dts
-/dts-v1/;
-/plugin/;
-
-/ {
-    compatible = "brcm,bcm2711";
-
-    fragment@0 {
-        target = <&gpio>;
-        __overlay__ {
-            pinctrl-names = "default";
-            pinctrl-0 = <&gpiosk_pins_in>;
-
-            gpiosk_pins_in: gpiosk_pins_in {
-                brcm,pins = <17>;     /* GPIO17 */
-                brcm,function = <0>; /* Input */
-            };
-        };
-    };
-};
-
-```
-
-```shell
-# compile 
-dtc -@ -I dts -O dtb -o gpiosk.dtbo gpiosk.dts
-
-```
-
-# JETSON XAVIER NX
-
-```shell
-
-# first flash
-
-# recovery mode
-
-# check if recovery mode
-
-lsusb 
-
-# get jetson linux bsp and rootfs
-
-# 35.4.1 (ubuntu20)
-
-# https://developer.nvidia.com/embedded/jetson-linux-r3541
-
-# un bzip2 un tar both and get the rootfs using sudo tar into BSP/rootfs
-
-sudo ./apply_binaries.sh
-
-sudo ./nvautoflash.sh
-
-# now on jetson
-
-fdisk /dev/nvme0n
-
-mkfs.ext4 /dev/nvme0np1
-
-
-# copy to volume and then switch rootfs when booting
-
-sudo mount /dev/nvme0n1p1 /mnt
-
-sudo rsync -axHAWX --numeric-ids --info=progress2 --exclude={"/dev/","/proc/","/sys/","/tmp/","/run/","/mnt/","/media/*","/lost+found"} / /mnt
-
-
-sudo cp setssdroot.service /etc/systemd/system
-sudo cp setssdroot.sh /sbin
-sudo chmod 777 /sbin/setssdroot.sh
-systemctl daemon-reload
-sudo systemctl enable setssdroot.service
-
-
-sudo cp /etc/systemd/system/setssdroot.service /mnt/etc/systemd/system/setssdroot.service
-sudo cp /sbin/setssdroot.sh /mnt/sbin/setssdroot.sh
-
-
-sudo touch /etc/setssdroot.conf
-
-```
-
-```shell
-# setssdroot.service
-
-[Unit]
-Description=Change rootfs to SSD in M.2 key M slot (nvme0n1p1)
-DefaultDependencies=no
-Conflicts=shutdown.target
-After=systemd-remount-fs.service
-Before=local-fs-pre.target local-fs.target shutdown.target
-Wants=local-fs-pre.target
-ConditionPathExists=/dev/nvme0n1p1
-ConditionPathExists=/etc/setssdroot.conf
-ConditionVirtualization=!container
-[Service]
-Type=oneshot
-RemainAfterExit=yes
-ExecStart=/sbin/setssdroot.sh
-[Install]
-WantedBy=default.target
-
-```
-
-```shell
-# setssdroot.sh
-#!/bin/sh
-NVME_DRIVE="/dev/nvme0n1p1"
-CHROOT_PATH="/nvmeroot"
-
-INITBIN=/lib/systemd/systemd
-EXT4_OPT="-o defaults -o errors=remount-ro -o discard"
-
-modprobe ext4
-
-mkdir -p ${CHROOT_PATH}
-mount -t ext4 ${EXT4_OPT} ${NVME_DRIVE} ${CHROOT_PATH}
-
-cd ${CHROOT_PATH}
-/bin/systemctl --no-block switch-root ${CHROOT_PATH}
-```
-
-```shell
-
-# install jetpack
-
-sudo apt update
-sudo apt install nvidia-jetpack
-
-
-```
-
-
-# VIDEO LIVE STREAM FFMPEG GSTREAMER RTMP NGINX
-
-```shell
-
-sudo apt install -y ffmpeg v4l-utils
-
-sudo apt install libnginx-mod-rtmp
-
-
-```
-
-```shell
-
-# gstreamer
-
-apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
-
-# gstreamer arm
-
- + gstreamer1.0-libcamera
-
-
-```
-
-
-```shell
-# /etc/nginx/nginx.conf
-
-# for ssl
-stream{
-
-        upstream RTMP_SERVER {
-                server 192.168.0.32:1936;
-        }
-
-
-        server {
-                listen 1935 ssl;
-                proxy_pass RTMP_SERVER;
-                ssl_certificate /etc/letsencrypt/live/feebdaed.xyz/fullchain.pem;
-                ssl_certificate_key /etc/letsencrypt/live/feebdaed.xyz/privkey.pem;
-        }
-}
-
-rtmp {
-        server {
-                listen 1936;
-                allow publish 192.168.0.32;
-
-                # allow publish feebdaed.xyz
-
-                application live {
-                        live on;
-                        interleave on;
-                        record off;
-                        hls on;
-                        hls_path /tmp/hls;
-                        hls_fragment 15s;
-
-                        # external auth server
-                        on_publish http://localhost:5000/auth;
-                        notify_method get;
-
-                }
-        }
-}
-
-# /etc/nginx/conf.d/hls.conf
-
-server
-{
-
-        listen      8080 ssl;
-        ssl_certificate /etc/letsencrypt/live/feebdaed.xyz/fullchain.pem; # managed by Certbot
-        ssl_certificate_key /etc/letsencrypt/live/feebdaed.xyz/privkey.pem; # managed by Certbot
-        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
-        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
-
-        location /hls {
-            types {
-                application/vnd.apple.mpegurl m3u8;
-                video/mp2t ts;
-            }
-            root /tmp;
-            add_header Cache-Control no-cache;
-
-            # for file:// testing only
-            add_header Access-Control-Allow-Origin *;
-
-        }
-}
-
-
-```
-
-
-```shell
-
-# stream to rtmp server
-
-
-ffmpeg -f v4l2 -i /dev/video0 \
-  -f alsa -i hw:0,0 \
-  -c:v libx264 -pix_fmt yuv420p -framerate 15 -g 30 -b:v 500k \
-  -c:a aac -b:a 128k -ar 44100 -ac 2 \
-  -f flv -flvflags no_duration_filesize \
-  "rtmps://$HOST/live/MyWebCam?puser=$PUSER"
-
-#  -preset ultrafast -tune zerolatency                             \
-
-
-```
-
-
-```shell
-# stream to rtp server
-
-
-ffmpeg -i /dev/video0 -r 24 -video_size 640x480 -vcodec libvpx -cpu-used 5 -deadline 1 -g 10 -error-resilient 1 -auto-alt-ref 1 -f rtp 'rtp://127.0.0.1:5004?pkt_size=1200'
-
-
-```
-
-```shell
-
-# stream to rtmp server
-
-gst-launch-1.0 -e v4l2src device=/dev/video0 ! queue ! videoconvert ! videoscale ! video/x-raw,width=960,height=720 ! x264enc speed-preset=ultrafast tune=zerolatency key-int-max=20 ! flvmux streamable=true ! queue ! rtmpsink location='rtmp://localhost:8084/publish/foobar'
-
-# youtube
-
-gst-launch-1.0 v4l2src device=/dev/video0 ! queue ! videoconvert ! videoscale ! video/x-raw,width=640,height=480 ! x264enc speed-preset=ultrafast tune=zerolatency key-int-max=20 ! flvmux streamable=true name=mux ! queue ! rtmpsink location='rtmp://a.rtmp.youtube.com/live2/qbm8-a0dq-x7z5-hks7-3m6w' audiotestsrc is-live=true ! lamemp3enc ! mpegaudioparse ! mux.
-
-```
-
-# ETHERCAT
-
-```shell
-
-# 2.8
-
-# download linuxcnc image
-
-# https://linuxcnc.org/iso/
-
-# unzip and flash image
-
-dd sudo dd if=2021-01-20-linuxcnc-pi4.img of=/dev/sda bs=1M status=progress
-
-# modify if needed as follow
-
-
-```
-
-```shell
-# if needed on pi3
-
-[pi4]
-kernel=vmlinuz-4.19.71-rt24-v7l+
-force_turbo=1
-
-to this:
-
-[pi3b]
-kernel=vmlinuz-4.19.71-rt24-v7l+
-force_turbo=1
-
-# free prevention
-
-# add to cmdline.txt
-
-dwc_otg.fiq_fsm_enable=0 dwc_otg.fiq_enable=0 dwc_otg.nak_holdoff=0
-
-
-```
-
-```shell
-# on newly installed rpi
-
-uname -a
-sudo apt update
-sudo apt upgrade
-sudo reboot
-
-
-# etherlab master
-
-uname -a
-apt-cache search 4.19.71
-sudo apt install linux-headers-4.19.71-rt24-v7l
-
-sudo apt install mercurial build-essential automake tree dkms bison flex
-
-
-git clone github.com/icshwi/etherlabmaster
-cd etherlabmaster
-make init
-echo "ENABLE_CYCLES = NO" > configure/CONFIG_OPTIONS.local
-make build
-make install
-echo "ETHERCAT_MASTER0=eth0" > ethercatmaster.local
-make dkms_add
-make dkms_build
-make dkms_install
-make setup
-
-sudo mkdir -p /usr/include/linuxcnc
-sudo ln -s /opt/etherlab/include/*.h /usr/include/linuxcnc/
-sudo ln -s /opt/etherlab/lib/lib* /usr/lib/
-
-sudo reboot
-
-
-# linuxcnc ethercat
-
-sudo apt install linuxcnc-uspace-dev
-
-git clone github.com/sittner/linuxcnc-ethercat
-cd linuxcnc-ethercat
-make configure
-make
-sudo make install
-
-linuxcnc
-```
-
-```shell
-# 2.9
-# download linuxcnc image
-
-# https://linuxcnc.org/iso/
-
-# unzip and flash iso
-
-sudo apt update
-sudo apt install  linuxcnc-ethercat
-
-sudo apt install ethercat-master libethercat-dev  linuxcnc-ethercat
-
-sudo geany /etc/ethercat.conf
-
-MASTER0_DEVICE="xx:aa:yy:zz:bb:cc"
-DEVICE_MODULES="generic"
-
-sudo systemctl enable ethercat.service
-sudo systemctl start ethercat.service
-sudo systemctl status ethercat.service
-sudo chmod 666 /dev/EtherCAT0
-
-
-# check
-
-ethercat slaves
-
-sudo geany /etc/udev/rules.d/99-ethercat.rules
-
-KERNEL=="EtherCAT[0-9]", MODE="0777"
-
-sudo udevadm control --reload-rules
-
-reboot
-
-```
-
-
-```shell
-# direct from etherlab
-
-
-sudo apt install -y autoconf automake libtool
-
-git clone https://gitlab.com/etherlab.org/ethercat.git
-
-cd ethercat
-
-git switch -c stable-1.5 origin/stable-1.5
-
-# may have to set proper ethercat compatible driver
-
-./bootstrap
-
-# on intel
-
-./configure --enable-cycles --enable-8139too=no --sysconfdir=/etc
-
-# on others
-
-./configure --sysconfdir=/etc
-
-
-make -j$(nproc) all modules
-
-sudo make modules_install install
-
-sudo depmod
-
-sudo vim /etc/ethercat.conf
-
-MASTER0_DEVICE="xx:aa:yy:zz:bb:cc"
-DEVICE_MODULES="generic"
-
-sudo systemctl enable ethercat.service
-
-sudo systemctl start ethercat.service
-
-sudo vim /etc/udev/rules.d/99-ethercat.rules
-
-KERNEL=="EtherCAT[0-9]", MODE="0777"
-
-sudo udevadm control --reload-rules
-
-```
-
-
-```shell
-# after the above
-
-# get servo motor xml from vendor site
-
-# pdo mapping (get offset)
-
-# sdo send (set parameters)
-
-# logic...
-
-```
-
-
-# SERIAL SPI I2C UART
-
-
-```shell
-
-# on rpi4
-
-sudo vim /boot/config.txt
-
-
-# add or uncomment for i2c
-dtparam=i2c_arm=on
-
-
-# add or uncomment for spi
-dtparam=spi=on
-dtoverlay=spi1-1cs
-
-# add or uncomment for uart
-enable_uart=1
-
-...
-
-arm_boost=1
-
-[all]
-
-# add or uncomment for freq stabilization
-force_turbo=1
-
-
-
-
-sudo reboot
-
-
-```
-
-# BUILDROOT
-
-```shell
-
-sudo apt-get update
-
-sudo apt-get -y install make binutils build-essential diffutils patch gzip bzip2 perl tar cpio unzip rsync file bc findutils wget libelf-dev libncurses5-dev python-is-python3
-
-git clone git://git.busybox.net/buildroot
-
-cd buildroot
-
-git switch -c lts origin/2019.08.x
-
-find ./configs -name '*_defconfig'
-
-# make the defconfig
-
-# ex)
-
-make qemu_x86_64_defconfig
-
-make menuconfig
-
-# target options
-
-# build options
-
-# toolchain options
-
-# system configuration
-
-# kernel
-
-# targat packages
-
-# filesystem images
-
-make -j$(nproc)
-
-# output
-
-./output/images
-
-# vm
-
-# hypervisor
-
-i440fx
-
-bios
-
-# os
-
-generic
-
-# boot options
-
-
-# at start-qemu.sh
-
-direct kernel boot
-
-kernel path: bzimage
-kernel args: rootwait root=/dev/vda console=tty1 console=ttyS0 ip=dhcp
-
-# storage
-
-change ide to virtio disk
-
-# network interface
-
-model virtio
-
-# serial 1
-
-# and delete all other hardwares
-
-```
-
-
-# YOCTO 
-
-
-```shell
-
-# https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html
-
-
-sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev python3-subunit mesa-common-dev zstd liblz4-tool file locales libacl1
-
-sudo locale-gen en_US.UTF-8
-
-
-git clone git://git.yoctoproject.org/poky
-
-
-
-# check lts
-
-# https://wiki.yoctoproject.org/wiki/Releases
-
-git switch -c scarthgap origin/scarthgap
-
-source oe-init-build-env
-
-# tweak conf?
-
-bitbake core-image-sato
-
-
-# create vm
-
-# disk, bzimage at
-
-# tmp/deploy/images
-
-# direct kernel boot
-
-# kernel args 
-
-root=/dev/sda ip=dhcp
-
-# nic
-
-e1000
-
-```
-
-
-# VPN IPSEC LIBRESWAN XL2TPD
-
-
-```shell
-# script ubuntu/debian
-
-# server
-
-vpn-socks5/server-install/swan.sh
-
-```
-
-```shell
-
-# server
-
-# open udp port 500, 4500
-
-# add
-
-# /etc/ipsec.d/ikev2.conf
-
-authby=rsa-sha1
-
-sudo service ipsec restart
-```
-
-```shell
-
-# client
-
-sudo apt-get update
-sudo apt-get install strongswan libcharon-extra-plugins
-
-# get p12
-
-openssl pkcs12 -in vpnclient.p12 -cacerts -nokeys -out ca.cer
-openssl pkcs12 -in vpnclient.p12 -clcerts -nokeys -out client.cer
-openssl pkcs12 -in vpnclient.p12 -nocerts -nodes  -out client.key
-
-
-sudo cp ca.cer /etc/ipsec.d/cacerts
-
-sudo cp client.cer /etc/ipsec.d/certs
-
-sudo cp client.key /etc/ipsec.d/private
-
-sudo vim /etc/ipsec.conf
-
-# ipsec.conf - strongSwan IPsec configuration file
-
-# basic configuration
-
-config setup
-        # strictcrlpolicy=yes
-        # uniqueids = no
-
-# Add connections here.
-
-conn ikev2-rw
-    right=34.83.103.130
-    rightid=%34.83.103.130
-    rightsubnet=0.0.0.0/0
-    rightauth=pubkey
-    leftsourceip=%config
-    leftauth=pubkey
-    leftcert=client.cer
-    #eap_identity=username, only if leftauth=eap (e.g. peer)
-    auto=add
-
-
-sudo vim /etc/ipsec.secrets
-
-# This file holds shared secrets or RSA private keys for authentication.
-
-# RSA private key for this host, authenticating it to any other host
-# which knows the public part.
-#
-
-: RSA client.key
-
-
-sudo ipsec restart
-
-sudo ipsec status
-
-sudo ipsec up ikev2-rw
-
-sudo ipsec down ikev2-rw
-
-
-
-# do manual resolvectl if not set 
-
-sudo resolvectl dns enp1s0 8.8.8.8 8.8.4.4
-
-
-```
-
-
-
-```shell
-
-# client nmcli
-
-sudo apt-get update
-sudo apt-get install network-manager-strongswan
-
-# get p12
-
-openssl pkcs12 -in vpnclient.p12 -cacerts -nokeys -out ca.cer
-openssl pkcs12 -in vpnclient.p12 -clcerts -nokeys -out client.cer
-openssl pkcs12 -in vpnclient.p12 -nocerts -nodes  -out client.key
-
-
-nano /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf 
-
-
-[keyfile]
-unmanaged-devices=none
-
-sudo systemctl restart NetworkManager
-
-sudo nmcli d
-
-# if not managed
-
-sudo nmcli dev set enp1s0 managed yes
-
-sudo nmcli c add type vpn ifname -- vpn-type strongswan connection.id VPN connection.autoconnect no vpn.data 'address = 34.27.245.236, certificate = /home/seantywork/ca.cer, encap = no, esp = aes128gcm16, ipcomp = no, method = key, proposal = yes, usercert = /home/seantywork/client.cer, userkey = /home/seantywork/client.key, virtual = yes'
-
-
-sudo nmcli c up 'Wired connection 1'
-
-sudo nmcli c up VPN
-
-sudo nmcli c down VPN
-
-```
-
-# VPN STRONGSWAN 
-
-
-```shell
-# server
-
-
-apt install strongswan libcharon-extra-plugins strongswan-pki -y
-
-ipsec pki --gen --size 4096 --type rsa --outform pem > ca.key.pem
-ipsec pki --self --in ca.key.pem --type rsa --dn "CN=VPN Server CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
-ipsec pki --gen --size 4096 --type rsa --outform pem > server.key.pem
-ipsec pki --pub --in server.key.pem --type rsa | ipsec pki --issue --lifetime 2750 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpn.example.com" --san "vpn.example.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
-
-cp -f ca.cert.pem /etc/ipsec.d/cacerts/
-cp -f server.cert.pem /etc/ipsec.d/certs/
-cp -f ca.key.pem /etc/ipsec.d/private/
-cp -f server.key.pem /etc/ipsec.d/private/
-
-# for client
-ipsec pki --gen --type rsa --size 4096 --outform pem > client.key.pem
-ipsec pki --pub --in client.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpnclient" --san vpnclient --outform pem > client.cert.pem
-openssl pkcs12 -export -inkey client.key.pem -in client.cert.pem -name "vpnclient" -certfile ca.cert.pem -caname "VPN Server CA" -out client.p12
-sudo /bin/cp -Rf client.p12 /tmp/client.p12
-sudo chmod 777 /tmp/client.p12
-
-vim  /etc/ipsec.conf
-
-config setup
-        charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2, mgr 2"
-        strictcrlpolicy=no
-        uniqueids=never
-        cachecrls=no
-        
-conn ipsec-ikev2-vpn
-      auto=add
-      compress=no
-      type=tunnel  # defines the type of connection, tunnel.
-      keyexchange=ikev2
-      fragmentation=yes
-      forceencaps=yes
-      dpdaction=clear
-      dpddelay=300s
-      rekey=no
-      left=%any
-      leftid=@vpn.example.com    # if using IP, define it without the @ sign
-      leftcert=server.cert.pem  # reads the VPN server cert in /etc/ipsec.d/certs
-      leftsendcert=always
-      leftsubnet=0.0.0.0/0
-      right=%any
-      rightid=%any
-      rightauth=pubkey
-      rightsourceip=192.168.43.0/24
-      rightdns=8.8.8.8 #DNS to be assigned to clients
-      rightsendcert=always
-      esp=aes256-sha256-modp2048
-
-vi /etc/ipsec.secret
-
-: RSA "server.key.pem"
-
-
-
-```
-
-```shell
-
-# client 
-
-# get p12
-
-scp server@server.com:/tmp/client.p12 .
-
-# from client
-sudo apt update
-sudo apt install strongswan libcharon-extra-plugins libssl-dev -y
-suod cp -f client.p12 /etc/ipsec.d/private
-
-# /etc/ipsec.conf 
-conn ipsec-ikev2-vpn-client
-    auto=start
-    right=192.168.10.25
-    rightid=vpn.example.com
-    rightsubnet=0.0.0.0/0
-    rightauth=pubkey
-    leftsourceip=%config
-    leftid=vpnclient
-    leftauth=pubkey
-    mediation=no
-
-# /etc/ipsec.secret 
-: P12 client.p12 ""
-
-```
-
-
-```shell
-
-# swanctl
-
-
-sudo apt-get update
-
-sudo apt-get -y install strongswan-swanctl charon-systemd strongswan-pki libcharon-extra-plugins libstrongswan-standard-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd-dev
-
-
-sudo pki --gen --size 4096 --type rsa --outform pem > ca.key.pem
-sudo pki --self --in ca.key.pem --type rsa --dn "CN=VPN Server CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
-sudo pki --gen --size 4096 --type rsa --outform pem > server.key.pem
-sudo pki --pub --in server.key.pem --type rsa | pki --issue --lifetime 2750 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpn.example.com" --san "vpn.example.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
-
-sudo /bin/cp -Rf ca.cert.pem /etc/swanctl/x509ca/
-sudo /bin/cp -Rf server.cert.pem /etc/swanctl/x509/
-sudo /bin/cp -Rf server.key.pem /etc/swanctl/private/
-
-# for client
-
-sudo pki --gen --type rsa --size 4096 --outform pem > client.key.pem
-sudo pki --pub --in client.key.pem --type rsa | pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=test.client" --san test.client --outform pem > client.cert.pem
-
-
-sudo /bin/cp -Rf ca.cert.pem /tmp/ca.cert.pem
-sudo /bin/cp -Rf client.cert.pem /tmp/client.cert.pem
-sudo /bin/cp -Rf client.key.pem /tmp/client.key.pem
-
-sudo chmod 777 /tmp/ca.cert.pem
-sudo chmod 777 /tmp/client.cert.pem
-sudo chmod 777 /tmp/client.key.pem
-
-# for client done
-
-
-# /etc/swanctl/swanctl.conf
-
-connections {
-
-   rw {
-      local_addrs  = %any
-      pools = rw_pool
-      version = 2
-      proposals = aes256-sha256-modp2048
-      unique = never
-      encap = yes
-
-      local {
-         auth = pubkey
-         certs = server.cert.pem
-         id = vpn.example.com
-      }
-      remote {
-         auth = pubkey
-      }
-      children {
-         net {
-            local_ts  = 10.168.0.0/24
-            mode = tunnel
-            esp_proposals = aes256-sha256
-            dpd_action = restart
-            rekey_time = 0
-         }
-      }
-   }
-}
-
-pools{
-       rw_pool {
-               addrs = 10.168.0.0/24
-       }
-}
-
-
-sudo systemctl restart strongswan
-
-
-
-```
-
-
-
-
-```shell
-
-# swanctl whitelist, attr-sql
-
-
-sudo apt-get update
-
-sudo apt-get -y install build-essential make libgmp-dev libsystemd-dev libcurl4-openssl-dev libldap-dev libtss2-dev libgcrypt20-dev libpam0g-dev libip4tc-dev pkg-config init sqlite3 libsqlite3-dev
-
-
-curl -L https://github.com/strongswan/strongswan/releases/download/6.0.0/strongswan-6.0.0.tar.gz -o strongswan-6.0.0.tar.gz
-
-tar -xzf strongswan-6.0.0.tar.gz
-
-pushd strongswan-6.0.0
-
-
-./configure --prefix=/usr --sysconfdir=/etc --enable-charon --enable-systemd \
---disable-defaults \
---enable-static \
---enable-test-vectors \
---enable-pki --enable-ikev2 --enable-vici --enable-swanctl \
---enable-ldap \
---enable-pkcs11 \
---enable-tpm \
---enable-aesni \
---enable-aes \
---enable-rc2 \
---enable-sha2 \
---enable-sha1 \
---enable-md5 \
---enable-mgf1 \
---enable-rdrand \
---enable-random \
---enable-nonce \
---enable-x509 \
---enable-revocation \
---enable-constraints \
---enable-pubkey \
---enable-pkcs1 \
---enable-pkcs7 \
---enable-pkcs8 \
---enable-pkcs12 \
---enable-pgp \
---enable-dnskey \
---enable-sshkey \
---enable-pem \
---enable-openssl \
---enable-gcrypt \
---enable-af-alg \
---enable-fips-prf  \
---enable-gmp  \
---enable-curve25519 \
---enable-agent \
---enable-chapoly \
---enable-xcbc \
---enable-cmac \
---enable-hmac \
---enable-ctr \
---enable-ccm \
---enable-gcm \
---enable-ntru \
---enable-drbg \
---enable-curl \
---enable-attr \
---enable-kernel-netlink \
---enable-resolve \
---enable-socket-default \
---enable-connmark \
---enable-forecast \
---enable-farp \
---enable-stroke \
---enable-vici \
---enable-updown \
---enable-eap-identity \
---enable-eap-aka \
---enable-eap-md5 \
---enable-eap-gtc \
---enable-eap-mschapv2 \
---enable-eap-dynamic \
---enable-eap-radius \
---enable-eap-tls \
---enable-eap-ttls \
---enable-eap-peap \
---enable-eap-tnc \
---enable-xauth-generic \
---enable-xauth-eap \
---enable-xauth-pam \
---enable-tnc-tnccs \
---enable-dhcp \
---enable-lookip \
---enable-error-notify \
---enable-certexpire \
---enable-led \
---enable-addrblock \
---enable-unity \
---enable-counters \
---enable-whitelist \ 
---enable-sqlite \
---enable-attr-sql 
-
-make 
-
-make install
-
-popd
-
-sudo pki --gen --size 4096 --type rsa --outform pem > ca.key.pem
-sudo pki --self --in ca.key.pem --type rsa --dn "CN=VPN Server CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
-sudo pki --gen --size 4096 --type rsa --outform pem > server.key.pem
-sudo pki --pub --in server.key.pem --type rsa | pki --issue --lifetime 2750 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpn.example.com" --san "vpn.example.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
-
-sudo /bin/cp -Rf ca.cert.pem /etc/swanctl/x509ca/
-sudo /bin/cp -Rf server.cert.pem /etc/swanctl/x509/
-sudo /bin/cp -Rf server.key.pem /etc/swanctl/private/
-
-# for client
-
-sudo pki --gen --type rsa --size 4096 --outform pem > client.key.pem
-sudo pki --pub --in client.key.pem --type rsa | pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=test.client@test.org" --san "test.client@test.org" --outform pem > client.cert.pem
-
-
-sudo /bin/cp -Rf ca.cert.pem /tmp/ca.cert.pem
-sudo /bin/cp -Rf client.cert.pem /tmp/client.cert.pem
-sudo /bin/cp -Rf client.key.pem /tmp/client.key.pem
-
-sudo chmod 777 /tmp/ca.cert.pem
-sudo chmod 777 /tmp/client.cert.pem
-sudo chmod 777 /tmp/client.key.pem
-
-# for client done
-
-
-# /etc/swanctl/swanctl.conf
-
-connections {
-
-   rw {
-      local_addrs  = %any
-      pools = rw_pool
-      version = 2
-      proposals = aes256-sha256-modp2048
-      unique = never
-      encap = yes
-
-      local {
-         auth = pubkey
-         certs = server.cert.pem
-         id = vpn.example.com
-      }
-      remote {
-         auth = pubkey
-      }
-      children {
-         net {
-            local_ts  = 10.168.0.0/24
-            mode = tunnel
-            esp_proposals = aes256-sha256
-            dpd_action = restart
-            rekey_time = 0
-         }
-      }
-   }
-}
-
-pools{
-       rw_pool {
-               addrs = 10.168.0.0/24
-       }
-}
-
-
-sudo systemctl restart strongswan
-
-
-
-# whitelist 
-
-sudo /usr/libexec/ipsec/whitelist enable
-
-sudo /usr/libexec/ipsec/whitelist add test.client@test.org 
-
-sudo /usr/libexec/ipsec/whitelist list
-
-sudo /usr/libexec/ipsec/whitelist disable
-
-
-# attr-sql 
-
-# setup 
-
-pushd strongswan-6.0.0
-
-sqlite3 ${DB_PATH} < scr/pool/sqlite.sql 
-
-sudo vim /etc/strongswan.d/charon/attr-sql.conf
-
-database = sqlite://${DB_PATH}
-
-load = yes 
-
-sudo systemctl restart strongswan 
-
-# cmd
-
-sudo ipsec pool --status 
-
-udo ipsec pool --add rw_pool --addresses ./address.txt
-
-# address.txt example
-
-10.168.100.12=test.client@test.org
-
-udo ipsec pool --del rw_pool
-
-
-
-```
-
-
-```shell
-
-# swanctl client
-
-sudo apt-get update
-
-
-sudo apt-get -y install strongswan-swanctl charon-systemd strongswan-pki libcharon-extra-plugins libstrongswan-standard-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd-dev 
-
-
-
-sudo /bin/cp -Rf ca.cert.pem /etc/swanctl/x509ca
-sudo /bin/cp -Rf client.cert.pem /etc/swanctl/x509
-sudo /bin/cp -Rf client.key.pem /etc/swanctl/private
-
-
-connections {
-    home {
-      remote_addrs = 192.168.101.25
-      vips = 0.0.0.0
-      version = 2
-      proposals = aes256-sha256-modp2048
-
-      local {
-        auth = pubkey
-        certs = client.cert.pem
-        id = test.client
-      }
-      remote {
-        auth = pubkey
-        id = vpn.example.com
-      }
-      children {
-        home {
-          remote_ts  = 10.168.0.0/24
-          start_action = start
-          esp_proposals = aes256-sha256
-        }
-      }
-    }
-}
-
-sudo systemctl restart strongswan
-
-
-sudo swanctl --initiate --child $NAME
-
-sudo swanctl --list-sas
-
-sudo swanctl --terminate --ike-id $ID
-
-```
-
-# VPN OPENVPN
-
-```shell
-
-# ubuntu 
-
-vpn-socks5/server-install/openvpn.sh
-
-
-```
-
-
-```shell
-
-# client 
-
-sudo apt update
-# sudo apt install openvpn
-
-sudo apt-get install openvpn
-
-
-sudo openvpn --config ovclient.ovpn 
-```
-
-
-
-
-# VPN WIREGURAD
-
-```shell
-# ubuntu
-
-vpn-socks5/server-install/wireguard.sh
-
-```
-
-```shell
-
-# client
-
-sudo apt update
-sudo apt install wireguard
-
-# paste generated client conf
-sudo vim /etc/wireguard/wgclient.conf
-
-
-
-# tunnel
-
-sudo vim /etc/wireguard/wgclient.conf
-
-PostUp = ip rule add table 200 from 192.168.0.13
-PostUp = ip route add table 200 default via 192.168.0.1
-PreDown = ip rule delete table 200 from 192.168.0.13
-PreDown = ip route delete table 200 default via 192.168.0.1
-
-
-[Peer]
-
-
-# up
-
-sudo wg-quick up wgclient
-
-# down
-
-sudo wg-quick down wgclient
-
-
-```
-
-
-# UDP BUFFER SIZE
-
-```shell
-
-sudo sysctl -w net.core.rmem_max=7500000
-
-sudo sysctl -w net.core.wmem_max=7500000
-
-```
-
-
-# GUI FYNE
-
-```shell
-
-# after installing go, gcc
-
-sudo apt-get update
-
-sudo apt-get install -y libgl1-mesa-dev xorg-dev
-
-
-
-```
-
-
-# GUI AUTOMATION ROBOT 
-
-```shell
-
-# after installing go, gcc
-
-# x11
-sudo apt install libx11-dev xorg-dev libxtst-dev
-
-# Clipboard
-sudo apt install xsel xclip
-
-# Bitmap
-sudo apt install libpng++-dev
-
-# GoHook
-sudo apt install xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxkbcommon-dev
-
-
-```
-
-# TURN SERVER COTURN WEBRTC
-
-
-```shell
-
-sudo apt-get update
-
-sudo apt-get install coturn
-
-
-sudo nano /etc/default/coturn
-
-TURNSERVER_ENABLED=1
-
-sudo systemctl start coturn
-
-
-nano /etc/turnserver.conf
-
-listening-ip=0.0.0.0
-
-listening-port=3478
-
-external-ip=feebdaed.xyz/192.168.0.1
-
-min-port=3479
-max-port=3579
-
-
-verbose
-
-
-fingerprint
-
-user=test:test123
-
-lt-cred-mech
-
-realm=feebdaed.xyz
-
-
-sudo systemctl restart coturn
-
-
-```
-
-```shell
-
-# webrtc ports
-
-
-# server udp mux: 8006 (custom)
-
-# turn udp : 3478
-
-# turn relay udp: 3479-3579
-
-# ephemeral udp range : 31000-31100 (custom)
-
-
-```
-
-
-
-# VIM NEOVIM NVIM
-
-```shell
-
-# copy
-# $LINENUMyy
-
-99yy
-
-# paste
-
-p
-
-# set number
-
-:set nu
-
-# unset number
-
-:set nonu
-
-# set paste
-
-:set paste
-
-# goto
-# :$LINENUM
-
-:33
-
-# search
-
-/$BLAH
-
-# set tab spaces
-set expandtab ts=4 sw=4 ai
-
-
-```
-
-
-# RAYLIB
-
-```shell
-
-sudo apt install libasound2-dev libx11-dev libxrandr-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libxcursor-dev libxinerama-dev libwayland-dev libxkbcommon-dev
-
-```
-
-# KANIKO
-
-```shell
-
-apiVersion: v1
-kind: Pod
-metadata:
-  name: kaniko
-spec:
-  containers:
-  - name: kaniko
-    image: gcr.io/kaniko-project/executor:latest
-    args: ["--dockerfile=Dockerfile",
-            "--context=git://github.com/seantywork/target.git",
-                 "--context-sub-path=subdir/",
-            "--destination=seantywork.com/library/test"] 
-    volumeMounts:
-      - name: kaniko-secret
-        mountPath: /kaniko/.docker
-    env:
-      - name: GIT_USERNAME
-        value: "$YOUR_ID"
-      - name: GIT_PASSWORD
-        value: "$YOUR_PASS"
-  restartPolicy: Never
-  volumes:
-    - name: kaniko-secret
-      secret:
-        secretName: regcred
-        items:
-          - key: .dockerconfigjson
-            path: config.json
-
-
-```
-
-
-# DPDK
-
-```shell
-
-# qemu kvm
-# fstack
-
-# Install dependencies for F-Stack
-sudo apt install build-essential make libssl-dev python3 python-is-python3 
-
-# get fstack release
-
-# Install libnuma-dev
-yum install numactl-devel          # on Centos
-#sudo apt-get install libnuma-dev  # on Ubuntu
-
-# Install dependencies (FreeBSD only)
-#pkg install meson pkgconf py38-pyelftools
-
-cd f-stack
-# Compile DPDK
-
-# fix for virtual machine
-
-$FSTACK_DIR/dpdk/kernel/linux/igb_uio/igb_uio.c
-
--   if (pci_intx_mask_supported(udev->pdev)) {
-+   if (true || pci_intx_mask_supported(udev->pdev)) {
-
-cd dpdk/usertools
-./dpdk-setup.sh # compile with x86_64-native-linuxapp-gcc
-
-# Set hugepage (Linux only)
-# single-node system
-echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
-
-# or NUMA (Linux only)
-echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
-echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
-
-# Using Hugepage with the DPDK (Linux only)
-mkdir /mnt/huge
-mount -t hugetlbfs nodev /mnt/huge
-
-# Close ASLR; it is necessary in multiple process (Linux only)
-echo 0 > /proc/sys/kernel/randomize_va_space
-
-# Install python for running DPDK python scripts
-sudo apt install python # On ubuntu
-#sudo pkg install python # On FreeBSD
-
-# Offload NIC
-# For Linux:
-modprobe uio
-insmod /data/f-stack/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
-insmod /data/f-stack/dpdk/x86_64-native-linuxapp-gcc/kmod/rte_kni.ko carrier=on # carrier=on is necessary, otherwise need to be up `veth0` via `echo 1 > /sys/class/net/veth0/carrier`
-python dpdk-devbind.py --status
-ip link set dev eth0 down
-python dpdk-devbind.py --bind=igb_uio eth0 # assuming that use 10GE NIC and eth0
-
-# Install DPDK
-cd ../x86_64-native-linuxapp-gcc
-make install
-
-# On Ubuntu, use gawk instead of the default mawk.
-#sudo apt-get install gawk  # or execute `sudo update-alternatives --config awk` to choose gawk.
-
-# Install dependencies for F-Stack
-sudo apt install gcc make libssl-dev                            # On ubuntu
-#sudo pkg install gcc gmake openssl pkgconf libepoll-shim       # On FreeBSD
-
-
-
-# Compile F-Stack
-export FF_PATH=/$FSTACK_DIR
-export FF_DPDK=/$FSRACK_DIR/dpdk/x86_64-native-linuxapp-gcc
-cd ../../lib/
-
-# disable RSS in source code
-
-#lib/ff_dpdk_if.c 
-#edit
-
-port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
-
-make    # On Linux
-#gmake   # On FreeBSD
-
-# Install F-STACK
-# libfstack.a will be installed to /usr/local/lib
-# ff_*.h will be installed to /usr/local/include
-# start.sh will be installed to /usr/local/bin/ff_start
-# config.ini will be installed to /etc/f-stack.conf
-make install    # On Linux
-#gmake install   # On FreeBSD
-
-
-# kni
-ip link set dev veth0 up
-
-ip addr add 192.168.1.2/24 dev veth0
-
-ip route add 0.0.0.0 via 192.168.1.1 dev veth0
-
-```
-
-
-```shell
-
-# gcloud tutorial
-
-# https://cloud.google.com/compute/docs/networking/use-dpdk
-
-
-# create vpc for data plane
-
-## new subnet > region name (ex us-west1) , ipv4 range (ex 10.0.0.0/24)
-
-# create vpc for control plane
-
-## new subnet > region name (must be same as dp, ex us-west1), ipv4 range (must be different from dp, ex 10.0.1.0/24), enable ssh firewall rule
-
-
-# create vm
-
-## region must be same as dp
-
-## going with e2-medium
-
-## ubuntu 22 x64
-
-## network card: virtio
-
-## add two interfaces, control plane, data plane
-
-
-# connect to vm
-
-# get env
-
-sudo apt-get update && sudo apt-get upgrade -yq
-sudo apt-get install -yq build-essential ninja-build python3-pip linux-headers-$(uname -r) pkg-config libnuma-dev
-sudo pip install pyelftools meson
-
-# get dpdk
-
-wget https://fast.dpdk.org/rel/dpdk-23.07.tar.xz
-tar xvf dpdk-23.07.tar.xz
-cd dpdk-23.07
-
-# build dpdk
-
-meson setup -Dexamples=all build
-
-sudo ninja -C build install; sudo ldconfig
-
-
-# check iommu-less vfio
-
-cat /boot/config-$(uname -r) | grep NOIOMMU
-
-CONFIG_VFIO_NOIOMMU=y
-
-## load noiommu, vfio
-
-sudo modprobe vfio enable_unsafe_noiommu_mode=1
-
-sudo modprobe vfio-pci
-
-## enable noiommu
-
-sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
-
-# alternative, uio
-
-## install uio
-
-git clone https://dpdk.org/git/dpdk-kmods
-
-pushd dpdk-kmods/linux/igb_uio
-sudo make
-sudo depmod && sudo insmod igb_uio.ko
-popd
-
-## or 
-
-sudo apt-get install -y dpdk-igb-uio-dkms
-
-sudo modprobe igb_uio
-
-
-# bind dpdk
-
-## check pci, get data plane slot
-
-sudo lspci | grep -e "gVNIC" -e "Virtio network device"
-
-## down
-
-sudo ip link set ens5 down
-
-## bind
-
-sudo dpdk-devbind.py --bind=vfio-pci 00:05.0
-
-## or, if uio
-
-sudo dpdk-devbind.py --bind=igb_uio 00:05.0
-
-## create huge page
-
-sudo mkdir /mnt/huge
-
-sudo mount -t hugetlbfs -o pagesize=1G none /mnt/huge
-
-sudo bash -c 'echo 4 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages'
-sudo bash -c 'echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages'
-
-## test
-
-sudo ./build/app/dpdk-testpmd
-
-# unbind dpdk
-
-sudo dpdk-devbind.py -u 00:05.0
-
-## if virtio-pci
-
-sudo bash -c 'echo 00:05.0 > /sys/bus/pci/drivers/virtio-pci/bind'
-
-## if gvnic
-
-sudo bash -c 'echo 00:05.0 > /sys/bus/pci/drivers/gvnic/bind'
-
-sudo ip link set ens5 up
-
-```
-
-
-# RUST
-
-```shell
-
-# install
-
-curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-
-# .profile
-
-export PATH="$PATH:$HOME/.cargo/env"
-export PATH="$PATH:$HOME/.cargo/bin"
-
-source .profile
-
-```
-
-# SCRCPY ANDROID SCREEN MIRRORING
-
-```shell
-
-# enable usb debugging
-
-snap install scrcpy
-
-scrcpy
-
-```
-
-# DBEAVER 
-
-
-```shell
-
-
-
-# download ce
-
-sudo apt install ./dbeaver
-
-# public key retrieval by url
-
-jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true
-
-```
-
-# IFTOP
-```shell
-
-iftop
-
-```
-# PERF
-
-```shell
-
-perf stat -d command
-```
-
-# IPERF
-
-```shell
-
-# tcp client
-
-iperf -c $ADDR -t 60 -i 1
-
-# tcp server
-
-iperf -s
-
-# udp client
-
-iperf -c $ADDR -u -b 10G -t 60 -i 1
-
-```
-
-# KOREAN ON LINUX
-
-```shell
-
-sudo apt install fcitx5 fcitx5-hangul
-
-# go to settings > region & language 
-
-# change keyboard input to fctix5
-
-# go to settings > keyboard
-
-# add input source as hangul
-
-sudo reboot
-
-```
-
-```shell 
-
-apt-get install locales-all fonts-nanum 
-
-```
-
-```shell
-
-# debian
-
-sudo apt install fcitx5 fcitx5-hangul
-
-# enter fcitx5 configuration in menu
-
-# set as you knoe
-
-sudo reboot
-
-```
-
-# LAPTOP LID CLOSE DO NOTHNG 
-
-
-```shell
-
-sudo vim /etc/systemd/logind.conf
-
-# uncomment
-# HandleLidSwitch=ignore
-
-sudo systemctl restart systemd-logind
-
-```
-
-# IO URING IOURING
-
-```shell
-
-sudo apt install liburing
-
-```
-
-
-# AVALANCHE DUT SETUP
-
-```shell
-
-sysctl -w net.ipv4.ip_forward=1
-sysctl -w net.ipv4.conf.enp134s0f2.accept_redirects=0
-sysctl -w net.ipv4.conf.enp134s0f2.send_redirects=0
-sysctl -w net.ipv4.conf.enp134s0f0.accept_redirects=0
-sysctl -w net.ipv4.conf.enp134s0f0.send_redirects=0
-
-ethtool -G enp134s0f0 rx 4096
-ethtool -G enp134s0f0 tx 4096
-ethtool -G enp134s0f2 rx 4096
-ethtool -G enp134s0f2 tx 4096
-
-net.ipv4.neigh.default.gc_stale_time=57600
-net.ipv4.neigh.default.gc_thresh1 = 32768
-net.ipv4.neigh.default.gc_thresh2 = 32768
-net.ipv4.neigh.default.gc_thresh3 = 32768
-
-
-##########################################
-#                                        #
-#                  DUT                   #
-#  10.4.11.237/16     192.168.200.237/16 #
-## if0 ############## if1 ################
-   #                  #
-   #                  #
-   #                  #
-   #                  #
-   #                  #
-10.1.5.0/16 + 20000   192.168.200.0 + ? (8, 16...) 
-   #
-tun(192.168.0.0/16 + 20000)  
-
-# height means tunnel per sec
-# if 8 cores, set it to the multiples of 8
-# 8, 16, 24, 32, 64...
-# and client action and server count shoud match, 8
-# if server count and client action doubled, tunnel per sec doubles also
-# responder ips should be server ips
-
-
-```