Как стать автором
Обновить

Комментарии 57

особенно тем, кто по тем или иным причинам перешёл на эту ОС с Windows

Разве файловые менеджеры не имеют корзин?

В Windows удаление из командной строки тоже по-моему удаляет файл навсегда.

К стати, не знаю стандарт ли это, но файловые менеджеры используют папку .Trash-UID к корне устройства, либо ~/.local/share/Trash для корня, круто было бы переносить файлы именно туда, и прописывать файлы в info поддиректорию.

А если сделать из этого deb/rpm пакет с DKMS, и будет перехватывать только файлы, которые удаляет пользователь сам, но не приложения в процессе работы — это будет полезный модуль с практическим применением.
Разве файловые менеджеры не имеют корзин?


Ну блин, это ж скучно :)

А если сделать из этого deb/rpm пакет с DKMS, и будет перехватывать только файлы, которые удаляет пользователь сам, но не приложения в процессе работы — это будет полезный модуль с практическим применением.


Что касается фильтрации по пользователям, то именно это не сложно сделать. Сложнее в ядре обрабатывать домашние каталоги и делать прочие вещи, как-то куда-то что-то прописывать. Не для этого, ядро всё-таки :)

И да, это же POC…
+1
Этим должны заниматься файловые менеджеры. Программы могут создавать и удалять тысячи файлов и рассчитывать что они исчезнут (не переполнят диск). В т.ч. и под win32.
Да не вопрос, вы просто сути не уловили. Это демонстрация применения метода динамической модификации ядра Linux :)
Демонстрация это хорошо, но первый абзац недвусмысленно намекает что это всерьёз:
Многим пользователям Linux, особенно тем, кто по тем или иным причинам перешёл на эту ОС с Windows, не хватает возможности удаления файлов «в корзину»
А, что, это и правда же всеръёз ;)
В linux и так всё замечательно удаляется в корзину (во всех DE что я видел). В Windows удаляется не в корзину, если с командной строки (хотя за последние версии винды не ручаюсь).
Да ладно вам уже :)
Видимо вы не работали с NetWare
Нет, а что там?..
А там была реализована системная корзина еще в 90-х, ни чего не тормозило.
Что будет, если удаляется файл из примонтированного раздела? Когда-то я монтировал второй винт в свою пользовательскую папку.
Корзина локальна для файловой системы. То есть если вы хотите удалять в корзину файлы с какой-то ФС, то именно на ней и нужно создавать .fstrash
но ведь дело то в том, что даже у меня куча всего намонтировано в /home/
Удаляемые файлы не копируются с раздела на раздел. Перемещение в корзину всегда происходит в рамках устройства.
ну я понимаю что такое жесткая ссылка, я про то что в разных местах были бы понатыканы .fstrash
Ммм… .ftrash будет нужен для каждого раздела, на котором предполагается необходимость удаления «в корзину». Или я не совсем вас понял?
А может как то можно научить файловые менеджеры (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_четотам (или как то так).
Ну можно в модуле запилить фильтр имён, но не знаю на сколько вас не будет смущать висящий в ядре модуль хукающий пару-тройку функций ядра :)
Я предполагаю что таким ядро не должно заниматься. Работа с файлами — дело файлового менеджера и/или окружения рабочего стола. Да и не реально просто так отучить Windows кидать во все папки с картинками свою базу превьюшек. Так что каждая система своими «скрытыми» файлами радует.
Да, это не ядерные задачи, конечно. Можно через LD_PRELOAD so'шку грузить в которой фильтровать доступ к файлам, например. Но это же скучно :)
В windows файлы превьюшек отключаются очень просто, в ветке
HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\Explorer\Advanced\
Находим ключ DisableThumbnailCache и выставляем значение 1
Осталось это рассказать и показать всем юзерам, которым даю флешки =)
Также можно поставить галочку «не кешировать эскизы» в свойствах отображения папки, для достижения того же эффекта )
Thumb.db если не ошибаюсь исчезли вместе с Windows XP, новые версии вроде имеют наконец централизованное хранилище, а вот System Volume Information на флешке и/или USB HDD явно не нужен.
В трёх словах, что именно вы там делали и зачем приходилось патчить ядро?
Легко, нам нужно было собирать все изменения файлов на файловой системе ext4 — создание/удаление/правка данных/правка inode. Для этого сделали патч, который просто вклинивается в open/creat и прочие и собрали код помещения этого в кольцевой буфер.

А ну это можно и модулем было сделать. Либо патчить как в примере, что без проблем. Либо не патчить, а подменить LSM-модель, что также без проблем (см., например, тут).
А можно ссылки на доки по сабжу? Мы это под 2/6/33 делали, пытались найти более правильный подход, но как-то не вышло.
Правильный подход зависит от задачи, наверное. У меня посмотрите статьи, там есть на тему LSM и как его можно использовать. Но, подход с LSM немного ограничен; я не знаю про ваши задачи, опять же.
Да, это хотя и по теме, но через `LD_PRELOAD` работает. Юзер-спейс решение :)
Вам не кажется, что это как-то изпушкиповоробьино?

[irony]Я просто не могу не оставить это здесь, чего бы мне это не стоило. lorquotes.ru/view-quote.php?id=44[/irony]
Феерично :)
Извиняюсь, у меня вопрос не по сабжу. В описании структуры:
static struct qstr fstrash = {
        .len = 8, .name = ".fstrash",
};


Что значит поля через точку и без типов в первый раз вижу, правда и на чистом С много не писал?
Это инициализация структуры qstr.
Ух ты ж.
А вам бы макрос QSTR_INIT не подошел бы?
Да, подошёл бы, его походу не так давно добавили, я не видел. Спасибо за внимательность :)
Для с99 это стандартная фича.
Прошу прощения у читателей за дезинформацию, впредь буду внимательнее. Сказывается годовое отстутсвие практики на C.
Я как-то очень давно и под виндой привык удалять все исключительно путем нажатия Shift+Del.
Корзина всегда весьма раздражала необходимостью дополнительного действия для реального освобождения места на диске.
Хотя, не спорю, иногда интересно что-то реализовать чисто ради самого процесса и «челленжа» :)
Интересный концепт. Однако я сам что-то не соображу — правильно ли поведёт себя Ваш код, если два процесса будет одновременно удалять два линка на один и тот же инод. Конкретно вот эта строчка:

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 всё-таки нет корзины — предполагается мозг у пользователя.
На описываемом в статье уровне ни в одной ОС нет корзины. На уровне в котором она есть в 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
Вот тут, кстати, еще косяк
snprintf(name, sizeof(name), "XXX-%lu-%s", \ object->d_inode->i_ino, object->d_name.name);
При ограничении ext(2,3,4) на длину имени файла в 256 байт, если оригинальное имя было достаточно длинное, то новое, «корзиночное», имя по длине вылезет за пределы разрешенных 256 байт. Что будет потом, я сам не знаю =)
А как вы думаете, что означает буковка n в функции snprintf?
Ну видимо, больше 64 байт не запишет, насколько я понимаю C.
Я не программист, я просто спросил)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории