Меню Рубрики

Установка daemon tools в линукс

Как установить аналог DAEMON Tools в Ubuntu Linux?

Думаю каждый задумывался либо искал в сети приложение подобное DAEMON Tools с чем вы работали в операционной системе Windows и хотели бы иметь что-то подобное, но уже в Ubuntu linux. Такое приложение конечно же есть, я и сам особо не искал так как пока не было особой нужды, но случайно наткнулся и решил написать пост в блог, может кому пригодится.

Обычно, когда возникает необходимость быстро примонтировать образ CD/DVD диска в Linux и еще для новичка, то это дело нелегкое, в чем я и попытаюсь вам помочь.

Конечно в сети существует, достаточно разнообразных приложений и консольных и графических, предпочтительней конечно приложение которое обладает графическим интерфесом, так как не все пользователи познают азы консоли и умеют с ней работать. Приложение должно распознавать с всеми самыми популярными iso форматы для быстрого и удобного монтирования, и еще с уведомлениями в боковой панели монитора.

Всем этим, что я описал выше обладает приложение gCDEmu, хотя и функционала не так и много в сравнении с DAEMON Tools, но самое важное все же есть, ничего лишнего только самое необходимое. Иногда возникает потребность быстро просмотреть несколько образов, меняя их на лету, и GUI в этой ситуации выглядит более привлекательно.

  • Репозиторий для Ubuntu поддерживает дистрибутивы версий 9.04-10.10 (C 26.05.11 уже доступны для Ubuntu 11.04).

Чтобы установить программу в ubuntu 11.04 и старше, откройте терминал(Ctrl+Alt+T), далее выполните следующие команды:

sudo add-apt-repository ppa:cdemu/ppa && sudo aptitude update && sudo aptitude install cdemu-client gcdemu

sudo add-apt-repository ppa:danulo124/lucid4+debs sudo apt-get update sudo apt-get install cdemu cdemu-client gcdemu libmirage cdemu-daemon

После запускай приложения, на верхней панели мы сразу же видим иконку наблюдающего пингвина:

Это и есть наше приложение, хотя и интерфейс приложения на английском, но все понятно и думаю запутаться здесь нет где, я выше выделил стрелкой, в самом начале если вам нужно подключить образ, жмем на кнопку News device, я так и сделал уже, выше вы видите надпись — Device #01: Empty, это то устройство, что мы добавили вот только что.

По умолчанию, сразу же послу установки имеется дефолтное устройство под номером — Device #00: Empty, которое вы можете использовать в своих целях либо удалить и создать новое.

Образ подключить так же не составит трудности, жмем на кнопку Create blank после появится окошко которое ниже на скриншоте, в поле Medium type, выберем тип диска(CD либо DVD+R), после настройки данных параметров, жмем на кнопку Choose и далее ищем наш диск, выбираем и монтируем в пару нажатий мышью.

Удалить примонтированный диск так же не составит трудности ниже вы увидите кнопку — Remove device, одно нажатие и все готово без запросов, а точно ли вы этого хотите, а может вы передумаете итд(все очень быстро и не в стиле windows).

На этом пожалуй окончу материал. Если у вас будут вопросы, пожалуйста, спрашиваем в комментариях, по возможности отвечу.

источник

unixforum.org

Форум для пользователей UNIX-подобных систем

аналоги Daemon Tools для Линукс

аналоги Daemon Tools для Линукс

Сообщение vovanvster » 11.11.2008 22:13

Re: аналоги Daemon Tools для Линукс

Сообщение Goodvin » 11.11.2008 22:29

Re: аналоги Daemon Tools для Линукс

Сообщение DjSpike » 11.11.2008 22:37

Re: аналоги Daemon Tools для Линукс

Сообщение demontager » 13.11.2008 14:58

Re: аналоги Daemon Tools для Линукс

Сообщение zwey » 13.11.2008 18:26

