20200323のLinuxに関する記事は7件です。

CentOS Linux 8 + Apache mod_ssl で https サーバへのリバースプロキシを設定する

概要

  • CentOS Linux 8 に Apache HTTP Server と mod_ssl をインストールして https サーバへのリバースプロキシを設定する

環境

  • CentOS Linux 8
  • Apache HTTP Server 2.4.37
$ cat /etc/centos-release
CentOS Linux release 8.1.1911 (Core)

Apache のインストール

dnf install コマンドで httpd パッケージをインストールする。

$ sudo dnf install httpd

インストールされたのを確認する。

$ dnf list --installed httpd
インストール済みパッケージ
httpd.x86_64  2.4.37-16.module_el8.1.0+256+ae790463  @AppStream

$ which httpd
/usr/sbin/httpd

$ httpd -v
Server version: Apache/2.4.37 (centos)
Server built:   Dec 23 2019 20:45:34

$ httpd -V
Server version: Apache/2.4.37 (centos)
Server built:   Dec 23 2019 20:45:34
Server's Module Magic Number: 20120211:83
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="run/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

systemd の httpd サービスを有効にする。

$ sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

Apache の起動

systemctl start コマンドで Apache を起動する。

$ sudo systemctl start httpd

Apache の状態を確認する。

$ systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-03-23 21:55:04 JST; 7min ago
     Docs: man:httpd.service(8)

Apache の設定ファイル

/etc/httpd/ 以下に Apache の設定ファイルがある。
メインの設定ファイルは /etc/httpd/conf/httpd.conf で、このファイルが他の設定ファイルを Include ディレクティブで追加している。

$ tree /etc/httpd/
/etc/httpd/
├── conf
│   ├── httpd.conf
│   └── magic
├── conf.d
│   ├── README
│   ├── autoindex.conf
│   ├── userdir.conf
│   └── welcome.conf
├── conf.modules.d
│   ├── 00-base.conf
│   ├── 00-dav.conf
│   ├── 00-lua.conf
│   ├── 00-mpm.conf
│   ├── 00-optional.conf
│   ├── 00-proxy.conf
│   ├── 00-systemd.conf
│   ├── 01-cgi.conf
│   ├── 10-h2.conf
│   ├── 10-proxy_h2.conf
│   └── README
├── logs -> ../../var/log/httpd
├── modules -> ../../usr/lib64/httpd/modules
├── run -> /run/httpd
└── state -> ../../var/lib/httpd

7 directories, 17 files

mod_ssl のインストール

dnf install コマンドで mod_ssl パッケージをインストールする。

$ sudo dnf install mod_ssl

設定ファイル ssl.conf と 00-ssl.conf が増えているので、必要に応じて Include ディレクティブで追加する。

$ find /etc/httpd | grep ssl
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.modules.d/00-ssl.conf

リバースプロキシの設定

例えば以下のような内容を /etc/httpd/conf/httpd.conf の設定ファイルに記述する。
今回は Include ディレクティブを使わず1つの設定ファイルにまとめた。

ServerRoot "/etc/httpd"

LoadModule authz_core_module modules/mod_authz_core.so
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule systemd_module modules/mod_systemd.so

Listen 80
User apache
Group apache

ErrorLog "logs/error_log"

ProxyRequests Off
SSLProxyEngine On
ProxyPass /foobar/ https://hogehoge.example.com/foobar/
ProxyPassReverse /foobar/ https://hogehoge.example.com/foobar/

設定ファイルが間違っていないか apachectl configtest コマンドで確認できる。

$ apachectl configtest
Syntax OK

設定が間違っていなければ Apache を再起動して、設定を反映する。

$ sudo systemctl restart httpd

curl 等でアクセスしてコンテンツ生成元のサーバからレスポンスが返ってきているのを確認する。

$ curl --include --silent http://localhost/foobar/ | head
HTTP/1.1 200 OK
Date: Mon, 23 Mar 2020 13:05:09 GMT
Server: Foobar Frontend
Content-Type: text/html;charset=utf-8
Content-Length: 9876

<!DOCTYPE html>
<html>
<head>
<title>Hello, world.</title>

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ローカル環境にファイルサーバを構築してみた

▼下記OSを使用
CentOS Linux release 7.7.1908 (Core)

やったこと

  1. sambaのインストール
  2. smb.confの編集
  3. ユーザの作成
  4. 共有ディレクトリの作成とパーミッションの変更
  5. samba起動・自動起動設定
  6. ローカル使用での設定
  7. クライアントから接続確認

※今回は全てルートユーザで実施しました

sambaのインストール

yum -y install samba samba-common

smb.confの編集

cd /etc/samba
#念のためバックアップ
cp -p smb.conf smb.conf.20200323
vi smb.conf
smb.conf
[global]
    workgroup = SAMBA
    security = user
        netbios name = neko #追記

    passdb backend = tdbsam

    #printing = cups
    #printcap name = cups
    load printers = no
    #cups options = raw
    dos charset = CP932
    wins support = yes
    disable spoolss = yes
    unix charset = UTF-8
    mangled names = no
    vfs objects = catia
    catia:mappings = 0x22:0xa8,0x2a:0xa4,0x2f:0xf8,0x3a:0xf7,0x3c:0xab,0x3e:0xbb,0x3f:0xbf,0x5c:0xff,0x7c:0xa6

[neko]
        comment = Share Folder for All Users
        path = /var/mnt/
        browsable = yes
        writable = yes
        read only = no

[homes]
    comment = Home Directories
    valid users = %S, %D%w%S
    browseable = No
    read only = No
    inherit acls = Yes

[printers]
    comment = All Printers
    path = /var/tmp
    printable = Yes
    create mask = 0600
    browseable = No

[print$]
    comment = Printer Drivers
    path = /var/lib/samba/drivers
    write list = @printadmin root
    force group = @printadmin
    create mask = 0664
    directory mask = 0775

文字コードはCP932、プリンターを使用しない、シェア名は[neko]、Pathは /var/mnt などを設定しました。
必要なものは追加・変更してください。

ユーザの作成

useradd -M share_user
#パスワードを設定
passwd share_user
# 認証用パスワードを設定(share_userと同じパスワードにする)
pdbedit -a -u share_user -f "share user"

共有ディレクトリの作成とパーミッションの変更

mkdir /var/mnt
chmod 777 /var/mnt

samba起動・自動起動設定

systemctl start smb nmb
systemctl enable smb nmb
systemctl status smb nmb

※sambaの起動と自動起動設定がenableになっていることを確認する

ローカル使用での設定

▼SELinuxの無効化

