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)

В новости три раза упомянут LunatiC и два раза LunatiK. Вы уж определитесь.

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

Драйверам расте: нет-нет-нет

Драйверам на луа: да-да-да

bender ★★★★★
()

Прикольно, надо посмотреть.

robot12 ★★★★★
()

Сначала динамическая машина для nftables.
Теперь динамический интерпретатор для lua (я правильно понял?).
В свое время была поддержка java(если мне память не изменяет, это где то в районе 2.2-2.4 было) - её не хотят возродить? =)

А что дальше? #Шарпо-образные языки туда ещё не впихивают??

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

Драйверам расте: нет-нет-нет

Драйверам на луа: да-да-да

Ну не драйверы, но много логики можно вынести в Lua, он быстр как понос.

Это они во FreeBSD подглядели, у нас это уже давно. (=

mord0d ★★★★★
()

Это хорошо, я считаю. Если реально можно написать драйверы простых устройств (поверх, tty, i2c, spi…), будет полезно. Не знаю, как в BSD с этим.

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

Не знаю, как в BSD с этим.

За все *BSD кучей ничего сказать нельзя, это разные проекты, у них разные разработчики, разные цели и разная кодовая база.

Но конкретно во FreeBSD Lua завезли довольно давно. Но драйверы, конечно, никто на нём не пишет. (=

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

Я слышал по крайней мере про FreeBSD и NetBSD. Про техническую возможность написать драйвер (например, мыши обыкновенной с интерфейсом COM) я не знаю, но было бы интересно.

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

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

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

А можно пример? Для тех, кто знает что такое луа, значт что токое ядро более смутно, но не знает что можно делать на уровне ядра.

LightDiver ★★★★★
()

по ссылке на LabLua - 404
на главной вход в админку phpMyAdmin

XXL
()

Ну, кто первый затащит ноду и v8 в ядро? ;)

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

Ну пример — тот же BPF. Но это не скрипты, это специально скомпилированные программы, работающие в ядре в ограниченном окружении. LSM (Apparmor, SELinux) грузят в себя кучу политик, которые компилируются в конечные автоматы и таблицы из userspace.

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

Он быстр как понос очень условно и с нюансами.

Когда ты используешь только встроенные функции, которые написаны на си, да, он быстр. Как только ты реализуешь что то свое, что интерпретируется - сразу сокращаешь производительность на пару порядков.

Вот у меня в wow есть ютф8 и кириллица. Встроенные инструменты с этим работать не умеют. Нужно делать свои, которые резко медленнее.

[18:34]Прошло: 0.0010000001639128
[18:36]Прошло: 1.1119999997318

Первое - вычисление размера строки через #строка

Второе - через:

local utf8_pattern = "[\1-\127\194-\244][\128-\191]*"

function utf8myLen(s)
    return select(2, s:gsub(utf8_pattern, ""))
end

Как тебе разница? На сколько порядков замедление? Первое - на си, второе на луа, я правильно понимаю логику работы? Так нахрена в ядре луа то, если можно сделать на си гораздо быстрее?

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

интерпретатор Lua, модифицированный для работы в ядре;

Вот насколько он там модифицирован является пока загадкой. Выглядит это как попытка замены BPF, особенно в контексте использования внутри OpenWRT. Я как-то принимал участие (весьма недолго и не слишком удачно) в проекте разработки системы защиты от DDOS. Есть список правил, который можно было менять на лету. Правила довольно простые, на уровне IPFilter. Но эти правила на лету же компилировались в апплеты BPF и вгружались в модуль сетевой фильтрации. Главная фишка была в том, что скорость реакции на атаку увеличивалась и появлялась вариативность реакций. Ну и тут примерно то же самое, но не в контексте сетевой фильтрации, а в логике роутинга, может быть. Ну или те же LSMы вдруг на Lua задумают писать.

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

Да, судя по последним событиям, Рустокапец в ядре близок. :)

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

Я тут загуглил:

