Skip to main content

5 posts tagged with "linux"

View All Tags

· 5 min read
zaxro

以下資訊是當前查詢資訊並比對其他人的做法,列出覺得不錯的設定方式,之後如果發現錯誤或更好的方式會滾動修改!

主要邏輯就是會先: 建立系統帳號 -> 限制資料夾權限及owner -> 建立service設定檔 -> 透過systemctl託管該service.

  • 建立系統帳號,並不給家目錄且不能登terminal
useradd --no-create-home --shell /bin/false your_target_user
  • 修改指定資料夾owner給該user,且注意是否要給予可寫權限(這邊以promethues需要寫入的資料庫為例),然後要知道安裝東西後會產生哪些東西,再去分配,如果是用yum,apt安裝會幫你安排好並設定,如果是上網自己下載的檔案包就需要再自己去分配位置,以及權限!
chown -R prometheus:prometheus  /var/lib/prometheus
  • 建立service設定檔
/usr/lib/systemd/system/prometheus.service
[Unit]
Description=Monitoring system and time series database
Documentation=https://prometheus.io/docs/introduction/overview/ man:prometheus(1)
After=time-sync.target

[Service]
Type=simple
Restart=on-failure
User=prometheus
Group=prometheus

EnvironmentFile=/etc/default/prometheus
ExecStart=ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.enable-admin-api \
--storage.tsdb.retention.time=30d \
--web.enable-lifecycle \
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
[Install]
WantedBy=multi-user.target

Type預設simple,由ExecStart 接的指令啟動服務並常駐在記憶體!

tip

之前在設定service時候都是設定Type=simple,不過自從在rsync設定daemon服務踢到鐵板就知道必須了解差異,如果程式執行的模式是父process產生子process之後就關閉父process,例如: rsync daemon程式會產生子process作為主要執行process(同理還有nginx這類服務),就必須用Type=forking,否則systemctl會把它當作主程式退出,之後就會hang住然後回報failure狀態. rsync server的service設定檔如下.

/usr/lib/systemd/system/rsyncd.service
[Unit]
Description=rsyncd Server
After=network.target

[Service]
Type=forking

ExecStart=/bin/rsync --daemon --config=/etc/rsyncd.conf
TimeoutStopSec=20s


[Install]
WantedBy=multi-user.target

