Я уверен, что кто-то до сих пор этим занимается, но в те дни, когда еще не было таких вещей, как 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 Я не понимаю этот уровень достаточно хорошо, чтобы его сварить.
Приведенная выше ссылка, вероятно, ответит, что для этих целей, но в основном это адрес памяти.
Я посмотрел на некоторые файловые системы 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
Вот мой случай, почему база данных может быть хорошим решением:
id_tag
через декларативную систему адресации. Мой пример основан на идее, что каждое шоу идентифицируется уникальной записью, в одной таблице (проще, чем несколько таблиц) вся информация об этом радио-шоу будет содержаться в записи в этой таблице {{1} } используя 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