https://www.altlinux.org/api.php?action=feedcontributions&user=Yushi&feedformat=atomALT Linux Wiki - Вклад [ru]2024-03-28T22:32:57ZВкладMediaWiki 1.38.2https://www.altlinux.org/index.php?title=Jack&diff=48427Jack2020-05-10T06:51:59Z<p>Yushi: /* Cannot create RT messagebuffer thread: Operation not permitted (1) */ Добавил поиск опции в конфиге ядра</p>
<hr />
<div>== Что такое JACK ==<br />
<br />
JACK (https://jackaudio.org/) — сервер звуковых соединений, используемый при профессиональной работе со звуком. JACK позволяет разным приложениям обмениваться потоками звука с низкой задержкой в режиме «реального времени». Многие приложения для обработки звука поддерживают или даже требуют JACK. Например, наличие работающего JACK очень желательно при работе с DAW Ardour.<br />
<br />
Одновременная работа JACK и [[PulseAudio]] невозможна и вряд ли будет возможна в обозримом будущем.<br />
<br />
== Установка JACK ==<br />
<br />
<pre><br />
$ sudo apt-get install jack-audio-connection-kit<br />
</pre><br />
<br />
== Запуск JACK ==<br />
<br />
Можно запустить JACK из командной строки, например, так:<br />
<br />
<code><br />
jackd -dalsa -dhw:SB -r48000 -p1024 -n2<br />
</code><br />
<br />
но лучше воспользоваться программой QJackCtl, предоставляющей дружественный к пользователю интерфейс для запуска и остановки JACK и имеющей разумные настройки «по умолчанию».<br />
<br />
== Управление соединениями JACK ==<br />
<br />
Из визуальных редакторов соединений JACK в AltLinux есть Patchage. Кроме того, в QJackCtl встроен свой редактор графа соединений JACK, хотя и не такой красивый и удобный.<br />
<br />
== Альтоспецифичные проблемы ==<br />
<br />
=== Cannot create RT messagebuffer thread: Operation not permitted (1) ===<br />
<br />
Иногда запуск JACK сопровождается сообщениями:<br />
<code><br />
Cannot create RT messagebuffer thread: Operation not permitted (1)<br />
</code><br />
<br />
Это означает, что у JACK нет возможности использовать режим «реального времени». Некоторые приложения (например, Ardour) без режима реального времени просто не будут работать.<br />
<br />
Скорее всего, это связано с тем, что ядро собрано с настройкой [https://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt CONFIG_RT_GROUP_SCHED=y] (на момент создания страницы с этой опцией собирается, например, альтовое ядро <tt>std-def</tt>). В таких ядрах у приложений, запускаемых от непривилегированного пользователя, нет доступа к RT-возможностям планировщика, даже если соответствующее разрешение прописано через механизм limits, пока эта возможность явно не делегирована пользователю через механизм cgroups.<br />
<br />
Проверить, какое у вас ядро, можно так:<br />
<br />
<pre><br />
sudo cat /boot/config-`uname -r` | grep CONFIG_RT_GROUP_SCHED<br />
</pre><br />
<br />
На проблемных ядрах эта команда выдаст<br />
<br />
<pre><br />
CONFIG_RT_GROUP_SCHED=y<br />
</pre><br />
<br />
Убедиться, что cgroups не настроены и доступа к RT нет можно так:<br />
<br />
<pre><br />
$ ulimit -r<br />
95<br />
</pre><br />
<br />
(убедимся, что нет других причин, по которым мы не сможем работать в режиме «реального времени»),<br />
<br />
<code><br />
$ chrt -f 80 echo "I'm chrt'ed!"<br />
</code><br />
<br />
(попробуем поменять приоритет).<br />
<br />
На ядрах без <tt>CONFIG_RT_GROUP_SCHED=y</tt> пользователь увидит сообщение<br />
<br />
<code><br />
I'm chrt'ed!<br />
</code><br />
<br />
а на ядрах с <tt>CONFIG_RT_GROUP_SCHED=y</tt> ошибку:<br />
<br />
<code><br />
chrt: failed to set pid 0's policy: Операция не позволена<br />
</code><br />
<br />
Настроим через cgroups доступ к RT-возможностям планировщика ядра с помощью сервиса <tt>cgconfig</tt> (именно это решение [https://github.com/jackaudio/jackaudio.github.com/wiki/Cgroups#method-2 рекомендуется авторами JACK]). Для этого нужно поставить пакет <tt>cgroup</tt>, если он ещё не поставлен:<br />
<br />
<code><br />
$ sudo apt-get install cgroup<br />
</code><br />
<br />
дописать в <tt>/etc/cgconfig.conf</tt>:<br />
<br />
<pre><br />
group rtaudio {<br />
perm {<br />
task {<br />
uid = root;<br />
gid = audio;<br />
}<br />
admin {<br />
uid = root;<br />
gid = root;<br />
}<br />
}<br />
cpu {<br />
cpu.rt_runtime_us = 950000;<br />
}<br />
}<br />
</pre><br />
<br />
а в <tt>/etc/cgrules.conf</tt>:<br />
<br />
<code><br />
@audio cpu rtaudio/<br />
</code><br />
<br />
после чего сделать сервисы <tt>cgred</tt> и <tt>cgconfig</tt> стартующими при запуске системы и перезагрузиться:<br />
<br />
<pre><br />
$ sudo systemctl enable cgred<br />
$ sudo systemctl enable cgconfig<br />
$ systemctl reboot<br />
</pre><br />
<br />
Теперь от пользователей, входящих в группу <tt>audio</tt> (убедитесь, что ваш пользователь в неё входит с помощью команды <tt>groups</tt>) JACK можно запускать в режиме «реального времени».<br />
<br />
[[Категория:Звук]]</div>Yushihttps://www.altlinux.org/index.php?title=Jack&diff=48426Jack2020-05-09T21:32:35Z<p>Yushi: Добавил описание установки.</p>
<hr />
<div>== Что такое JACK ==<br />
<br />
JACK (https://jackaudio.org/) — сервер звуковых соединений, используемый при профессиональной работе со звуком. JACK позволяет разным приложениям обмениваться потоками звука с низкой задержкой в режиме «реального времени». Многие приложения для обработки звука поддерживают или даже требуют JACK. Например, наличие работающего JACK очень желательно при работе с DAW Ardour.<br />
<br />
Одновременная работа JACK и [[PulseAudio]] невозможна и вряд ли будет возможна в обозримом будущем.<br />
<br />
== Установка JACK ==<br />
<br />
<pre><br />
$ sudo apt-get install jack-audio-connection-kit<br />
</pre><br />
<br />
== Запуск JACK ==<br />
<br />
Можно запустить JACK из командной строки, например, так:<br />
<br />
<code><br />
jackd -dalsa -dhw:SB -r48000 -p1024 -n2<br />
</code><br />
<br />
но лучше воспользоваться программой QJackCtl, предоставляющей дружественный к пользователю интерфейс для запуска и остановки JACK и имеющей разумные настройки «по умолчанию».<br />
<br />
== Управление соединениями JACK ==<br />
<br />
Из визуальных редакторов соединений JACK в AltLinux есть Patchage. Кроме того, в QJackCtl встроен свой редактор графа соединений JACK, хотя и не такой красивый и удобный.<br />
<br />
== Альтоспецифичные проблемы ==<br />
<br />
=== Cannot create RT messagebuffer thread: Operation not permitted (1) ===<br />
<br />
Иногда запуск JACK сопровождается сообщениями:<br />
<code><br />
Cannot create RT messagebuffer thread: Operation not permitted (1)<br />
</code><br />
<br />
Это означает, что у JACK нет возможности использовать режим «реального времени». Некоторые приложения (например, Ardour) без режима реального времени просто не будут работать.<br />
<br />
Скорее всего, это связано с тем, что ядро собрано с настройкой [https://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt CONFIG_RT_GROUP_SCHED=y] (на момент создания страницы с этой опцией собирается, например, альтовое ядро <tt>std-def</tt>). В таких ядрах у приложений, запускаемых от непривилегированного пользователя, нет доступа к RT-возможностям планировщика, даже если соответствующее разрешение прописано через механизм limits, пока эта возможность явно не делегирована пользователю через механизм cgroups.<br />
<br />
Проверить это можно так:<br />
<br />
<pre><br />
$ ulimit -r<br />
95<br />
</pre><br />
<br />
(убедимся, что нет других причин, по которым мы не сможем работать в режиме «реального времени»),<br />
<br />
<code><br />
$ chrt -f 80 echo "I'm chrt'ed!"<br />
</code><br />
<br />
(попробуем поменять приоритет).<br />
<br />
На ядрах без <tt>CONFIG_RT_GROUP_SCHED=y</tt> пользователь увидит сообщение<br />
<br />
<code><br />
I'm chrt'ed!<br />
</code><br />
<br />
а на ядрах с <tt>CONFIG_RT_GROUP_SCHED=y</tt> ошибку:<br />
<br />
<code><br />
chrt: failed to set pid 0's policy: Операция не позволена<br />
</code><br />
<br />
Настроим через cgroups доступ к RT-возможностям планировщика ядра с помощью сервиса <tt>cgconfig</tt> (именно это решение [https://github.com/jackaudio/jackaudio.github.com/wiki/Cgroups#method-2 рекомендуется авторами JACK]). Для этого нужно поставить пакет <tt>cgroup</tt>, если он ещё не поставлен:<br />
<br />
<code><br />
$ sudo apt-get install cgroup<br />
</code><br />
<br />
дописать в <tt>/etc/cgconfig.conf</tt>:<br />
<br />
<pre><br />
group rtaudio {<br />
perm {<br />
task {<br />
uid = root;<br />
gid = audio;<br />
}<br />
admin {<br />
uid = root;<br />
gid = root;<br />
}<br />
}<br />
cpu {<br />
cpu.rt_runtime_us = 950000;<br />
}<br />
}<br />
</pre><br />
<br />
а в <tt>/etc/cgrules.conf</tt>:<br />
<br />
<code><br />
@audio cpu rtaudio/<br />
</code><br />
<br />
после чего сделать сервисы <tt>cgred</tt> и <tt>cgconfig</tt> стартующими при запуске системы и перезагрузиться:<br />
<br />
<pre><br />
$ sudo systemctl enable cgred<br />
$ sudo systemctl enable cgconfig<br />
$ systemctl reboot<br />
</pre><br />
<br />
Теперь от пользователей, входящих в группу <tt>audio</tt> (убедитесь, что ваш пользователь в неё входит с помощью команды <tt>groups</tt>) JACK можно запускать в режиме «реального времени».<br />
<br />
[[Категория:Звук]]</div>Yushihttps://www.altlinux.org/index.php?title=Jack&diff=48425Jack2020-05-09T21:22:40Z<p>Yushi: /* Cannot create RT messagebuffer thread: Operation not permitted (1) */ Добавил ссылку на источник решения.</p>
<hr />
<div>== Что такое JACK ==<br />
<br />
JACK (https://jackaudio.org/) — сервер звуковых соединений, используемый при профессиональной работе со звуком. JACK позволяет разным приложениям обмениваться потоками звука с низкой задержкой в режиме «реального времени». Многие приложения для обработки звука поддерживают или даже требуют JACK. Например, наличие работающего JACK очень желательно при работе с DAW Ardour.<br />
<br />
Одновременная работа JACK и [[PulseAudio]] невозможна и вряд ли будет возможна в обозримом будущем.<br />
<br />
== Запуск JACK ==<br />
<br />
Можно запустить JACK из командной строки, например, так:<br />
<br />
<code><br />
jackd -dalsa -dhw:SB -r48000 -p1024 -n2<br />
</code><br />
<br />
но лучше воспользоваться программой QJackCtl, предоставляющей дружественный к пользователю интерфейс для запуска и остановки JACK и имеющей разумные настройки «по умолчанию».<br />
<br />
== Управление соединениями JACK ==<br />
<br />
Из визуальных редакторов соединений JACK в AltLinux есть Patchage. Кроме того, в QJackCtl встроен свой редактор графа соединений JACK, хотя и не такой красивый и удобный.<br />
<br />
== Альтоспецифичные проблемы ==<br />
<br />
=== Cannot create RT messagebuffer thread: Operation not permitted (1) ===<br />
<br />
Иногда запуск JACK сопровождается сообщениями:<br />
<code><br />
Cannot create RT messagebuffer thread: Operation not permitted (1)<br />
</code><br />
<br />
Это означает, что у JACK нет возможности использовать режим «реального времени». Некоторые приложения (например, Ardour) без режима реального времени просто не будут работать.<br />
<br />
Скорее всего, это связано с тем, что ядро собрано с настройкой [https://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt CONFIG_RT_GROUP_SCHED=y] (на момент создания страницы с этой опцией собирается, например, альтовое ядро <tt>std-def</tt>). В таких ядрах у приложений, запускаемых от непривилегированного пользователя, нет доступа к RT-возможностям планировщика, даже если соответствующее разрешение прописано через механизм limits, пока эта возможность явно не делегирована пользователю через механизм cgroups.<br />
<br />
Проверить это можно так:<br />
<br />
<pre><br />
$ ulimit -r<br />
95<br />
</pre><br />
<br />
(убедимся, что нет других причин, по которым мы не сможем работать в режиме «реального времени»),<br />
<br />
<code><br />
$ chrt -f 80 echo "I'm chrt'ed!"<br />
</code><br />
<br />
(попробуем поменять приоритет).<br />
<br />
На ядрах без <tt>CONFIG_RT_GROUP_SCHED=y</tt> пользователь увидит сообщение<br />
<br />
<code><br />
I'm chrt'ed!<br />
</code><br />
<br />
а на ядрах с <tt>CONFIG_RT_GROUP_SCHED=y</tt> ошибку:<br />
<br />
<code><br />
chrt: failed to set pid 0's policy: Операция не позволена<br />
</code><br />
<br />
Настроим через cgroups доступ к RT-возможностям планировщика ядра с помощью сервиса <tt>cgconfig</tt> (именно это решение [https://github.com/jackaudio/jackaudio.github.com/wiki/Cgroups#method-2 рекомендуется авторами JACK]). Для этого нужно поставить пакет <tt>cgroup</tt>, если он ещё не поставлен:<br />
<br />
<code><br />
$ sudo apt-get install cgroup<br />
</code><br />
<br />
дописать в <tt>/etc/cgconfig.conf</tt>:<br />
<br />
<pre><br />
group rtaudio {<br />
perm {<br />
task {<br />
uid = root;<br />
gid = audio;<br />
}<br />
admin {<br />
uid = root;<br />
gid = root;<br />
}<br />
}<br />
cpu {<br />
cpu.rt_runtime_us = 950000;<br />
}<br />
}<br />
</pre><br />
<br />
а в <tt>/etc/cgrules.conf</tt>:<br />
<br />
<code><br />
@audio cpu rtaudio/<br />
</code><br />
<br />
после чего сделать сервисы <tt>cgred</tt> и <tt>cgconfig</tt> стартующими при запуске системы и перезагрузиться:<br />
<br />
<pre><br />
$ sudo systemctl enable cgred<br />
$ sudo systemctl enable cgconfig<br />
$ systemctl reboot<br />
</pre><br />
<br />
Теперь от пользователей, входящих в группу <tt>audio</tt> (убедитесь, что ваш пользователь в неё входит с помощью команды <tt>groups</tt>) JACK можно запускать в режиме «реального времени».<br />
<br />
[[Категория:Звук]]</div>Yushihttps://www.altlinux.org/index.php?title=Jack&diff=48424Jack2020-05-09T21:20:08Z<p>Yushi: Добавил категорию.</p>
<hr />
<div>== Что такое JACK ==<br />
<br />
JACK (https://jackaudio.org/) — сервер звуковых соединений, используемый при профессиональной работе со звуком. JACK позволяет разным приложениям обмениваться потоками звука с низкой задержкой в режиме «реального времени». Многие приложения для обработки звука поддерживают или даже требуют JACK. Например, наличие работающего JACK очень желательно при работе с DAW Ardour.<br />
<br />
Одновременная работа JACK и [[PulseAudio]] невозможна и вряд ли будет возможна в обозримом будущем.<br />
<br />
== Запуск JACK ==<br />
<br />
Можно запустить JACK из командной строки, например, так:<br />
<br />
<code><br />
jackd -dalsa -dhw:SB -r48000 -p1024 -n2<br />
</code><br />
<br />
но лучше воспользоваться программой QJackCtl, предоставляющей дружественный к пользователю интерфейс для запуска и остановки JACK и имеющей разумные настройки «по умолчанию».<br />
<br />
== Управление соединениями JACK ==<br />
<br />
Из визуальных редакторов соединений JACK в AltLinux есть Patchage. Кроме того, в QJackCtl встроен свой редактор графа соединений JACK, хотя и не такой красивый и удобный.<br />
<br />
== Альтоспецифичные проблемы ==<br />
<br />
=== Cannot create RT messagebuffer thread: Operation not permitted (1) ===<br />
<br />
Иногда запуск JACK сопровождается сообщениями:<br />
<code><br />
Cannot create RT messagebuffer thread: Operation not permitted (1)<br />
</code><br />
<br />
Это означает, что у JACK нет возможности использовать режим «реального времени». Некоторые приложения (например, Ardour) без режима реального времени просто не будут работать.<br />
<br />
Скорее всего, это связано с тем, что ядро собрано с настройкой [https://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt CONFIG_RT_GROUP_SCHED=y] (на момент создания страницы с этой опцией собирается, например, альтовое ядро <tt>std-def</tt>). В таких ядрах у приложений, запускаемых от непривилегированного пользователя, нет доступа к RT-возможностям планировщика, даже если соответствующее разрешение прописано через механизм limits, пока эта возможность явно не делегирована пользователю через механизм cgroups.<br />
<br />
Проверить это можно так:<br />
<br />
<pre><br />
$ ulimit -r<br />
95<br />
</pre><br />
<br />
(убедимся, что нет других причин, по которым мы не сможем работать в режиме «реального времени»),<br />
<br />
<code><br />
$ chrt -f 80 echo "I'm chrt'ed!"<br />
</code><br />
<br />
(попробуем поменять приоритет).<br />
<br />
На ядрах без <tt>CONFIG_RT_GROUP_SCHED=y</tt> пользователь увидит сообщение<br />
<br />
<code><br />
I'm chrt'ed!<br />
</code><br />
<br />
а на ядрах с <tt>CONFIG_RT_GROUP_SCHED=y</tt> ошибку:<br />
<br />
<code><br />
chrt: failed to set pid 0's policy: Операция не позволена<br />
</code><br />
<br />
Настроим через cgroups доступ к RT-возможностям планировщика ядра с помощью сервиса <tt>cgconfig</tt>. Для этого нужно поставить пакет <tt>cgroup</tt>, если он ещё не поставлен:<br />
<br />
<code><br />
$ sudo apt-get install cgroup<br />
</code><br />
<br />
дописать в <tt>/etc/cgconfig.conf</tt>:<br />
<br />
<pre><br />
group rtaudio {<br />
perm {<br />
task {<br />
uid = root;<br />
gid = audio;<br />
}<br />
admin {<br />
uid = root;<br />
gid = root;<br />
}<br />
}<br />
cpu {<br />
cpu.rt_runtime_us = 950000;<br />
}<br />
}<br />
</pre><br />
<br />
а в <tt>/etc/cgrules.conf</tt>:<br />
<br />
<code><br />
@audio cpu rtaudio/<br />
</code><br />
<br />
после чего сделать сервисы <tt>cgred</tt> и <tt>cgconfig</tt> стартующими при запуске системы и перезагрузиться:<br />
<br />
<pre><br />
$ sudo systemctl enable cgred<br />
$ sudo systemctl enable cgconfig<br />
$ systemctl reboot<br />
</pre><br />
<br />
Теперь от пользователей, входящих в группу <tt>audio</tt> (убедитесь, что ваш пользователь в неё входит с помощью команды <tt>groups</tt>) JACK можно запускать в режиме «реального времени».<br />
<br />
[[Категория:Звук]]</div>Yushihttps://www.altlinux.org/index.php?title=Jack&diff=48423Jack2020-05-09T21:17:50Z<p>Yushi: Создал страницу.</p>
<hr />
<div>== Что такое JACK ==<br />
<br />
JACK (https://jackaudio.org/) — сервер звуковых соединений, используемый при профессиональной работе со звуком. JACK позволяет разным приложениям обмениваться потоками звука с низкой задержкой в режиме «реального времени». Многие приложения для обработки звука поддерживают или даже требуют JACK. Например, наличие работающего JACK очень желательно при работе с DAW Ardour.<br />
<br />
Одновременная работа JACK и [[PulseAudio]] невозможна и вряд ли будет возможна в обозримом будущем.<br />
<br />
== Запуск JACK ==<br />
<br />
Можно запустить JACK из командной строки, например, так:<br />
<br />
<code><br />
jackd -dalsa -dhw:SB -r48000 -p1024 -n2<br />
</code><br />
<br />
но лучше воспользоваться программой QJackCtl, предоставляющей дружественный к пользователю интерфейс для запуска и остановки JACK и имеющей разумные настройки «по умолчанию».<br />
<br />
== Управление соединениями JACK ==<br />
<br />
Из визуальных редакторов соединений JACK в AltLinux есть Patchage. Кроме того, в QJackCtl встроен свой редактор графа соединений JACK, хотя и не такой красивый и удобный.<br />
<br />
== Альтоспецифичные проблемы ==<br />
<br />
=== Cannot create RT messagebuffer thread: Operation not permitted (1) ===<br />
<br />
Иногда запуск JACK сопровождается сообщениями:<br />
<code><br />
Cannot create RT messagebuffer thread: Operation not permitted (1)<br />
</code><br />
<br />
Это означает, что у JACK нет возможности использовать режим «реального времени». Некоторые приложения (например, Ardour) без режима реального времени просто не будут работать.<br />
<br />
Скорее всего, это связано с тем, что ядро собрано с настройкой [https://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt CONFIG_RT_GROUP_SCHED=y] (на момент создания страницы с этой опцией собирается, например, альтовое ядро <tt>std-def</tt>). В таких ядрах у приложений, запускаемых от непривилегированного пользователя, нет доступа к RT-возможностям планировщика, даже если соответствующее разрешение прописано через механизм limits, пока эта возможность явно не делегирована пользователю через механизм cgroups.<br />
<br />
Проверить это можно так:<br />
<br />
<pre><br />
$ ulimit -r<br />
95<br />
</pre><br />
<br />
(убедимся, что нет других причин, по которым мы не сможем работать в режиме «реального времени»),<br />
<br />
<code><br />
$ chrt -f 80 echo "I'm chrt'ed!"<br />
</code><br />
<br />
(попробуем поменять приоритет).<br />
<br />
На ядрах без <tt>CONFIG_RT_GROUP_SCHED=y</tt> пользователь увидит сообщение<br />
<br />
<code><br />
I'm chrt'ed!<br />
</code><br />
<br />
а на ядрах с <tt>CONFIG_RT_GROUP_SCHED=y</tt> ошибку:<br />
<br />
<code><br />
chrt: failed to set pid 0's policy: Операция не позволена<br />
</code><br />
<br />
Настроим через cgroups доступ к RT-возможностям планировщика ядра с помощью сервиса <tt>cgconfig</tt>. Для этого нужно поставить пакет <tt>cgroup</tt>, если он ещё не поставлен:<br />
<br />
<code><br />
$ sudo apt-get install cgroup<br />
</code><br />
<br />
дописать в <tt>/etc/cgconfig.conf</tt>:<br />
<br />
<pre><br />
group rtaudio {<br />
perm {<br />
task {<br />
uid = root;<br />
gid = audio;<br />
}<br />
admin {<br />
uid = root;<br />
gid = root;<br />
}<br />
}<br />
cpu {<br />
cpu.rt_runtime_us = 950000;<br />
}<br />
}<br />
</pre><br />
<br />
а в <tt>/etc/cgrules.conf</tt>:<br />
<br />
<code><br />
@audio cpu rtaudio/<br />
</code><br />
<br />
после чего сделать сервисы <tt>cgred</tt> и <tt>cgconfig</tt> стартующими при запуске системы и перезагрузиться:<br />
<br />
<pre><br />
$ sudo systemctl enable cgred<br />
$ sudo systemctl enable cgconfig<br />
$ systemctl reboot<br />
</pre><br />
<br />
Теперь от пользователей, входящих в группу <tt>audio</tt> (убедитесь, что ваш пользователь в неё входит с помощью команды <tt>groups</tt>) JACK можно запускать в режиме «реального времени».</div>Yushihttps://www.altlinux.org/index.php?title=Ports/arm/chroot&diff=16563Ports/arm/chroot2010-10-15T21:59:19Z<p>Yushi: /* binfmt_misc */ Описал, как бороться с ошибкой "-bash: echo: write error: Invalid argument" (по итогам обсуждения в рассылке)</p>
<hr />
<div>[[Category:Sisyphus]]<br />
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/ports/arm/chroot}}<br />
<br />
=== Chroot into ARM root ===<br />
Для того чтобы сделать chroot в arm-овый root с "большой" машины нам понадобится qemu, ядро с поддержкой binfmt и собственно готовая распакованная или смонтированная rootfs куда будем chroot'иться.<br />
<br />
Поехали.<br />
<br />
Для примера предположим, что rootfs будет находиться в каталоге /home/user/arm.<br />
<br />
==== Qemu ====<br />
<br />
На данный момент можно использовать qemu-user-binfmt_misc-0.12.1, готовый пакет подходит. В нем содержится /usr/bin/qemu-arm.static который и требуется для задачи. (apt-get install qemu-user-binfmt_misc). Но если вам надо собрать самостоятельно, как было раньше до появления готового пакета, то:<br />
<br />
<pre>> git-clone git://git.altlinux.org/people/kas/packages/qemu.git<br />
> gear-hsh-build --prefix="/home/kas/hasher" --target=x86_64 -- -- --packager='Kirill A. Shutemov <kas@altlinux.org>'<br />
> sudo rpm -Uvh /home/kas/hasher/*/%_target_cpu/RPMS.hasher/qemu-0.8.2-alt1.1.%_target_cpu.rpm</pre><br />
<br />
==== binfmt_misc ====<br />
<br />
Конфигурируем binfmt_misc на использование qemu для arm-овых elf'ов:<br />
<br />
<pre>> sudo modprobe binfmt_misc<br />
> sudo mount -t binfmt_misc none /proc/sys/fs/binfmt_misc<br />
> sudo sh -c 'echo ":arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm.static:" > /proc/sys/fs/binfmt_misc/register'</pre><br />
<br />
Вероятно, что первые две операции вам не потребуются потому что они уже сделаны при загрузке (например, при установленном wine).<br />
Последнее поле в третьей строке, разделенной знаками : - это путь, по которому будет скопирован файл qemu-arm.static из пакета qemu-user-binfmt_misc (относительно корня rootfs).<br />
<br />
Если в /proc/sys/fs/binfmt_misc/register уже что-то писалось, третья команда может выдавать ошибку:<br />
<pre><br />
-bash: echo: write error: Invalid argument<br />
</pre><br />
<br />
Это исправляется командой<br />
<pre><br />
echo -1 > /proc/sys/fs/binfmt_misc/arm<br />
</pre><br />
<br />
и повторным вводном третьей команды.<br />
<br />
==== Готовим rootfs ====<br />
<br />
rootfs можно собрать самостоятельно на основе ALTLinux и [http://git.altlinux.org/people/kas/packages/?p=mkimage-profile-armrootfs.git вот этого профиля], например. см. прилагаемый README с примерным кратким списком команд.<br />
<br />
Можно взять и готовый не от ALTLinux:<br />
<br />
Можно посмотреть [http://www.at91.com/linux4sam/bin/view/Linux4SAM/OpenEmbeddedAngstromGet тут].<br />
<br />
Или к примеру (вероятно, устарел) [http://gentoo.osuosl.org/experimental/arm/embedded/stages/stage3-arm-uclibc-softfloat-20050811.tar.bz2 http://gentoo.osuosl.org/experimental/arm/embedded/stages/stage3-arm-uclibc-softfloat-20050811.tar.bz2]. <br />
<br />
Распаковываем в /home/user/arm/:<br />
<pre>> sudo mkdir -p /home/user/arm/<br />
> cd /home/user/arm/<br />
> sudo tar -xf arm-rootfs.tar</pre><br />
<br />
получаем в /home/user/arm/rootfs/ весь набор каталогов /bin, /etc и т.д.<br />
<br />
Копируем хостовый статический qemu-arm внутрь arm'ового root'а:<br />
<br />
<pre>> sudo cp /usr/bin/qemu-arm.static /home/user/arm/rootfs/usr/bin</pre><br />
<br />
<br />
==== chroot ====<br />
<br />
Собственно chroot'имся<br />
<br />
<pre>$ sudo chroot /home/user/arm/rootfs bin/bash<br />
bash-3.2# uname -a<br />
Linux combr.local 2.6.27-std-def-alt15 #1 SMP Tue Mar 24 15:17:22 UTC 2009 armv5tel GNU/Linux<br />
bash-3.2# ls<br />
bin dev home media opt root srv tmp var<br />
boot etc lib mnt proc sbin sys usr<br />
</pre><br />
<br />
Надеюсь кому-нить понадобится ;)</div>Yushihttps://www.altlinux.org/index.php?title=%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BD%D0%B0_sheevaplug&diff=16556Установка на sheevaplug2010-10-14T20:54:03Z<p>Yushi: /* Ставим ядро */ "ядро ставиться" -> "ядро ставится"</p>
<hr />
<div>{{Stub}}<br />
== Получение образа ==<br />
* скачать репозиторий http://git.altlinux.org/people/silicium/packages/mkimage-profile-armrootfs.git <br />
* прочитать [http://git.altlinux.org/people/silicium/packages/mkimage-profile-armrootfs.git?p=mkimage-profile-armrootfs.git;a=blob;f=README;h=2fa2fb3fa5eed235ae36eafda849f29f3404b9e5;hb=911e46b2df34430623008d15adc4d0423ee841e1 README] и сделать по нему. Для работы mkimage нужен правильно настроенный hasher под arm, подробнее о нем можно прочитать здесь [[Ports/arm/BuildHowto]]<br />
* в .work/.out/armroot.tar появится образ системы<br />
<br />
== Загрузка с USB flash ==<br />
=== Подготовка === <br />
'''ОСТОРОЖНО все данные на флешке будут уничтожены!'''<br />
* берем любую флешку<br />
* создаем на ней fdiskом 1 раздел типа 83 (linux). Можно создать несколько и использовать по своему усмотрению, но дальше мы будем работать только с этим первым разделом<br />
* форматируем её(вместо ''sdd' название устройства на вашей машине) <br />
mkfs -t ext2 ''/dev/sdd1''<br />
Можно в принципе и ext3 но не ext4 <br />
* монтируем<br />
* заходим туда и распаковываем tar архив<br />
<br />
=== Загрузка === <br />
* Вставляем флешку в sheevaplug<br />
* Подключаем USB консоль<br />
* включаем <br />
* запускаем minicom. устройство скорее всего /dev/ttyUSB0<br />
* Видим примерно такое<br />
U-Boot 1.1.4 (Mar 19 2009 - 16:06:59) Marvell version: 3.4.16<br />
U-Boot code: 00600000 -> 0067FFF0 BSS: -> 006CEE80 <br />
Soc: 88F6281 A0 (DDR2)<br />
CPU running @ 1200Mhz L2 running @ 400Mhz<br />
SysClock = 400Mhz , TClock = 200Mhz <br />
* Нажимаем любую клавишку чтобы не началась загрузка по умолчанию<br />
* Появляется консоль <br />
MARVEL>>><br />
* Для загрузки пишем там:<br />
usb start<br />
ext2load usb 0:1 800000 /boot/uImage-2.6.34-sheeva-alt1<br />
set bootargs console=ttyS0,115200 root=/dev/sda1 rootdelay=10 rootwait=1 ro<br />
bootm 800000<br />
После каждой из этих команд должны быть ответы. После первой должно написать что 1 storge device found. После второй появиться много точек. После третий ничего. После четвертой начинает грузиться ядро. hint: по флешке можно полазить ext2ls usb 0:1 <путь><br />
* Должна начаться загрузка ядра и системы<br />
* root там без пароля<br />
<br />
== Установка системы == <br />
=== Забекапить! ===<br />
подключаем имеющиеся фс, скорее всего<br />
mkdir /mnt/src<br />
mount /dev/mtdblock2 /mnt/src<br />
делаем бекап<br />
cd /mnt/src/<br />
mkdir /backup/<br />
tar czf /backup/orig.tar.gz .<br />
<br />
=== Создаем раздел ubifs ===<br />
отмонтируем<br />
umount /mnt/src<br />
Проверяем расположение разделов <br />
cat /proc/mtd <br />
dev: size erasesize name<br />
mtd0: 00100000 00020000 "u-boot"<br />
mtd1: 00400000 00020000 "uImage"<br />
mtd2: 1fb00000 00020000 "root"<br />
Нам нужен mtd2.<br />
<br />
Cобственно процесс создания раздела<br />
ubiformat /dev/mtd2<br />
ubiattach /dev/ubi_ctrl -m 2<br />
ubimkvol /dev/ubi0 -m -N root<br />
В принципе можно сделать несколько разделов по вкусу.<br />
<br />
Помните что своп на mtd не самая лучшая идея<br />
<br />
=== Заливаем файлы ===<br />
Для того чтобы не залить содержимое proc dev и прочего делаем<br />
mount --bind / /mnt/src<br />
Создаем и подключаем ubifs<br />
mkfs.ubifs /dev/ubi0_0<br />
mkdir /mnt/dst<br />
mount -t ubifs /dev/ubi0_0 /mnt/dst<br />
Заливаем систему<br />
rsync -avP --exclude backup /mnt/src /mnt/dst<br />
<br />
=== Правим конфиги ===<br />
Правим /mnt/dst/etc/fstab<br />
/dev/ubi0_0 / ubifs defaults 0 0<br />
=== Ставим ядро ===<br />
Поскольку ядро ставится в специальную область, для этого нужно сделать дополнительные действия<br />
flash_eraseall /dev/mtd1<br />
nandwrite -map /dev/mtd1 /boot/uImage-2.6.34-sheeva-alt1<br />
erase надо делать всегда, потому что это nand и запись переводит только из 1 в 0, но не наоборот. И если там что то было<br />
то образ будет поврежден.<br />
<br />
=== Правим опции загрузки ===<br />
Перезагружаемся. Заходим в консоль загрузчика<br />
set bootargs console=ttyS0,115200 rootfstype=ubifs ubi.mtd=2 root=ubi:root fastboot<br />
save<br />
Ещё раз перезагружаемся и наблюдаем за загрузкой. <br />
reset<br />
<br />
== Конфигурирование ==<br />
* поправить /etc/net<br />
* задать hostname в /etc/sysconfig/network<br />
* поправить /etc/resolv.conf<br />
* настроить апт на репозитарий<br />
rpm file:/sisyphus arm classic<br />
Здесь /sisyphus это подмонтированая по NFS копия сизифа. Можно использовать классический путь с FTP<br />
<br />
== Установка на openrd client == <br />
В приципе тоже самое но надо сделать<br />
setenv mainlineKernel yes<br />
setenv arcNumber 2361<br />
saveenv<br />
reset<br />
'''перезагружаться обязательно'''</div>Yushihttps://www.altlinux.org/index.php?title=%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BD%D0%B0_sheevaplug&diff=16555Установка на sheevaplug2010-10-14T20:52:23Z<p>Yushi: /* Получение образа */ появиться образ -> появится образ</p>
<hr />
<div>{{Stub}}<br />
== Получение образа ==<br />
* скачать репозиторий http://git.altlinux.org/people/silicium/packages/mkimage-profile-armrootfs.git <br />
* прочитать [http://git.altlinux.org/people/silicium/packages/mkimage-profile-armrootfs.git?p=mkimage-profile-armrootfs.git;a=blob;f=README;h=2fa2fb3fa5eed235ae36eafda849f29f3404b9e5;hb=911e46b2df34430623008d15adc4d0423ee841e1 README] и сделать по нему. Для работы mkimage нужен правильно настроенный hasher под arm, подробнее о нем можно прочитать здесь [[Ports/arm/BuildHowto]]<br />
* в .work/.out/armroot.tar появится образ системы<br />
<br />
== Загрузка с USB flash ==<br />
=== Подготовка === <br />
'''ОСТОРОЖНО все данные на флешке будут уничтожены!'''<br />
* берем любую флешку<br />
* создаем на ней fdiskом 1 раздел типа 83 (linux). Можно создать несколько и использовать по своему усмотрению, но дальше мы будем работать только с этим первым разделом<br />
* форматируем её(вместо ''sdd' название устройства на вашей машине) <br />
mkfs -t ext2 ''/dev/sdd1''<br />
Можно в принципе и ext3 но не ext4 <br />
* монтируем<br />
* заходим туда и распаковываем tar архив<br />
<br />
=== Загрузка === <br />
* Вставляем флешку в sheevaplug<br />
* Подключаем USB консоль<br />
* включаем <br />
* запускаем minicom. устройство скорее всего /dev/ttyUSB0<br />
* Видим примерно такое<br />
U-Boot 1.1.4 (Mar 19 2009 - 16:06:59) Marvell version: 3.4.16<br />
U-Boot code: 00600000 -> 0067FFF0 BSS: -> 006CEE80 <br />
Soc: 88F6281 A0 (DDR2)<br />
CPU running @ 1200Mhz L2 running @ 400Mhz<br />
SysClock = 400Mhz , TClock = 200Mhz <br />
* Нажимаем любую клавишку чтобы не началась загрузка по умолчанию<br />
* Появляется консоль <br />
MARVEL>>><br />
* Для загрузки пишем там:<br />
usb start<br />
ext2load usb 0:1 800000 /boot/uImage-2.6.34-sheeva-alt1<br />
set bootargs console=ttyS0,115200 root=/dev/sda1 rootdelay=10 rootwait=1 ro<br />
bootm 800000<br />
После каждой из этих команд должны быть ответы. После первой должно написать что 1 storge device found. После второй появиться много точек. После третий ничего. После четвертой начинает грузиться ядро. hint: по флешке можно полазить ext2ls usb 0:1 <путь><br />
* Должна начаться загрузка ядра и системы<br />
* root там без пароля<br />
<br />
== Установка системы == <br />
=== Забекапить! ===<br />
подключаем имеющиеся фс, скорее всего<br />
mkdir /mnt/src<br />
mount /dev/mtdblock2 /mnt/src<br />
делаем бекап<br />
cd /mnt/src/<br />
mkdir /backup/<br />
tar czf /backup/orig.tar.gz .<br />
<br />
=== Создаем раздел ubifs ===<br />
отмонтируем<br />
umount /mnt/src<br />
Проверяем расположение разделов <br />
cat /proc/mtd <br />
dev: size erasesize name<br />
mtd0: 00100000 00020000 "u-boot"<br />
mtd1: 00400000 00020000 "uImage"<br />
mtd2: 1fb00000 00020000 "root"<br />
Нам нужен mtd2.<br />
<br />
Cобственно процесс создания раздела<br />
ubiformat /dev/mtd2<br />
ubiattach /dev/ubi_ctrl -m 2<br />
ubimkvol /dev/ubi0 -m -N root<br />
В принципе можно сделать несколько разделов по вкусу.<br />
<br />
Помните что своп на mtd не самая лучшая идея<br />
<br />
=== Заливаем файлы ===<br />
Для того чтобы не залить содержимое proc dev и прочего делаем<br />
mount --bind / /mnt/src<br />
Создаем и подключаем ubifs<br />
mkfs.ubifs /dev/ubi0_0<br />
mkdir /mnt/dst<br />
mount -t ubifs /dev/ubi0_0 /mnt/dst<br />
Заливаем систему<br />
rsync -avP --exclude backup /mnt/src /mnt/dst<br />
<br />
=== Правим конфиги ===<br />
Правим /mnt/dst/etc/fstab<br />
/dev/ubi0_0 / ubifs defaults 0 0<br />
=== Ставим ядро ===<br />
Поскольку ядро ставиться в специальную область, для этого нужно сделать дополнительные действия<br />
flash_eraseall /dev/mtd1<br />
nandwrite -map /dev/mtd1 /boot/uImage-2.6.34-sheeva-alt1<br />
erase надо делать всегда, потому что это nand и запись переводит только из 1 в 0, но не наоборот. И если там что то было<br />
то образ будет поврежден.<br />
<br />
=== Правим опции загрузки ===<br />
Перезагружаемся. Заходим в консоль загрузчика<br />
set bootargs console=ttyS0,115200 rootfstype=ubifs ubi.mtd=2 root=ubi:root fastboot<br />
save<br />
Ещё раз перезагружаемся и наблюдаем за загрузкой. <br />
reset<br />
<br />
== Конфигурирование ==<br />
* поправить /etc/net<br />
* задать hostname в /etc/sysconfig/network<br />
* поправить /etc/resolv.conf<br />
* настроить апт на репозитарий<br />
rpm file:/sisyphus arm classic<br />
Здесь /sisyphus это подмонтированая по NFS копия сизифа. Можно использовать классический путь с FTP<br />
<br />
== Установка на openrd client == <br />
В приципе тоже самое но надо сделать<br />
setenv mainlineKernel yes<br />
setenv arcNumber 2361<br />
saveenv<br />
reset<br />
'''перезагружаться обязательно'''</div>Yushihttps://www.altlinux.org/index.php?title=Lxde/%D0%94%D0%B8%D1%81%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D0%B8%D0%B2&diff=14429Lxde/Дистрибутив2010-05-03T18:32:32Z<p>Yushi: /* Дополнительные возможности: */ Поправил опечатку ("Атомонтирование" -> "Автомонтирование").</p>
<hr />
<div>[[Категория:ALT Linux Desktop]]<br />
[[Категория:Sisyphus]]<br />
{{Stub}}<br />
<br />
==Содержание страницы==<br />
На данной странице будут описываться этапы создания дистрибутива ALTLinux с графической оболочкой LXDE.<br />
==Описание дистрибутива==<br />
===Смысл создания===<br />
Создать дистрибутив ALTLinux с графической оболочкой LXDE и набором легковесных функциональных программ.<br />
<br />
===Дополнительные возможности:===<br />
1. Автомонтирование USB-устройств. [http://figvam.blogspot.com/2008/12/linux-automounting-of-removable-usb.html Вариант №1], [http://sisyphus.ru/ru/srpm/qtrayvolman вариант №2].<br />
<br />
===ПО по-умолчанию:===<br />
Ниже будут представлены названия приложений, которые будут устанавливаться в дистрибутиве по-умолчанию.<br/><br />
'''Графическая среда:''' [http://www.lxde.org LXDE]<br/><br />
'''Файловый менеджер:''' [http://www.pcmanfm.sourceforge.net PCManFM2] и [http://midnight-commander.org/ Midnight Commander]<br/><br />
'''Эмулятор терминала''' [http://wiki.github.com/nonstop/termit Termit]<br/><br />
'''Архиватор:''' [http://www.xarchiver.sourceforge.net Xarchiver]<br/><br />
'''Управление сетью:''' [http://projects.gnome.org/NetworkManager NetworkManager-gnome]<br/><br />
'''Управление bluetooth-подключениями:''' [http://www.blueman-project.org Blueman]<br/><br />
'''Текстовый редактор:''' [http://tarot.freeshell.org/leafpad/ Leafpad]<br/><br />
'''Офисный пакет:''' [http://ru.openoffice.org OpenOffice.org] <br/><br />
'''Органайзер:''' [http://clayo.org/osmo/ Osmo]<br/><br />
'''Словари:''' [http://stardict.sourceforge.net/ Stardict-gtk]<br/><br />
'''OCR:''' [http://symmetrica.net/cuneiform-linux/yagf-ru.html Yagf]<br/><br />
'''Просмотр PDF-файлов:''' [http://projects.gnome.org/evince Evince-gtk]<br/><br />
'''Просмотр изображений:''' [http://wiki.lxde.org/en/GPicView Gpicview]<br/><br />
'''Просмотр видео:''' [http://code.google.com/p/gnome-mplayer Gnome-Mplayer] или [http://www.videolan.org/vlc VLC]<br/><br />
'''Прослушивание звуковых файлов:''' [http://wiki.lxde.org/en/LXMusic LXMusic] или [http://www.audacious-media-player.org Audacious]<br/><br />
'''Калькулятор:''' [http://qalculate-gtk.darwinports.com Qalculate-gtk]<br/><br />
'''Веб-браузер:''' [http://chromium.sourceforge.net Cromium] или [http://www.mozilla-russia.org Firefox] <br/><br />
'''Почтовый клиент:''' [http://claws-mail.sourceforge.net/ Claws-mail]<br/><br />
'''Клиент обмена мгновенными сообщениями:''' [http://pidgin.im Pidgin]<br/><br />
'''Редактирование растровых изображений:''' [http://www.gimp.org GIMP]<br/><br />
'''Запись CD и DVD:''' [http://projects.gnome.org/brasero/ Brasero]<br/><br />
'''Предоставление печати на локальный принтер:''' [http://www.cups.org CUPS]<br/><br />
'''Программа для создания скриншотов:''' [http://shutter-project.org/ Shutter]<br/><br />
'''Менеджер настроек OpenBox:''' [http://vault.openmonkey.com/pages/obconf Obconf]<br/><br />
'''Менеджер пакетов:''' [http://www.nongnu.org/synaptic/ Synaptic]<br/><br />
'''Настройки дистрибутива:''' [http://www.altlinux.org/Alterator Alterator] (выбрать нужные компоненты) <br/><br />
<br />
<br />
<br />
<br />
Смотри также [http://www.altlinux.org/5.0/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 список программного обеспечения для решения задач пользователя на Платформе 5.0.]<br/><br />
Смотри также [https://wiki.ubuntu.com/Lubuntu/Applications список программного обеспечения Lubuntu 10.4]<br />
<br />
===Оформление===<br />
Очень хочется создать свою тему оформления для дистрибутива. Пока есть только задумки.<br/><br />
<br />
Например темы оформления:<br/><br />
1. http://all-hope.deviantart.com/art/Platinum-Openbox-27094472<br/><br />
2.<br />
<br />
===Дальнейшие планы===<br />
==Участники проекта==<br />
[http://www.sisyphus.ru/ru/packager/gns Nick S. Grechukh]<br/><br />
[http://sisyphus.ru/ru/packager/radik Radik Usupov]<br />
===Благодарности===<br />
==Ссылки по теме==</div>Yushihttps://www.altlinux.org/index.php?title=Pseudo_User_Policy&diff=13985Pseudo User Policy2010-03-25T17:56:25Z<p>Yushi: /* Суть policy */ "он имени" -> "от имени"</p>
<hr />
<div>{{викифицировать}}<br />
{{DraftPolicy<br />
|responsible=?<br />
}}<br />
<br />
=== Проблема ===<br />
Ряду программных пакетов для реализации работы с понижением привилегий (<tt>privilege separation</tt>) требуется псевдопользователь (и обычно — соответствующая группа; численное значение — от 1 до 499 согласно принятых норм).<br />
<br />
Идея предварительно «забить» всех нужных псевдо в <code>/etc/passwd</code> и <code>/etc/group</code> прямо при создании пакета <code>setup</code> обречена на столкновение с непредвиденными надобностями и серьёзными проблемами с интеграцией изменений — ведь новые версии этих файлов будут установлены как <code>*.rpmnew</code>, а автоматизированные средства сведения изменений не прилагаются.<br />
<br />
С другой стороны, идея создавать служебные аккаунты динамически при установке пакета сама по себе чревата несовместимостью uid/gid различных инсталляций, что создаёт вполне реальные проблемы с резервным копированием (восстановлением данных в контексте другого сервера).<br />
<br />
Кажется разумным сочетание этих подходов: поддержание списка зарегистрированных <tt>UID</tt>/<tt>GID</tt> и реализация добавления «по требованию», но с фиксированными значениями. Для этого требуется написать (обобщить имеющиеся) макросы для проверки коллизий (наличие пользователя с «неправильными» <tt>uid</tt>/<tt>gid</tt>, как было с <code>sympa</code>; наличие «реального» пользователя с <tt>uid</tt>/<tt>gid</tt> >= 500).<br />
<br />
При этом для уменьшения плотности этих самых коллизий предлагается отдавать предпочтение именам вида «<code>_name</code>» для «системных» пользователей и групп.<br />
<br />
=== Суть policy ===<br />
* Если программа для своей работы не требует прав <code>root</code>, она должна работать от имени непривелигированного псевдопользователя. <br />
* При этом разные программы следует запускать от имени индивидуальных псевдопользователей, в случаях, когда программы никак не связаны друг с другом, а именно:<br />
** файловая система (общие файлы или каталоги для <tt>IPC</tt>)<br />
** <tt>SYSV</tt> <tt>IPC</tt><br />
** сигналы, посылаемые процессам<br />
** обобщённо, то, на что распространяются <tt>unix permissions</tt><br />
<br />
=== Пример заведения псевдопользователя ===<br />
<pre><br />
%define _pseudouser_user _foo<br />
%define _pseudouser_group _foo<br />
%define _pseudouser_home %_localstatedir/foo<br />
<br />
Name: foo<br />
...<br />
<br />
%pre<br />
/usr/sbin/groupadd -r -f %_pseudouser_group ||:<br />
/usr/sbin/useradd -g %_pseudouser_group -c 'The foo daemon' \<br />
-d %_pseudouser_home -s /dev/null -r %_pseudouser_user >/dev/null 2>&1 ||:<br />
...<br />
<br />
%files<br />
%dir %attr(0775,root,%_pseudouser_group) %_var/run/%name<br />
%dir %attr(0770,root,%_pseudouser_group) %_localstatedir/%name<br />
</pre><br />
<br />
=== Права на каталоги ===<br />
При упаковке приложений следует уделять должное внимание правам доступа, выставляемым на файлы и директории, принадлежащие этому приложению. Подробно об этом можно почитать в [[SecurePackagingPolicy|ALT Linux Secure Packaging Policy]].<br />
<br />
Вкратце:<br />
* Если в каталог пишет только один псевдопользователь, то <code>0770 root:_pseudouser_group</code><br />
* Если в каталог пишет не только один псевдопользователь, то если у них нет общих для записи файлов, то 3770, иначе 2770.<br />
* Если псевдопользователи только читают из каталога, то 0750.<br />
* Если псевдопользователи только открывают файлы из каталога, то 0710<br />
<br />
=== Удаление пользователя ===<br />
Удалять псевдопользователей не следует.<br />
<br />
В силу специфического [[SpecTips/triggers|порядка выполнения пакетных скриптов]] в rpm прописанный в <code>%postun</code> <code>userdel</code> при обновлении пакета отработает ''после'' <code>%post</code> (с какими угодно <code>useradd</code>) из обновляемого пакета. Результатом будет отсутствие пользователя после установки пакета ''вообще''. Так что пусть уж лучше не удаляются… заодно решать вопросы с «плавающими» правами в условиях отсутствия полиси на фиксирование UID/GID динамически создаваемых пользователей и групп.<br />
<br />
=== Исправление ситуации, если псевдопользователь был удалён ===<br />
На примере [http://sisyphus.ru/srpm/webalizer/spec webalizer.spec] версии 2.01.10-alt3:<br />
<pre>%triggerpostun -- webalizer < 2.01.10-alt3<br />
echo "Fixing permissions after faulty previous package:"<br />
/usr/sbin/groupadd -r -f %webalizer_group ||:<br />
/usr/sbin/useradd -g %webalizer_group -G %apache_group -c 'The Webalizer' \<br />
-d %webalizer_home -s /dev/null -r %webalizer_user ||:<br />
chown -Rv root:%webalizer_group %webalizer_home %webalizer_html</pre><br />
<br />
=== Ссылки ===<br />
* [https://bugzilla.altlinux.org/show_bug.cgi?id=15268 пример проблемы]<br />
* [https://bugzilla.altlinux.org/show_bug.cgi?id=9895 add useradd and groupadd macros]<br />
* [http://lists.altlinux.org/pipermail/devel/2004-January/018128.html http://lists.altlinux.org/pipermail/devel/2004-January/018128.html]<br />
* [http://lists.altlinux.org/pipermail/devel/2004-January/018132.html http://lists.altlinux.org/pipermail/devel/2004-January/018132.html]<br />
* [https://bugzilla.altlinux.org/show_bug.cgi?id=2623 #2623]<br />
* [https://bugzilla.altlinux.org/show_bug.cgi?id=2977 #2977].</div>Yushihttps://www.altlinux.org/index.php?title=Scheme/synonym&diff=13981Scheme/synonym2010-03-25T14:33:56Z<p>Yushi: /* Синонимы и велосипеды */</p>
<hr />
<div>==Синонимы и велосипеды==<br />
<br />
Очень часто вместо одной функции можно использовать другие, иногда это бывает полезно.<br />
Например во многих случаях программа начинает быстрее работать.<br />
<br />
'''"Велосипеды" из SRFI-1 и SRFI-13'''<br />
<br />
{| class="standard"<br />
|-<br />
!Вариант 1<br />
!Вариант 2<br />
|-<br />
|not + pair<br />
|not-pair<br />
|-<br />
|car + last-pair<br />
|last<br />
|-<br />
|fold + reverse<br />
|fold-right<br />
|-<br />
|list-tail<br />
|drop, а заодно есть и take.<br />
|-<br />
|(delq #f)+ map<br />
|filter-map<br />
|-<br />
|apply + append + map<br />
|append-map<br />
|-<br />
|apply + append<br />
|concatenate<br />
|-<br />
|<br />
contatenate+ map<br />
|append-map<br />
|-<br />
|apply+string-append<br />
|string-concatenate<br />
|-<br />
|}<br />
<br />
<br />
'''"Велосипеды" из R5RS'''<br />
<br />
{| class="standard"<br />
|-<br />
!Вариант 1<br />
!Вариант 2<br />
|-<br />
|<br />
(= x 0)<br />
|<br />
(zero? x)<br />
|-<br />
|<br />
(> x 0)<br />
|<br />
(positive? x)<br />
|-<br />
|<br />
(< x 0)<br />
|<br />
(negative? x)<br />
|-<br />
|<br />
(lambda(x) x)<br />
|<br />
values<br />
|-<br />
|<br />
(list->vector x)<br />
|<br />
(apply vector x)<br />
|-<br />
|<br />
(and (< a b) (<b c))<br />
|<br />
(< a b c)<br />
|}<br />
<br />
<br />
'''Полезные рекомендации'''<br />
*Очень полезно бывает скрывать некоторые "склеивающие" операции внутри функции - выглядеть будет гораздо нагляднее.<br />
Например, (my-url "/aaa" "/bbb" "ccc") гораздо понятнее, чем (my-url (string-append "/aaaa" "/bbb" "ccc)).<br />
<br />
<br />
'''Опасные моменты'''<br />
*'''fold-left''' - это итеративный процесс, но '''fold-right''' - рекурсивный, соотв., на больших списках может закончиться стек.</div>Yushihttps://www.altlinux.org/index.php?title=Scheme/synonym&diff=13980Scheme/synonym2010-03-25T14:32:29Z<p>Yushi: /* Синонимы и велосипеды */ тся/ться</p>
<hr />
<div>==Синонимы и велосипеды==<br />
<br />
Очень часто вместо одной функции можно использовать другие, иногда это бывает полезно.<br />
Например во многих случаях программа начинает быстрее работать.<br />
<br />
'''"Велосипеды" из SRFI-1 и SRFI-13'''<br />
<br />
{| class="standard"<br />
|-<br />
!Вариант 1<br />
!Вариант 2<br />
|-<br />
|not + pair<br />
|not-pair<br />
|-<br />
|car + last-pair<br />
|last<br />
|-<br />
|fold + reverse<br />
|fold-right<br />
|-<br />
|list-tail<br />
|drop, а заодно есть и take.<br />
|-<br />
|(delq #f)+ map<br />
|filter-map<br />
|-<br />
|apply + append + map<br />
|append-map<br />
|-<br />
|apply + append<br />
|concatenate<br />
|-<br />
|<br />
contatenate+ map<br />
|append-map<br />
|-<br />
|apply+string-append<br />
|string-concatenate<br />
|-<br />
|}<br />
<br />
<br />
'''"Велосипеды" из R5RS'''<br />
<br />
{| class="standard"<br />
|-<br />
!Вариант 1<br />
!Вариант 2<br />
|-<br />
|<br />
(= x 0)<br />
|<br />
(zero? x)<br />
|-<br />
|<br />
(> x 0)<br />
|<br />
(positive? x)<br />
|-<br />
|<br />
(< x 0)<br />
|<br />
(negative? x)<br />
|-<br />
|<br />
(lambda(x) x)<br />
|<br />
values<br />
|-<br />
|<br />
(list->vector x)<br />
|<br />
(apply vector x)<br />
|-<br />
|<br />
(and (< a b) (<b c))<br />
|<br />
(< a b c)<br />
|}<br />
<br />
<br />
'''Полезные рекомендации'''<br />
*Очень полезно бывает скрывать некоторые "склеивающие" операции внутри функции - выглядеть будет гораздо нагляднее.<br />
Например, (my-url "/aaa" "/bbb" "ccc") гораздо понятнее, чем (my-url (string-append "/aaaa" "/bbb" "ccc)).<br />
<br />
<br />
'''Опасные моменты'''<br />
*'''fold-left''' - это итеративный процесс, но '''fold-right''' - рекурсивный, соотв. , на больших списках может закончиться стек.</div>Yushihttps://www.altlinux.org/index.php?title=Gear/old&diff=13972Gear/old2010-03-24T23:58:45Z<p>Yushi: /* Импорт пакетов: */ <srpm-пакеты> это не ключ, дефис не нужен</p>
<hr />
<div>{{Викифицировать}}<br />
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/gear}}<br />
== Использование gear/git ==<br />
<br />
__TOC__<br />
<br />
Дополнительные статьи:<br />
[[gear/geartags|Пример работы с gear-tags]]<br />
<br />
'''gear''' — инструмент, позволяющий использовать git для хранения исходных пакетов.<br />
<br />
Что нужно:<br />
* установить gear: apt-get install gear;<br />
* дополнительно можно установить cogito - более дружественный интерфейс к git, в дальнейшем некоторые команды будут описываться из пакета cogito.<br />
<br />
=== Как работает gear ===<br />
Gear - инструмент, позволяющий оперируя данными из git репозитория проводить сборку исходного текста в rpm пакет,тарболл или просто экспортировать результаты выполненияправил (gear-rules) в определённый каталог. <br />
<br />
В своей работе gear использует файл .gear-rules, являющийся частью репозитория, В данном файле описывается то, что нужно сделать gear что бы получить файлы, необходимые для сборки rpm пакета с помощью spec, <br />
<br />
Так как gear берёт все данные исключительно из git репозитория, и пользуется для этого исключительно набором утилит git, то все изменения должны быть в обязательном порядке внесены в репозиторий командой git-commit -a. Иначе gear будет работать с предыдущими данными и все последние изменения использоваться при сборке не станут. Но для тестирования некоторых коммитов у gear есть замечательная опция --commit, позволяющая выполнить так называемый временный коммит всех текущих изменений и использовать его исключительно для сборки, откатив в дальнейшем. Но даже с этой опцией безусловно предварительно нужно выполнить git-add для всех новых файлов и git-rm для всех файлов, подлежащих удалению. <br />
<br />
gear позволяет собирать пакет как с помощью обычного системного rpm, в системном окружении, так и с помощью hasher в создаваемом с нуля чруте.<br />
Преимущества использования gear для мантейнера вполне очевидны:<br />
* возможность использования в процессе сборки и разработки пакета всех достоинств репозитория git, основное из которых - хранение истории всех изменений плюс ведение нескольких веток<br />
* унифицированный механизм сборки и публикации исходных текстов пакета. <br />
* удобный интерфейс с rpm и hasher<br />
* возможность (теоретическая, я не знаю практических примеров), сборки из одного репозитория пакета для разных дистрибутивов Linux<br />
* значительная экономия трафика при выкладывании и получении обновлений уже загруженных ранее git репозиториев<br />
* возможность ведения нескольких веток одного проекта разными разработчикам, с дальнейшей процедурой объединения изменений. <br />
<br />
Говоря о преимуществах, не стоит забывать и про недостатки, самым основным из которых я вижу невозможность получения только последней версии git-репозитория, исключая необходимость загружать к себе всю историю ведения пакета. Наличие такой возможности позволило бы значительно экономить сетевой трафик. Для примера - git репозиторий ядра в ALT Linux - это порядка 100 мегабайт. И это всё нужно выкачать любому, кто захочет из gear собрать свежее ядро. Загрузка же только последней ревизии git репозитория ядра должна была бы весить около 30 мегабайт. Разница ощутима, и она будет расти по мере внесения изменений в git репозиторий. <br />
<br />
=== Импорт пакетов: ===<br />
Итак, какие действия нужно выполнить для начала работы с gear/git ? Первое - это import существующего пакета (или загрузка его с публичного git-репозитория). Для импорта необходимо выполнить следующие действия:<br />
<pre>mkdir <имя-пакета><br />
cd <имя-пакета><br />
git init<br />
gear-srpmimport <srpm-пакеты></pre><br />
<br />
После того, как в текущем каталоге создан git-репозиторий, содержащий исходный код пакетов, рекомендуется пройтись по автоматически созданному во время импорта файлу .gear-rules.<br />
<br />
Из замен:<br />
все copy:<файл> рекомендуется заменять на маску. Например так:<br />
<pre>copy?: *.patch *.diff<br />
copy: <имя программы>-*.tar</pre><br />
впрочем, gear-srpmimport обычно делает эту работу за вас.<br />
[[gear/ImportSeparateUpstream|Один реальный лог импорта]]<br />
<br />
=== Синтаксис .gear-rules ===<br />
<br />
Самое свежее описание синтаксиса можно найти в gear-rules(5), входящей в состав пакета gear.<br />
<br />
Файл с правилами, описывающими поведение gear при сборке пакетов, должен содержать строки в следующем формате:<br />
директива: аргументы...<br />
<br />
Все пустые строки, а также строки , начинающиеся с # - игнорируются<br />
<br />
Доступные директивы: spec, tags, copy, gzip, bzip2, tar, tar.gz, tar.bz2, exclude, gzip, bzip2, zip, diff, diff.bz2, diff.gz. Каждая директива имеет следующий синтаксис аргументов:<br />
* '''''spec: путь_к_файлу''''' - использовать данный specfile для работы gear<br />
* '''''tags: путь_к_каталогу''''' - позволяет указать путь к каталогу, содержащему gear-tags, вместо стандартного .gear-tags/<br />
* '''''copy: glob_pattern...''''' - копировать в пакет файлы, попадающие под glob_pattern<br />
* '''''gzip: glob_pattern...''''', '''''bzip2: glob_pattern...''''' - по аналогии с copy, но ещё сжимает копируемые файлы<br />
* '''''copy?: glob_pattern...''''', '''''gzip?: glob_pattern...''''', '''''bzip2?: glob_pattern..''''' - по аналогии с copy, но не выводить ошибку при отсутствии данных файлов. Полезно в случае переодического использования патчей<br />
* '''''exclude: glob_pattern...''''' - исключать из копирования определённые файлы.<br />
* '''''tar: tree_path [options...]''''' - создавать тарболл (архив tar) с деревом, определяемом в tree_path. Допустимые опции:<br />
** ''spec=path_to_file'' - использовать другой specfile для определения значений ключей<br />
** ''name=archive_name'' - устанавливает имя создаваемого архива (суффикс tar (или иной, определённый опцией suffix) добавляется автоматически). По умолчанию эта опция выставлена в значение @dir@-@version@, если tree-path выставлен в . , иначе значение по умолчанию - @name@-@version@<br />
** ''base=base_name'' - добавить base_name в качестве первого каталога ко всем файлам архива. Если опция не указана, то используется имя архива без суффикса (например @name@-@version@)<br />
** ''suffix=suffix'' - использовать другой суффикс архива вместо .tar<br />
* '''''tar.gz: tree_path [options...]''''', '''''tar.bz2: tree_path [options...]''''' - по аналогии с tar, но создаёт сжатые архивы. Соответственно меняется суффикс по умолчанию на tar.gz или tar.bz2<br />
* '''''zip: tree_path [options...]''''' - по аналогии с tar, но создаёт архив zip, соответственно изменяя суффикс<br />
* '''''tar?: tree_path [options...]''''', '''''tar.gz?: tree_path [options...]''''', '''''tar.bz2?: tree_path [options...]''''', '''''zip?: tree_path [options...]''''' - работают по аналогии с директивами без "?", но не выводят ошибку в случае отсутствия tree_path в репозитории.<br />
* '''''diff: old_tree_path new_tree_path [options...]''''' - создаёт патч между оригинальным деревом (old_tree_path) и изменённым деревом (new_tree_path). Оба дерева должны обязательно существовать в git репозитории. Доступные опции:<br />
** '''spec=path_to_file''' - путь к спекфайлу, позволяет использовать другой, отличный от основного спекфайл для получения значений ключевых слов (version, например)<br />
** '''name=diff_name''' - устанавливает имя генерируемого патча. По умолчанию патч создаётся с именем @new_dir@-@version@-@release@.patch. Если в качестве каталога используется ., то патч будет создан с именем @name@-@version@-@release@.patch. Значение опции "name" может содержать ключевые слова, дополнительные к стандартным: @old_dir@ и @new_dir@, которые раскрываются в имя последнего каталога (basename, по факту) из old_tree_path и new_tree_path. <br />
*'''''diff.gz: old_tree_path new_tree_path [options...]''''', '''''diff.bz2: old_tree_path new_tree_path [options...]''''' - работает по аналогии с директивой diff, но создаёт сжатые соответсвующими алгоритмами патчи<br />
*'''''diff?: old_tree_path new_tree_path [options...]''''', '''''diff.gz?: old_tree_path new_tree_path [options...]''''', '''''diff.bz2?: old_tree_path new_tree_path [options...]''''' - работает по аналогии с diff, diff.gz и diff.bz2, но не выдаёт ошибку в случае невозможности создать патч (например из-за отсутствия какого-то из бранчей). <br />
<br />
Допустимые ключевые слова:<br />
* @dir@ - basename(путь_к_каталогу);<br />
* @name@ - Имя пакета, добытое из спекфайла<br />
* @version@ - Версия пакета, добытая из спекфайла<br />
* @release@ - релиз (номер сборки) пакета, добытый из спекфайла<br />
<br />
=== Сборка пакета ===<br />
Для сборки пакетов необходимо использовать gear. Вы должны чётко понимать, что gear использует git для получения файлов, поэтому все изменения, которые не внесены в репозиторий (для которых не выполнен commit) - '''gear учитывать не будет'''.<br />
<br />
Локальная сборка:<br />
<pre>gear --rpmbuild -- <команда rpmbuild></pre><br />
Например:<br />
<pre>gear --rpmbuild -- rpmbuild -ba</pre><br />
Сборка в hasher:<br />
<pre>gear --hasher -- <команда hsh></pre><br />
Например:<br />
<pre>gear --hasher -- hsh /path/to/workdir</pre><br />
Для сборки со временным коммитом изменений:<br />
gear --commit --hasher -- hsh<br />
<br />
NB:<br />
<pre>Когда hasher собирает gear-пакет, сборочные зависимости ставятся трижды:<br />
1. BuildRequires(pre): для того, чтобы работал rpmbuild -bE.<br />
2. BuildRequires: для того, чтобы работал rpmbuild -bs.<br />
3. Зависимости srpm-пакета: для того, чтобы работал rpmbuild --rebuild.</pre><br />
''[http://lists.altlinux.org/pipermail/devel/2007-April/044401.html ldv@]''<br />
<br />
<br />
<br />
== XX ==<br />
<br />
При необходимости добавить ещё один remote branch в ваш репозиторий, например ваш собственный или тех, кто вносил изменения в ваш проект:<br />
<pre>git remote add <имя бранча> <URL></pre><br />
Для загрузки remote branch воспользуйтесь командой:<br />
<pre>git fetch <имя бранча></pre><br />
Просмотреть все внешние бранчи можно командой:<br />
<pre>git remote</pre><br />
А просмотреть информацию о каком-то бранче можно командой:<br />
<pre>git remote show <имя бранча, например origin></pre><br />
<br />
<br />
<br />
=== Приспосабливаем rpmwrap ===<br />
<br />
Часто у мантейнера нет желания делать commit в локальный GIT репозиторий, не проверив пакет на собираемость.<br />
Для того, что бы собирать пакеты локально rpm'ом - необходим rpmwrapper, переопределяющий пути к исходникам пакета.<br />
<br />
Забрать rpmwrapper:<br />
apt-get install rpmwrap<br />
<br />
после этого необходимо в $HOME/bin/ сделать следущие симлинки:<br />
$HOME/bin/rpm -> /usr/bin/rpmwrap<br />
$HOME/bin/rpmbuild -> /usr/bin/rpmwrap<br />
<br />
или использовать команды rpmwrap-rpm и rpmwrap-rpmbuild<br />
<br />
Для настройки rpmwrapper добавьте в свой домашний каталог файл .rpmwraprc с таким содержимым:<br />
<pre>RPM_PREFIX="/usr/bin"<br />
RPM="$RPM_PREFIX/rpm"<br />
macrofile=".rpmwrapmacros"<br />
allow_prefix="$HOME/src/RPM:$HOME/src/sisyphus/packages"</pre><br />
Где allow_prefix содержит все пути, в которых могут быть пакеты.<br />
<br />
Для использования rpmwrapper в каталог пакета необходимо положить файл .rpmwrapmacros с примерно таким содержимым:<br />
<pre>%_topdir %_macropath<br />
%_sourcedir %{_topsrcdir}<br />
%_specdir %{_topsrcdir}<br />
%_tmppath %{_topsrcdir}/tmp</pre><br />
Где %_macropath будет определяться rpmwrapper'ом и содержать путь к файлу .rpmwrapmacros.<br />
После этого можно выполнять rpm -ba <спек файл>, находясь в каталоге git-репозитория пакета.<br />
<br />
=== BuildPreReq vs BuildRequires(pre) ===<br />
<pre>* gvy попытался напустить gear на vim-plugin-deldiff<br />
<gvy> error: line 8: Tag takes single token only: Url: %vim_script_url 444 :-(<br />
<vsu> gvy: BuildRequires(pre): vim-devel ?<br />
<gvy> vsu, ну я пока не понял -- как оно попало в сизиф, если gear не может собрать<br />
<vsu> gvy: gear --hasher не может<br />
<vsu> gvy: gear --rpmbuild, вероятно, может<br />
<gvy> vsu, Ааа<br />
<gvy> vsu, точно<br />
<vsu> gvy: ну зафикси да выложи :)<br />
<gvy> vsu, кого -- gear? :)<br />
<gvy> там BuildPreReq: vim-devel<br />
<vsu> gvy: а надо BuildRequires(pre)<br />
<vsu> sed '/^buildrequires(pre):[[:space:]]*/I!d;s///' "\$HOME/in/spec"/* |<br />
<vsu> /.host/filter_spec_buildreq<br />
<vsu> gvy: это в hasher забито</pre><br />
<br />
=== Ссылки ===<br />
* [http://www.kernel.org/pub/software/scm/git/docs/everyday.html Everyday GIT]<br />
* [http://www.freesource.info/wiki/AltLinux/Sisyphus/devel/gear/gear-tags Пример работы с gear-tags]<br />
* [http://www.freesource.info/wiki/AltLinux/Sisyphus/devel/git Ещё о работе с git.alt]<br />
<br />
<br />
{{Category navigation|title=gear|category=gear|sortkey={{SUBPAGENAME}}}}</div>Yushi