質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

rpm

rpmコマンドは、UNIX系OSのroot権限でのみ利用可能なコマンドで、 RPMパッケージのインストールなどができます。

Q&A

解決済

3回答

3345閲覧

rpmパッケージを一から自作する方法

yay

総合スコア17

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

rpm

rpmコマンドは、UNIX系OSのroot権限でのみ利用可能なコマンドで、 RPMパッケージのインストールなどができます。

0グッド

1クリップ

投稿2020/03/16 10:39

編集2020/03/18 08:14

作成したソースをrpmパッケージに作成したいが、特殊な環境のため位置から設定しないといけないため詰んでおります。

環境

CentOS7
root権限が使えない(sudo yumなどが使用できない)
-> このため、ネット上にあるrpmbuildコマンドなどの操作ができない状態です。

やりたいこと

テスト用に以下のCのソースを~/test配下にインストールしたい。
hello.c

C

1#include <stdio.h> 2 3int main(int argc, char *args[]) 4{ 5 printf("Hello, world!\n"); 6 return 0; 7}

すなわち以下のようなことをしたい。(あくまでrpm作成練習用なので意味はほとんどないですが...)

$ rpm -ihv xxx.rpm $~/test/hello Hello, world!

どなたか、rpmパッケージを作ったことのないド素人にわかりやすく教えてくださいませんか。

仮想CentOS環境下にrpmbuildを入れてやってみた

指摘されたように、yumが使える環境でrpmを自作してみたのですが、rpmパッケージは作成できたものの、インストールの設定がわからず何も起きなかったのでどうしたら良いかアドバイスください。

ディレクトリ構成

ユーザ:rpmbuilder
[rpmbuild実行前]
~/rpmbuild 
|_SOUSES
|  |_hello-.1.0.tar.gz (hello, Makefile)

|_SPEC
|  |__sample.spec

以下設定ファイル等です。

# Makefile (hello-1.0.tar.gz内) install: @[ -d $(DESTDIR) ] || mkdir -p $(DESTDIR) @tar cf - -C dest . | tar xfp - -C $(DESTDIR) # ~/.rpmmacros %_topdir %{getenv:HOME}/rpmbuild %_tmppath %{getenv:HOME}/tmp # ~/rpmbuild/SPEC/sample.spec ### basic info Name: hello Version: 1.0 Release: 1 Summary: sample hello world program License: GPL2 ### build info Source0: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root ### description %description sample code ### script %prep rm -rf %{buildroot} %setup -q %build %install make DESTDIR=%{buildroot} install %files

[rpmbuild -bb sample.spec実行後]
~/rpmbuild 
|_SOUSES
|  |_hello-.1.0.tar.gz

|_SPEC
|  |__sample.spec

|_BUILD
|  |_hello-.1.0
|      |_debugfiles.list
|      |_debuglinks.list
|      |_debugsources.list
|      |_dest
|      |_elfbins.list
|      |_hello
|      |_Makefile
|_BUILDROOT
|_RPMS
|  |_x86_64
|     |_hello-1.0-1.x86_64.rpm
|     |_hello-debuginfo-1.0-1.x86_64.rpm
|_SRPMS

~/tmp/rpm-tmp.0MSvL3

分かっていること

%setupまでにSOURCES以下のアーカイブを一度BUILD内で展開してビルド(今回は無し)していること

分からないこと
  • BUILDROOTの意味(バカすぎて調べてもよくわからず...): 具体的には、buildrootに仮想的にインストールされるという説明があったのですが、どういうことなのかわかっていません。
  • BUILDROOTの書き方がなぜ以下のような書き方なのかがわからない
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
  • _tmppath
  • install の箇所(一番大事なとこ)の設定方法: 今回はtar.gzを展開して~/test配下にhello(実行可能ファイル)を置きたい

一応rpm作成はエラーなくできているのですが、やりたいことが出来ていないspecファイルなのでrpm -ivh hello-1.0-1.x86_64.rpmで何も起きない状態です。指摘修正をお願いできないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

  • _tmppathマクロ:shが実際に処理するときに使う一時的なディレクトリの場所?どっか適当なところに置いといていいのかな。
  • BuildRoot
    パッケージ作成時にパッケージにするソース群をインストールしておく仮ルートディレクトリで、このサブディレクトリ以下がまるまるパッケージ化されるみたい。

