magnum

Docker get start

Install Docker (Ubuntu 14.04)

#加入第三方的apt來源
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ sudo apt-key adv \ --keyserver hkp://ha.pool.sks-keyservers.net:80 \ --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
#驗證docker已存在於apt-cache
$ sudo apt-get update
$ apt-cache policy docker-engine
#為了使用aufs storage driver,14.04版應是先安裝linux-image-extra-* kernel packages
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
#安裝docker-engine
$ sudo apt-get update
$ sudo apt-get install docker-engine
#啟動docker,作hello-world image測試
$ sudo service docker start

Docker 運作流程

  1. Docker Engine CLI client 連接到 Docker Engine daemon.
  2. Docker Engine daemon 從 Docker Hub pull image(例如:"hello-world" image)
  3. Docker Engine daemon 利用抓下來的image載入到一個新的container並執行其內容
  4. Docker Engine daemon 將運行結果回傳給 Docker Engine CLI client,並送回到原本執行command的terminal

Verify Installation

#hello-world image測試
$ sudo docker run hello-world
#啟動一個ubuntu tty,-t 選項讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上, -i 則讓容器的標準輸入保持打開。
$ sudo docker run -it ubuntu bash
#啟動一個whalesay image,
$ docker run docker/whalesay cowsay boo
#docker版本查詢
$ sudo docker version
#docker containers運行清單
$ sudo docker ps -a
#docker image清單
$ sudo docker images

Build image

#寫一個Dockerfile
$ mkdir mydockerbuild
$ cd mydockerbuild
$ touch Dockerfile
$ nano Dockerfile
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
#利用Dockerfile build一個image
$ docker build -t docker-whale .

Push and pull image

#找出image id
$ sudo docker images
#標記image
$ sudo docker tag [image-id] baddychiang/docker-whale:latest
#登入docker hub
$ sudo docker login
#push image到repository
$ sudo docker push baddychiang/docker-whale
#移除本地端image
$ sudo docker rmi docker-whale
#重新pull image下來執行
$ sudo docker run baddychiang/docker-whale
OpenStack

Basic OpenStack operations

API

透過GUI、CLI下的指令,都會轉換成API來執行,所以任何指令也都能透過API來完成

Debug CLI

CLI加上–debug,便能expose API的行為

Set environmental variables

#bash的completion
$ source /opt/stack/python-novaclient/tools/nova.bash_completion
#從某個demo in demo執行指令
$ source openrc demo demo

Keystone – creating tenants, users and roles

#建立General tenant
$ keystone tenant-create --name General
#建立XXX user
$ keystone user-create \
--name=XXX \
--pass=openstack \
--tenant-id [tenant_id] \
--email=XXX@mail.com
#查看user list, role list
$ keystone user-list
$ keystone role-list
#增加一個role
$ keystone user-role-add \
--tenant-id [tenant_id] \
--user-id [user_id] \
--role-id [role_id]

Neutron – tenant network

inside tenant要建立一個private network、subnet、virtual router再與public(external) network連接

#建立一個internal network
$ neutron net-create \
--tenant-id [tenant_id] \
[NETWORK_NAME]
#在network中建立一個subnet
$ neutron subnet-create \
--tenant-id [tenant_id] \
[NETWORK_NAME] \
[SUBNET_RANGE CIDR  ex:172.24.220/24]
#建立一個virtual router
$ neutron router-create \
--tenant-id [tenant_id] \
[ROUTER_NAME]
#把router加入到internal subnet
$ neutron router-interface-add \
[ROUTER_ID] \
[SUBNET_ID]
#秀出external network list
$ neutron net-external-list
#[已經有external network]指定外部的external network作為internal router的gateway
$ neutron router-gateway-set \
[ROUTER_ID] \
[EXT_NETWORK_ID]
#[尚未有external network]若外部沒有external network,則必須建立一個,預設是由admin tenant來建立
$ neutron net-create \
[EXT_NETWORK_NAME] \
--router:external=True
#[尚未有external network]在external network中建立一個subnet
$ neutron subnet-create \
--gateway [GATEWAY_IP ex:192.168.2.1] \
--allocation-pool start=[IP_START ex:192.168.2.2] ,end=[IP_END ex:192.168.2.254] \
[NETWORK_NAME ex:new_public] \
[SUBNET_RANGE CIDR  ex:192.168.2.0/24] \
--enable_dhcp=False
#秀出router list
$ neutron router-list
#切換router gateway,從已有的external network切換到新建立的external network
$ neutron router-gateway-clear \
[ROUTER_ID]
$ neutron router-gateway-set \
[ROUTER_ID] \
[NEW_EXT_NETWORK_ID]
#秀出特定router的info
$ neutron router-show

 Keystone、Nova、Cinder Quotas management

