---
# System prepended metadata

title: Linux Setup
tags: [Linux]

---

# Linux Setup

# Install VirtualBox

[Download VirtualBox](https://www.virtualbox.org/wiki/Downloads)

# Install Vagrant

[Download Vagrant](https://www.vagrantup.com/downloads)

***Vagrant*** is a **CLI** utility that manages the lifecycle of your virtual machines. The virtual machine platforms include vSphere, Hyper-v, Virtual Box and also Docker.

# Setup

```=
cd /path/to/wks

vim VAGRANTFILE

========== Content ==========
Vagrant.configure("2") do |config|

  config.vm.box = "chenhan/ubuntu-desktop-20.04"

  config.vm.provider :virtualbox do |v|

   v.memory  = 2048

   v.cpus    = 2

   v.customize ["modifyvm", :id, "--vram", "128"]

end

end
=============================
```

> The `.box` chooses an image from [here](https://app.vagrantup.com/boxes/search).
> The `.provider` is a virtual machine platform.
> The rest of content are resource limitations.

```=
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'chenhan/ubuntu-desktop-20.04' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0       
==> default: Loading metadata for box 'chenhan/ubuntu-desktop-20.04'
    default: URL: https://vagrantcloud.com/chenhan/ubuntu-desktop-20.04
==> default: Adding box 'chenhan/ubuntu-desktop-20.04' (v20200424) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/chenhan/boxes/ubuntu-desktop-20.04/versions/20200424/providers/virtualbox.box
    default:
==> default: Successfully added box 'chenhan/ubuntu-desktop-20.04' (v20200424) for 'virtualbox'!
==> default: Importing base box 'chenhan/ubuntu-desktop-20.04'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'chenhan/ubuntu-desktop-20.04' version '20200424' is up to date...
==> default: Setting the name of the VM: 90DaysDevOps_default_1659320603010_92271
Vagrant is currently configured to create VirtualBox synced folders with
the `SharedFoldersEnableSymlinksCreate` option enabled. If the Vagrant
guest is not trusted, you may want to disable this option. For more
information on this option, please refer to the VirtualBox manual:

  https://www.virtualbox.org/manual/ch04.html#sharedfolders

This option can be disabled globally with an environment variable:

  VAGRANT_DISABLE_VBOXSYMLINKCREATE=1

or on a per folder basis within the Vagrantfile:

  config.vm.synced_folder '/host/path', '/guest/path', SharedFoldersEnableSymlinksCreate: false
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 5.2.34
    default: VirtualBox Version: 6.1
==> default: Mounting shared folders...
    default: /vagrant => D:/opt/repos/90DaysDevOps

vagrat ssh
```

If you are using GUI view in VirtualBox, get credential issue. The default account/password is `vagrant`/`vagrant`.

# Commands

List documented commands
```=
man man
```

Execute with superuser
```=
sudo command

su root
command
exit
```

Move cursor to top
```=
clear
```

File management
```bash=
ls -al [PATH]
mkdir DIR_NAME
cd DIR_NAME

touch CREATED_FILE

mv FILE TO_DIR/
cp FILE TO_DIR/

mv FILE RENAME

rm FILE
rm -R DIR
```

File access
```bash=
echo "content_appended" >> FILE

cat PRINT_ALL_CONTENT

cat FILE | grep "STRING_MATCH"

# column filter
command | awk '{print $1}'

# sort is sorting by lines
# xargs combines lines into oneline and with gap of a space
cut -d"DELEMETER" -f"COL_FROM_1" < FILENAME | sort | xargs
```

Current location
```=
pwd
```

File search
```=
find FROM_DIR [options] PATTERN
[options]
-name
-iname // case-insensitive
-regex
```

Command history
```bash=
history

# Clean history
history -c

# Settings
echo 'export HISTTIMEFORMAT="%d-%m-%Y %T "' >> ~/.bash_profile
echo 'export HISTSIZE=100000' >> ~/.bash_profile
echo 'export HISTFILESIZE=10000000' >> ~/.bash_profile
```
> Be careful to write sensitive content in commands

User management
```bash=
password

sudo useradd USER_NAME
sudo groupadd GROUP_NAME

sudo usermod USER_NAME -a -G GROUP_NAME

# Add sudo group to an user
usermod -a -G sudo USER_NAME

chmod -R [authority] FILE_NAME
# [authority]
# rwx = 421 = 4+2+1 = 7

chown -R USER_NAME[:GROUP_NAME] FILE_NAME
```

# System Management

```bash=
sudo apt update

sudo apt install PACKAGE
sudo apt remove PACKAGE
```

Install from other package repository
```bash=
curl -fsSL https://apt.release.../gpg | sudo apt-key add -

sudo apt-add-repository "deb [arch=amd64] https://apt.release... ($lsb_release -cs) main"
```

Storage information
```bash=
# Show disk and its partitions
lsblk

df -f
```

Add new disk
```bash=
sudo mkfs -t ext4 /dev/sdb

sudo mkdir MNT_DIR
sudo mount /dev/sdb MNT_DIR

sudo umount /dev/sdb
```
> Automatically mount the disk at boot, adds the disk information to `/etc/fstab`, or you have to do the same thing above.

# System Directories

- `/bin` - binary files
- `/sbin` - binary files for superuser
- `/boot` - configurations for boot
- `/proc` - knernel & process information
- `/dev` - device information
- `/run` - application states
- `/etc` - configuration files
- `/home` - for user directory
- `/lib` - shared libs for those binary files
- `/usr` - installed software packages
- `/opt` - optional software packages
- `/var` - dynamic files, like application logs
- `/tmp` - temporary files
- `/mnt` - temporary mount point
- `/media` - removable devices

# Text editor

## nano

```=
nano FILENAME
```

## vim

```=
vim FILENAME

===== normal mode =====
h // left arrow
j // down arrow
k // up arrow
l // right arrow
yy // copy line
p // Paste at next line
P // Paste at previous line
dd // remove line
x // delete next character
X // delete previous character
u // undo
=======================

===== command mode =====
ESC
:q // exit
:w // write data
:%s/STRING_REPLACED/NEW_STRING
========================

===== insert mode =====
i // write at curser
a // write behind curser with one character
=======================

===== visual mode =====
=======================
```

# SSH

```bash=
sudo systemctl status ssh
```

If no ssh server exist
```bash=
sudo apt install OpenSSH-server

sudo ufw allow ssh
```

Setup network bridge in VirtualBox
```=
Right Click container -> Network -> Port Transfering -> Set port in Host and port(22 for ssh) in Client
```

ssh without password
```bash=
# create key in client machine
ssh-keygen -t ed25519

# upload key to remote machine
ssh-copy-id vagrant@localhost -p PORT
```

ssh denides password log in
```bash=
# In remote machine
sudo vim /etc/ssh/sshd_config
# Modify PasswordAuthentication 
PasswordAuthentication no

sudo systemctl reload sshd
```

# Script

Script context
```=
===== Script Content =====
#!/bin/bash
...commands
==========================

chmod +x SCRIPT.sh

./SCRIPT.sh
```

Standard input
```bash=
#!/bin/bash

echo "enter name"
read name
# No display of input
read -s password
echo "Your name is $name"
```

Conditions
```bash=
#!/bin/bash

income=20
if [ $income -eq 10 ] 
then
    echo eq10
elif [ $income -gt 10 ] 
then
    echo gt10
else 
    echo "else"
fi
```
> `eq`, `ne`, `gt`, `ge`, `lt`, `le` for `==`, `!=`, `>`, `>=`, `<`, `<=`.
> `-d FILENAME`, is `FILENAME` a directory
> `-e FILENAME`, is `FILENAME` existed
> `-f FILENAME`, is `FILENAME` a file
> `-r FILENAME`, is `FILENAME` writable
> `-s FILENAME`, is `FILENAME` non-zero size

Arguments
```bash=
#!/bin/bash

# First agrument, not command name
echo $1
```

# Others

[Other Notes](https://hackmd.io/FZVVtNnERRmYURUvXYuNPw)

###### tags: `Linux`
