curlコマンド

curl が利用するssl証明書

curl が利用するssl証明書の確認方法

以下の CAfile: で確認できます。

$ curl https://www.yahoo.co.jp -v >> /dev/null
* Uses proxy env variable no_proxy == 'localhost
* Uses proxy env variable https_proxy == 'http://proxy.co.jp:8080'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 10.51.8.102:8080...
* Connected to proxy.co.jp port 8080 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to www.yahoo.co.jp:443
> CONNECT www.yahoo.co.jp:443 HTTP/1.1
> Host: www.yahoo.co.jp:443
> User-Agent: curl/7.71.1
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection Established
< Proxy-Agent: Zscaler/6.1
<
* Proxy replied 200 to CONNECT request
* CONNECT phase completed!
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: ~/anaconda3/ssl/cacert.pem        ***ここで確認可能
  CApath: none
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* CONNECT phase completed!
* CONNECT phase completed!
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
curl が利用するssl証明書の変更方法

curl の--cacertオプションを利用することで、利用するsslを変更できます。

curl https://www.yahoo.co.jp -v -cacert プロキシのパス

もしくは、以下のように環境変数を指定してもよい。

export SSL_CERT_FILE = Proxyのパス

curlでTokenを取得する際の書き方

  • Headerは、-Hオプションで指定。 複数のHeaderを指定したい場合は、-Hオプションを複数つけること。

curlコマンドでの一例