每個tenant建立時就會帶入預設的quota,每個tenant中的user也會配置tenant的預設quota,但是每個user的quota都可以被調整,當增加quotas超過tenant的quota時,tenant quota也會被調升。

#秀出tenant id
$ keystone tenant-list
#秀出目前tenant內的nova(Compute) quotas information
$ nova quota-show \
--tenant [TENANT_ID]
#秀出目前tenant預設quotas (不加TENANT_ID)
$ nova quota-show
#修改某個tenant的quota限制
$ nova quota-update \
--[QUOTA_KEY ex:cores] [QUOTA_VALUE ex:20] \
[TENANT_ID]
#查詢某個tenant內的user quotas information (預設user quota會等同預設的tenant quota,不受修改的tenant quota影響)
$ nova quota-show \
--user [USER_ID] \
--tenant [TENANT_ID]
#修改某個tenant的user quota限制
$ nova quota-update \
--user [USER_ID] \
--[QUOTA_KEY ex:instance] [QUOTA_VALUE ex:1] \
[TENANT_ID]
#秀出目前tenant內的cinder(Storage) quotas information
$ cinder quota-show \
--tenant [TENANT_ID]
#秀出目前tenant內的neutron(Networking) quotas information
$ neutron quota-show \
--tenant [TENANT_ID]

文章參考資料

  • OpenStack IN ACTION (ISBN:9781617292163)
OpenStack

DevStack testing

安裝DevStack流程

建議使用Ubuntu 14.04版

#更新packages
$ sudo apt-get -y update
$ sudo apt-get -y upgrade
#安裝git,以clone DevStack
$ sudo apt-get -y install git
#clone DevStack至/opt/devstack/
$ sudo git clone https://github.com/openstack-dev/devstack.git /opt/devstack/
#創建devstack專用用戶stack
$ cd /opt/devstack/
$ sudo chmod u+x tools/create-stack-user.sh
$ sudo tools/create-stack-user.sh
$ sudo chown -R stack:stack /opt/devstack/
#切換到stack以執行安裝
$ sudo -iu stack
$ cd /opt/devstack/
#配置所需的local.conf
$ nano local.conf
#進行安裝./stack.sh
$ ./stack.sh
#-----------------------------------------------
#中途若遇到失敗,可透過unstack以及clean的動作進行重新安裝
$ ./unstack.sh
$ ./clean.sh
$ sudo rm -rf /opt/stack
$ sudo reboot
$ sudo mkdir /opt/stack
#接著再從 上述 [#創建devstack專用用戶stack] 重新進行
#-----------------------------------------------


文章參考資料

  • OpenStack IN ACTION (ISBN:9781617292163)
magnumOpenStack

Openstack magnum overview

Magnum

官方網站、wiki的介紹

Magnum 是Openstack Containers Team所開發的一套API service,允許一些container編制引擎(orchestration engines)能夠做為第一類的資源(first class resource)來使用,例如:Docker Swarm, Kubernetes(K8s), and Apache Mesos,並透過這些資源來管理及佈署container,達成CaaS(container as a service)。
Magnum是透過Heat去編制一個包含了Docker或是K8s的OS image,而這個image允許以VM或裸機(bare metal)的方式運行。

OpenStack和Docker/container的關係

Openstack和Docker可以呈現互補的關係。因為Openstack著重在IaaS的整合及服務,Docker的出現能利用Openstack在IaaS出色的表現,加上container比VM更輕量的特性,將資源更充分利用。
openstack-as-layers