#次回以降起動時にSELinuxをOFFにする設定
setenforce 0
vi /etc/selinux/config

→ SELINUX=disabled に設定

▼firewallの停止

systemctl stop firewalld
systemctl disable firewalld

クライアントから接続確認

▽Windows
エクスプローラを開いて以下にアクセス

 \\[サーバ名またはサーバIP]\neko # 今回の場合

▽Mac
Finder上でCmd+K

smb://[サーバ名またはサーバIP]/

おしまい

今回はファイルサーバを構築してみました。
もちろんスマホからのアクセスも可能です。
不要なPCなど転がっていたら有効活用してみてはいかがでしょうか?(^^)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

新人エンジニアが知っておきたいサーバ負荷の考え方

10年ほど前、エンジニア駆け出しの頃のブログを再認識兼ねてリバイバルします。
最近はサーバにsshで繋いで確認すると言う機会も減りましたが、覚えておいて損はないです。
https://itinao.hatenadiary.org/

ある日の出来事

エンジニア成り立ての僕。
出勤して早々、キラキラな営業さんや企画の方からこんなこと言われます。

営業「ちょっとなんかサーバが重いんだけど」
企画「なんとかして!仕事にならないよ」

僕「やべ、調査の仕方わからへん。」
僕「すみません。先輩にすぐ連絡します。」

プログラマーの僕はインフラ側の知識、知見が足りてません。
なんとかしたいけど、どうすることもできず。。

自社サービス運用していると良くある光景ですね。

やっぱりなんとかしたい!

報連相は大切だけどやっぱりエンジニア。
自分でなんとか出来るようになりたいと思いますよね。
そんな方へ。まずはボトルネックの考え方を学びましょう。

ボトルネックの考え方は大きく2つ

1. CPU負荷
2. I/O負荷

1. CPU負荷ってなんぞ?

プロセスがCPUを占有している(CPUが計算している)状態
スクリーンショット 2020-03-18 0.58.50.png

あるプロセス(プログラム)がCPUを使い使用率100%の状態が長く続いてしまった場合、他のプロセスの実行を妨害してしまいます。

一つ語弊があると困りますが、CPU使用率100%自体は悪ではなく、ディスクやメモリ容量などの他にボトルネックがなければ理想的な状態です。

CPU100%が急に続くようであれば

プログラムが暴走(無限ループ等)していないか確認する。
直近のリリースバージョン内の処理を見直す。

2. じゃCPU負荷とI/O負荷の違いは?

I/Oとは入出力(Input/Output)の意味です。
頻繁にデータを出し入れすることにより、ハードウェアやネットワークに負荷がかかることで、CPU負荷とI/O負荷は別物です。CPU負荷が高いからと言って必ずしもI/Oが遅くなるわけではなく、あくまでもディスクへ大量の読み書きが発生している状態です。

I/O負荷が続くようであれば

ファイルに入出力ようなプログラムが多くないか?
メモリ不足でスワップが発生してディスクアクセスが発生していないか?

メモリが足らないとシステムはスワップを使います。
逆に言うとスワップに対してのアクセスが多い場合はメモリ不足の可能性があります。

ボトルネック調査手順

ここまでCPU負荷とI/O負荷の概念を見てきました。
次に早速、CPU負荷とI/O負荷についてのボトルネックの調査方法に入っていきます。

1. まずは心を落ち着かせます。これ大事。
2. topでロードアベレージを確認します。
3. sarでCPUとI/O負荷どちらが高いか確認します。
4. psで各プロセスの情報を見ます。
5. 実行プログラムの見直しやバージョンを戻すなどの対応をします
6. 途中でとめて問題ない場合は悪さをしているプロセスをkillしたり再起動します。

1. まずは心を落ちつかせる

これはどんな時も大切です。
周りに早くなんとかしろと言う視線が痛いですが、パニックになってはいけません。

太々しいほど落ちき対応をしましょう。

2. すぐにTOPコマンド

とにかくまずはTOPコマンドでロードアベレージを見ましょう。

ロードアベレージとは

1CPUにおける単位時間あたりの実行待ちとディスクI/O待ちのプロセスの数。
単位時間当たりにどの程度のタスクが待ち状態にあったかを報告する数値です。
これが高いとシステムへの負荷が高いということです。

ロードアベレージが高いとは

コア数よりロードアベレージが高ければ負荷の原因になる可能性があります。

$top
top - 00:41:49 up 6 days,  2:24,  1 user,  load average: 2.15, 3.02, 3.20
Tasks:  93 total,   1 running,  45 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3977928 total,  3324844 free,   121568 used,   531516 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  3630656 avail Mem 

load average: 2.15, 3.02, 3.20という表示がロードアベレージです。
左から直近1分, 5分, 15分間の値です。

見るべきものは以下2つ

load averageの状態がコア数を超えてないか。
Swapは発生していないか。

次にコアごとの負荷状況を見て行きましょう。

2. sarコマンドでCPU使用率とI/O待ち率を見る

マルチコアの場合ロードアベレージだけでは判断がつかないことがあります。
そんなときは合わせてsar -P ALLで各CPUの状態を個別に把握しましょう。
マルチCPUが搭載されていてもディスクは1つしかない場合、CPU負荷は他のCPUに分散できてもI/Oは分散できないため負荷原因となります。

$ sar -P ALL
Linux 3.10.0-862.2.3.el7.x86_64 (118-27-1-88)   10/01/2018  _x86_64_    (2 CPU)

01:17:35 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:17:36 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
01:17:36 AM       0      0.00      0.00      0.00      0.00      0.00    100.00
01:17:36 AM       1      0.00      0.00      0.00      0.00      0.00    100.00

それぞれの意味はこちらになります。

表示 説明
%user CPUがユーザモードにあった時間の割合
%system CPUがカーネルモードにあった時間の割合
%iowait CPUがIO待ちをしていた時間の割合
%idle CPUがアイドル状態にあった時間の割合

見るべきものは以下

%idleが小さいとCPUの使用率が高いのでCPUがボトルネックになっている可能性があります。

CPUに割り当てられるプロセスの状態遷移をpsコマンドで確認

CPUが負荷の原因とわかった場合は
次ににどのプロセスが悪さをしているのかを把握しましょう。

$ ps auwx | head
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  19232  1516 ?        Ss   Feb09   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Feb09   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Feb09   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    Feb09   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    Feb09   0:00 [stopper/0]
root         6  0.0  0.0      0     0 ?        S    Feb09   0:06 [watchdog/0]
root         7  0.0  0.0      0     0 ?        S    Feb09   0:00 [migration/1]
root         8  0.0  0.0      0     0 ?        S    Feb09   0:00 [stopper/1]
root         9  0.0  0.0      0     0 ?        S    Feb09   0:00 [ksoftirqd/1]

それぞれの意味は下記を参照ください。

表示 説明
%CPU プロセスのCPU使用率
%MEM プロセスの物理メモリ
VSZ(RSS) プロセスが確保している仮想(物理)メモリ領域
STAT プロセスの状態
TIME プロセスがCPUを占有した時間
STAT(プロセスステータス)について

CPU上で実行可能なプロセスはTASK_RUNNING状態になっています。
複数あるTASK_RUNNING状態のプロセスのうち最も高いプライオリティを持つタスクにCPUが与えられます。

表記 状態 説明
R TASK_RUNNING 実行可能状態
S TASK_INTERRUPTIBLE 待ち状態。シグナル受信可能
D TASK_UNINTERRUPTIBLE 待ち状態。シグナル受信不可
Z TASK_ZOMBIE ゾンビ状態。exit後の状態
T TASK_STOPPED サスペンド状態

見るべきものは以下2つ

RSSのサイズを見て極端に大きなプロセスがないか確認する。
TIMEの状態をみます。無限ループ(TASK_RUNNING)の場合、TIMEが増加し続けます。

スワップが発生している場合

TOPコマンドでスワップが発生している場合には物理メモリ不足が原因となる可能性があります。
sarコマンドでさらに細かくみていきます。

$ sar -S

00時00分01秒 kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
00時10分01秒   2097148         0      0.00         0      0.00
00時20分01秒   2097148         0      0.00         0      0.00
00時30分01秒   2097148         0      0.00         0      0.00
00時40分01秒   2097148         0      0.00         0      0.00
状態 説明
kbswpfree スワップ領域の空き容量
kbswpused スワップ領域の使用容量
%swpused スワップ領域の使用量割合
kbswpcad スワップ領域のキャッシュ容量

こちらでどの程度Swapが発生しているのか確認した上、
vmstatでvmstat 1 100 のようにインターバルを指定して見るとわかりやすい

$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  1 244208  10312   1552  62636    4   23    98   249   44  304 28  3 68  1  0
 0  2 244920   6852   1844  67284    0  544  5248   544  236 1655  4  6  0 90  0
 1  2 256556   7468   1892  69356    0 3404  6048  3448  290 2604  5 12  0 83  0
 0  2 263832   8416   1952  71028    0 3788  2792  3788  140 2926 12 14  0 74  0
 0  3 274492   7704   1964  73064    0 4444  2812  5840  295 4201  8 22  0 69  0
表示 説明
r 実行待ちプロセス数
b スリープ(割り込み可能)のプロセス数、実行できてないプロセス数
swpd スワップサイズ(KB)
free 空きメモリ(KB)
buff バッファメモリサイズ(KB)
cache キャッシュメモリサイズ(KB)
si ディスクからスワップインされているメモリサイズ(KB/秒)
so ディスクへスワップアウトされているメモリサイズ(KB/秒)
bi ブロックデバイスから受け取ったブロック数(ブロック/秒)
bo ブロックデバイスに送られたブロック数(ブロック/秒)
in 割り込み回数/秒
cs コンテキストスイッチ回数/秒
us ユーザプロセスのCPU使用時間割合
sy カーネルコードの実行に使用した時間
id CPUがアイドル状態の時間割合
wa CPUがI/O待ち
st ゲストOSがCPUを割り当てられなかった時間の割合
r、bは通常は0~2程度。
この数値が大きい場合サーバ重いと感じる可能性があります。

si、soは常時ゼロが基本。
ここに常時数値が現れることはメモリ不足か、メモリを食ってしまうプログラムがあるのどちらかです。

負荷対策まとめ

まずはCPUかI/Oかを以下のコマンドで判断する

top
sar
ps
vmstat

対処法としては

CPU負荷が高い場合

サーバ増設やプログラムのロジック、アルゴリズムの改善

I/O負荷が高い場合

メモリ増設でキャッシュ領域を拡大する
メモリ増設不可なら、データの分散やキャッシュサーバの導入を検討
プログラムの改善でI/O頻度を軽減する

ふう、まとめるの疲れました。
これで負荷の原因を説明できるようになったら良いな。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かす(ビルド編)【未完】

はじめに

XRT(Xilinx Runtime) は Xilinx社が提供する開発環境(Vitis)で開発したプログラムをプラットフォームで動かすための環境です。XRT はユーザー空間とカーネルドライバのコンポーネントの組み合わせとして実装されています。XRT は github で ソースコードが公開されています。

下図に XRT のソフトウェアスタックを示します(上のgithub リポジトリ より引用)。

Fig.1 XRT Software Stack

Fig.1 XRT Software Stack


筆者はgithub に UltraZed/Ultra96/Ultra96-V2 のプラットフォームとして Debian GNU/Linux をビルドして提供しています。

XRT は Xilinx 社が提供する Petalinux を前提にしているのですが、ZynqMP-FPGA-Linux で提供している Debian GNU/Linux でも動かしてみたいと思います。

この記事では、XRT をソースコードからビルドして Debian パッケージを作るまでを説明します。

なお、ビルド済みの Debian Package は github で公開しています。ビルドする環境を構築するのも大変だしビルドする時間も1〜2時間かかるので、面倒な人はこちらからダウンロードしてください。

また、インストールには次の記事を参照してください。

注意

現時点(2020年3月23日)では、一応インストールは出来るものの、まだ動作していません。この記事はあくまでもトライアルの防備録です。

XRT のビルド

ビルド環境

XRT を UltraZed/Ultra96/Ultra96-V2 向けにビルドするのは少し面倒です。XRT のビルドには Ubuntu や CentOS などの Linux ディストリビューションが必要です。ビルドには色々な開発ツールがインストールされていなければなりません。さらに Debian Package を作るためか、PC をホストにして ARM64 用にクロスコンパイルするのがとても面倒です。

そこで、 Ultra96-V2 に Ubuntu 18.04 を動かして、その上でセルフビルドします。

Ultra96-V2 用の Ubuntu 18.04 は以下の URL で公開しています。

XRT のダウンロード

以下の URL より XRT のソースコードをダウンロードします。

