прозрачный «символическая ссылка + двоичный патч»

Я уверен, что кто-то до сих пор этим занимается, но в те дни, когда еще не было таких вещей, как ILO / DRAC и т. Д. стал дешевым и повсеместным, лучший способ получить "внеполосный" доступ к консоли в случае возникновения чрезвычайных ситуаций или ошибки был через последовательный порт. Вы бы установили терминальный сервер в стойку, а затем проложили бы кабели к последовательному порту ваших серверов. Некоторые BIOS поддерживали перенаправление консоли на последовательный порт (например, серверы VA Linux и SuperMicro в период 1999+).

8250/16550 UARTS были одними из самых популярных микросхем последовательного порта в то время, а это означало, что они лучше всего поддерживались под Linux, и все они использовали драйвер ядра 8250 (в этой серии было гораздо больше моделей. что все использовали один и тот же драйвер).

Я подозреваю, что многие проекты SoC, предназначенные для использования в Linux, встроили в них UART, совместимые с 8250/16550, потому что это была простая кнопка - хорошо документированный и хорошо протестированный драйвер. Хотелось бы надеяться, что они построили более поздние версии многобайтовых буферов (конечно, даже «медленные» процессоры по сегодняшним стандартам могут обслуживать последовательные прерывания гораздо чаще, чем последовательный порт 115k). IIRC Mac имел последовательный порт, используемый для Local / Apple Talk (не могу вспомнить, какой был протокол, а какое оборудование), который делал 248k. Тем не менее, это было еще тогда, когда процессоры работали с частотой 60 МГц.

Это, вероятно, лучший ответ на разницу между MMIO и портом ввода-вывода: https://en.wikipedia.org/wiki/Memory-mapped_I/O Я не понимаю этот уровень достаточно хорошо, чтобы его сварить.

Приведенная выше ссылка, вероятно, ответит, что для этих целей, но в основном это адрес памяти.

3
07.08.2016, 01:07
2 ответа

Я посмотрел на некоторые файловые системы fuse, и самой простой для работы оказалась concatfs Питера Шлейля. Если ничего другого нет, то это хорошее место для начала, так как реализация кода на C небольшая и самодостаточная.

По сути, для любого файла A, на который вы хотите сделать "симлинк", в произвольном каталоге исходников S вы создаете файл B, который содержит только информацию о тегах id3 (версия 2), которая вам нужна, затем волшебный файл C с именем, содержащим символы "-concat-". Этот файл C содержит, по порядку, имена B и A.

При запуске программы concatfs вы указываете исходный каталог S и второй произвольный каталог точки монтирования M. В M вы увидите все те же файлы, что и в S, но при чтении файла C вы получите конкатенацию B и A, то есть ваши новые теги, за которыми следуют реальные данные mp3. Очевидно, что только волшебные файлы должны находиться в S, так как вы можете использовать абсолютные или относительные пути в волшебном файле.

Это не идеально, потому что если ваш файл A содержит теги id3v2 (в начале файла), они будут добавлены к тегам в файле B. Кроме того, теги id3v1 (в конце файла) все еще будут присутствовать. Однако с помощью некоторого кодирования на C можно подавить начало и конец A. Также тривиально изменить магическую строку "-concat-".

Вот команды, которые я использовал для тестирования concatfs. Установите пакет fuse-devel, чтобы вы могли скомпилировать код. Для остального не нужно быть root. Скачайте и разархивируйте исходники и скомпилируйте их:

cd concatfs
gcc -Wall src/concatfs.c $(pkg-config fuse --cflags --libs) -o concatfs

Создайте 2 директории, запустите команду и скопируйте какой-нибудь mp3-файл для игры, удалив в нем все теги:

mkdir -p ~/myfuse/src ~/myfuse/mnt
./concatfs ~/myfuse/src ~/myfuse/mnt  # runs in background
cd ~/myfuse/src
cp ....sometestfile.mp3 try.mp3
id3v2 --delete-v1 try.mp3
id3v2 --delete-v2 try.mp3
id3info try.mp3

Создайте фиктивный файл, волшебный файл и добавьте к нему несколько тегов id3v2:

echo -e 'dummy.mp3\ntry.mp3' > try.mp3-concat-.mp3
> dummy.mp3
id3v2 -2 -c 'my description:my comment' -a  'my artist' -A 'my album' -y '2010' -T 1/2  dummy.mp3
hexdump -C dummy.mp3 
ls -l

Загляните во второй каталог и найдите те же файлы, но размер и содержимое волшебного файла - это конкатенация двух файлов:

ls ../mnt/ -l
cat ../mnt/try.mp3-concat-.mp3 | wc -c
id3info ../mnt/try.mp3-concat-.mp3
mediainfo ../mnt/try.mp3-concat-.mp3

Когда вы убьете программу, вам может понадобиться очистить mount:

fusermount -u ~/myfuse
1
27.01.2020, 21:26

Вот мой случай, почему база данных может быть хорошим решением:

  • Поскольку язык запросов SQL является гибким, он позволяет связывать старые и новые имена файлов с id_tag ​​ через декларативную систему адресации.
  • Его можно расширить для предоставления дополнительных возможностей - в качестве примера я добавил тег категории в сценарий ниже.
  • при использовании SQLite его можно использовать из командной строки, и он выдает STDOUT, который можно передавать по конвейеру, перенаправлять и т. Д.

Мой пример основан на идее, что каждое шоу идентифицируется уникальной записью, в одной таблице (проще, чем несколько таблиц) вся информация об этом радио-шоу будет содержаться в записи в этой таблице {{1} } используя sqlite

, установите sqlite

apt-get install sqlite3

или используйте yum , pacman , выполните сборку из исходных текстов или любой другой

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

файл: music_db.sh

#!/bin/bash

if [ -f music_db ]
then
    rm -v music_db
fi

sqlite3 music_db << 'EOF'
    create table radio_shows(
        original_filename text,
        new_filename      text,
        id_tag            text,
        category_tags     text
    );
EOF

sqlite3 music_db << 'EOF'
    insert into radio_shows 
    (original_filename, new_filename, id_tag, category_tags) values
    ('first_show-001', 'first_show-001--new_naming_scheme', 'id_tag aaa', 'favourite_shows'),
    ('first_show-002', 'first_show-002--new_naming_scheme', 'id_tag aab', 'favourite_shows'),
    ('first_show-003', 'first_show-003--new_naming_scheme', 'id_tag aac', 'crap_shows'),
    ('first_show-004', 'first_show-004--new_naming_scheme', 'id_tag aad', 'favourite_shows');
EOF

Затем используйте из командной строки: например добавить новое шоу

% sqlite3 music_db <<EOF
insert into radio_shows                  
(new_filename, id_tag, category_tags) values 
('a_new_show', 'xyz_123', 'good_show'); 
EOF

получить шоу (позднее) и распечатать в STDOUT

% sqlite3 music_db <<EOF
select new_filename, id_tag
from radio_shows
where category_tags = "good_show";
EOF

результат

a_new_show|xyz_123
1
27.01.2020, 21:26

Теги

Похожие вопросы