OpenStack中的項目可以按其特性分成4層:
  1. 基礎設施層(Base Compute Infrastructure): 如Nova, Glance, Keystone
  2. 擴展基礎設施層(Extended Infrastructure): 能基於第一層提供延伸性的服務,如Cinder、Swift、Neutron、Designate和Ironic
  3. 可選的增強項目層(Optional Enhancements): 是選用而不是必備的項目,可以提供用戶更高級的服務,如Ceilometer、Horizon和Barbican
  4. 消費型服務層(Consumption Services):消費所指的就是要消耗或使用下方的三層的服務來達成的第四層服務,如Heat、Magnum、Sahara、Solum和Murano,其中Magnum就是屬於這一層的服務。
  5. Kolla不屬於這四層,他主要是將Openstack的所有服務都container化,讓安裝佈署即升級更為方便。

Magnum術語及架構

  • Container: 容器
  • Pod: 是K8s中的基本佈署單元,是一群Containers的集合,可以在同一個host上一起運行
  • Service: 把Container與Network port介接起來,可提供服務是Pod的路由代理抽象,Client端便透過Serive做代理,以運行Pod
  • Replication Controller: 是Pod的複製抽象,用來做Pod的複製、Scale、HA、load balance
  • Bay: 一群Nova instance的群集集合,透過Magnum可創建K8s或Swarm的Bay
  • Baymodel: 用來定義Bay的規格
  • Node: Bay中的節點

6.png

File:Magnum architecture.png

Magnum主要有兩個服務Magnum API及Magnum Conductor:
Magnum API負責處理client的請求。
Magnum Conductor負責做後端的處理,將client的請求轉送到對應的K8s、Swarm等backend

Magnum的角色與Nova有一定的相似程度,Nova透過不同的Hypervisor去管理VM,而Magnum透過不同的orchestration engines去管理container。

Magnum所能改進問題

  • 在Heat之上實做,並無法提供Multi-tenancy的架構
  • Asynchronous API 允許Request提出後,不用持續被block and wait
  • 結合並利用Heat的Orchestartion機制,而不是直接靠Heat實做
  • 利用Keystone提供SSO(Single-sign on)

Magnum 新特色 2015 Oct. Liberty Release

  • 支援Apache Mesos
  • Secure Bay,在Magnum API與Client之間實做TLS(Transport Layer Security)
  • 更多的Load Balancer,更容易做到scale
  • Multi-Master for HA

Magnum FAQ

  1. Magnum於nova有什麼不同?
    Magnum提供API來部署應用容器,與nova-docker部署的容器處於不同的生命週期。事實上,Bay是一群Nova instance的集合
  2. Magnum於Dokcer和K8S有什麼不同?
    與Docker&k8s相比,Magnum提供了一組和Keystone一起工作異步的api,具備多租戶的能力。同時,Magnum不負責編排的工作,編排工作是有heat完成的。在Mangum中,K8S和docker都是Magnum的組件。 Magnum使用它們作為容器後端來管理容器。
  3. 是否與Nova-docker做的事情是相同的?
    Nova-Docker是nova的一個driver,使得用戶可以將容器作為一種輕量的虛擬機來使用。但是,Magum是用來部署用戶的服務容器的。 Magnum提供了一套獨立的ReST API。 Magnum並不會直接調用nova的API創建Bay。 Magnum使用的是heat的API來創建Bay。
  4. 誰需要使用Magnum?
    Magnum為OpenStack雲提供營提供了一種為雲用戶提供容器來託管服務的自助解決方案。 提供了超過現有云資源之外的能力。Magnum支持指定應用實例個數的方式進行應用伸縮,能夠在應用實例失敗的情況下自動重新啟動應用實例,與虛擬機比起來能夠將應用跟更緊的打包一起。
  5. Heat Docker 是否能完成Magnum做的事情?
    Heat Docker沒有提供資源調度的能力及選擇所使用容器技術的能力。 Heat docker並不支持與swarm和k8s的集成。
  6. 多租戶在Magnum中意味著什麼?
    由Mangnum創建出來的容器,服務,Pods,Bays這些資源只對創建他的租戶下的用戶可見。 Bays在不同租戶間不是共享的,不同租戶的容器不會運行在相同的bay裡,這意味這不同租戶的容器不會運行在同一個內核上。將同一個租戶的容器運行在相同的pods和bays裡面,將不通租戶的容器運行在不同的內核上是Magnum的關鍵安全特性。在租戶的隔離性上,使用Mangum創建的容器具有與使用nova創建虛擬機相同的隔離性。

