LINUX.ORG.RU

Lunatik v3.6 — релиз среды исполнения Lua в пространстве ядра Linux

 , , , ,

Lunatik v3.6 — релиз среды исполнения Lua в пространстве ядра Linux

0

4

Lunatik — это фреймворк для написания сценариев для ядра Linux на Lua. Разрабатывается LabLua в рамках Lua in kernel с явными ссылками на опыт использования Lua в ядре NetBSD.

Основные компоненты

  • интерпретатор Lua, модифицированный для работы в ядре;
  • драйвера устройства (написаны на Lua);
  • средства командной строки для запуска сценариев и управления средами выполнения из пользовательского пространства;
  • C API для загрузки и запуска сценариев и управления средами выполнения из ядра;
  • Lua API для привязки средств ядра к Lua-скриптам.

Новые возможности


Группа разработчиков Lunatik выражает благодарность контрибуторам, благодаря которым стал возможен этот релиз: sav и marcelstanley из Ring-0 Networks, sheharyaar, jperon, vincentmli, rustedusted, glk0, ну и конечно же всем другим участникам, работающими над Lunatik.

Пример драйвера устройства для генерации простых «паролей»

-- /lib/modules/lua/passwd.lua
--
-- implements /dev/passwd for generate passwords
-- usage: $ sudo lunatik run passwd
--        $ head -c <width> /dev/passwd

local device = require("device")
local linux  = require("linux")

local function nop() end -- do nothing

local s = linux.stat
local driver = {name = "passwd", open = nop, release = nop, mode = s.IRUGO}

function driver:read() -- read(2) callback
	-- generate random ASCII printable characters
	return string.char(linux.random(32, 126))
end

-- creates a new character device
device.new(driver)

>>> Исходный код релиза

>>> Документация, исходный код и примеры проекта

>>> Сопутствующие проекты

>>> Анонс в официальной группе Lua

★★★★★

Проверено: CrX ()
Последнее исправление: hobbit (всего исправлений: 9)
Ответ на: комментарий от gagarin0

Пожалуй ты прав, работает это все немного не так, как я ожидал. Для прототипирования может и пойдет. Ну и как канал получения какой-то оперативной информации из ядра. Типа нетлинком пользоваться геморно, а вот условно температуру процессора узнать можно одним вызовом.

gns ★★★★★
()
Ответ на: комментарий от sena

С учётом того, что большинство срачей и истерик по поводу Раста на ЛОРе заводили любители сишечки/плюсов, такие заявления смотрятся особо занимательно.

WatchCat ★★★★★
()
Ответ на: комментарий от sena

Ну в данном контексте про скорость речь и вовсе не идет. Скрипт же грузится в ядро «построчно». Типа интерпретатору в ядре говорят «создай контекст исполнения нового скрипта». Ну и грузят скрипт ioctl'm построчно специально обученной тулзой. Интерпретатор на каждый ioctl что-то отвечает. Ну вот так это все с ядром и общается.

А про руст — да, пусть пыль осядет. Пока истерики и политики больше, чем инженерного смысла.

gns ★★★★★
()
Ответ на: комментарий от bender

Если для сборки ядра при этом не понадобится собирать компилятор, собираемый только этим же компилятором и требующим жырный llvm - почему нет?
Будет gccrs собирать ядерный rust код - бомбёжки на него будет меньше, но rust не может пока что в несколько реализаций

mittorn ★★★★★
()
Ответ на: комментарий от LightDiver

На самый верх скроль, там пример даже с подсветкой синтаксиса и комментариями.

CYB3R ★★★★★
()
Ответ на: комментарий от mord0d

Так у numpy та часть, что считает, на си и написана.

amm ★★
()
Ответ на: комментарий от frier

компьютеры нынче несуразно быстрые, они и не такое пережуют

За такие рассуждения в приличном обществе морду бьют.

Radjah ★★★★★
()
Ответ на: комментарий от sena

Вот почему-то не видел ни одного срача из-за Луа. Как ты думаешь, почему?

Об этом и пишет @FishHook. Как только какая-то технология становится популярной, она обретает hate среди форумных экспертов. Фактически Lua ничем от JavaScript не отличается, кроме популярности. Ненавидеть JavaScript — это «правило хорошего тона» среди «true-программистов», а вот Lua — «правило хорошего тона» уважать.

Сравним Lua и JavaScript в отрыве от библиотек. Оба — высокоуровневые интерпретируемые языки с весьма специфической реализацией ООП и ассоциативными массивами. Более того, у Lua индексация начинается с 1. Но это никого особо не парит. По одной простой причине: Lua малоизвестна и носит оттенок экзотичности и элитарности.