В Linux используется расширенная версия BPF, называемая eBPF  (Extended BPF). Она представляет собой виртуальную машину в ядре Linux, которая может выполнять программы, написанные на специальном ассемблере или компилируемые из C-кода с помощью LLVM.

Ну это же совсем не луа. Просто скорость луа это вообще не скорость си. Даже не близко. Я так понимаю, это для упрощения работы? Потому что на си работать сложно, а на луа проще? Причина только в этом, как я понял. Но за счет скорости и ресурсов.

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

Спасибо, я в ядре уже несколько лет ковыряюсь, как оно там обстоит примерно понимаю. Но теперь мы понимаем одно и то же. Поэтому. :)

Ну да, это так. Но эта виртуальная машина сильно расширяется и прорастает как рак во все места ядра. Начиналось это как просто управляемый пакетный фильтр, а сейчас это и трассировка, и BPF LSM, и я уже даже не знаю что еще.

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

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

Я не настоящий сварщик, но ты только что сравнил один проход цикла с компиляцией регекспа и перебором по нему? О_о Перепиши нормально и не будет порядков никаких.

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

Каким байткодам? О_О открой стандарт. Старший бит в начале первого байта - 1, в остальных байтах (до 3х) - 0. Ну, BOM для перфекционизма задетектить тоже не помешает. И проходишься циклом. Я такое на D делал давно, счас погуглю.

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

Да делал я циклом. Так дольше и длиннее. Сейчас попробую циклом и сравню. Я вчера целый день этим занимался.

Ты про что то такое?

function utf8myLen(s)
    local count = 0
    local i = 1
    while i <= #s do
        local byte = string.byte(s, i)
        -- Проверяем первый байт символа:
        if byte < 128 then
            -- ASCII символ (один байт)
            count = count + 1
            i = i + 1
        elseif byte >= 194 and byte <= 244 then
            -- Многосимвольный UTF-8 символ
            -- Определяем длину символа по первому байту
            local len
            if byte <= 223 then
                len = 2
            elseif byte <= 239 then
                len = 3
            else
                len = 4
            end
            -- Увеличиваем счётчик символов
            count = count + 1
            -- Пропускаем все байты текущего символа
            i = i + len
        else
            -- Некорректный байт, пропускаем
            i = i + 1
        end
    end
    return count
end
[22:37]Прошло: 0.0010000001639128
[22:38]Прошло: 1.160000000149
[22:41]Прошло: 2.7669999999925

Первое: #строка Второе: моя функцию на регулярках Третье: на циклах

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

Главное не какой язык, а какие люди за этим стоят, что бы не истерички, как в RfL

Вот оно лицо линуха во всей красе. Главное - быть закрытой сектой с надуманными ценностями. Я тебя уверяю, как только Lua-в-ядре наберет достаточную популярность, то есть идея перестанет быть маргинальной, немедленно начнутся факельные шествия за чистоту ядра, митинги против луа-макак и стостраничные срачи. Истинный линуксоид обязан колебаться как синусоида, позитивно принимая любую идею потому что «СПО это свобода и хорошо что у нас есть выбор», и пламенно бороться с любыми новшествами, как только они разовьются до стадии внедрения.

а какие люди за этим стоят

а я то думал, проблема в том, что «поддерживать два языка - сложно». А не, оказывается хоть три, если люди правильные.

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

Не, это шляпа. Смотри, у тебя каждый байт в последовательности utf8 имеет признак - старший бит. http://canonical.org/~kragen/strlen-utf8#:~:text=In%20UTF%2D8%2C%20bytes%20that,t%20begin%20with%20binary%2010.

Вот больмень кратко и на сях описано, правда воды много.

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

Смотри:

function utf8myLen2(s)
    local count = 0
    local len = #s
    for i = 1, len do
        local byte = string.byte(s, i)
        -- Проверяем, что байт НЕ начинается с 10xxxxxx
        if byte < 128 or byte >= 192 then
            count = count + 1
        end
    end
    return count
end

Вообще идея брать функции на си и переписывать их на луа - это то, с чего я начал. Но.