文章參考資料:

  1. Openstack – Magnum
  2. Openstack Wiki – Magnum
  3. [aboutyun論壇]openstack与容器如何深度整合?
  4. [YouTube]OpenStack Magnum – Containers-as-a-Service
  5. OpenStack Magnum简介
  6. DockOne技术分享(八):OpenStack Magnum社区及项目介绍
HA

HAProxy Configuration(.cfg設定)

HAProxy的設定主要可以分為三個部分:

  1. command-line最為優先
  2. cfg檔的global section做全域設定
  3. cfg檔的proxy section做其他設定(“defaults", “listen", “frontend", “backend")

HAProxy會試著透過frontend端的socket監聽client的request,經過Http Header的驗證或修改後,再轉送到backend端來執行。

$ cat /etc/haproxy/haproxy.cfg
global #global section
# 1.Process Management And Security
    chroot [jail dir] #執行chroot(),把process搬到jail dir運行,提高安全性
    daemon #執行fork,在背後運行一個相同的process
    gid [number] #把group ID設成數字
    group [group name] #把group ID設成名字
    log [address] [facility] [max level] #syslog server設定位址、實施應用類型,以及log必須具備等級 
    log-send-hostname [name] #在syslog表頭設定hostname
    log-tag [string] #在syslog表頭設定tag,預設tag為program name
    pidfile [pidfile] #把所有daemons的pid紀錄到這個pidfile
    stats socket #在path創建一個UNIX Socket 
    stats timeout [timeout, in milliseconds] #stats socket的timeout預設10秒 
    stats maxconn [conn] #stats socket的連接數量預設10 
    uid [number] #把user ID設成數字 
    user [user name] #把user ID設成名字 
    node [name] #設定node name 
    description [text] #設定一段文字來描述這個實體 
# 2.Performance Tuning 
    maxconn [number] #設定每個process最大可連接數量 
    maxpipes [number] #設定每個process最大pipes數量 
    noepoll #no epoll,禁用epoll(註:epoll可支援打開大量socket) 
    nopoll #no poll,禁用poll 
    spread-checks <0..50, in percent> #避免同時送出health check到server,增加隨機性 
    tune.XXXXX #其他tune相關設定 
# 3.Userlists 
userlist [list name] 
group [groupname] [users [user],[user],(...)]
user [username] [password|insecure-password [password]] [groups [group],[group],(...)] 
#例如: 
#userlist L1 
#    group G1 users tiger,scott 
#    group G2 users xdb,scott 
#    user tiger password $6$k6y3o.eP$JlKBx9za9667qe4(...)xHSwRv6J.C0/D7cV91 
#    user scott insecure-password elgato 
#    user xdb insecure-password hello

文章參考資料

  1. HAProxy Configuration Manual
  2. HAProxy 實現 load balance 負載平衡
  3. HAProxy – Maxkit
HA

Corosync / Pacemaker Tool command操作

Corosync

用於HA的環境中,提供通訊服務,在各個node間傳送heartbeat的訊息。

透過/ete/corosync/corosync.conf可以定義corosync的配置,其中totem標籤內定義的是node之間的通訊協議。


Pacemaker

用於HA的環境中,負責資源的管理,若需通訊時,則透過底層的corosync來達成。

主要元件

pcmk-internals

pacemaker 扮演資源管理的大腦角色,內部自然就有多個元件緊密的運作著,而主要的元件共有五個:

  1. Cluster Information Base (CIB): 儲存 cluster 中所有 resource 資訊,訊會同步到所有 pacemaker 的 CIB 上,確保每一個 pacemaker 服務都有 cluster 完整的 resource 資訊。
  2. Cluster Resource Management daemon (CRMd): CRMd 會接收來自 PEngine 的資訊,傳遞控制訊息至 LRMd 來進行 resource 的調配。
  3. Local Resource Management daemon (LRMd): LRMd進行resource的調配。
  4. Policy Engine (PEngine or PE): 運用CIB 資訊,在依照制定好的 policy 為前提下,作為將 cluster 最佳化的依據。
  5. Fencing daemon (STONITHd): CRMd 可能會下命令給 STONITHd,將遠端的某個 resource 關閉,甚至把機器關機(進行隔離)。