# curl -H "Content-Length:62" -H "Content-Type: application/json" -X POST https://10.165.8.68:8080/UserManagement/v1/edgeui/auth/signin  -d '{"email": "defaultAdmin@admin.com", "password": "Admin1234!"}' -k   -i -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0"
{"statusCode":"200 OK","status":"SUCCESS","message":"Signin success","data":{"userId":1,"email":"defaultAdmin@admin.com","accessToken":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJvYjJ1cTdHZ0lnSkRmbXJuZ3JWYWJObzRLaWMwNE40R05UNENUQkdVa2dNIn0.eyJleHAiOjE2MTA5MjQwNTcsImlhdCI6MTYxMDkyMzc1NywianRpIjoiZTVhMjY4OTItYmFkMC00M2NiLTllZTgtMjEzZmQ0MTVjZDVkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgyL2F1dGgvcmVhbG1zL0VER0VVSSIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJmOjQ5MmE2ZjdhLTZjNmQtNGI4NS05ZDBiLTdlMjNiZWEyMTU2NDoxIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiRURHRVVJIiwic2Vzc2lvbl9zdGF0ZSI6ImI5OGNhODlmLTgzYTAtNDI3NC1iYWJlLTBkZjg1YTM2MGYyNiIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7IkVER0VVSSI6eyJyb2xlcyI6WyJBcHBsaWNhdGlvbl9BZG1pbiIsIkNvbnRyb2xwYW5lbF9BZG1pbiJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6ImRlZmF1bHRBZG1pbiBkZWZhdWx0QWRtaW4iLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkZWZhdWx0QWRtaW5AYWRtaW4uY29tIiwiZ2l2ZW5fbmFtZSI6ImRlZmF1bHRBZG1pbiIsImFjdGlvbnMiOlsiUmVhZF9Vc2VyX0FjY291bnRzIiwiQWRkX1JlcG9ydCIsIlZpZXdfQ29uZmlndXJlZF9Ob3RpZmljYXRpb25zIiwiQWRkX05ld19XaWRnZXQiLCJEZWxldGVfTm90aWZpY2F0aW9ucyIsIkRlbGV0ZV9SZXBvcnQiLCJSZWFkX1JlcG9ydCIsIlZpZXdfTGl2ZXZpZXciLCJBZGRfTm90aWZpY2F0aW9ucyIsIkFkZF9TZWFyY2hfUXVlcnkiLCJSZWFkX1JvbGVzIiwiVXBkYXRlX05vdGlmaWNhdGlvbnMiLCJWaWV3X0Jhc2ljX0NvbmZpZ3VyYXRpb25fT2ZfQW5hbHl0aWNzX1VuaXQiLCJWaWV3X0ZhY2VtYXRjaF9SZXN1bHRzIiwiRW5yb2xsX1N1YmplY3RzIiwiVXBkYXRlX0Jhc2ljX0NvbmZpZ3VyYXRpb25fT2ZfQW5hbHl0aWNzX1VuaXQiLCJVcGRhdGVfQmFzaWNfQ29uZmlndXJhdGlvbl9PZl9DYW1lcmEiLCJWaWV3X0FuYWx5dGljc19Vbml0IiwiQWRkX0ZhY2VtYXRjaCIsIlVwZGF0ZV9BbGVydHMiLCJEZWxldGVfU2VhcmNoX1F1ZXJ5IiwiRGVsZXRlX0FsZXJ0cyIsIkV4cG9ydF9SZXBvcnRzIiwiVmlld19TZWFyY2hfUXVlcnkiLCJEZWxldGVfV2lkZ2V0IiwiQWRkX0FsZXJ0cyIsIlZpZXdfQmFzaWNfQ29uZmlndXJhdGlvbl9PZl9DYW1lcmEiLCJSZWFkX0FsZXJ0cyIsIlZpZXdfUmVwb3J0X0RldGFpbHMiLCJHZW5lcmF0ZV9SZXBvcnRzIiwiVXBkYXRlX1dpZGdldCIsIkNyZWF0ZV9Vc2VyX0FjY291bnRzIiwiUmVtb3ZlX0FVX0xpY2Vuc2VzIiwiUmVhZF9TdWJqZWN0cyIsIkRlbGV0ZV9Vc2VyX0FjY291bnRzIiwiUmVhZF9BVV9MaWNlbnNlcyIsIlJlYWRfQ2FtZXJhcyIsIlVwZGF0ZV9Pd25fQWNjb3VudF9JbmZvIiwiRGVsZXRlX1JvbGVzIiwiUmVhZF9BbGxfQ29uZmlndXJhdGlvbnMiLCJSZWFkX0VWQV9BbmFseXRpY3NfVW5pdCIsIlVwZGF0ZV9FVkFfQW5hbHl0aWNzX1VuaXQiLCJDcmVhdGVfV2F0Y2hsaXN0cyIsIkFkZF9BdWRpdF9SZXBvcnQiLCJVcGRhdGVfV2F0Y2hsaXN0cyIsIlVwZGF0ZV9TdWJqZWN0cyIsIlJlYWRfV2F0Y2hsaXN0cyIsIkNyZWF0ZV9Sb2xlcyIsIlJlYWRfTm9kZV9IYXJkd2FyZV9TdGF0dXMiLCJEZWxldGVfQXVkaXRfUmVwb3J0IiwiUmVhZF9BdWRpdCIsIkNyZWF0ZV9FVkFfQW5hbHl0aWNzX1VuaXQiLCJWaWV3X0F1ZGl0X1JlcG9ydF9EZXRhaWxzIiwiVXBkYXRlX1JvbGVzIiwiRGVsZXRlX1dhdGNobGlzdHMiLCJBZGRfVXNlcl9BY2NvdW50cyIsIlVwZGF0ZV9DYW1lcmFfTG9jYXRpb25zIiwiRGVsZXRlX0NhbWVyYXMiLCJVcGRhdGVfVXNlcl9BY2NvdW50cyIsIkRlbGV0ZV9TdWJqZWN0cyIsIkFkZF9BVV9MaWNlbnNlcyIsIkNyZWF0ZV9TdWJqZWN0cyIsIlVwZGF0ZV9BbGxfQ29uZmlndXJhdGlvbnMiLCJEZWxldGVfRVZBX0FuYWx5dGljc19Vbml0IiwiQWRkX0NhbWVyYXMiLCJVcGRhdGVfQ2FtZXJhcyJdLCJmYW1pbHlfbmFtZSI6ImRlZmF1bHRBZG1pbiIsImVtYWlsIjoiZGVmYXVsdEFkbWluQGFkbWluLmNvbSIsImF1dGhvcml0aWVzIjpbIkFwcGxpY2F0aW9uX0FkbWluIiwiQ29udHJvbHBhbmVsX0FkbWluIl19.KXVCArJlJggmG5OhHn9OaCWyCXee8vbQz9CiuyX0pnF7wuQNa3ygDU6vvO3ABXnM-uiymSZbc3rYK-tU7JKt9FMHZvAOmE0P6_PZrJxi_XoHof1mcoebr_c9CoaOfnEKlEJrfh50CMyNv8NIhXZovT8daDdZRhDkmwGDybbYBY5aaAFJB63OPXWNVtYIJu5a-TqhkfN3RhwMDqjdJJABzKOMiXnlmQbCnjqmPPSEk6qOK12v25IPFMBfoWtvPPeGyptu9kqCQXi4EyuNetiTAi9IDEVAUmfismkDfcPtlcJQz6zH5JPhighm5NvLiYfww6cVQqh7UuYuQBF1HlCQQg","refreshToken":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJkYzMwZWNjMi1lY2U0LTQyNzAtODA1MC05ZmEyYjE1NmQ2NTgifQ.eyJleHAiOjE2MTA5MjU1NTcsImlhdCI6MTYxMDkyMzc1NywianRpIjoiNzU5ZmE2MmItZjJhZS00YzA0LTljODMtM2QzNGU0ZGY2ZjVhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgyL2F1dGgvcmVhbG1zL0VER0VVSSIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4Mi9hdXRoL3JlYWxtcy9FREdFVUkiLCJzdWIiOiJmOjQ5MmE2ZjdhLTZjNmQtNGI4NS05ZDBiLTdlMjNiZWEyMTU2NDoxIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6IkVER0VVSSIsInNlc3Npb25fc3RhdGUiOiJiOThjYTg5Zi04M2EwLTQyNzQtYmFiZS0wZGY4NWEzNjBmMjYiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIn0.Q2Q289YFOlpvTNtKpygaxBYv87b2MjVrRbYflT06P_0","tokenType":"bearer","remainingAttempts":4,"accountLocked":false,"defaultPassword":false}}