Re: аналоги Daemon Tools для Линукс

Сообщение Flaming » 13.11.2008 18:35

Re: аналоги Daemon Tools для Линукс

Re: аналоги Daemon Tools для Линукс

Сообщение vovanvster » 13.11.2008 19:38

Спасибо, приятно что есть люди которые пишут не только для того чтобы самовыражаться.
Действительно я хочу Седегу обмануть но постарался вопрос задать понежнее и только для понятливых. А те кто не понял вряд-ли дельное посоветуют.
Нельзя-ли монтирование как-то оформить чтобы оно в девайсах было ? По поводу mount много неграмотными людьми написано но даже самая тупая програмулька отличит
fuseiso от /dev/sr0

Re: аналоги Daemon Tools для Линукс

Сообщение Flaming » 14.11.2008 15:54

/.wine/dosdevices/ символьную ссылку не на /mnt/cdrom, в на /dev/hdc (который у меня является утройством cd). Навело на определённые мысли, но до конца я недодумал, забил просто на это.
Не со всеми игрушками прокатит в любом случае, так как звёздная сила — зло.

Re: аналоги Daemon Tools для Линукс

Сообщение MMouXe » 14.11.2008 17:23

Re: аналоги Daemon Tools для Линукс

Сообщение Hoblin » 16.11.2008 18:57

Порезал все горячие высказывания, авторы получают свои порции плюсов.

Просьба не переводить тему в обсуждение нравственности StarForce и не призывать отламывать защиту.
Спасибо за внимание.

Re: аналоги Daemon Tools для Линукс

/.wine/dosdevices/ символьную ссылку не на /mnt/cdrom, в на /dev/hdc (который у меня является утройством cd). Навело на определённые мысли, но до конца я недодумал, забил просто на это.
Не со всеми игрушками прокатит в любом случае, так как звёздная сила — зло.

Читайте также:  Установка контейнер для воды