Cluster Resource Management: crm

#crm指令格式
$ crm [-D display_type] [-f file] [-c cib] [-H hist_src] [-hFRDw] [--version] [args]
#讀並且執行file上的指令
$ crm -f file
#與cib進行session
$ crm -c cib
#不加參數,直接進行互動模式
$ crm
#秀出目前配置
$ crm configure show
#以XML秀出目前配置
$ crm configure show xml
#把Resource設在同一個群組
$ crm configure group G_name R1 R2 R3
#定義Resource啟動順序(級別可分為:mandatory強制/Optional選擇/Serialize序列化)
$ crm configure order O_name mandatory: R1 R2 R3
#cluster中的節點訊息
$ crm status
#列出Resource Agent(ra)支援的provider類別
$ crm ra classes
#列出Resource Agent(ra)中某個類別(ex:ocf)的所有provider清單
$ crm ra list ocf
#查詢provider的資訊及使用方式
$ crm ra info ocf:heartbeat:IPaddr2

詳細內容可以連至參考資料3.

Start/Stop Pacemaker: pacemakerd

#版本及feature資訊
$ pacemakerd --feature

Summary of cluster’s current state: crm_mon

#resource failcounts
$ crm_mon -f

check the validity of the configuration: crm_verify

#秀出目前配置有問題的地方
$ crm_verify -L

文章參考資料

  1. [HA] 建置 Two Nodes HA Cluster by corosync & pacemake @ Ubuntu 14.04 淺談 Pacemaker 架構
  2. Pacemaker – Chapter 4. Pacemaker Tools
  3. corosync+pacemaker的crmsh常用指令介绍
  4. Pacemaker中的资源管理工具–CRM基本指令及用法
Juju

Using Juju Charms 6~13 – Service(Scaling, Removing, Groups, HA, Bundle, Units, Actions, Storage)

Scaling Charms

Expanding service capacity

#增加一個service節點在本地host(不指定--to)
$ juju add-unit rabitmq-server
#增加一個service節點在machine 1
$ juju add-unit --to 1 rabitmq-server
#增加特定數量節點(n)、特定環境(e)
$ juju add-unit -n 10 mysql -e hpcloud

Scaling back

#刪除特定編號(ex: 2號)的節點
$ juju remove-unit mediawiki/2
#銷毀特定編號(ex: 1號)機器
$ juju destroy-machine 1

Removing services and environments

Remove a service

#刪除特定服務(ex: mysql),若有Relation存在則會斷開
$ juju remove-service mysql

Remove machines

#移除特定編號(ex: 1號)機器
$ juju remove-machine 1

Destroying the environment

#銷毀執行環境(移除所有節點及服務)
$ juju destroy-environment <environment>

Caveats

#解決units的error,讓其繼續運作,解除中斷的情況
$ juju resolved <unit>

Groups of Services

#替佈署的service命名
$ juju deploy mysql <name>
$ juju deploy mysql wikidb
#使用已命好的名稱建立連結(-n可以設定unit的數量,換句話說就是建立了一個群組)
$ juju deploy mysql masterdb
$ juju deploy mysql slavedb -n2
$ juju add-relation masterdb:master slavedb:slave
#可以針對命好名的群組作設定
$ juju set slavedb some_param=new_value

Service High Availability (HA)

Distribution groups

#若系統有啟用 Availability Zones 或 Availability Sets ,佈署數個Service時,就會存在HA的特性
$ juju deploy -n 10 <service>

Availability Zones

#機器佈署在不同的zone,可以達到HA(distribution groups)的效果
$ juju bootstrap --to zone=us-east-1b
$ juju add-machine zone=us-east-1c

Azure Availability Sets

Azure的預設HA機制,預設是開啟的,功能是要確保所有的unit不會在同一時間失效


Creating and using Bundles