fpga@ubuntu-fpga:~$ cd work
fpga@ubuntu-fpga:~/work$ git clone https://github.com/Xilinx/XRT
Cloning into 'XRT'...
remote: Enumerating objects: 30, done.
remote: Counting objects: 100% (30/30), done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 43591 (delta 13), reused 7 (delta 0), pack-reused 43561
Receiving objects: 100% (43591/43591), 58.10 MiB | 2.57 MiB/s, done.
Resolving deltas: 100% (33849/33849), done.
Checking out files: 100% (1682/1682), done.
fpga@ubuntu-fpga:~/work$ cd XRT
fpga@ubuntu-fpga:~/work/XRT$

XRT を Ultra96/Ultra96-V2 用にビルドするためにはいくつかファイルを修正します。ですので、https://github.com/Xilinx/XRT を直接 clone するよりも、fork したほうが良いでしょう。

XRT の変更

XRT のビルド用ファイルにいくつかの修正をしますので、ブランチを作成します。

fpga@ubuntu-fpga:~/work/XRT$ git checkout -b 2019.2_Ultra96
Switched to a new branch '2019.2_Ultra96'

パッケージファイル名を変更

オリジナルの XRT では、ビルドした Debian Package の名前は xrt_202010.2.6.0_18.04-arm64-xrt.deb になりますが、Ubuntu 用のパッケージであることを明示するためにxrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb にします。

fpga@ubuntu-fpga:~/work/XRT$ git diff src/CMake/cpackLin.cmake
diff --git a/src/CMake/cpackLin.cmake b/src/CMake/cpackLin.cmake
index 4f45f97a..9f6eebe4 100644
--- a/src/CMake/cpackLin.cmake
+++ b/src/CMake/cpackLin.cmake
@@ -79,7 +79,7 @@ else ()
   SET (CPACK_GENERATOR "TGZ")
 endif()
-SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${XRT_VERSION_RELEASE}.${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}_${CPACK_REL_VER}-${CPACK_ARCH}")
+SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${XRT_VERSION_RELEASE}.${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}_${LINUX_FLAVOR}_${CPACK_REL_VER}-${CPACK_ARCH}")
 message("-- ${CMAKE_BUILD_TYPE} ${PACKAGE_KIND} package")
fpga@ubuntu-fpga:~/work/XRT$ git add src/CMake/cpackLin.cmake
fpga@ubuntu-fpga:~/work/XRT$ git commit -m "[add] linux flavor name to built debian package name"
[2019.2_Ultra96 f6d3236b] [add] linux flavor name to built debian package name
 1 file changed, 1 insertion(+), 1 deletion(-)

依存する Debian Package のバージョンの上限を撤廃

オリジナルでは、ビルドした Debian Package が依存する Packageは src/CMake/cpackLin.cmake で次のように設定されています。

src/CMake/cpackLin.cmake
  SET(CPACK_DEBIAN_XRT_PACKAGE_DEPENDS "ocl-icd-opencl-dev (>= 2.2.0), 
libboost-dev (>= ${Boost_VER_STR}), libboost-dev (<< ${Boost_VER_STR_ONEGREATER}), 
libboost-filesystem-dev (>=${Boost_VER_STR}), libboost-filesystem-dev (<<${Boost_VER_STR_ONEGREATER}),
uuid-dev (>= 2.27.1), dkms (>= 2.2.0), libprotoc-dev (>=2.6.1), libssl-dev (>=1.0.2), protobuf-compiler (>=2.6.1), 
libncurses5-dev (>=6.0), lsb-release, libxml2-dev (>=2.9.1), libyaml-dev (>= 0.1.6), 
libc6 (>= ${GLIBC_VERSION}), libc6 (<< ${GLIBC_VERSION_ONEGREATER}),
python (>= 2.7), python-pip, libudev-dev ")

ビルドした Debian Package が依存する Package のうち、libboost-dev、libboost-filesystem-dev、libc6 のバージョンに上限が設定されています。これだと、インストールするディストリビューションの制約が強すぎてインストールに失敗することがあります。例えば、この Debian Package を Debian10 にインストールを試みると失敗します。

そこで、後で問題になるかもしれませんが、次のように cpackLin.cmake を修正してバージョンの上限を撤廃します。

fpga@ubuntu-fpga:~/work/XRT$ git diff src/CMake/cpackLin.cmake
--- a/src/CMake/cpackLin.cmake
+++ b/src/CMake/cpackLin.cmake
@@ -49,7 +49,7 @@ if (${LINUX_FLAVOR} MATCHES "^(Ubuntu|Debian)")
   SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS "OFF")
   SET(CPACK_DEBIAN_AWS_PACKAGE_DEPENDS "xrt (>= ${XRT_VERSION_MAJOR}.${XRT_VERSION_MINOR}.${XRT_VERSION_PATCH})")
   SET(CPACK_DEBIAN_XBTEST_PACKAGE_DEPENDS "xrt (>= ${XRT_VERSION_MAJOR}.${XRT_VERSION_MINOR}.${XRT_VERSION_PATCH}), libjson-glib-dev")