Если бы Lua была встроена в браузеры, её точно так же бы ненавидели senior chat experts и обзывали языком для макак.

То же самое можно сказать и про Tcl. Его уважают только потому, что он фактически не используется.

Опять же, я говорю о специфической части Linux-тусовки, а не об IT в целом.

lbvf50txt
()
Ответ на: комментарий от buddhist

Ну вот я люблю сишку, она прекрасна. Хотя и приходится работать с луа и питоном. Но у меня просто не с чем работать на си, а так с удовольствием бы работал. Чего все так не навидят си?

LightDiver ★★★★★
()
Ответ на: комментарий от Radjah

За такие рассуждения в приличном обществе морду бьют.

Пойдёшь кому-нибудь морду бить за такие рассуждения – меня позови, я поучаствую (потому как вообще-то правильно делают, что бьют). Но это никак не отменяет того, что при обсуждении допустимости или недопустимости скриптухи в ядре эта самая скорость выполнения – дело даже не десятое, поскольку есть проблемы посерьёзнее. Ну то есть скорость может быть проблемой, несомненно, но бывают более серьёзные.

frier
()
Ответ на: комментарий от LightDiver

Я имел в виду любителей и сишки, и крестов одновременно

buddhist ★★★★★
()
Ответ на: комментарий от LightDiver

скорость в луа это просто моя больная тема

Так переходи на LuaJIT!

CYB3R ★★★★★
()
Ответ на: комментарий от Playermet

Так вот откуда такая длина чистого стринга - 17 байт. Там инфа о нем хранится вся. Спасибо, понял.

LightDiver ★★★★★
()
Ответ на: комментарий от lbvf50txt

Об этом и пишет @FishHook. Как только какая-то технология становится популярной, она обретает hate среди форумных экспертов. Фактически Lua ничем от JavaScript не отличается, кроме популярности. Ненавидеть JavaScript — это «правило хорошего тона» среди «true-программистов», а вот Lua — «правило хорошего тона» уважать.

В твоих словах и словах @FishHook есть большая доля правды. Но здесь есть и другие аспекты. Например shell популярен, python тоже популярен, с/с++. Есть примеры скажем так, более положительной популярности и примеры отрицательно популярности. Когда какую-то технологию (почти всегда новую) продвигают через чур агрессивно, а также массово навязывают.

sena ★★
()
Последнее исправление: sena (всего исправлений: 2)
Ответ на: комментарий от Playermet

Слушай, а скажи мне такую вещь. Вот у меня задача:

Хранение объектов без разделителей в строках. Каждый объект 3 символа. Каждая строка по 300 символов.

Например так:

nsFldS = {
	["Шеф"] = {
		["objects"] = "0ka0ka00t0ka0ka0ka00t0ka0ka00t00t0ka0ka0ka00t00t0ka0ka0ka00t0ob0ka0ka0ka0ka0ka00t0ka0ka00t0ka0ka0ka0ka0ka0ka0ka0ka0ka0ka0ka0ka00t0ka00t0ka0ka0ka0ka0ka0ka00t0ka0ka0ka0ka0ka0ka0ka0ka00t0ka00t0ka00t00t0ka0ka0ka0ka00t00t0ka0ka00t00t0ka00t00t0ka0ka00t00t0ka0ka0ka0ka0ka00t0ka0ka0ka0ka0ka00t00t00t00t00t00t",
	},
}

function NsDb:addStaticStr(nik, nStr, nArg, message)
    local entry = self.input_table[nik] or {}
    self.input_table[nik] = entry
    
    if entry[nStr] == nil or entry[nStr] == "" then
        print("Строка не была инициализирована")
    end
    
    -- Вычисляем позиции один раз
    local start = (nArg - 1) * 3 + 1
    
    -- Собираем новую строку через буфер
    entry[nStr] = str_sub(currentStr, 1, start - 1) 
                .. str_sub("   "..message, 1, 3) 
                .. str_sub(currentStr, start + 3)
end

Теперь мне нужно активно работать с этой строкой. Например я хочу изменить третий объект - это 7-9 символы в строке. Как ты видишь, я пересобираю строку каждый раз. Строка создается новая и пересчитываются ее данные.

А если я буду использовать не ключи, а просто массив строк? Допустим строка под индексом 1 в таблице будет объкектами, под индексом 2 - их состояниями итд. Я получаю массив строк, а не хэш-таблицу. Стоит ли оно того? Будет ли разница при пересборке таких строк или пофигу? Конкретно в плане засирания ОЗУ при такой работе.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 3)
Ответ на: комментарий от Anoxemian