Docker

docker ファイルの作成からコンテナの起動までの流れ

docker fileの基本

goで書いたプログラムをDockerコンテナ内で動かすためのDocker fileの例です。 動作としては、

  1. echo ディレクトリを作成します。
  2. 予め準備していた、main.go ファイルを echo ディレクトリにコピーします。
  3. go run /echo/main.go コマンドを実行して、コンテナの動作を開始します。
FROM  golang:1.15.1

RUN mkdir /echo
COPY main.go /echo 

CMD ["go", "run", "/echo/main.go"]
  • RUNは、Dockerイメージビルド時に、Dockerコンテナ内で、実行するコマンドを定義します。
  • CMDは、Dockerコンテナとして実行する際に、コンテナないで、実行するプロセスを指定します。 イメージをBuildするためのRUNに対して、、CMDはコンテナ起動時に、1度実行されます。 CMDはコンテナ内で、アプリケーションそのものを実行するイメージとなります
docker imageの起動時にパラメータを引き渡す方法。

パラメータを引き渡すためには、Docker fileにどのCommand実行時にパラメータを引渡するかをしているする必要があります。
以下のようにENTRYPOINTで指定したコマンドは、docker run コマンド実行字に引数を渡すことができます。

FROM  centos:7

#Entry point : Provide parameter to executable cmd in docker container.
ENTRYPOINT ["sh", "/sayhello/sayhello.sh"]

RUN mkdir /sayhello
COPY sayhello.sh /sayhello

#Default prameter to provide executable cmd in docker container.
#If no parameter are setting when executing cmd, this parameter is provided .
CMD ["5"]

Reference: EntryPointの例 https://gitlab.com/stm05/k8s/dockerexample/-/tree/master

docker imageのビルド

Dockerファイルの準備ができたら、Dockerfileと必要なファイルを同じディレクトリに集めて、以下のコマンドで、buildを行います。

# docker image build -t イメージ:[タグ名] Docerfile 配置ディレクトリのパス
$ sudo docker image build -t example/echo:latest .

Sending build context to Docker daemon  6.441MB
Step 1/4 : FROM golang:1.15.1
 ---> 9f495162f677