[38:25]Прошло: 0.0019999998621643
[38:26]Прошло: 1.0800000000745
[38:29]Прошло: 2.5789999999106

Так еще хуже, хотя тут разница не та, чтобы оценивать. Примерно одинаково с моим циклом.

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

Вот у меня в wow есть ютф8 и кириллица. Встроенные инструменты с этим работать не умеют. Нужно делать свои, которые резко медленнее.

Это говорит в первую очередь о том, что ты не умеешь писать код на Lua. ☺

Он быстр как понос очень условно и с нюансами.

Не без этого. Но всё упирается во всякие хитрости языка, которые нужно знать. Вон, умелые питонисты пишут код так, что он может соревноваться в скорости с сишным; взять тот же numpy.

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

а я то думал, проблема в том, что «поддерживать два языка - сложно». А не, оказывается хоть три, если люди правильные.

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

А колебаться можно вслед за здравым смыслом и исходя из решаемой задачи. Пока все это «про Lua» выглядит как ещё один BPF. Где-то, может, и пригодится. Пока не вижу где.

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

взять тот же numpy.

Ну вот как раз всю математику и плавающую точку от ядерной исполняющей системы Lua и отгрызли. За ненадобностью :)

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

Что будут делать с несовместимостью версий Lua? Тоже ломать совместимость? Постоянно сидеть на старой версии? Какое-то неломаемое подмножество?

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

как только Lua-в-ядре наберет достаточную популярность, то есть идея перестанет быть маргинальной

Вот почему-то не видел ни одного срача из-за Луа. Как ты думаешь, почему? Язык очевидно простенький, лёгонький и без претензий, хотя и медленный, как все интерпретируемые языки. В принципе понятно, где и как его использовать - в задачах не требующих быстродействия, но требующих гибкости.

Не, я не хочу сказать что все сторонники Раста какие-то истерички и неадекваты. Но что-то явно через чур слишком много срача и скандалов вокруг него. Пусть сначала пыль осядет, потом можно к нему опять вернуться, если выживет.

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

А как бенчишь? Просто выхлоп реально похож на изморось. Не может же string.byte(s, i) быть такой дорогой. Явно косяк же.

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

Так скажи как правильно. Вон я привел варианты. Самый быстрый, что я нашел - через регулярки. И он на несколько порядков медленнее, чем си.

LightDiver ★★★★★
()
Ответ на: комментарий от Anoxemian
function test222(n1, n2)
    local temp
    local time1 = GetTime()
    for i = 1, n1 do
        temp = #ns_chat_log_line_q_p["лог_чат"][10]
        --print(temp)
    end
    print("Прошло: " .. GetTime()-time1)
    local time1 = GetTime()
    for i = 1, n1 do
        temp = utf8len(ns_chat_log_line_q_p["лог_чат"][10])
        --print(temp)
    end
    print("Прошло: " .. GetTime()-time1)
    local time1 = GetTime()
    for i = 1, n1 do
        temp = utf8myLen2(ns_chat_log_line_q_p["лог_чат"][10])
        --print(temp)
    end
    print("Прошло: " .. GetTime()-time1)
end

Обе мои функции локализованы в начале файла для доп оптимизиации и всеравно это на порядки медленнее нативного. Регулярка самая быстрая пока.

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

Какое-то неломаемое подмножество?

Абсолютно. С ограниченным набором функций и своей исполняющей системой. Не надо это воcпринимать как средство написания всего ядра на Lua. Это просто обрезки интерпретатора с разными контекстами исполнения и функциональностью, годные для использования в разных подсистемах ядра. Насколько годные — хочется понять на реальных примерах

gns ★★★★★
()

Это вам не раст какой-нибудь!)

Даёшь в апстрим!)

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

Да мне то в ядре юникод не надо. Я просто последние 2 года работаю с луа, в том числе с юникодом.

Я просто привел пример, что чуть отхождение от стандартных функций, который написаны на си и падение производительности на несколько прядков. В любой нестандартной ситуации. А тогда в чем смысол? Свои функции писать и использовать нельзя. А не проще тогда сразу на си?

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