Невозможно. В таблицах уже на 5-8 тысячасх пользователей переполнение и обнуление всей базы аддона.

Если хранить в строках, сокращение элементов в 100 раз. То есть до 50-150 тысяч пользователей.

LightDiver ★★★★★
()
Ответ на: комментарий от Anoxemian

Я и решил проблему переполнения - перенес из таблиц данные в строки.

Вот сейчас в базе данных 151 тысяча строк - больше половины лимита. Это где то 3500 пользователей. То есть еще год активной работы и все рухнет. Если ничего не добавлять и не менять. Лучше уж сразу сделать нормально - в строках лимит не придет никогда.

Главное - понять как оптимальнее работать со строками в таком варианте. Чтобы не создать еще какой коллапс.

К слову, я уже терял базу: ввел логи, они засрали 150 тысяч строк лишних и все рухнуло. Пришлось восстанавливать недельной давности базу и убирать логи вообще.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Яннп, сервера вовки - это кластера, где количество нод наверно сотнями исчисляется. Ты все впихнуть в 8гб ноутбука пытаешься? И вообще, запили в пространстве бота клиента для внешней базы данных/сервера и там логику крути хоть на сях хоть как. Пока все выглядит буд-то ты сам себе проблему придумал и превозмогаешь.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Это НЕ мой сервер. Я там просто один из пользователей.

У меня там гильдия. В рамках гильдии пользователи ставят аддон - клиентскую часть. Через него они берут и выполняют квесты, эвенты.

Серверная часть аддона у меня. В ней логика квестов, ответ на запросы клиентских частей, хранение инфа о пользователях, их квестах и прогрессе.

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

LightDiver ★★★★★
()
Ответ на: комментарий от buddhist

Ты же понимаешь, что «C/C++» это устойчивое выражение? Тогда зачем газифицируешь мелкий водоём?

И да, судя по тому количеству говнокода, который мне приходилось править, где люди смешивают сишную стандартную библиотеку и плюсовую STL, а потом мы ловим segfault на ровном месте, множество нихрена не пустое.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)

Интересно, когда появятся более детальные тесты. Сейчас сложно сказать, насколько полезно

anzhelikabindel
()
Ответ на: комментарий от LightDiver

Серверная часть аддона у меня

Ну, в боте? Об этом и говорю, оставь бота чисто каналом связи, а всю работу реализуй как хочешь во вне. И от луы отвяжешься и ограничения памяти снимешь.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Я уже писал - не существует возможности прямой работы с данными в игре и нет возможности работы из игры с данными вне игры. Все в озу. Работа врамках игровой сессии. Все что ты сделаешь вне игры - уже неактуально.

Ты включаешь игру, подгружаются все файлы аддонов. Входишь в игру игровым персонажем, подгружаются все сохраненные данные аддонов в ОЗУ. Теперь ты можешь с этим работать.

Выходишь из игры - специально определенные переменные сохраняются на жесткий диск. Заранее определенные.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver
  1. Заходишь в игру
  2. Бот берет из памяти что ему надо, синхронизирует с базой во вне. Да хоть каждый раз заново все выгружает.
  3. Дальше тупо дергает внешний api на всякие там твои ивенты.

Например: https://github.com/nrk/redis-lua

Anoxemian ★★★★★
()
Последнее исправление: Anoxemian (всего исправлений: 1)
Ответ на: комментарий от WatchCat

«C/C++» это устойчивое выражение

От того, что ты что-то придумаешь и закрепишь в своей голове, реальность не изменится. Моя бабушка, например, до конца жизни была уверена, что моя работа заключается в том, что я телевизор смотрю.

buddhist ★★★★★
()
Ответ на: комментарий от Anoxemian

Заходишь в игру.

Не имеешь доступа к жесткому диску. Вообще никак.

Вне игры не имеешь доступка игре. Никак. Вообще никак. Совсем совсем. Через любые АПИ.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Это же невозможно, ты ж понимаешь. К диску еще куда ни шло, но огородить память не выйдет. Вплоть до передачи комнд через чат в клиенте и скриншотилки со стороны внешнего api))))

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

У клиента есть встроенный античит, который следит за манипуляциями с файлами на диске и ОЗУ. Попробуешь лезть в озу, получишь бан. Причем автоматически. Лучше туда не лезть.

LightDiver ★★★★★
()
Ответ на: комментарий от FishHook

Речь не о критике самого языка. Критика языка это нормально и естественно, потому что идеального языка нет и не будет.

Речь скорее о движухе вокруг.

sena ★★
()
Последнее исправление: sena (всего исправлений: 1)
Ответ на: комментарий от sena