Step 2/4 : RUN mkdir /echo
 ---> Using cache
 ---> 876f76330b0c
Step 3/4 : COPY main.go /echo
 ---> Using cache
 ---> f6f3a9a2dc3a
Step 4/4 : CMD ["go", "run", "/echo/main.go"]
 ---> Using cache
 ---> 9e8663cc9057
Successfully built 9e8663cc9057
Successfully tagged example/echo:latest
docker イメージの確認

Docker ファイルのBuildに成功すると、以下のようにimageが登録されます。

# docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
example/echo                             latest              9e8663cc9057        22 minutes ago      839MB
docker コンテナの実行/停止

上記のDocker imagesを指定して、Dockerのプロセスを実行します。

# docker run example/echo:latest 

コンテナの停止は以下のコマンドを利用します。

# docker stop [docker Names]
docker コンテナのポートフォワーディング

Dockerコンテナは、外部からは独立しており、Docker内のアプリケーションのポートが開放されていても、外部からはそのままでは、アクセスできないです。 アクセスするためには、Dockerホストのポートと、Docker内部のアプリケーションのポートを紐付ける必要があります。

以下のように'-p' オプションを利用することで、ポートフォワーディングの設定ができます。

-p ホストのポート:コンテナアプリケーションのポート  で指定します。

# docker run -p 9000:8080   9e8663cc9057  

上記で、起動したコンテナには、外部から9000番ポートでアクセス可能です。

なお、起動しているコンテナのどのポートが空いているかは、docker psコマンドで確認可能です。

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6e940bc44898        9e8663cc9057        "go run /echo/main.go"   7 minutes ago       Up 7 minutes        0.0.0.0:9000->8080/tcp   dreamy_murdock

0.0.0.0:9000->8080/tcp  となっており、ホストの9000番ポートから、コンテナの8080ポートにアクセスすることができます。

Docker コンテナ内へのアクセス

Docker コンテナ内へアクセスするためのコマンドは以下の通り。

# docker exec -it 6e940bc44898 /bin/bash
Dockerのイメージを一括で削除したい場合

Dockerの不要イメージを削除する場合は、docker image prune コマンドを利用します。 これは、dokcer自身が不要だと判断したimageが削除されます。

docker image prune
 Dockerの利用状況の取得

以下のコマンド(docker stats)を利用して、コンテナ単位で、システムリソースの利用状況を把握できます。

docker stats [Docker name]

# docker stats jolly_perlman 

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
7295a86a463f        jolly_perlman       0.20%               2.52MiB / 15.56GiB   0.02%               6.91kB / 0B         0B / 0B             2

Docker registryをLocalで建てて、ImageをPush する方法

  1. Docker registry をPullします。
# sudo docker pull registry
  1. Docker registry をRunさせてます。 5000ポートでアクセスできるように、設定。
#docker run -d -p 5000:5000 --name registry -e REGISTRY_STORAGE_DELETE_ENABLED=true registry:2

3. イメージをbuildします。

# docker image build -t イメージ:[タグ名] Docerfile 配置ディレクトリのパス

4. イメージをTagをつけて、resittryにPush します。 ここでは、registryがLocalにあり、5000ポートでListen しているとしています。   

# docker tag <image Tag> localhost:5000/imagename:latest
# docker push localhost:5000/imagename:latest
  1. なお、registryに登録されているイメージは、以下のように取得可能です。
$ curl http://localhost:5000/v2/_catalog
{"repositories":["video2"]}

Docker のプライベートregistryにhttpでアクセスする方法

問題

デフォルト設定では、Dockerのregistryに外のノードからhttpでアクセスしようとすると、怒られる。

$ sudo docker  push 192.168.10.100:5000/sample-application:latest 

The push refers to repository [192.168.10.100:5000/sample-application]
Get https://192.168.10.100:5000/v2/: http: server gave HTTP response to HTTPS client
解決方法

Client側の/etc/docker/にdaemon.jsonファイルを作成して、httpでアクセスしたい、registry除法を記載する。

I.E. registryが192.168.10.100 の5000ポートの場合

{
 "insecure-registries": ["192.168.10.100:5000"]
}

その後、以下のコマンドでdocker daemonをリスターとする。