Вино, это не седега
Она смотрит прежде всего на устройство, затем в fstab, ну а потом в точку монтирования. Посему пока она не узреет в соответствующем ноде /dev/* нужную метку тома, серийный номер, etc., ни с какой папки она инфу читать не будет как бы вы ее ей не подсовывали.
Выхода два, первый — писать образы на болванки, второй — биндить образ и нод (только при наличии реального/железного привода, после связывания он будет не доступен; исправляется перезагрузкой).
mount [iso] /dev/cdrom -o bind — этим мы связываем образ и нод реального привода так что их содержимое становится доступно и там и там.
mount /dev/cdrom [mount point] -o loop — этим мы монтируем нод как образ.

зы Защиты седега обходить умеет (собственно почему она и закрытый продукт), это и объясняет принцип ее работы.

зыы Если серьезно, то все это костыли. Ставить и играть под виндой. или вообще для игр взять себе какой-нибудь X-Box

Re: аналоги Daemon Tools для Линукс

Сообщение vovanvster » 26.11.2008 12:23

/.wine/dosdevices/ символьную ссылку не на /mnt/cdrom, в на /dev/hdc (который у меня является утройством cd). Навело на определённые мысли, но до конца я недодумал, забил просто на это.
Не со всеми игрушками прокатит в любом случае, так как звёздная сила — зло.

Вино, это не седега
Она смотрит прежде всего на устройство, затем в fstab, ну а потом в точку монтирования. Посему пока она не узреет в соответствующем ноде /dev/* нужную метку тома, серийный номер, etc., ни с какой папки она инфу читать не будет как бы вы ее ей не подсовывали.
Выхода два, первый — писать образы на болванки, второй — биндить образ и нод (только при наличии реального/железного привода, после связывания он будет не доступен; исправляется перезагрузкой).
mount [iso] /dev/cdrom -o bind — этим мы связываем образ и нод реального привода так что их содержимое становится доступно и там и там.
mount /dev/cdrom [mount point] -o loop — этим мы монтируем нод как образ.

зы Защиты седега обходить умеет (собственно почему она и закрытый продукт), это и объясняет принцип ее работы.

зыы Если серьезно, то все это костыли. Ставить и играть под виндой. или вообще для игр взять себе какой-нибудь X-Box

источник

аналог daemon tools под линукс

Ищу годный аналог даемон тулса для линукса для просмотра .iso образов

И осиль mount -o loop,ro /path/to/image.iso /mnt/cdrom

cdemu + апплет, но если требуется только

то подойдет file-roller или любой аналог

Ищу годный аналог даемон тулса для линукса для просмотра .iso образов

Как тебе уже сказали, исошки монтируются mount

Не слушай линупс-дрочеров про mount. Гном тыщу лет умеет монтировать исошники одним нажатием кнопки.

Ну Thunar тоже монтирует, просто нужно функцию настроить.

Ааааа

ЛОР скатился в филиал винфака!

Для монтирования, как Daemon Tools — cdemu
Для просмотра/изменения — isomaster

Для просмотра? Щёлкаешь левой кнопкой мыши по iso-шнику и смотришь.

Мне нужно открыть образ iso, в нем как бы видео с интерактивными элементами, то есть с менюшкой, щелкать, выбирать и т.д. Поставил acetoneiso, он выдает какую то ошибку при монтировании. В сам образ можно влезть через krusader но тогда можно просто просматривать куски видео в папке video_TS, без интерактивности. Стандартное кликание на образ предлагает просто записать его на диск

ну так смонтируй куда-нибудь образ и открой двд из каталога мплеером или влц

источник

Пишем собственный linux демон с возможностью автовосстановления работы

Уважаемые хабрапользователи, хотелось бы поделиться с вами опытом написания серверных демонов. В Рунете очень много статей по этому поводу, но большинство из них не даёт ответы на такие важные вопросы как:

  • Как добавить демона в автозагрузку?
  • Что делать, если в процессе работы произошла ошибка и демон рухнул?
  • Каким образом обновить конфигурацию демона без прерывания его работы?

В рамках данной части рассмотрим следующие моменты:

  • Принцип работы демона.
  • Основы разработки мониторинга состояния демона.
  • Обработка ошибок при работе, с подробным отчетом в лог.
  • Некоторые вопросы связанные с ресурсами системы.

Для наглядности будет показан исходный код следующих частей:

  • Шаблон основной программы.
  • Шаблон функции мониторинга работы демона.
  • Шаблон функции обработки ошибок.
  • Ряд вспомогательных функций.

Принцип работы демона.
По суди демон это обычная программа выполняющаяся в фоновом режиме. Но так как наш демон будет запускаться из init.d, то на него накладываются определенные ограничения:

  • Демон должен сохранить свой PID в файл, для того чтобы потом можно было его корректно остановить.
  • Необходимо выполнить ряд подготовительных операций для начала работы в фоновом режиме.
Читайте также:  Установка данных защищаемых конфигураций

В нашей модели демон будет функционировать по следующему алгоритму:

  • Отделение от управляющего терминала и переход в фоновый режим.
  • Разделение на две части: родитель(мониторинг) и потомок(функционал демона).
  • Мониторинг состояния процесса демона.
  • Обработка команды обновления конфига.
  • Обработка ошибок.

Шаблона программы.
Данный код будет осуществлять все действия, которые необходимы для удачного запуска демона.

int main( int argc, char ** argv)
<
int status;
int pid;

// если параметров командной строки меньше двух, то покажем как использовать демона
if (argc != 2)
<
printf( «Usage: ./my_daemon filename.cfg\n» );
return -1;
>

// загружаем файл конфигурации
status = LoadConfig(argv[1]);

if (!status) // если произошла ошибка загрузки конфига
<
printf( «Error: Load config failed\n» );
return -1;
>

// создаем потомка
p >
if (p >// если не удалось запустить потомка
<
// выведем на экран ошибку и её описание
printf( «Error: Start Daemon failed (%s)\n» , strerror(errno));

return -1;
>
else if (!p >// если это потомок
<
// данный код уже выполняется в процессе потомка
// разрешаем выставлять все биты прав на создаваемые файлы,
// иначе у нас могут быть проблемы с правами доступа
umask(0);

// создаём новый сеанс, чтобы не зависеть от родителя
setsid();

// переходим в корень диска, если мы этого не сделаем, то могут быть проблемы.
// к примеру с размантированием дисков
chdir( «/» );

// закрываем дискрипторы ввода/вывода/ошибок, так как нам они больше не понадобятся
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

// Данная функция будет осуществлять слежение за процессом
status = MonitorProc();

return status;
>
else // если это родитель
<
// завершим процес, т.к. основную свою задачу (запуск демона) мы выполнили
return 0;
>
>

* This source code was highlighted with Source Code Highlighter .

int MonitorProc()
<
int pid;
int status;
int need_start = 1;
sigset_t sigset;
siginfo_t siginfo;

// настраиваем сигналы которые будем обрабатывать
sigemptyset(&sigset);

// сигнал остановки процесса пользователем
sigaddset(&sigset, SIGQUIT);

// сигнал для остановки процесса пользователем с терминала
sigaddset(&sigset, SIGINT);

// сигнал запроса завершения процесса
sigaddset(&sigset, SIGTERM);

// сигнал посылаемый при изменении статуса дочернего процесса
sigaddset(&sigset, SIGCHLD);

// пользовательский сигнал который мы будем использовать для обновления конфига
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset, NULL);

// данная функция создаст файл с нашим PID’ом
SetPidFile(PID_FILE);

// бесконечный цикл работы
for (;;)
<
// если необходимо создать потомка
if (need_start)
<
// создаём потомка
p > >

if (p >// если произошла ошибка
<
// запишем в лог сообщение об этом
WriteLog( «[MONITOR] Fork failed (%s)\n» , strerror(errno));
>
else if (!p >// если мы потомок
<
// данный код выполняется в потомке

// запустим функцию отвечающую за работу демона
status = WorkProc();

// завершим процесс
exit(status);
>
else // если мы родитель
<
// данный код выполняется в родителе

// ожидаем поступление сигнала
sigwaitinfo(&sigset, &siginfo);

// если пришел сигнал от потомка
if (siginfo.si_signo == SIGCHLD)
<
// получаем статус завершение
wait(&status);

// преобразуем статус в нормальный вид
status = WEXITSTATUS(status);

// если потомок завершил работу с кодом говорящем о том, что нет нужды дальше работать
if (status == CHILD_NEED_TERMINATE)
<
// запишем в лог сообщени об этом
WriteLog( «[MONITOR] Child stopped\n» );

// прервем цикл
break ;
>
else if (status == CHILD_NEED_WORK) // если требуется перезапустить потомка
<
// запишем в лог данное событие
WriteLog( «[MONITOR] Child restart\n» );
>
>
else if (siginfo.si_signo == SIGUSR1) // если пришел сигнал что необходимо перезагрузить конфиг
<
kill(p >// перешлем его потомку
need_start = 0; // установим флаг что нам не надо запускать потомка заново
>
else // если пришел какой-либо другой ожидаемый сигнал
<
// запишем в лог информацию о пришедшем сигнале
WriteLog( «[MONITOR] Signal %s\n» , strsignal(siginfo.si_signo));

// убьем потомка
kill(pid, SIGTERM);
status = 0;
break ;
>
>
>

// запишем в лог, что мы остановились
WriteLog( «[MONITOR] Stop\n» );

// удалим файл с PID’ом
unlink(PID_FILE);

* This source code was highlighted with Source Code Highlighter .

f = fopen(Filename, «w+» );
if (f)
<
fprintf(f, «%u» , getpid());
fclose(f);
>
>

* This source code was highlighted with Source Code Highlighter .

int WorkProc()
<
struct sigaction sigact;
sigset_t sigset;
int signo;
int status;

// сигналы об ошибках в программе будут обрататывать более тщательно
// указываем что хотим получать расширенную информацию об ошибках
sigact.sa_flags = SA_SIGINFO;
// задаем функцию обработчик сигналов
sigact.sa_sigaction = signal_error;

// установим наш обработчик на сигналы

sigaction(SIGFPE, &sigact, 0); // ошибка FPU
sigaction(SIGILL, &sigact, 0); // ошибочная инструкция
sigaction(SIGSEGV, &sigact, 0); // ошибка доступа к памяти
sigaction(SIGBUS, &sigact, 0); // ошибка шины, при обращении к физической памяти

// блокируем сигналы которые будем ожидать
// сигнал остановки процесса пользователем
sigaddset(&sigset, SIGQUIT);

// сигнал для остановки процесса пользователем с терминала
sigaddset(&sigset, SIGINT);

// сигнал запроса завершения процесса
sigaddset(&sigset, SIGTERM);

// пользовательский сигнал который мы будем использовать для обновления конфига
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset, NULL);

// Установим максимальное кол-во дискрипторов которое можно открыть
SetFdLimit(FD_LIMIT);

Читайте также:  Установка плинтуса пвх фер

// запишем в лог, что наш демон стартовал
WriteLog( «[DAEMON] Started\n» );

// запускаем все рабочие потоки
status = InitWorkThread();
if (!status)
<
// цикл ожижания сообщений
for (;;)
<
// ждем указанных сообщений
sigwait(&sigset, &signo);

// если то сообщение обновления конфига
if (signo == SIGUSR1)
<
// обновим конфиг
status = ReloadConfig();
if (status == 0)
<
WriteLog( «[DAEMON] Reload config failed\n» );
>
else
<
WriteLog( «[DAEMON] Reload config OK\n» );
>
>
else // если какой-либо другой сигнал, то выйдим из цикла
<
break ;
>
>

// остановим все рабочеи потоки и корректно закроем всё что надо
DestroyWorkThread();
>
else
<
WriteLog( «[DAEMON] Create work thread failed\n» );
>

// вернем код не требующим перезапуска
return CHILD_NEED_TERMINATE;
>

* This source code was highlighted with Source Code Highlighter .

По коду требуется сказать:

  • InitWorkThread — функция которая создаёт все рабочие потоки демона и инициализирует всю работу.
  • DestroyWorkThread — функция которая останавливает рабочие потоки демона и корректно освобождает ресурсы.
  • ReloadConfig — функция осуществляющая обновление конфига (заново считать файл и внести необходимые изменения в свою работу). Имя файла можно также взять из параметров командной строки.

Данные функции зависят уже от вашей реализации демона.

Принципе работы следующий: устанавливаем свой обработчик на сигналы ошибок, затем запускаем все рабочие потоки и ждем сигналов завершения или обновления конфига.

Обработка ошибок при работе, с подробным отчетом в лог.

Конечно же демоны должны работать идеально и не вызывать всякого рода ошибок, но ошибаться может каждый, да и порой встречаются ошибки, которые довольно тяжело обнаружить на стадии тестирования. Особенно это актуально для ошибок которые проявляются при большой загруженности. По этому важным моментом в разработке демона является правильная обработка ошибок, а также выжимание из ошибки как можно большей информации. В данном случае рассмотрим обработку ошибок с сохранением стека вызовов (backtrace). Это даст нам информацию о том, где именно произошла ошибка (в какой функции), а также мы сможем узнать то, кто вызвал эту функцию.

Код функции обработчика ошибок:

static void signal_error( int sig, siginfo_t *si, void *ptr)
<
void * ErrorAddr;
void * Trace[16];
int x;
int TraceSize;
char ** Messages;

// запишем в лог что за сигнал пришел
WriteLog( «[DAEMON] Signal: %s, Addr: 0x%0.16X\n» , strsignal(sig), si->si_addr);

#if __WORDSIZE == 64 // если дело имеем с 64 битной ОС
// получим адрес инструкции которая вызвала ошибку
ErrorAddr = ( void *)((ucontext_t*)ptr)->uc_mcontext.gregs[REG_RIP];
#else
// получим адрес инструкции которая вызвала ошибку
ErrorAddr = ( void *)((ucontext_t*)ptr)->uc_mcontext.gregs[REG_EIP];
#endif

// произведем backtrace чтобы получить весь стек вызовов
TraceSize = backtrace(Trace, 16);
Trace[1] = ErrorAddr;

// получим расшифровку трасировки
Messages = backtrace_symbols(Trace, TraceSize);
if (Messages)
<
WriteLog( «== Backtrace ==\n» );

// запишем в лог
for (x = 1; x «%s\n» , Messages[x]);
>

WriteLog( «== End Backtrace ==\n» );
free(Messages);
>

// остановим все рабочие потоки и корректно закроем всё что надо
DestroyWorkThread();

// завершим процесс с кодом требующим перезапуска
exit(CHILD_NEED_WORK);
>

* This source code was highlighted with Source Code Highlighter .

При использовании backtrace можно получить данные примерно такого вида:
[DAEMON] Signal: Segmentation fault, Addr: 0x0000000000000000
== Backtrace ==
/usr/sbin/my_daemon(GetParamStr+0x34) [0x8049e44]
/usr/sbin/my_daemon(GetParamInt+0x3a) [0x8049efa]
/usr/sbin/my_daemon(main+0x140) [0x804b170]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x126bd6]
/usr/sbin/my_daemon() [0x8049ba1]
== End Backtrace ==

Из этих данных видно, что функция main вызвала функцию GetParamInt. Функция GetParamInt вызвала GetParamStr. В функции GetParamStr по смещению 0x34 произошло обращение к памяти по нулевому адресу.

Также помимо стека вызовов можно сохранить и значение регистров (массив uc_mcontext.gregs).
Необходимо заметить, что наибольшую информативность от backtrace можно получить только при компилировании без вырезания отладочной информации, а также с использованием опции -rdynamic.

Как можно было заметить, в коде используются константы CHILD_NEED_WORK и CHILD_NEED_TERMINATE. Значение этих констант вы можете назначать сами, главное чтобы они были не одинаковые.

Некоторые вопросы связанные с ресурсами системы.

Важным моментом является установка максимального кол-ва дескрипторов. Любой открытый файл, сокет, пайп и прочие тратят дескрипторы, при исчерпании которых невозможно будет открыть файл или создать сокет или принять входящее подключение. Это может сказаться на производительности демона. По умолчанию максимальное кол-во открытых дескрипторов равно 1024. Такого кол-ва очень мало для высоконагруженных сетевых демонов. Поэтому мы будем ставить это значение больше в соответствии со своими требованиями. Для этого используем следующую функцию:

int SetFdLimit( int MaxFd)
<
struct rlimit lim;
int status;

// зададим текущий лимит на кол-во открытых дискриптеров
lim.rlim_cur = MaxFd;
// зададим максимальный лимит на кол-во открытых дискриптеров
lim.rlim_max = MaxFd;

// установим указанное кол-во
status = setrlimit(RLIMIT_NOFILE, &lim);

* This source code was highlighted with Source Code Highlighter .

Вместо заключения.
Вот мы и рассмотрели как создать основу для демона. Конечно же код не претендует на идеальный, но со своими задачами справляется отлично.
В следующей статье будут рассмотрены моменты, связанные с установкой/удалением демона, управления им, написанием скриптов автозагрузки для init.d и непосредственно добавлением в автозагрузку.

источник

Добавить комментарий

Adblock
detector