Речь не о критике самого языка.

да? а я уверен, что именно самого языка. Как ни новость про питон, так двадцать страниц минимум критики языка.

FishHook
()
Ответ на: комментарий от lbvf50txt

Ненавидеть JavaScript — это «правило хорошего тона» среди «true-программистов», а вот Lua — «правило хорошего тона» уважать.

Так есть за что. Чтобы полностью понять Lua достаточно прочитать книжку Иерусалимсокого, и в языке не останется тёмных мест, и даже его сишный апи при этом изучишь. А про случаи неожиданного поведения в JS только ленивый не писал/ не рисовал смишные картиночки.

annulen ★★★★★
()
Ответ на: комментарий от annulen

В луа своих темных мест хватает с головой. Одни таблицы чего стоят. Или назначение переменным nil. Или определение существования переменных. Или отсчет с единицы.

Оно конечно удобно, когда привыкаешь и даже в том же питоне некоторого поведения не хватает уже, но возникают иногда противоречия и нюансы.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Одни таблицы чего стоят. Или назначение переменным nil. Или определение существования переменных. Или отсчет с единицы.

Это всё описано в книжке. И к тёмным местам я бы это не отнёс, это всё предельно очевидно после прочтения правила. Отсчёт с единицы так вообще более очевиден для непрограммистов, чем с нуля (в фортране, кстати, так же).

annulen ★★★★★
()
Ответ на: комментарий от annulen

Ладно про остальное. Но таблицы. Это тихий ужас. Все в одном объекте с динамическим определением. Вот я на днях пытался сделать массив объектов. Если назначить индексу nil, все - разрыв и у тебя автоматом не массив. Часть элементов массив, часть хэш-таблица.

А иногда оно само просто динамически переделывает в хэш-таблицу. Ну просто потому что хочет.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Во, про питон и отсчёт с нуля: в питоне for i in range(5) делает цикл по значениям от 0 до 4, это считается понятным и лаконичным. Но это блин очевидно тем, кто привык к for (int i = 0; i < 5; i++) — да, всё чётко и меньше букав писать. А начинающим придётся долго привыкать, к тому, что конец интервала во всех конструкциях языка «выкалывается»

annulen ★★★★★
()
Ответ на: комментарий от annulen

Да да да, про этот нюанс питона я тоже как раз вспомнил. Есть такое. Как раз столкнулся после луа, долго думал.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

А иногда оно само просто динамически переделывает в хэш-таблицу.

Оно всегда хэш-таблица и массив в одном лице. ipairs останавливается на nil, но да, это криво и очевидно только сишникам.

annulen ★★★★★
()
Ответ на: комментарий от annulen

о_О А что если исходники луа по работе с таблицам посмотреть. Хм. Нужно покопаться.

LightDiver ★★★★★
()
Ответ на: комментарий от FishHook

да? а я уверен, что именно самого языка. Как ни новость про питон, так двадцать страниц минимум критики языка.

Так я и говорю, Питон критикуют как язык, это нормально. Критика языка это хорошо и нормально.

А нездоровые явления вокруг Раста это явление другого рода.

sena ★★
()
Последнее исправление: sena (всего исправлений: 2)

А смысл? Для быстрой обработки уже есть eBPF, для безопасной местами уже есть Rust. Какую именно нишу пытается занять Lua кроме игрушечной песочницы?

zabbal ★★★★★
()
Ответ на: комментарий от zabbal

Какую именно нишу пытается занять Lua кроме игрушечной песочницы?

Не пытается занять, а уже давным-давно заняла: встраиваемый скриптовый язык. Вместо изобретения велосипедов просто берется и встраивается Lua в любой проект, где нужно писать скрипты: от компьютерных игр до текстовых редакторов.

lbvf50txt
()
Последнее исправление: lbvf50txt (всего исправлений: 1)
Ответ на: комментарий от annulen

А про случаи неожиданного поведения в JS только ленивый не писал/ не рисовал смишные картиночки.

Согласитесь, если прочитать 300 страниц про ядро языка JS, то строки с цифрами тоже складывать не будешь. Все «неожиданное поведение» JS это либо безграмотность, либо какие-то ребусы из code golf. В коде проходящем базовый code review никакого «неожиданного поведения» в JS нет.

lbvf50txt
()
Ответ на: комментарий от lbvf50txt

Я вообще этого момента даже в питоне не понимаю. Нахрена делать один оператор для объединения строк и складывания чисел?

Вот в луа правильно же сделано - два разных оператора для двух разных действий и никаких неожиданностей.

LightDiver ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.