#system daemon-reload 
#system restart docker.service

Docker のプライベートregistryに登録されているImageを削除する方法

  1. プライベートregistry内に登録されているImageを確認します。
$ curl localhost:5000/v2/_catalog |jq .

{
  "repositories": [
    "sample-applicatoin"
  ]
}
  1. 上記のsample-applicationのImageのタグ一覧を確認します。

APIのフォーマットは以下の通りです。 /v2/<イメージ>/tags/list

$ curl   http://localhost:5000/v2/sample-application/tags/list |jq .
{
  "name": "sample-application",
  "tags": [
    "latest"
  ]
}
  1. 削除したいイメージのDigistを確認します。

APIのフォーマットは以下の通りです。 /v2/<イメージ>/manifests/ なお、Dockerのdigistは、上記APIのレスポンスヘッダに記述されます。curlコマンドを利用する問いは、-iオプションを忘れずにつけましょう。

$ curl  -i http://localhost:5000/v2/sample-application/manifests/latest 
HTTP/1.1 200 OK
Content-Length: 7297
Content-Type: application/vnd.docker.distribution.manifest.v1+prettyjws
Docker-Content-Digest: sha256:caf02fe9a6a2ef22272d592b613ae4328865047c9c5c8c1b1f4ebf376ccb54b3
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:caf02fe9a6a2ef22272d592b613ae4328865047c9c5c8c1b1f4ebf376ccb54b3"
X-Content-Type-Options: nosniff
Date: Fri, 06 Aug 2021 05:36:26 GMT