Bundle 可以透過線上的store下載,也可以透過本地端yaml檔來安裝

Local deploy via command-line

#在本地端佈署Bundle yaml要使用juju quickstart,因此必須先行安裝
$ sudo add-apt-repository ppa:juju/stable
$ sudo apt-get install juju-quickstart
#務必使用bundle proof來確保可能會發生的錯誤
$ juju bundle proof ../path-your-bundle-name
#啟用本地bundle
$ juju quickstart bundle.yaml

Using Units

juju ssh

#遠端連線到某一個unit
$ juju ssh mysql/3

juju scp

#遠端複製檔案(從machine 2到本地)
$ juju scp 2:/var/file .
# 同時複製多個不同的遠端檔案
$ juju scp -v 2:/var/file 1:/var/file .
# 複製整個遠端的資料夾
$ juju scp -r 2:/var/log/ .
#複製本地的檔案到遠端
$ juju scp -e <environment> test.txt apache2/1:

juju run

#遠端下CLI指令(ex: uname)在所有machine上
$ juju run "uname -a" --all
# 遠端下CLI指令(ex: uptime)在特定machine上
$ juju run "uptime" --machine=2
# 遠端下CLI指令(ex: uptime)在所有運行此service的unit上
$ juju run "uptime" --service=mysql
# 遠端下CLI指令(ex: uptime)在特定unit上
$ juju run "uptime" --unit=nfs1/0

Juju Actions

#秀出service可執行的action
$ juju action defined mysql
backup: Take a backup of the database
...
# 命令service執行action
$ juju action do mysql/0 backup
Action queued with id: <ID>
#擷取某個action執行結果
$ juju action fetch <ID>
#查詢某個action目前的狀況
$ juju action status <ID>

Storage support

用juju storage指令,可以提出儲存媒體需求(storage requirements),進而使用制定的參數做規範。


文章參考資料

  1. Juju – Scaling Charms
  2. Juju – Removing services, units and environments
  3. Juju – Groups of Services
  4. Juju – Service High Availability (HA)
  5. Juju – Creating and using Bundles
  6. Juju – Using Units
  7. Juju – Juju Actions
  8. Juju – Storage support
Linux

Linux(Ubuntu)練習 – 鳥哥基礎篇6.4-6.8檔案特殊權限與檔案搜尋

檔案特殊權限

檔案預設權限: umask

umask 的分數指的是『該預設值需要減掉的權限!』

#預設其他人不可寫入(022)
$ umask 022

設定檔案隱藏屬性: chattr

$ chattr [+-=][ASacdistu] 檔名

顯示檔案隱藏屬性: lsattr

$ chattr [-adR] 檔名

檔案特殊權限: SUID、SGID、SBIT

SUID(set UID,執行者可暫時或得擁有者的權限),例如: /usr/bin/passwd 這個檔案的權限狀態:『-rwsr-xr-x』,s出現在擁有者的x項目

  • SUID 權限僅對二進位程式(binary program)有效;
  • 執行者對於該程式需要具有 x 的可執行權限;
  • 本權限僅在執行該程式的過程中有效 (run-time);
  • 執行者將具有該程式擁有者 (owner) 的權限。

SGID,例如: -rwx–s–x.

  • 對檔案來說
    • SGID 對二進位程式有用;
    • 程式執行者對於該程式來說,需具備 x 的權限;
    • 執行者在執行的過程中將會獲得該程式群組的支援!
  • 對目錄來說
    • 使用者若對於此目錄具有 r 與 x 的權限時,該使用者能夠進入此目錄;
    • 使用者在此目錄下的有效群組(effective group)將會變成該目錄的群組;
    • 用途:若使用者在此目錄下具有 w 的權限(可以新建檔案),則使用者所建立的新檔案,該新檔案的群組與此目錄的群組相同。

SBIT(Sticky Bit),例如:如果將 A 目錄加上了 SBIT 的權限項目時, 則甲只能夠針對自己建立的檔案或目錄進行刪除/更名/移動等動作,而無法刪除他人的檔案。

  • 當使用者對於此目錄具有 w, x 權限,亦即具有寫入的權限時;
  • 當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔案
