rpm 和脱脂

rpm 和脱脂

为什么

%files ram
%defattr(-,root,root,644)
%dir %attr(755, root, root) /usr/lib/ram/postd
/usr/lib/ram/postd/about
/usr/lib/ram/postd/local.conf
/usr/lib/ram/postd/local.init.conf
/usr/lib/ram/postd/param
%attr(755, root, root) /usr/lib/ram/postd/apply
%attr(755, root, root) /usr/lib/ram/postd/input
%attr(755, root, root) /usr/lib/ram/postd/query

创造全部755的文件?

-rwxr-xr-x. 1 kostyrev kostyrev   37 Aug 25 19:42 about
-rwxr-xr-x. 1 kostyrev kostyrev  160 Aug 25 19:42 apply
-rwxr-xr-x. 1 kostyrev kostyrev  548 Aug 25 19:42 input
-rwxr-xr-x. 1 kostyrev kostyrev 1178 Aug 25 19:42 local.conf
-rwxr-xr-x. 1 kostyrev kostyrev   61 Aug 25 19:42 local.init.conf
-rwxr-xr-x. 1 kostyrev kostyrev  183 Aug 25 19:42 param
-rwxr-xr-x. 1 kostyrev kostyrev    0 Aug 25 19:42 query

它不是应该适用defattr于没有明确attr设置的文件吗?

答案1

你的语法已经关闭。宏%defattr看起来像:

%defattr(<file mode>, <user>, <group>, <dir mode>)

所以:

%defattr(-,root,root,644)

意思是:保持文件安装时的文件模式,设置属主为root,所属组为root,设置权限目录644。您可能想要:

%defattr(0644,root,root)

更新

这是一个例子。它比您正在使用的短,这使得在这里讨论更容易,但我认为它演示了事情是如何工作的。如果我们从存档中的以下文件开始sotest-1.0.0.tar.gz

drwxrwxr-x lars/lars         0 2015-08-30 15:51 sotest-1.0.0/
-rwxr-xr-x lars/lars        28 2015-08-30 09:36 sotest-1.0.0/script1
-rw-rw-r-- lars/lars        16 2015-08-30 09:36 sotest-1.0.0/file1
-rw-rw-r-- lars/lars        14 2015-08-30 15:51 sotest-1.0.0/file2

以及以下规格文件:

Name:       sotest
Version:    1.0.0
Release:    1%{?dist}
Summary:    A test for StackOverflow
BuildArch:  noarch

License:    GPL
Source0:    %{name}-%{version}.tar.gz

%description
%{summary}

%package subpackage
Summary: A test subpackage

%description subpackage
A test subpackage

%prep
%setup -q

%build

%install

install -Dp -m 755 file1 %{buildroot}%{_libdir}/%{name}/file1
install -Dp -m 755 file2 %{buildroot}%{_sysconfdir}/%{name}
install -Dp -m 755 script1 %{buildroot}%{_bindir}/%{name}


%files
%defattr(0644, root, root)
%{_sysconfdir}/%{name}

%files subpackage
%defattr(0644, root, root)
%{_bindir}/%{name}
%{_libdir}/%{name}/file1

我认为这个示例对于您正在使用的内容来说非常简单。

安装后,所有内容都将具有模式0644,即使文件是使用模式安装的0755。这是因为 %defattr宏告诉 rpmbuild 对我们未提供显式权限的所有文件使用这些权限。

如果我添加:

%attr(0755, root, root) %{_bindir}/%{name}

然后我按预期得到该文件的模式 0755。但是,那其他 解决这个问题的方法是修改我们的%install部分以简单地安装具有正确权限的东西,如下所示:

install -Dp -m 644 file1 %{buildroot}%{_libdir}/%{name}/file1
install -Dp -m 644 file2 %{buildroot}%{_sysconfdir}/%{name}
install -Dp -m 755 script1 %{buildroot}%{_bindir}/%{name}

然后我可以使用这个:

%files
%defattr(-, root, root)
%{_sysconfdir}/%{name}

%files subpackage
%defattr(-, root, root)
%{_bindir}/%{name}
%{_libdir}/%{name}/file1

这告诉 rpm 只需使用文件安装时的模式(但修改所有者和组)。这使得该%files部分变得更加简单,因为您不必使用%attr单个文件的显式宏来使其混乱。

相关内容