为什么
%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
单个文件的显式宏来使其混乱。