#使用chmod指令時,若用四個數字代表權限,第一個數字則為特殊權限。4 為 SUID、2 為 SGID、1 為 SBIT。
$ chmod 4755 test

觀察檔案類型:file

$ file 檔名

檔案搜尋

尋找指令(執行檔)檔案: which

$ which [-a] command
$ which ifconfig

搜尋檔案檔名: whereis(只搜尋特定目錄)、locate(從資料庫找,較快)、find(從硬碟搜尋,較慢)

$ whereis [-bmsu] 檔名
$ whereis ifconfig
#列出5個包含關鍵字的檔案位置
$ loacte -l 5 passwd
#設定特定條件從硬碟搜尋
$ find [PATH] [option] [action]

文章參考資料

  1. 鳥哥的linux私房菜 – Linux檔案與目錄管理6.4-6.8
Juju

Using Juju Charms 1~5 – Services(Deployment, Constraints, Configurations, Relations, Exposing)

Deploying Services

Juju的charm佈署來源大致上可分為兩個:從線上的charm store、從本地的repository

Deploying from the Charm Store

從charm store(cs)找到最新、最穩定的service版本來佈署

#精簡寫法
$ juju deploy mysql
#完整寫法
$ juju deploy <respository>:<series>/<service>
$ juju deploy cs:precise/mysql

Deploying from a local repository

使用時機:自己撰寫或修改charm、無法連網

#完整寫法(多了repository的環境參數)
$ juju deploy --repository=<path/to/files> :/
$ juju deploy --repository=/usr/share/charms/ local:trusty/vsftpd
#repository環境參數也可事先宣告,deploy時就不用再打了
$ export JUJU_REPOSITORY=/usr/share/charms/
$ juju deploy local:trusty/vsftpd
#series系列參數也可事先設定,deploy時就不用再打了(可從CLI設定,也可以從yaml檔設定)
$ juju set-env "default-series=trusty"
$ juju deploy --repository=. local:haproxy

Deploying to specific machines and containers

#佈署service在特定machine(本機host=bootstrap node→machine 0)
$ juju deploy --to 0 mysql
#佈署service在特定machine(ex:24)、特定container(ex:3)
$ juju deploy mysql --to 24/lxc/3
#佈署service在特定machine(ex:25)、新增一個特定的container
$ juju deploy mysql --to lxc:25
#佈署在MAAS上的特定機器
$ juju deploy mysql --to host.mass
#用特定的network佈署service
$ juju deploy --networks db,monitor mysql

Status Overview

$ juju status

Machine Constraints

Working with constraints

–constraints可以對機器做一些限制,針對juju deploy 是對service做限制;針對juju bootstrap是對整個環境(environment)做限制。最常用的兩個限制就是CPU數量(cpu-cores)、記憶體大小(mem)

#Bootstrap Node環境限制
$ juju bootstrap --constraints="mem=4G"
#佈署Service的限制
$ juju deploy --constraints="cpu-cores=8 mem=4G" mysql
#取得環境限制
$ juju get-constraints
#取得特定service限制
$ juju get-constraints mysql

Service Configuration

Deploying with a configuration file(.yaml)

#對整個環境做配置
$ juju deploy --config=myconfig.yaml
#對Service做配置
$ juju deploy --config=myconfig.yaml mediawiki
#取得目前對Service的配置
$ juju get mediawiki
#對Service設定某幾個config屬性
$ juju set mediawiki skin=monoblock name='Baddy Wiki'
#對Service取消某幾個config屬性
$ juju unset mediawiki skin name

Managing Relationships

有的Service可以獨自運作,但有的需要數個Service一起才能服務。

#建立Service之間的Relation
$ juju add-relation mysql wordpress
#建立Service之間的"特定角色"之Relation(一個serviced可能存在著超過一種以上的Relation)
$ juju add-relation mediawiki:db mysql
#移除Relation
$ juju remove-relation mediawiki mysql

Exposing Services

Service預設都是沒有對外開放的,因此要解除某些防火牆的設定才能對外開放。

#對外開放Service
$ juju expose wordpress
#對外封鎖Service
$ juju unexpose wordpress