※ 特に何も指定していなかったのに勝手に後ろにx86_64がつくのは仕様なのかなぁ。

  • rpmパッケージ化の大まかな流れ
    1. %setup:$HOME/BUILD配下にSOURCEに置いたファイルを展開してそのディレクトリ(デフォルトで%{name}-%{version})に移動する
    ※その規定に沿ってないアーカイブ(tar)だとエラーで止まる
    2. %build:今回はビルドしてないので割愛
    %install:インストールしたい場所を指定してそこにBUILD以下展開したファイルを入れるイメージ
    ※buildrootとかくっついているが、のちにrpmでインストールしたときにはこの部分はなくなるので、実質そのサブディレクトリがインストール場所になる
    3. %files:2で作った仮想ディレクトリにインストールしたファイルのパスをかく
    ※パスはbuildrootのサブディレクトリから書く(例えばINSTALLDIR(=%{buildroot}/hoge/piyo)にtestファイルを仮インストールしてるなら、/hoge/piyo/testと書く)

以上を踏まえて、正しい設定ファイルを書くと以下。

# Makefile 今回要らなかったのでアーカイブから削除 # ~/.rpmmacros そのまま # ~/rpmbuild/SPEC/sample.spec ### basic info Name: hello Version: 1.0 Release: 1 Summary: sample hello world program License: GPL2 ### build info Source0: %{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root # この一番後ろの-rootの意味は何なのか。ここをルートにしますよっていう宣言として必要? %define INSTALLDIR %{buildroot}/home/rpmbuilder/test # 仮のルート(buildroot)+実際のインストール場所(/home/rpmbuilder/test) ### description %description sample code ### script %prep rm -rf %{buildroot} %setup -q %build %install rm -rf %{buildroot} mkdir %{buildroot} mkdir -p %{INSTALLDIR} cp -r %{_builddir}/%{name}-%{version}/hello %{INSTALLDIR}/ %files /home/rpmbuilder/test/hello

これで
(すでに失敗した中身が何もないパッケージを削除してから)
RPMS$ rpm -ivh hello-1.0-1.x86_64.rpm
とすると無事に
/home/rpmbuilder/test/hello
が作られました。
Hello World!

最初マクロがいっぺんに出てきて混乱したが一つずつ覚えていけばそんなに大したこと言っていなかったという...
定義とかすんなり頭に入る人になりたかった...。

投稿2020/03/18 10:22

編集2020/03/18 12:08
yay

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

rpmをスクラッチから作るのはかなりの知識が必要だと思います(私にはできません)。
ネット検索した限りだと「rpmbuildはroot権限で操作するな」と書いてありますから、rpmを作成するのに直接はroot権限は不要かもしれません。
しかし、rpmbuildコマンドがなければyumコマンドでインストールする必要があり、これはroot権限が必要です。その環境でroot権限を与えてもらうか、権限がある人に操作してもらってrpmbuild他の必要なパッケージをインストールすればできるようになるでしょう。
さもなくばmaisumakunさんの指摘のように自分で環境を構築する必要があります。
ところでmakefileは作れますか?
rpmbuildするにはspecファイルを作成する必要があり、そのためには少なくともmakefileを作成する程度の知識は必要です。
rpmが作成できるようになったら、そのやり方をまとめてここに回答してもらうと、後に続く人の大きな参考になります。

投稿2020/03/17 02:56

sage

総合スコア1240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yay

2020/03/18 10:42

回答ありがとうございました。 makefileろくに作ったことのないものでしたのでこれから徐々に勉強していきたいと思います。
guest

0

rpmパッケージを作ったことのないド素人

でしたら、標準的なやり方でできるように、CentOS 7の仮想環境を1つ立てて、その中でrootを取ってrpm作成の作業をする、という方がいいのではないでしょうか。

投稿2020/03/16 10:43

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yay

2020/03/18 10:43

言われた通りに仮想環境を作ってみることにしました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問