Комментарии 57
особенно тем, кто по тем или иным причинам перешёл на эту ОС с Windows
Разве файловые менеджеры не имеют корзин?
В Windows удаление из командной строки тоже по-моему удаляет файл навсегда.
К стати, не знаю стандарт ли это, но файловые менеджеры используют папку .Trash-UID к корне устройства, либо ~/.local/share/Trash для корня, круто было бы переносить файлы именно туда, и прописывать файлы в info поддиректорию.
А если сделать из этого deb/rpm пакет с DKMS, и будет перехватывать только файлы, которые удаляет пользователь сам, но не приложения в процессе работы — это будет полезный модуль с практическим применением.
Разве файловые менеджеры не имеют корзин?
Ну блин, это ж скучно :)
А если сделать из этого deb/rpm пакет с DKMS, и будет перехватывать только файлы, которые удаляет пользователь сам, но не приложения в процессе работы — это будет полезный модуль с практическим применением.
Что касается фильтрации по пользователям, то именно это не сложно сделать. Сложнее в ядре обрабатывать домашние каталоги и делать прочие вещи, как-то куда-то что-то прописывать. Не для этого, ядро всё-таки :)
И да, это же POC…
+1
Этим должны заниматься файловые менеджеры. Программы могут создавать и удалять тысячи файлов и рассчитывать что они исчезнут (не переполнят диск). В т.ч. и под win32.
Этим должны заниматься файловые менеджеры. Программы могут создавать и удалять тысячи файлов и рассчитывать что они исчезнут (не переполнят диск). В т.ч. и под win32.
Да не вопрос, вы просто сути не уловили. Это демонстрация применения метода динамической модификации ядра Linux :)
Демонстрация это хорошо, но первый абзац недвусмысленно намекает что это всерьёз:
Многим пользователям Linux, особенно тем, кто по тем или иным причинам перешёл на эту ОС с Windows, не хватает возможности удаления файлов «в корзину»
Видимо вы не работали с NetWare
Что будет, если удаляется файл из примонтированного раздела? Когда-то я монтировал второй винт в свою пользовательскую папку.
Корзина локальна для файловой системы. То есть если вы хотите удалять в корзину файлы с какой-то ФС, то именно на ней и нужно создавать
.fstrash
А может как то можно научить файловые менеджеры (nautilus в частности) не гадить на FAT/NTFS флешки скрытой папкой корзины? А то она скрытая то только для файлового менеджера с дефолтными настройками, а в винде очень даже хорошо показывается.
Это легко сделать, наверное. Просто запретить ядру создавать файл в корне с определённым именем… Какое оно, кстати? А вас смущает наличие такой папки или же наличие там удаляемых файлов?
$ uname -a
Linux sovgvd-nb 3.2.0-58-generic-pae #88-Ubuntu SMP Tue Dec 3 18:00:02 UTC 2013 i686 i686 i386 GNU/Linux
Если не изменияет память, то наутилус оставляе в корне .Trash или .Trash-NNN (конечно если не делать shift+del или wipe)
Меня смущает любой мусор на флешке, в том числе виндовые Thumb.db и маковые .DC_четотам (или как то так).
Linux sovgvd-nb 3.2.0-58-generic-pae #88-Ubuntu SMP Tue Dec 3 18:00:02 UTC 2013 i686 i686 i386 GNU/Linux
Если не изменияет память, то наутилус оставляе в корне .Trash или .Trash-NNN (конечно если не делать shift+del или wipe)
Меня смущает любой мусор на флешке, в том числе виндовые Thumb.db и маковые .DC_четотам (или как то так).
Ну можно в модуле запилить фильтр имён, но не знаю на сколько вас не будет смущать висящий в ядре модуль хукающий пару-тройку функций ядра :)
Я предполагаю что таким ядро не должно заниматься. Работа с файлами — дело файлового менеджера и/или окружения рабочего стола. Да и не реально просто так отучить Windows кидать во все папки с картинками свою базу превьюшек. Так что каждая система своими «скрытыми» файлами радует.
Да, это не ядерные задачи, конечно. Можно через LD_PRELOAD so'шку грузить в которой фильтровать доступ к файлам, например. Но это же скучно :)
В windows файлы превьюшек отключаются очень просто, в ветке
HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\Explorer\Advanced\
Находим ключ DisableThumbnailCache и выставляем значение 1
HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\Explorer\Advanced\
Находим ключ DisableThumbnailCache и выставляем значение 1
Thumb.db если не ошибаюсь исчезли вместе с Windows XP, новые версии вроде имеют наконец централизованное хранилище, а вот System Volume Information на флешке и/или USB HDD явно не нужен.
Занятно, мы когда-то делали что-то похожее, github.com/FastVPSEestiOu/Linux-kernel-fast-logging-path но патчем ядра. Выходит, нашу задачу можно реализовать модулем ядра?
В трёх словах, что именно вы там делали и зачем приходилось патчить ядро?
Легко, нам нужно было собирать все изменения файлов на файловой системе ext4 — создание/удаление/правка данных/правка inode. Для этого сделали патч, который просто вклинивается в open/creat и прочие и собрали код помещения этого в кольцевой буфер.
А можно ссылки на доки по сабжу? Мы это под 2/6/33 делали, пытались найти более правильный подход, но как-то не вышло.
не могу не вспомнить библиотеку libtrash
Вам не кажется, что это как-то изпушкиповоробьино?
[irony]Я просто не могу не оставить это здесь, чего бы мне это не стоило. lorquotes.ru/view-quote.php?id=44[/irony]
[irony]Я просто не могу не оставить это здесь, чего бы мне это не стоило. lorquotes.ru/view-quote.php?id=44[/irony]
Извиняюсь, у меня вопрос не по сабжу. В описании структуры:
Что значит поля через точку и без типов в первый раз вижу, правда и на чистом С много не писал?
static struct qstr fstrash = {
.len = 8, .name = ".fstrash",
};
Что значит поля через точку и без типов в первый раз вижу, правда и на чистом С много не писал?
Это уже не чистый C, а расширение GCC.
Я как-то очень давно и под виндой привык удалять все исключительно путем нажатия Shift+Del.
Корзина всегда весьма раздражала необходимостью дополнительного действия для реального освобождения места на диске.
Хотя, не спорю, иногда интересно что-то реализовать чисто ради самого процесса и «челленжа» :)
Корзина всегда весьма раздражала необходимостью дополнительного действия для реального освобождения места на диске.
Хотя, не спорю, иногда интересно что-то реализовать чисто ради самого процесса и «челленжа» :)
Интересный концепт. Однако я сам что-то не соображу — правильно ли поведёт себя Ваш код, если два процесса будет одновременно удалять два линка на один и тот же инод. Конкретно вот эта строчка:
Вот пример. В начале инод имеет i_nlink == 2. Затем два процесса подходят к этой строке, видят, что ещё один линк останется, и спокойно продолжают удалять каждый свою ссылку, не затруднившись зайти в move_to_trash(). В результате никто не создаст копию в корзине.
Или там подразумевается какой-то семафор на уровне выше, ещё до вызова fstrash_unlink()?
if (dentry->d_inode->i_nlink == 1) {
...
}
Вот пример. В начале инод имеет i_nlink == 2. Затем два процесса подходят к этой строке, видят, что ещё один линк останется, и спокойно продолжают удалять каждый свою ссылку, не затруднившись зайти в move_to_trash(). В результате никто не создаст копию в корзине.
Или там подразумевается какой-то семафор на уровне выше, ещё до вызова fstrash_unlink()?
Вы — внимательный читатель, это здорово. На самом деле, действительно, синхронизация происходит уровнем выше в функции vfs_unlink. Я добавлю в статью информацию об этом, спасибо.
Идея и реализация интересные. С файловыми системами на уровне ядра не взаимодействовал, полистаю код.
Хорошо, что в GNU/Linux всё-таки нет корзины — предполагается мозг у пользователя. Многие утилиты имеют режим «no action», в котором они только печатают, что намереваются делать или запрашивают подтверждение (rm -i, mv -i, rename -n). Посмотрел вывод, убедился что ничего нужного не исчезнет, запустил уже в рабочем режиме.
Ну и для восстановления недавно удалённого (незатёртого) на разделе ext есть extundelete.
Хорошо, что в GNU/Linux всё-таки нет корзины — предполагается мозг у пользователя. Многие утилиты имеют режим «no action», в котором они только печатают, что намереваются делать или запрашивают подтверждение (rm -i, mv -i, rename -n). Посмотрел вывод, убедился что ничего нужного не исчезнет, запустил уже в рабочем режиме.
Ну и для восстановления недавно удалённого (незатёртого) на разделе ext есть extundelete.
Хорошо, что в GNU/Linux всё-таки нет корзины — предполагается мозг у пользователя.На описываемом в статье уровне ни в одной ОС нет корзины. На уровне в котором она есть в windows (или что вы там имеете в виду) она имеется везде.
Данный способ позволяет держать корзину для любой ФС, поддерживающей хардлинки…
[irony] А простой алиас вида «rm='mv -t .fstrash/' » не? =) [/irony]
Ну это слишком просто же ;)
Юзаю такой скриптик на серверах (нормально работает от рута, от юзера будет ругаться на права).
#!/bin/bash if [ $# -eq 0 ] ; then echo "Usage: $0 filename ..." ; exit 1 ; fi FSTRASH='.fstrash' while [ $# -gt 0 ] ; do case $1 in -* ) shift ; continue ;; esac FILENAME=$1 FULLFILENAME=$(stat --printf='%n\n' ${FILENAME}) if [ $? -ne 0 ] ; then shift ; continue ; fi FS='' #LS='' ISNOTFINDEDFS=0 if [ ${FULLFILENAME:0:1} != '/' ] ; then FULLFILENAME="${PWD}/${FULLFILENAME}" fi FSPATHLIST="$(mount | grep -E '^\/dev\/' | awk '{print $3}' | sed -n '1d;p')" for FS in ${FSPATHLIST} ; do if [ x"${FS}" = x"${FULLFILENAME:0:${#FS}}" ] ; then ISNOTFINDEDFS=1 mkdir -p "${FS}/${FSTRASH}" &>/dev/null if [ $? -eq 0 ] ; then mv --target-directory="${FS}/${FSTRASH}" "${FULLFILENAME}" else echo "${FULLFILENAME} :: Не достаточно прав!" fi break fi done if [ $ISNOTFINDEDFS -eq 0 ] ; then mkdir -p "/${FSTRASH}" &>/dev/null if [ $? -eq 0 ] ; then mv --target-directory="/${FSTRASH}" "${FULLFILENAME}" else echo "${FULLFILENAME} :: Не достаточно прав!" fi fi shift done
Вот тут, кстати, еще косяк
При ограничении ext(2,3,4) на длину имени файла в 256 байт, если оригинальное имя было достаточно длинное, то новое, «корзиночное», имя по длине вылезет за пределы разрешенных 256 байт. Что будет потом, я сам не знаю =)
snprintf(name, sizeof(name), "XXX-%lu-%s", \
object->d_inode->i_ino, object->d_name.name);
При ограничении ext(2,3,4) на длину имени файла в 256 байт, если оригинальное имя было достаточно длинное, то новое, «корзиночное», имя по длине вылезет за пределы разрешенных 256 байт. Что будет потом, я сам не знаю =)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Динамическое расширение ядра Linux — добавляем функцию «удалить в корзину»