文章參考資料

  1. Juju – Deploying Services
  2. Juju – Machine Constraints
  3. Juju – Service Configuration
  4. Juju – Managing Relationship
  5. Juju – Exposing Service
Linux

Linux(Ubuntu)練習 – 鳥哥基礎篇6.1-6.3檔案與目錄配管理

檔案及目錄

變換目錄(change directory): cd

變換目錄
$ cd [絕對/相對路徑]
變換到某個使用者的家目錄
$ cd 波浪符[使用者名]

顯示所在目錄(print working directory): pwd

顯示確實路徑,而非連結路徑
$ pwd -P

建立目錄(make directory): mkdir

遞回建立多層目錄,即使原本都不存在
$ mkdir -p layer1/layer2/layer3
建立目錄,且同時設定權限(不使用預設權限)
$ mkdir -m 777 [目錄名稱]

刪除目錄(remove directory): rmdir

遞回刪除多層"空"目錄
$ rmdir -p layer1/layer2/layer3

執行檔路徑: $PATH

加入新的路徑(例如:/root)到執行檔路徑中
$ PATH="${PATH}:/root"

檢視檔案及目錄(list): ls

常用[-a]:列出所有檔案包含隱藏檔
常用[-d]:僅列出目錄本身,不列出目錄內檔案
常用[-l]:列出長串的完整屬性,包含權限等
$ ls [-aAdfFhilnrRSt] 檔名或目錄名稱..
$ ls [--color={never,auto,always}] 檔名或目錄名稱..
$ ls [--full-time] 檔名或目錄名稱..
$ ls -l 等同於 $ ll

複製檔案及目錄(copy): cp

常用[-a]:完整複製
常用[-i]:目標已存在時,會詢問是否覆蓋
常用[-p]:連同檔案的屬性(權限、用戶、時間)一起複製過去,而非使用預設屬性(備份常用)
常用[-r]:遞迴持續複製整個目錄
$ cp [-adfilprsu] 來源檔 目標檔

刪除檔案及目錄(remove): rm

常用[-f]:指的是force,不存在的檔案就忽略,不會詢問
常用[-i]:刪除前會詢問
常用[-r]:遞回刪除整個目錄(危險!)
$ rm [-fir] 目標檔

移動檔案及目錄(move): mv

常用[-f]:指的是force,存在同樣的檔案就覆蓋,不會詢問
常用[-i]:目標存在時,會詢問
常用[-u]:來源較新時就覆蓋
(利用mv指令也可以做到更名的動作)
$ mv [-fiu] 來源檔 目標檔

取得路徑的檔名、目錄名: basename、dirname

取得路徑的檔名 testfile
$ basename /etc/testdir/testfile
取得路徑的目錄名 /etc/testdir
$ dirname /etc/testdir/testfile

檔案內容查閱

 直接檢視檔案內容(Concatenate): cat

常用[-b]:列印行號(不包含空白行)
常用[-n]:列印行號(包含空白行)
$ cat [-AbEnTv] 檔案名

反向檢視檔案內容: tac

$ tac 檔案名

添加行號列印: nl

效果類似$ cat -b
$ nl 檔案名

可翻頁檢視: more、less

只能往後翻頁
$ more 檔案名
能夠前後翻頁,更加彈性
$ less 檔案名

擷取資料前幾行: head

$ head [-n number] 檔案名
擷取前n行
$ head -n 10 first10.txt
擷取不包含後面n行
$ head -n -10 exceptLast10.txt

擷取後面幾行: tail

$ tail [-n number] 檔案名
擷取後n行
$ tail -n 10 last10.txt
擷取第n行之後的所有
$ tail -n +10 exceptFirst10.txt
擷取第11行到第20行(利用管線|)
$ head -n 20 file.txt | tail -n 10

檢視非文字檔: od

$ od [-t TYPE] 檔案名
按照ASCII輸出
$ od -t oCc 檔案名
直接查詢文字的ASCII編碼
$ echo word | od -t oCc

修改檔案時間、開新檔案: touch

修改檔案時間
$ touch [-acdmt] 檔案名
開新(空白)檔案
$ touch 檔案名

文章參考資料

  1. 鳥哥的linux私房菜 – Linux檔案與目錄管理6.1-6.3