{
   "schemaVersion": 1,
   "name": "sample-application",
   "tag": "latest",
   "architecture": "amd64",
   "fsLayers": [
      {
         "blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
      },
      {
         "blobSum": "sha256:c2ffe8edbb6aa773ae9760834096556bb56aa0d0f441094d2470c86afbc567d1"

Docker-Content-Digest: sha256:caf02fe9a6a2ef22272d592b613ae4328865047c9c5c8c1b1f4ebf376ccb54b3 が必要なdigist です。

4.イメージの削除

 トラブルシュート

DNSで名前解決ができない。

DockerBuild時に、以下のようなエラーが出る場合、dockerが名前を解決できていない可能性がある。

npm ERR! code EAI_AGAIN
npm ERR! errno EAI_AGAIN
npm ERR! request to https://registry.npmjs.org/semver/-/semver-6.3.0.tgz failed, reason: getaddrinfo EAI_AGAIN proxyg.co.jp

解決方法 /etc/docker/daemon.jsonDNSサーバのアドレスを入力。 /etc/docker/daemon.json

{
    "dns": ["DNSアドレス1","DNSアドレス2"]
}

dockerサービスを再起動する。

# systemctl resetart docker.service

Jenkins

Jenkins インストール

環境はUbuntu 18.04で構築しました。

Java 11のInstall
sudo apt-get update
sudo apt-get install openjdk-11-jre
Jenkins のインストール
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
Jenkinsの起動・停止
sudo systemctl start jenkins
sudo systemctl stop jenkins
Jenkinsへのアクセス方法
  • ブラウザで http://{hostname}:8080 にアクセスします
  • Administrator passwordの入力を求められますので、cat /var/lib/jenkins/secrets/initialAdminPasswordでパスワードを確認して入力します

RHELのISOイメージをUSBに書き込んで、Installしようとしたときのエラー

現象

RHELのISOイメージをUSBに書き込んで、Installしようとさせたときに以下のようなエラーが出てタイムアウトしてしまいました。 その結果、Installできなくなりました。

Warning: dracut-initqueue timeout Warning: /dev/xxxxx/xxxx does not exist. 

原因

USB内のInstallイメージを見つけられないことが原因のようです。 grub.cfgでDISKのインストールイメージパスの設定がされていますが、何らかの理由で正しいパスが設定できていないようです。

対処方法

grub.cfgに記載されているDISKのインストールイメージパスをUSBに向けます。

手順
  1. OSのイメージを書き込んだUSBをさしたサーバを起動します。
  2. エラーで失敗して、自動的にレスキューモードに移行します。以下のような画面になるはずです。。
dracut:/#
  1. まずは、USBのデバイスのパスを探す。 ラベルにusbと記載があるので、おそらく判別がつくと思われる。  心配なら、実際にマウントしてみるとよい。
#ls -al /dev/disk/by-id/

lrwxrwxrwx 1 root 0 9 : 04:15 ata-ST9555xxxxxxxxxx  -> ../../sdb
    ・
 ・
lrwxrwxrwx 1 root 0 9 : 04:15 usb-Generic_Flash_Disk_xxxxxxxxxx  -> ../../sdc
lrwxrwxrwx 1 root 0 9 : 04:15 usb-Generic_Flash_Disk_xxxxxxxxxx -part1 -> ../../sdc1
  1. 上記で、対象がsdc1であると判明したので、今度はuuidを調べる sdc1のuuidがC0DC-962Aであることがわかる。  このUUIDをgrubに設定する。いったんリブートする。
#ls -al /dev/disk/by-uuid/

lrwxrwxrwx 1 root 0 9 : 04:15 79d1d39493xxxxxxxx  -> ../../sda2
    ・
 ・
lrwxrwxrwx 1 root 0 9 : 04:15 C0DC-962A -> ../../sdc1
  1. リブート後に、USBからブートして、Install 選択画面が出てきたら、e をクリックして、grubの設定画面に移行する。  RHELの場合以下のような画面となる。
setparams 'Install Red Hat Enterprise Linux 7.8'

     linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-7.8\x20Serv\er.x86_64 quit
     initrdefi /images/pxeboot/initrd.img

上記のhd:Labelを5で調べたUUIDに変更する。

setparams 'Install Red Hat Enterprise Linux 7.8'

     linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:UUID=C0DC-962A quit     ★ここが変更場所 hd:UUID=調べたUUID というフォーマット
     initrdefi /images/pxeboot/initrd.img
  1. Ctrl-x で起動すれば、立ち上がるはず。

JAVAの負荷確認方法(jps, jstat など)

環境
  • Ubuntu16.04を想定しています。他ののLinux dustributionでも、ほぼ変わらないはずです。

JAVAプロセスのCPU使用率の確認

手順

1. jpsコマンドを利用して、JAVAのプロセスIDを確認します。   ここでは、Bootstrapを見たいので、プロセスIDは1180になります。

# jps
21509 Jps
1180 Bootstrap
1774 jboss-modules.jar
  1. topコマンドを利用して、そのプロセスIDのCPU使用率を確認します。 ここでは、topコマンドの結果を60sごとに、ファイルに保存するコマンドになります。
top -p 1180 -b -d 60  |tee -a top_cpu
  1. topコマンドを一回だけ実行したいときは、-n 1オプションを指定します。
top -p 1180 -b -n 1

JAVAプロセスのヒープメモリ使用率の確認

手順

1. jpsコマンドを利用して、JAVAのプロセスIDを確認します。   ここでは、Bootstrapを見たいので、プロセスIDは1180になります。

# jps
21509 Jps
1180 Bootstrap
1774 jboss-modules.jar
  1. jstatコマンドを利用して、そのプロセスIDのheap使用率を確認します。 ここでは、jstatコマンドの結果を60sごとに、ファイルに保存するコマンドになります。
# jstat  -gc 1180  60000 |tee -a jstat_heap
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
37888.0 39936.0 3848.4  0.0   3262976.0 1572221.1  488448.0   63041.7   105088.0 100846.7 12928.0 12096.3     34    1.082   4      0.568    1.650
  1. 確保済み領域/使用済み領域の確認方法

確保済み領域 (9216.0[S0C] + 6144.0[S1C] + 30720.0[EC] + 40448.0[OC] + 27136.0[MC]) / 1024  = 111MB

使用済み領域の確認 (0.0[S0U] + 5895.0[S1U] + 17433.9[EU] + 16309.2[OU]) / 1024  = 38MB

見方はこちらを参考にさせていただきました。 qiita.com

 GCの起こし方

JAVAのプロセスID1180に対して、GCを起こす。

$ sudo -u tomcat  jmap -histo:live 1180