-  SET(CPACK_DEBIAN_XRT_PACKAGE_DEPENDS "ocl-icd-opencl-dev (>= 2.2.0), libboost-dev (>= ${Boost_VER_STR}), libboost-dev (<< ${Boost_VER_STR_ONEGREATER}), libboost-filesystem-dev (>=${Boost_VER_STR}), libboost-filesystem-dev (<<${Boost_VER_STR_ONEGREATER}), uuid-dev (>= 2.27.1), dkms (>= 2.2.0), libprotoc-dev (>=2.6.1), libssl-dev (>=1.0.2), protobuf-compiler (>=2.6.1), libncurses5-dev (>=6.0), lsb-release, libxml2-dev (>=2.9.1), libyaml-dev (>= 0.1.6), libc6 (>= ${GLIBC_VERSION}), libc6 (<< ${GLIBC_VERSION_ONEGREATER}), python (>= 2.7), python-pip, libudev-dev ")
+  SET(CPACK_DEBIAN_XRT_PACKAGE_DEPENDS "ocl-icd-opencl-dev (>= 2.2.0), libboost-dev (>= ${Boost_VER_STR}), libboost-filesystem-dev (>=${Boost_VER_STR}), uuid-dev (>= 2.27.1), dkms (>= 2.2.0), libprotoc-dev (>=2.6.1), libssl-dev (>=1.0.2), protobuf-compiler (>=2.6.1), libncurses5-dev (>=6.0), lsb-release, libxml2-dev (>=2.9.1), libyaml-dev (>= 0.1.6), libc6 (>= ${GLIBC_VERSION}), python (>= 2.7), python-pip, libudev-dev ")
 elseif (${LINUX_FLAVOR} MATCHES "^(RedHat|CentOS|Amazon)")
   execute_process(
fpga@ubuntu-fpga:~/work/XRT$ git add src/CMake/cpackLin.cmake
fpga@ubuntu-fpga:~/work/XRT$ git commit -m "[remove] upper limit of version of depend packages"
[2019.2_Ultra96 b69d97cd] [remove] upper limit of version of depend packages
 1 file changed, 1 insertion(+), 1 deletion(-)

ビルドに必要な Debian Package をインストール

ビルドに必要なパッケージをインストールします。幸い XRT には、ビルドに必要なパッケージをインストールするスクリプトが用意されています。

./src/runtime_src/tools/scripts/xrtdeps.sh を super user 権限で実行すると、apt プログラムにより足りない Debian Package がインストールされます。

fpga@ubuntu-fpga:~/work/XRT$ sudo ./src/runtime_src/tools/scripts/xrtdeps.sh
Installing packages...
Reading package lists... Done
Building dependency tree
Reading state information... Done
    :
(中略)
    :
The following packages were automatically installed and are no longer required:
  libgl2ps1.4 libibverbs1 liblept5 libnetcdf-c++4 libnl-route-3-200
  libopencv-flann-dev libopencv-flann3.2 libopencv-ml-dev libopencv-ml3.2
  libopencv-photo-dev libopencv-photo3.2 libopencv-shape-dev
  libopencv-shape3.2 libopencv-ts-dev libopencv-video-dev libopencv-video3.2
  libtcl8.6 libtesseract4 libtk8.6 libxss1
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 26 not upgraded.

ビルド

build ディレクトリに移動して、そこにある build.sh を実行することで、ビルドが開始されます。Ultra96/Ultra96-V2 だとけっこう時間がかかります。私の環境では1〜2時間ほどかかりました。

fpga@ubuntu-fpga:~/work/XRT$ cd build/
fpga@ubuntu-fpga:~/work/XRT/build$ ./build.sh
cmake -DRDI_CCACHE=0 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE= ../../src
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/gcc-8
-- Check for working C compiler: /usr/bin/gcc-8 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/g++-8
-- Check for working CXX compiler: /usr/bin/g++-8 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Host system processor is aarch64
-- Target system processor is aarch64
    :
(後略)
    :
fpga@ubuntu-fpga:~/work/XRT/build$ 

ビルドが終了すると、build/Release ディレクトリの下に Debian Package が出来ています。

fpga@ubuntu-fpga:~/work/XRT$ cd build/
fpga@ubuntu-fpga:~/work/XRT/build$ ls -1 Release/xrt_*
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-aws.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-aws.tar.gz
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-azure.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-azure.tar.gz
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-container.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-container.tar.gz
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xbtest.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xbtest.tar.gz
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb
Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.tar.gz

このうち Ultra96/Ultra96-V2 に必要な Debian Package は、Release/xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb です。

zocl のビルド

前章でビルドした xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb には zocl が含まれていません(zocl は Fig.1 XRT Software Stack を参照)。zocl は Ultra96/Ultra96-V2 などの Edge Device 用の Linux カーネルモジュールです。

そこでこの章では zocl の Debian Package をビルドする方法を説明します。ここでは dkms を使ってビルドします。

ソースディレクトリの生成

まず、/usr/src/ の下に zocl-2.6.0 というディレクトリを作ります。zocl はカーネルモジュールの名前、2.6.0 は XRT のバージョン番号です。

fpga@ubuntu-fpga:~/work/XRT$ sudo mkdir /usr/src/zocl-2.6.0
fpga@ubuntu-fpga:~/work/XRT$ sudo chmod o+w /usr/src/zocl-2.6.0

ソースファイルの準備

zocl のソースコードは XRT の src/runtime_src/core/edge/drm/zocl にあります。さらに他のディレクトリにあるいくつかのヘッダファイルも必要です。これらのファイルを前節で用意したディレクトリにコピーします。

fpga@ubuntu-fpga:~/work/XRT$ mkdir /usr/src/zocl-2.6.0/src
fpga@ubuntu-fpga:~/work/XRT$ mkdir /usr/src/zocl-2.6.0/src/edge
fpga@ubuntu-fpga:~/work/XRT$ mkdir /usr/src/zocl-2.6.0/src/edge/drm
fpga@ubuntu-fpga:~/work/XRT$ cp -r src/runtime_src/core/edge/drm/zocl /usr/src/zocl-2.6.0/src/edge/drm
fpga@ubuntu-fpga:~/work/XRT$ cp -r src/runtime_src/core/include/ /usr/src/zocl-2.6.0/src
fpga@ubuntu-fpga:~/work/XRT$ cp -r src/runtime_src/core/edge/include /usr/src/zocl-2.6.0/src/edge/
fpga@ubuntu-fpga:~/work/XRT$ cp src/runtime_src/core/common/drv/xrt_drv.h /usr/src/zocl-2.6.0/src/edge/drm/zocl
fpga@ubuntu-fpga:~/work/XRT$ cp LICENSE /usr/src/zocl-2.6.0/

ビルド用ツールのインストール

ビルドするためには次のツールがインストールされていなければなりません。

  • dkms
  • debhelper
  • fakeroot

dkms.conf の作成

次のような /usr/src/zocl-2.6.0/dkms.conf を作成します。

/usr/src/zocl-2.6.0/dkms.conf
PACKAGE_NAME="zocl-dkms"
PACKAGE_VERSION="2.6.0"
MAKE="make -C src/edge/drm/zocl/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C src/edge/drm/zocl/ clean"
BUILT_MODULE_NAME="zocl"
BUILT_MODULE_LOCATION="src/edge/drm/zocl/"
DEST_MODULE_LOCATION="/updates"

dkms に追加

dkms に zocl-2.6.0 を追加します。

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ sudo dkms add -m zocl -v 2.6.0
Creating symlink /var/lib/dkms/zocl/2.6.0/source ->
                 /usr/src/zocl-2.6.0
DKMS: add completed.

カーネルモジュールのビルド

試しに dkms を使ってカーネルモジュールをビルドしてみて、成功することを確認します。

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ sudo dkms build -m zocl -v 2.6.0
Kernel preparation unnecessary for this kernel.  Skipping...
Building module:
cleaning build area...
make -j4 KERNELRELEASE=4.19.0-xlnx-v2019.2-zynqmp-fpga -C src/edge/drm/zocl/ KERNELDIR=/lib/modules/4.19.0-xlnx-v2019.2-zynqmp-fpga/build.......
cleaning build area...
DKMS: build completed.

Debian src package のビルド

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ sudo dkms mkdsc -m zocl -v 2.6.0 --source-only
Using /etc/dkms/template-dkms-mkdsc
copying template...
modifying debian/changelog...
modifying debian/compat...
modifying debian/control...
modifying debian/copyright...
modifying debian/dirs...
modifying debian/postinst...
modifying debian/prerm...
modifying debian/README.Debian...
modifying debian/rules...
copying legacy postinstall template...
Copying source tree...
Building source package... dpkg-source --before-build zocl-dkms-2.6.0
 debian/rules clean
dh_clean: Compatibility levels before 9 are deprecated (level 7 in use)
 dpkg-source -b zocl-dkms-2.6.0
dpkg-source: warning: no source format specified in debian/source/format, see dpkg-source(1)
 dpkg-genbuildinfo --build=source
 dpkg-genchanges --build=source >../zocl-dkms_2.6.0_source.changes
dpkg-genchanges: info: including full source code in upload
 dpkg-source --after-build zocl-dkms-2.6.0
DKMS: mkdsc completed.
Moving built files to /var/lib/dkms/zocl/2.6.0/dsc...
Cleaning up temporary files...

ここでビルドした Debian Package は /var/lib/dkms/zocl/2.6.0/dsc にあります。

  • /var/lib/dkms/zocl/2.6.0/dsc/zocl-dkms_2.6.0.dsc
  • /var/lib/dkms/zocl/2.6.0/dsc/zocl-dkms_2.6.0_source.changes
  • /var/lib/dkms/zocl/2.6.0/dsc/zocl-dkms_2.6.0_tar.gz

Debian binary package のビルド

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ sudo dkms mkdeb -m zocl -v 2.6.0 --source-only
Using /etc/dkms/template-dkms-mkdeb
copying template...
modifying debian/changelog...
modifying debian/compat...
modifying debian/control...
modifying debian/copyright...
modifying debian/dirs...
modifying debian/postinst...
modifying debian/prerm...
modifying debian/README.Debian...
modifying debian/rules...
copying legacy postinstall template...
Copying source tree...
Building binary package...dpkg-buildpackage: warning: using a gain-root-command while being root
 dpkg-source --before-build zocl-dkms-2.6.0
 fakeroot debian/rules clean
dh_clean: Compatibility levels before 9 are deprecated (level 7 in use)
 debian/rules build
 fakeroot debian/rules binary
dh_installdirs: Compatibility levels before 9 are deprecated (level 7 in use)
dh_strip: Compatibility levels before 9 are deprecated (level 7 in use)
dh_compress: Compatibility levels before 9 are deprecated (level 7 in use)
dh_installdeb: Compatibility levels before 9 are deprecated (level 7 in use)
dh_shlibdeps: Compatibility levels before 9 are deprecated (level 7 in use)
 dpkg-genbuildinfo --build=binary
 dpkg-genchanges --build=binary >../zocl-dkms_2.6.0_arm64.changes
dpkg-genchanges: info: binary-only upload (no source code included)
 dpkg-source --after-build zocl-dkms-2.6.0
DKMS: mkdeb completed.
Moving built files to /var/lib/dkms/zocl/2.6.0/deb...
Cleaning up temporary files...

ここでビルドした Debian Package は /var/lib/dkms/zocl/2.6.0/deb にあります。

  • /var/lib/dkms/zocl/2.6.0/deb/zocl-dkms_2.6.0_arm64.deb

Debian Package のコピー

前節でビルドした Debian Package をコピーします。

fpga@ubuntu-fpga:/usr/src/zocl-2.6.0$ cd ~/work/XRT/build
fpga@ubuntu-fpga:~/work/XRT/build$ cp /var/lib/dkms/zocl/2.6.0/deb/* .
fpga@ubuntu-fpga:~/work/XRT/build$ cp /var/lib/dkms/zocl/2.6.0/dsc/* .

後始末

ビルドした Debian Package をインストールするためには、一度、dkms から zocl を削除して、Debian Package と競合しないようにする必要があります。

fpga@ubuntu-fpga:~/work/XRT/build$ sudo rm -r /var/lib/dkms/zocl/

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かす(インストール編)【未完】

はじめに

次の記事で、Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かすための Debian Package をビルドする方法について説明しました。

この記事は、上の記事の続編で、実際に Ultra96/Ultra96-V2 向け Debian GNU/Linux にインストールする方法について説明します。

注意

現時点(2020年3月23日)では、一応インストールは出来るものの、まだ動作していません。この記事はあくまでもトライアルの防備録です。

対応するプラットフォーム

現時点でインストール出来ることを確認しているのは(注:クドいようですが現時点ではあくまでもインストールのみ)、次のプラットフォームのみです。

  • ボード: Ultra96-V2
  • Linux カーネル: Linux 4.19.0 (linux-xlnx 4.19.0 v2019.2)
  • ディストリビューション: Ubuntu 18.04 or Debian10

Linux Kernel は以下の URL にあります。

ディストリビューションは以下の URL にあります。

それぞれの URL を参照して Ultra96 にインストールしてください。また、以下の記事も参考にしてください。

Debian Packagesの入手

『Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime) を動かす(ビルド編)【未完】』@Qiitaで説明した方法で XRT の Debian Packageをビルドするか、次の URL にある Debian Package をダウンロードしてください。

インストールする前に

インストールする前に以下のパッケージをインストールしておいてください。

  • ocl-icd-opencl-dev (>= 2.2.0)
  • libboost-filesystem-dev (>=1.65)
  • uuid-dev (>= 2.27.1)
  • dkms (>= 2.2.0)
  • libprotoc-dev (>=2.61)
  • libssl-dev (>=1.0.2)
  • protobuf-compiler (>=2.6.1)
  • libncurses5-dev (>=6.0)
  • lsb-release
  • libxml2-dev (>=2.9.1)
  • libyaml-dev (>= 0.1.6)
  • libc6 (>= 2.27)
  • python (>= 2.7)
  • python-pip
  • libudev-dev

上で紹介したパッケージは、xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb をビルドした際に明示的に依存関係にあることを宣言したものです。

また、上記以外にも、以下のパッケージをインストールしておいてください。

  • python-pyopencl

このパッケージがインストールされていないと、xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb のインストールの際に pyopencl を pip でインストールしようとします。pip で pyopencl をインストールする場合は C で書かれたプログラムをコンパイルする必要があり、いろいろとトラブルが発生して結局インストールに失敗しました。最初から Debian/Ubuntu 用にビルド済みの pyopencl をインストールしておいたほうがトラブルが発生しなくて済みます。

XRT(Xilinx Runtime) Package のインストール

dpkg コマンドでxrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb をインストールします。なお、このパッケージをインストールする時、その工程の途中で、dkms の仕組みを使って xocl および xlmgmt カーネルモジュールをビルドします。そのためインストールに時間がかかります。

fpga@ubuntu-fpga:~$ cd work/ZynqMP-FPGA-XRT
fpga@ubuntu-fpga:~/work/ZynqMP-FPGA-XRT$ sudo dpkg -i xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb
Selecting previously unselected package xrt.
(Reading database ... 114575 files and directories currently installed.)
Preparing to unpack xrt_202010.2.6.0_Ubuntu_18.04-arm64-xrt.deb ...
Unpacking xrt (2.6.0) ...
Setting up xrt (2.6.0) ...
Unloading old XRT Linux kernel modules
rmmod: ERROR: Module xocl is not currently loaded
rmmod: ERROR: Module xclmgmt is not currently loaded
Invoking DKMS common.postinst for xrt
debconf: unable to initialize frontend: Dialog
debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
debconf: falling back to frontend: Readline
Loading new xrt-2.6.0 DKMS files...
Building for 4.19.0-xlnx-v2019.2-zynqmp-fpga
Building initial module for 4.19.0-xlnx-v2019.2-zynqmp-fpga

カーネルモジュールのビルド中に、うかつに Ctrl-C 等で中断しないで、終わるまで待ってあげてください。

Done.
xocl:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.19.0-xlnx-v2019.2-zynqmp-fpga/updates/dkms/
xclmgmt.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.19.0-xlnx-v2019.2-zynqmp-fpga/updates/dkms/
depmod...
DKMS: install completed.
Finished DKMS common.postinst
Loading new XRT Linux kernel modules
Installing MSD / MPD daemons
Skipping pyopencl installation...

zocl のインストール

dpkg コマンドで zocl-dkms_2.6.0_arm64.deb をインストールします。

fpga@ubuntu-fpga:~/work/ZynqMP-FPGA-XRT$ sudo dpkg -i zocl-dkms_2.6.0_arm64.deb
Selecting previously unselected package zocl-dkms.
(Reading database ... 114905 files and directories currently installed.)
Preparing to unpack zocl-dkms_2.6.0_arm64.deb ...
Unpacking zocl-dkms (2.6.0) ...
Setting up zocl-dkms (2.6.0) ...
debconf: unable to initialize frontend: Dialog
debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
debconf: falling back to frontend: Readline
Loading new zocl-2.6.0 DKMS files...
Building for 4.19.0-xlnx-v2019.2-zynqmp-fpga
Building for architecture arm64
Building initial module for 4.19.0-xlnx-v2019.2-zynqmp-fpga
Done.
zocl:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.19.0-xlnx-v2019.2-zynqmp-fpga/updates/dkms/
depmod...
DKMS: install completed.

zocl はカーネルモジュールですが、insmod で Linux に組み込んだだけではダメで、デバイスツリーが必要です。ZynqMP-FPGA-Linux では Device Tree Overlay をサポートしてるので、次のようなデバイスツリーをオーバーレイすることによって zocl をアクティブにします。

zocl.dts
/dts-v1/; /plugin/;
/ {
        fragment@1 {
                target-path = "/amba_pl@0";
                __overlay__ {
                        #address-cells = <2>;
                        #size-cells = <1>;
                        zyxclmm_drm {
                                compatible = "xlnx,zocl";
                                status = "okay";
                                reg = <0x0 0xA0000000 0x10000>;
                        };
                };
        };
};

fpga@ubuntu-fpga:~/work/streaming_lap_filter5$ sudo ./dtbocfg.rb -i zocl --dts zocl.dts
<stdin>:8.16-12.6: Warning (unit_address_vs_reg): /fragment@1/__overlay__/zyxclmm_drm: node has a reg or ranges property, but no unit name
fpga@ubuntu-fpga:~/work/streaming_lap_filter5$ dmesg | tail -4
[ 8401.997049] [drm] Probing for xlnx,zocl
[ 8401.997156] [drm] FPGA programming device pcap founded.
[ 8401.997161] [drm] PR Isolation addr 0x0
[ 8401.997750] [drm] Initialized zocl 2018.2.1 20180313 for a0000000.zyxclmm_drm on minor 1

現状

とりあえずXRT(Xilinx Runtime) のビルドとインストールは出来ました。ただし、XRT はまだ動いていません。FPGA の部屋の @marsee101 さんに Vitis で作ったサンプルを提供していただいて実行してみたところ、次のような結果になりました。

fpga@ubuntu-fpga:~/work/streaming_lap_filter5$ source /opt/xilinx/xrt/setup.sh
XILINX_XRT      : /opt/xilinx/xrt
PATH            : /opt/xilinx/xrt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:\\
/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
LD_LIBRARY_PATH : /opt/xilinx/xrt/lib:
PYTHONPATH     : /opt/xilinx/xrt/python:
fpga@ubuntu-fpga:~/work/streaming_lap_filter5$ ./streaming_lap_filter5.exe streaming_lap_filter5.xclbin
Using FPGA binary file specfied through the command line: streaming_lap_filter5.xclbin
XRT build version: 2.6.0
Build hash: b69d97cd7827bda97b194006be3b46809fc1b843
Build date: 2020-03-23 06:41:22
Git branch: 2019.2_Ultra96
PID: 16657
UID: 1000
[Mon Mar 23 14:21:54 2020]
HOST: ubuntu-fpga
EXE: /home/fpga/work/streaming_lap_filter5/streaming_lap_filter5.exe
[XRT] ERROR: No devices found
../src/krnl_streaming_lap_host3.cpp:71 Error calling err = cl::Platform::get(&platforms), error code is: -1

どうやら OpenCL のデバイスが見つからないと言っているようです。まだ何か設定が必要なのかもしれません。

今後も引き続きデバッグしていくつもりです。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C言語で静的・動的ライブラリを作成・使用する方法

目的

Linuxで.a(静的)と.so(動的)の2種類ライブラリを作成できるが、コンパイルする時に同じような方法で使用される。
即ち、異なるライブラリのlibA.aとlibA.soが存在しても、コンパイルのコマンドではライブラリの拡張子が省略され、gcc xxx -lAのようになるため、どっちが使用されるかは曖昧になる。

libA.aとlibA.soが共存する場合の動作確認をしたく、メモする。

先に結論

gcc -o main main.c -L. -lA
のように、ライブラリlibA(-lAで指定)が指定されている場合、libA.so(動的)はlibA.a(静的)より優先的にリンクされる。

追記
gcc -o main main.c -L. -static -lA
のように、「-static」を指定すれば、libA.a(静的)はリンクされる。

追記2
gcc -o main main.c -L. -static-libgcc -Wl,-Bdynamic,-lc,-Bstatic,-lA
のように、gccの「-Wl」オプションで「-Bdynamic」(動的)や「-Bstatic」(静的)を指定すれば、ライブラリを選択することは可能。
@yumetodoさん本当にありがとうございました!)

サンプルコード

下記記事のコードを使用する。
また、静的ライブラリでnumを5にして、動的ライブラリでnumを10にして、コンパイルの時に使用されたのはどっちかを判明できる。

C言語グローバル変数の宣言

動的ライブラリの作成及び動作確認

A.c
#include<stdio.h>
#include"A.h"

 void A(){
     num = 10;   //動的ライブラリでnumを10にする
     printf("inside A, num = %d\n", num);
 }
#Aの共有(動的)ライブラリを作成
[pirlo@centos8 02]$ gcc -shared -o libA.so -c A.c
・・・
#メイン処理をコンパイルして実行ファイルを作成
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
#ファイル一覧
[pirlo@centos8 02]$ ls
A.c  A.h  B.c  B.h  libA.so  libB.so  main  main.c
実行結果
[pirlo@centos8 02]$ ./main 
inside A, num = 10
inside B, num = 10

静的ライブラリの作成及び動作確認

A.c
#include<stdio.h>
#include"A.h"

 void A(){
     num = 5;   //静的ライブラリのここだけは違う
     printf("inside A, num = %d\n", num);
 }
#Aの静的ライブラリを作成
[pirlo@centos8 02]$ gcc -c A.c B.c   #オブジェクト「.o」ファイルが作成される
[pirlo@centos8 02]$ ls
A.c  A.h  A.o  B.c  B.h  B.o  main.c
[pirlo@centos8 02]$ ar rcs libA.a A.o   #オブジェクトファイルから静的ライブラリを作成
[pirlo@centos8 02]$ ls
A.c  A.h  A.o  B.c  B.h  B.o  libA.a  main.c
・・・Bの関連処理を略・・・
#メイン処理をコンパイルして実行ファイルを作成(コマンドは動的の時と完全一致)
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
#ファイル一覧
[pirlo@centos8 02]$ ls
A.c  A.h  A.o  B.c  B.h  B.o  libA.a  libB.a  main  main.c
実行結果
[pirlo@centos8 02]$ ./main 
inside A, num = 5
inside B, num = 5

動的・静的ライブラリが共存する場合で再度確認

#ファイル一覧
[pirlo@centos8 02]$ ls
A.c  A.h  A.o  B.c  B.h  B.o  libA.a  libA.so  libB.a  libB.so  main.c
#同じコンパイルコマンドで実行ファイルを再作成
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
実行結果
[pirlo@centos8 02]$ ./main 
inside A, num = 10
inside B, num = 10

まとめ

動的・静的ライブラリが共存する場合、動的ライブラリが優先的に参照される。

追記
「-static」オプションを追加すれば、静的ライブラリは参照される。

実行結果
[pirlo@centos8 02]$ ls
A.c  A.h  A.o  B.c  B.h  B.o  libA.a  libA.so  libB.a  libB.so  main.c
#「-static」オプション無し
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
[pirlo@centos8 02]$ ./main 
inside A, num = 10
inside B, num = 10
#「-static」オプション有り
[pirlo@centos8 02]$ gcc -o main main.c -L. -static -lA -lB
[pirlo@centos8 02]$ ./main 
inside A, num = 5
inside B, num = 5

追記2
gccの「-Wl」オプションで「-Bdynamic」(動的)や「-Bstatic」(静的)を指定すれば、ライブラリを選択することは可能。

実行結果
#AとBの静的ライブラリを使用
[pirlo@centos8 02]$ gcc -o main main.c -L. -static-libgcc -Wl,-Bdynamic,-lc,-Bstatic,-lA -lB
[pirlo@centos8 02]$ ./main 
inside A, num = 5
inside B, num = 5
#すべての動的ライブラリを使用
[pirlo@centos8 02]$ gcc -o main main.c -L. -static-libgcc -Wl,-Bdynamic,-lc,-lA -lB
[pirlo@centos8 02]$ ./main 
inside A, num = 10
inside B, num = 10

各参照先

動的ライブラリの作成を下記内容を参考

17.3. GCC での動的ライブラリーの作成

静的ライブラリの作成を下記内容を参考

17.4. GCC および ar での静的ライブラリーの作成

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C言語グローバル変数の宣言

目的

グローバル変数の使用方法及びその確認

ファイル

main.c:グローバル変数numの宣言および順番でAとBを処理
A.h:グローバル変数numを使用することを宣言
A.c:numを変更して出力(グローバル変数numが変更される)
B.h:グローバル変数numを使用することを宣言
B.c:numを変更せず出力(Aで変更されたグローバル変数numを出力)

上記のファイルで、mainで宣言されているnumは、AとBからも使用でき(グローバル変数になるため)、numがAで変更されても、Bからもその変更を確認できることを証明

ファイルの中身

main.c
#include"A.h"
#include"B.h"

int num;   //グローバル変数を宣言

int main(int argc, char *argv[]){
    A();   //numを他のファイルで変更させる
    B();   //他のファイルで変更されたnumを確認
    return 0;
}
A.h
extern int num;   //他のファイル(ここはmain.c)で宣言されているnumをAで使用することを宣言
void A();
A.c
#include<stdio.h>
#include"A.h"

 void A(){
     num = 10;   //グローバル変数を変更
     printf("inside A, num = %d\n", num);   //グローバル変数を出力
 }
B.h
extern int num;   //他のファイル(ここはmain.c)で宣言されているnumをBで使用することを宣言
void B();
B.c
#include<stdio.h>
#include"B.h"

void B(){
    printf("inside B, num = %d\n", num);   //グローバル変数を変更せず出力
}
#Aの共有ライブラリを作成
[pirlo@centos8 02]$ gcc -shared -o libA.so -c A.c
#Bの共有ライブラリを作成
[pirlo@centos8 02]$ gcc -shared -o libB.so -c B.c
#メイン処理をコンパイルして実行ファイルを作成
[pirlo@centos8 02]$ gcc -o main main.c -L. -lA -lB
#ファイル一覧
[pirlo@centos8 02]$ ls
A.c  A.h  B.c  B.h  libA.so  libB.so  main  main.c
実行結果
[pirlo@centos8 02]$ ./main 
inside A, num = 10   #Aでグローバル変数を変更
inside B, num = 10   #BからAで変更されたグローバル変数を確認
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む