至於為啥會try出這段,是因為在把它改為forking就成功了,仔細看服務會發現

    Process: 2740 ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf (code=exited, status=0/SUCCE>
Main PID: 2741 (rsync)

也就是PID不同的部分,所以要用forking.

Restart此選項決定當服務遭遇錯誤或崩潰時是否自動重新啟動服務。根據設定不同,Systemd 會在不同情況下執行重新啟動。例如,如果設定為 on-failure,表示只有在服務失敗時才會自動重啟。

User Group這個選項確定服務以哪個使用者及群處身份運行。當設定為 prometheus 時,服務將以 prometheus 使用者的身份運行。

EnvironmentFile這個選項用來指定環境變數的設定檔位置。設定檔內包含多個環境變數的定義,這些變數將在服務運行時生效。可以拿來放$ARGS

ExecStart這個選項確定啟動服務所需的命令和參數。當 Systemd 啟動這個服務時,會執行指定的命令。

ExecReload此選項定義重新載入服務所需的命令。當 Systemd 收到重新載入的信號(通常是 systemctl reload 命令),會執行指定的命令。因為prometheus提供熱加載可以透過kill HUP PID,但不代表其他service有~

TimeoutStopSec若這個服務在啟動或者是關閉時,因為某些緣故導致無法順利『正常啟動或正常結束』的情況下,則我們要等多久才會使用SIGKILL信號殺掉剩下進程!

SendSIGKILL這個選項確定停止服務時是否嘗試使用 SIGKILL 信號。如果設定為 no,Systemd 將儘可能避免使用 SIGKILL 信號,以允許服務有時間進行清理操作。

· 5 min read
zaxro

以往常常用 root 連到機器操作,那最近在 lab 機踢到鐵板了,關於不要用 root 登入操作討論很多,這邊就不說原因了!

用 root 執行minikube start會遇到報錯

❌  Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.

這邊看到很明顯他不讓你用 root 執行該指令.good!!

創建 ec2-user 並給予權限

執行以下命令以創建新使用者:

adduser ec2-user

設定使用者密碼

passwd ec2-user

將使用者新增至 wheel 群組,以獲得 sudo 權限:

usermod -aG wheel ec2-user

在 CentOS 系統中,wheel 群組通常被配置為具有特殊權限的群組,允許其成員使用 sudo 命令獲得 root 權限。通常,系統管理員可以將自己或其他需要具有管理權限的使用者新增至 wheel 群組,以便執行需要 root 權限的任務。 具有 wheel 群組成員身份的使用者可以使用 sudo 命令執行以 root 權限運行的命令。在上述命令中,-aG 選項指示 usermod 命令將使用者新增至指定的群組中而不移除已有的群組設定。

確認 sudoers 文件中的設定允許 wheel 群組的成員執行 sudo 指令。執行以下命令以編輯 sudoers 文件:

visudo

在打開的文件中,尋找以下行:

## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL

取消註釋(刪除前面的 # 符號)並保存文件,這給在 wheel 群組內的使用者可以用 sudo 執行任何權限

將 ec2-user 加到 docker 群組

將 ec2-user 加到 docker 群組

usermod -aG docker ec2-user

執行以下命令來使群組更改生效:

newgrp docker

加入 'docker' 群組後,您可以在不使用 sudo 的情況下執行 Docker 命令

如何確認有加入群組

看/etc/group 會看到有新增使用者

vi /etc/group
ssh_keys:x:997:
sshd:x:74:
postdrop:x:90:
postfix:x:89:
docker:x:996:ec2-user
cgred:x:995:
mysql:x:27:
apache:x:48:
nginx:x:994:
zabbix:x:993:
tss:x:59:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
saslauth:x:76:
mongod:x:992:
ec2-user:x:1000:

如何連線到 ec-user

  1. 確認有生成公私鑰,如無則執行以下指令生成
ssh-keygen -t rsa -b 4096

確認生成的公鑰位置在~/.ssh/id_rsa.pub

  1. 使用 ssh-copy-id 指令將公鑰添加到遠程 ec2-user 使用者的帳戶中。remote_host 記得換成 你的 ip(ex.我的 ip 是 192.168.185.72),記得你的私鑰(~/.ssh/id_rsa)基本上不會給別人
ssh-copy-id -i ~/.ssh/id_rsa.pub ec2-user@<remote_host>
  1. 測試連入
ssh 'ec2-user@192.168.185.72'
  1. 設定~/.ssh/config,像這樣,
~/.ssh/config
Host            agent-ec2user
HostName 192.168.185.72
Port 22
User ec2-user
IdentityFile ~/.ssh/id_rsa
  1. 設定 ssh 的通用配置
Host *
ServerAliveInterval 10
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
  • Host *: 這是一個通配符,表示適用於所有的主機。在下面的設定中,這個通配符將應用於所有的主機設定。

  • ServerAliveInterval 10: 此選項指定了 SSH 客戶端和伺服器之間的連線活著檢查時間間隔。在此例中,設定為 10 秒,表示每 10 秒發送一次保持連線的訊號。這有助於保持連線的穩定性。

  • HostKeyAlgorithms +ssh-rsa: 此選項指定了客戶端支援的主機金鑰驗證演算法。+ssh-rsa 表示除了預設的驗證演算法外,還允許使用 ssh-rsa 演算法進行主機金鑰驗證。

  • PubkeyAcceptedKeyTypes +ssh-rsa: 此選項指定了客戶端支援的用於公鑰驗證的金鑰類型。+ssh-rsa 表示除了預設的金鑰類型外,還接受使用 ssh-rsa 金鑰進行公鑰驗證。

· 5 min read
zaxro

purpose of each folder

  • /(根目錄):Linux 文件系統的起點,所有的目錄和文件都是以根目錄作為參照點。
  • /bin:包含一些常用的系統二進位執行檔(executable),如 ls、cp 等等。
  • /boot:系統啟動時使用的核心檔案和啟動載入器(bootloader)。
  • /dev:包含一些裝置檔案(device files),如硬盤、鍵盤、滑鼠等等。
  • /etc:系統全局的配置文件目錄,包含系統和應用程序的配置文件。
  • /home:用戶的家目錄,即每個用戶的個人資料目錄。
  • /lib:庫文件目錄,包含系統和應用程序所需的庫文件。
  • /mnt:用戶暫時掛載的文件系統目錄,通常用於掛載外部儲存設備,如 USB 隨身碟、CD-ROM 等等。
  • /opt:存放可選的應用程序目錄,通常包含第三方應用程序和軟件。
  • /proc:虛擬文件系統目錄,允許操作系統內核和進程的運行狀態。
  • /root:root 用戶的家目錄。
  • /run:系統啟動後,某些程序運行時使用的暫存目錄,包括 PID 文件、掛載點等等。
  • /sbin:包含一些系統管理用途的二進位執行檔,僅限 root 用戶使用。
  • /srv:存放網路服務(如 FTP、HTTP)的數據目錄。
  • /sys:系統文件系統,包含系統硬件和設備的信息。
  • /tmp:用於存放臨時文件的目錄,一般文件都會在系統重新啟動後自動清除。
  • /usr:用於存放共享的、只讀的和不經常變動的文件,包括程序和庫文件等等。
  • /var:存放經常變動的文件,包括日誌文件、緩存和臨時文件,某些應用程序和服務的數據庫以及其他各種程式運行時產生的數據文件等。

Basic concepts

單純看上面的各資料夾用處一定還是會覺得很陌生,以下用常見例子幫助了解

  1. 用 yum 安裝 mysql 之後,請問他的數據位置會在哪個資料夾? 設定檔會在哪? 其他?
  • 數據文件會放在/var/lib 底下,以 mariadb 為例,到/var/lib/mysql 底下會看到各數據庫的數據(每個 database 一個 folder)還有 crash recovery 時用於儲存 metadata 的 log 檔案等,這是因為/var 規劃是放數據文件跟日誌文件
  • 設定檔在/etc 底下,依據系統,centos 可能在/etc/my.cnf 或/etc/mysql/my.cnf,不過基本上都會在/etc,因為/etc 規劃放系統或應用程序的 config 的,注意 my.cnf 會用!includedir /etc/my.cnf.d 去進一步包設定檔,需要 cnf 為結尾.
  • pid 文件一般位于 /var/run/mysqld/mysqld.pid 或 /var/lib/mysql/{hostname}.pid
  • 日誌會在/var/log/mysql 底下.
  • 共用文件在 /usr/share/mysql/ 中存放的是 MySQL 的一些共用文件,其中包括:
    1. 公用的語言文件和字符集文件。
    2. 公用的系統表空間文件。
    3. 公用的插件庫文件。
    4. 公用的文檔和示例文件。
  1. docker 數據文件跟設定檔?
  • 數據文件會在/var/lib/docker 底下,依照 container ID 放置(另外用 bind mount 掛的不算,複習一下 bind mount 建立指令docker run -d --name my_container \ -v /path/on/host:/path/in/container \my_image)
  • 設定檔在/etc/docker 底下,預設只有一隻 key.json,也可以加入其他設定,例如/etc/docker/daemon.json 可以對 log 格式的 size 跟輪詢做設定.

· 8 min read
zaxro

disk management command

在管理上會去檢視硬碟使用量,資料夾資料大小,如果掛硬碟跟卸下硬碟也會有專用 command

df -h: 列出所有已掛載的硬盤的分區信息以及剩餘空間大小,結果長這樣

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs 7.6G 0 7.6G 0% /dev
tmpfs 7.7G 0 7.7G 0% /dev/shm
tmpfs 7.7G 801M 6.9G 11% /run
tmpfs 7.7G 0 7.7G 0% /sys/fs/cgroup
/dev/nvme0n1p1 100G 6.0G 95G 6% /
/dev/nvme1n1 300G 7.1G 293G 3% /var/gogo
tmpfs 1.6G 0 1.6G 0% /run/user/1000

· 4 min read
zaxro

sed

一般打印 印 5~7 行 其他行數 silence

cat -n xxxx.md | sed -n '5,7p'

把 whois 檢查 domain 中的 Registry Expiry Date 的前面的空格去掉,以下意思是把 0 個以上的 space 去掉

sed 's/\s\{0,\}Registry Expiry Date: //'