OS Inferno

индекс
78,82

Установка OS Inferno New Edition

Update: Добавлено описание установки под Windows XP SP2.
Update: Добавлено описание установки под Mac OS X 10.4.8 Tiger.
Update: Добавлено описание установки под Mac OS X 10.5.5 Leopard.

New Edition


Да, версия в svn называет себя именно так! Установите, запустите браузер (Charon) и сами убедитесь. (В принципе, последний релиз это "Fourth Edition", но на практике это уже давно тот же svn — «Fourth Edition» вышел примерно в 2004, а сейчас на офф.сайте под видом «Fourth Edition» выложен снапшот svn от 20071003.)

Версия в svn абсолютно стабильна, и, в отличие от инсталляшки «Fourth Edition», её значительно проще обновлять. Для установки на боевые сервера или выпуска вашего приложения она не менее удобна. В общем, минусом является только необходимость иметь subversion и компилятор для сборки системы, всё остальное плюсы.

Итак, ставим свеженькую OS Inferno из SVN, в hosted режиме (т.е. в виде эмулятора, работающего под другой OS).

OS Inferno hosted on Mac OS X

Особенности установки в разных системах


Хотя Inferno должна устанавливаться и работать одинаково во всех системах, все мы прекрасно знаем, что нюансы есть всегда. Я протестировал установку в Hardened Gentoo Linux и в Ubuntu 8.04. Надеюсь, такой выбор систем перекроет большинство нюансов установки и в других дистрибутивах Linux.

Hardened Gentoo Linux

С компилятором и .h-файлами в Gentoo проблем не будет, я вас уверяю. :) А вот Hardened немного работы добавит. Дело в том, что emu умеет работать как в режиме интерпретации байт-кода виртуальной машины Dis, так и в режиме JIT. А Hardened (точнее, входящий в него PaX) очень не любит генерации кода на лету с передачей на него управления. Поэтому для запуска emu в JIT-режиме для него потребуется частично отключить PaX. Этим занимаются команды paxctl и chpax. На системах без PaX этих команд, скорее всего, нет, и выполнять их не нужно. Ещё один нюанс возникает при включенном Trusted Path Execution (TPE), но обычно достаточно проследить чтобы права на каталог с emu принадлежали root. Как бороться с SeLinux — разбирайтесь сами. :)

Ubuntu 8.04

Вот чего тут нет… э… ничего тут нет. :) Ни Hardened нет, ни subversion, ни библиотек, ни .h-файлов. Придётся ставить:

apt-get install subversion build-essential 
apt-get install libx11-dev libxext-dev x11proto-xext-dev

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

Установка OS Inferno


Ниже описана установка от root, в каталог /usr/local/inferno, в полноценном многопользовательском режиме. Отличия при установке от обычного пользователя в ~/inferno/ я буду упоминать по ходу процесса — в основном они сводятся к тому, что часть команд выполнять бессмысленно и/или не нужно.

Затраты времени/трафика/дискового пространства примерно следующие:
  • архив версии из svn занимает порядка 30 MB, но понятно, что svn накачает трафика значительно больше
  • система полностью [пере]собирается на моём Core2Duo 6600 примерно за две минуты
  • в установленном виде на диске она занимает порядка 250 MB
ВНИМАНИЕ: Inferno достаточно сильно не любит «странные» символы в именах файлов и каталогов. Включая пробел! Это не баг, это осознанное архитектурное решение. Поэтому рекомендуется проследить, чтобы в каталоге куда ставится Inferno, и в вашем домашнем каталоге внутри Inferno, имена файлов были без символов вроде ":", "!", "#", пробела, etc.

Качаем. Все команды, если не сказано обратного, выполняются от root. При установке в домашний каталог установите INFERNO_ROOT, например, так: /home/powerman/inferno. И, разумеется, все команды выполняйте от обычного пользователя.

export INFERNO_ROOT=/usr/local/inferno
svn checkout http://inferno-os.googlecode.com/svn/trunk/ $INFERNO_ROOT
cd $INFERNO_ROOT

Настраиваем параметры компиляции. Вместо perl -i -pe можно запустить любимый текстовый редактор и отредактировать mkconfig ручками.

export PATH=$INFERNO_ROOT/Linux/386/bin:$PATH
perl -i -pe 's/^ROOT=.*/ROOT=$ENV{INFERNO_ROOT}/m' mkconfig
perl -i -pe 's/^SYSHOST=.*/SYSHOST=Linux/m' mkconfig
perl -i -pe 's/^OBJTYPE=.*/OBJTYPE=386/m' mkconfig

Собираем систему. Помните, paxctl нужен только на системах защищённых PaX и только для запуска в JIT-режиме.

sh makemk.sh
mk nuke
mk install
paxctl -psmxe Linux/386/bin/emu

Настраиваем параметры emu. Эту команду желательно прописать себе в ~/.bashrc — чтобы не передавать эти параметры при каждом запуске emu. (Кстати, ещё очень желательно в ~/.bashrc прописать export PATH=/usr/local/inferno/Linux/386/bin:$PATH — будет удобнее запускать emu и limbo.) Разумеется, размеры оконной системы Inferno нужно выставить какие вам удобнее, не обязательно 1024x768. В принципе, удобнее, когда размеры окна Inferno меньше разрешения host OS. Параметр -c0 отключает JIT (для включения просто запускайте emu -c1). Дело в том, что при включенном JIT сложнее отлаживать свои приложения — отладчик не работает, границы массивов контролируются хуже, etc. А скорость у Inferno и без JIT более чем впечатляющая.

export EMU="-r$INFERNO_ROOT -g1024x768 -c0"

Настраиваем пользователя inferno. При установке в домашний каталог эти команды выполнять не нужно. Второй chown нужен при включенном TPE.

groupadd inferno
useradd -m -s /bin/bash -g inferno inferno
chown -R inferno:inferno $INFERNO_ROOT
chown -R root:root $INFERNO_ROOT/Linux/386/bin/
echo exec $INFERNO_ROOT/Linux/386/bin/emu $EMU  >>~inferno/.bashrc
mv usr usr.skel
ln -s /home usr
cp -a usr.skel/inferno/* ~inferno/

Update: см. комментарий по поводу настройки /tmp.

Шрифты


В принципе, к этому моменту OS Inferno установлена, и её можно использовать. Но в «Fourth Edition» входят дополнительные шрифты (B&H Lucida), которые из-за лицензионных ограничений гугл не разрешает выкладывать в svn на code.google.com. В принципе большинство приложений будет работать и без них. Кроме того, их можно заменить альтернативными бесплатными шрифтами (так вроде бы сделали в проекте Acme SAC). Но я с этим не разбирался. Поэтому мы сейчас, быстренько, выкачаем и установим во временный каталог «Fourth Edition», и выдерем из неё эти шрифты. :)

mkdir /tmp/inferno
cd /tmp/inferno
wget http://www.vitanuova.com/dist/4e/20071003/inferno.tgz
wget http://www.vitanuova.com/dist/4e/20071003/Linux.tgz
tar xzf inferno.tgz
tar xzf Linux.tgz
chown -R root:root /tmp/inferno
chpax -psmxe Linux/386/bin/emu
sh install/Linux-386.sh /tmp/inferno/
cp -r fonts/{lucida,lucidasans,lucm,pelm,LICENCE} /usr/local/inferno/fonts/
rm -rf /tmp/inferno

Тестируем


Точка с запятой в начале строк — это приглашение Inferno-вского sh. Завершение работы с Inferno — в текстовом режиме либо Ctrl-D, либо Ctrl-C, в графическом — закрытие графического окна Inferno. (Графическая среда запускается командой wm/wm.)

Вход под пользователем inferno. При установке в домашний каталог этот шаг пропускаете.

# su - inferno
; cd
; pwd
/usr/inferno
; cat /dev/user
inferno

Вход под обычным пользователем. Команда cp проинициализирует ваш домашний каталог, её в будущем повторять перед запуском Inferno не нужно. Установку PATH и EMU тоже лучше прописать в ~/.bashrc. Тогда для запуска Inferno достаточно будет запустить emu.

$ cp -r /usr/local/inferno/usr.skel/inferno/* ~/
$ export PATH=/usr/local/inferno/Linux/386/bin:$PATH
$ export EMU="-r/usr/local/inferno/ -g1024x768 -c0"
$ emu
; cd
; pwd
/usr/powerman
; cat /dev/user
powerman

Начальная настройка Inferno


При запуске emu система минимально инициализируется, после чего запускается sh, который выполняет /lib/sh/profile для дальнейшей инициализации системы. Я в него обычно прописываю:
  • Установку тайм-зоны. В принципе это можно сделать один раз скопировав файл, но использовать bind — это более Infern-ish. :)
  • Переход в домашний каталог текущего пользователя (по умолчанию система находится в корневом каталоге).
  • Если в домашнем каталоге пользователя настроены соответствующие файлы — продолжить инициализацию системы этими файлами.
Итак, прописываете в /usr/local/inferno/lib/sh/profile:
bind /locale/Moscow /locale/timezone
cd
load std
and {ftest -e namespace} {nsbuild}
and {ftest -e profile} {run profile}

При установке в домашний каталог на этом настройка заканчивается — нет никакого смысла настраивать три субъекта авторизации с кучей паролей при работе под единственным аккаунтом.

Настройка авторизации

Для начала необходимо объяснить, что и зачем настраивается. Авторизация работает следующим образом: клиент и сервис взаимно авторизуют друг друга с помощью сертификатов на базе private/public ключей — всё почти как у ssh или https. Почти потому, что авторизуют они друг друга действительно взаимно. Для этого они оба должны получить свои сертификаты у одного и того же CA (certificate authority), которому оба доверяют. Так что именно CA, выдавая или не выдавая эти сертификаты, определяет, будет у клиента доступ к сервису, или нет.

Таким образом, нам нужно настроить три разные системы — сервер авторизации, некий полезный сервис, и терминал клиента. Для этого мы можем запустить три независимых emu на своей машине — с точки зрения Inferno это будут три разных сервера, на которых будут запущены разные приложения. Разумеется, при таком варианте есть некоторые ограничения — например, невозможно запустить два одинаковых сетевых сервиса в разных emu — у них будет конфликт при попытке открыть TCP порт. Ну и файлы на диске у них общие, разумеется — но это не касается «виртуальных» файлов (а-ля /proc и /dev в Linux), которые в Inferno используются очень активно. Так что отличий между этими тремя emu вам хватит, чтобы воспринимать их как действительно разные и независимые сервера.

Первым делом нужно прописать адрес (hostname или IP) сервера авторизации на машинах клиента и сервиса. Но, поскольку файлы у них в нашей конфигурации совпадают, то достаточно отредактировать один файл /usr/local/inferno/lib/ndb/local (можете вписать 127.0.0.1):
SIGNER=powerman.name

Дальше запускаем сервер авторизации. Он будет запускаться под юзером inferno, и все файлы с ключами и сертификатами CA будут доступны только этому юзеру.
# su - inferno
; cat /dev/user; echo
inferno

… очищаем базу ключей
; cp /dev/null /keydb/keys; chmod 600 /keydb/keys

… генерируем сертификат нашего CA, на указанное имя (любое)
; auth/createsignerkey powerman.name

… запускаем сервис авторизации, при этом потребуется установить пароль, который в будущем нужно будет вводить при каждом запуске этого сервиса — это необходимо т.к. ключи в файлах будут зашифрованы этим паролем
; svc/auth
Key: 
Confirm key:

… теперь мы можем завести на нашем сервисе авторизации настоящие пользовательские аккаунты, с паролями, наконец-то :) — один для пользователя inferno (просто чтобы не заводить ещё и третьего юзера, им будет пользоваться второй сервер для запуска полезных сервисов) и второй для пользователя powerman (который будет использовать клиентский терминал на третьем сервере для подключения к полезному сервису на втором сервере)
; auth/changelogin inferno
new account
secret: 
confirm: 
expires [DDMMYYYY/permanent, return = 23102009]: permanent
change written
; auth/changelogin powerman
new account
secret: 
confirm: 
expires [DDMMYYYY/permanent, return = 23102009]: permanent
change written

… ну и полюбуемся на запущенные на этом «сервере» TCP-сервисы
; netstat
tcp/0      inferno    Announced    0.0.0.0!6673         ::!0
tcp/1      inferno    Announced    0.0.0.0!6677         ::!0
tcp/2      inferno    Announced    0.0.0.0!6671         ::!0
tcp/3      inferno    Announced    0.0.0.0!6672         ::!0
; 

Сервер авторизации оставляем работать, и запускаем следующий emu — с полезным сервисом.
# su - inferno
; cat /dev/user; echo
inferno

… ndb/cs это что-то вроде универсального ресолвера, без него в Inferno с сетью особо не поработаешь (есть ещё ndb/dns, но в hosted режиме его можно не запускать и использовать dns-ресолвер host OS)
; ndb/cs

… обращаемся к сервису авторизации (первый сервер), представляемся под своим логином/паролем, и получаем от него свой сертификат (это операция единоразовая, при условии что сертификат не expire-нется и файл куда сейчас будет сохранён полученный сертификат никто не удалит).
; getauthinfo default
use signer [$SIGNER]: 
remote user name [inferno]: 
password: 
save in file [yes]:

… теперь, имея сертификат, можно запустить полезный сервис — например rstyx, который позволяет удалённо выполнять на этом сервере команды — аналог ssh
; svc/rstyx
; netstat
tcp/0      inferno    Announced    0.0.0.0!6668         ::!0
;

Оставляем его работать и запускаем третий emu — терминал юзера powerman.
$ emu
; cat /dev/user; echo
powerman
; ndb/cs
; getauthinfo default
use signer [$SIGNER]: 
remote user name [powerman]: 
password: 
save in file [yes]: 

… теперь мы можем подключиться ко второму серверу и выполнить на нём команду. для примера, посмотрим список процессов сначала на этом терминале, а потом на втором сервере
; ps
       1        1   powerman    0:00.0    release    74K Sh[$Sys]
       8        7   powerman    0:00.0        alt    17K Cs
      11        1   powerman    0:00.0      ready    74K Ps[$Sys]
; cpu powerman.name ps
       1        1    inferno    0:00.0    release    83K Bufio[$Sys]
       8        7    inferno    0:00.0        alt    17K Cs
      13        1    inferno    0:00.0        alt     9K Listen
      15        1    inferno    0:00.0    release     9K Listen[$Sys]
      22        1   powerman    0:00.0      ready     1K Ps[$Sys]
;

Обновление системы


Здесь всё абсолютно тривиально:
cd /usr/local/inferno
svn up
mk install

Что дальше?


RTFM. RTFM. И снова RTFM. Система очень сильно отличается от традиционных. Причём чтением документации ограничиться не рассчитывайте — нужно читать исходники, там всё самое главное. :)

Когда появится понимание что как работает — пишите на Limbo. (На sh писать не советую — он слишком медленный, что довольно странно, кстати.) Пишите сетевые сервисы, распределённые системы, или полноценные GUI-приложения.

Удачи! :)
+23
23 октября 2008, 16:53
25

комментарии (76)

НЛО прилетело и опубликовало эту надпись здесь
+8
tzman #
объясните мне. а зачем это всё надо?)
+23
powerman #
Лично мне это всё надо по глубоко личной причине, которая связана с некоторыми личными проблемами и особенностями моей личности. А именно: меня заебало сложное, раздутое, тормознутое, глюкавое ПО. Меня раздражает, что оно продолжает усложняться и раздуваться, и конца и края этому не видно!

Inferno даёт возможность писать простые программы в простой среде. При этом не уступающие по функциональности обычному софту в винде или линухе. Достигается этот эффект во многом за счёт более правильной и элегантной архитектуры, позволившей упростить множество вещей.

Простой пример: в линухе есть файлы, сокеты, юникс-сокеты, блокирующий I/O, неблокирующий I/O, асинхронный I/O, куча всякой другой хуйни, плюс дополнительные настройки всех этих восхитительно пахнущих крупными проблемами дырявых «абстракций» вроде setsockopt и ioctl. В Inferno вместо всего этого — только файлы, только блокирующий I/O для этих файлов, и нити. Минимум абстракций с простым и однозначным поведением. Позволяющий реализовать ту же функциональность с примерно той же производительностью. Но значительно проще. И то же самое абсолютно во всём. В линухе есть процессы и есть нити. В инферно — только нити. В линухе хренова туча способов реализации IPC и синхронизации между процессами и нитями… одни только сигналы чего стоят! В инферно — только типизированные каналы.

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

И не то, чтобы я не справлялся с линухом. Отлично справляюсь, много лет занимаясь всем этим очень вдумчиво и глубоко.
Просто это Н Е П Р А В И Л Ь Н О !!!
Этот путь непрерывного усложнения и раздувания ведёт либо в тупик либо в ад, и я не уверен, что хуже.

Я ответил на Ваш вопрос?
+3
artem_p #
ответили, причем, оч. понятно
0
dev1ce #
Спасибо, буду учить.
НЛО прилетело и опубликовало эту надпись здесь
0
Ferroman #
Эта ос сейчас — не для пользователя. Она — среда разработки.
НЛО прилетело и опубликовало эту надпись здесь
0
Ferroman #
А что, так трудно другие комментарии почитать? Или статьи из этого блога? Или это такая попытка троллинга?
habrahabr.ru/blogs/os_inferno/42998/#comment_1067024
НЛО прилетело и опубликовало эту надпись здесь
+1
Ferroman #
Вы бы хоть прочитали что это такое.
Всё, я кормением троллей не занимаюсь. Не понимаете — значит вам оно не надо. Всего доброго.
0
zhengxi #
Расскажи, пожалуйста, а как в Inferno сделать файловую операцию (open, read, write) время работы которой ограничено таймаутом?
Если там нет select и асинхронного I/O.
Или может быть там есть что-то типа перловского alarm()?
0
powerman #
Файловые операции блокирующие. Если нужно параллельно что-то делать или ограничить их таймаутом — файловые операции выносятся в отдельную нить. Вот пример кода «основной» нити, которая ждёт либо данных от второй нити (выполняющей файловые операции) либо от таймера:

t := Timer.start(600);
alt {
data := <-input =>
	t.stop();
	# process the data
<-t.timeout =>
	# request timed out
}
0
zhengxi #
Когда два канала — это да, хорошо, а как сделать что-то вроде:
t := Timer.start(600);
alt {
sys->read(fd1, buf1, len buf1) =>
# process the data
<-t.timeout =>
# request timed out
}

Допустим можно spawn'уть отдельный процесс который делает read, а потом посылает результат в канал.
Некрасиво, но хоть что-то.
Хорошо если этот процесс успеет отработаь за отведённое время, а если таймаут наступит раньше.
Тогда остаётся процесс-зомби ждущий в read()
Что с ним делать? Прибивать через /prog?
Как-то совсем некрасиво: много лишнего кода плюс создание лишнего процесса и канала для кадого чтения.
0
zhengxi #
Когда два канала — это да, хорошо, а как сделать что-то вроде:
t := Timer.start(600);
alt {
sys->read(fd1, buf1, len buf1) =>
# process the data
<-t.timeout =>
# request timed out
}

Допустим можно spawn'уть отдельный процесс который делает read, а потом посылает результат в канал.
Некрасиво, но хоть что-то.
Хорошо если этот процесс успеет отработаь за отведённое время, а если таймаут наступит раньше.
Тогда остаётся процесс-зомби ждущий в read()
Что с ним делать? Прибивать через /prog?
Как-то совсем некрасиво: много лишнего кода плюс создание лишнего процесса и канала для кадого чтения.
0
powerman #
Не «допустим можно spawn'уть», а именно это и нужно делать.

Насчёт «некрасиво» — категорически не согласен! Непривычно, после Perl-а — да. Мультиплексирование I/O через select/poll/epoll и таймауты на alarm гораздо хуже. Я много такого кода писал за последние годы, есть с чем сравнивать.

Насчёт прибивания процесса — да, прибивать.

На самом деле никакого лишнего и некрасивого кода не возникает. Всё зависит от задачи.

Например, таймер никто не заставляет заводить на каждый отдельный read — его можно заводить на все операции I/O которые должен выполнить процесс.

Если нужен таймер именно на отдельную операцию чтения, можно в несколько строчек сделать обёртку а-ля:

t := killmeafter(600);
sys->read(...);
t.stop();


где killmeafter() запустит отдельную нить, которая через 600 секунд убьёт процесс-родитель; а stop() наоборот, убьёт порождённую killmeafter() нить.

В других ситациях можно позволить нити выполняющей read висеть сколько хочет. Например, она обслуживает конкретного клиента, и если клиент отвалится и перелогинится то процесс, который его обслуживал, будет убит в момент, когда клиент залогинится снова, а не по таймауту для read().
0
powerman #
Да, для perl-программиста не помешает ещё раз упомянуть один факт: в Inferno очень лёгкие нити. Никаких проблем плодить их тысячами и десятками тысяч нет. Всё реально летает. А выделение блокирующих операций в отдельные нити обычно сказывается на архитектуре программы самым положительным образом.

Тот же Timer, в вышеприведённом примере, тоже запускается в отдельной нити, разумеется.
0
zhengxi #
Не очень это дешево — число процессов в инферно ограничено числом порядка 1500.
А sys->sleep() в emu реализован через запуск треда OS.
0
zhengxi #
В смысле треда host OS (CreateThread() в случае Win32)
0
powerman #
Откуда информация про 1500?

Я гонял разнообразные тесты, большое кол-во нитей выполняющих I/O с сетью, etc. И сравнивал с аналогичными тестами на Perl через epoll. Результаты были сравнимы.

Вы можете предложить тест, демонстрирующий дороговизну нитей инферно, точнее где нити бы проигрывали тому же epoll?
0
zhengxi #
#define MAXSLEEPERS 1500 в os.c

kuku()
{
sys->sleep(10000);
}

for(i:=0; i<3000; i++)
{
spawn kuku();
}

И посмотрите в TaskManager (или в top под Linux) сколько тредов будет при этом у emu (я бы это назвал багом конкретной реализации, это нисколько не умаляет плюсы инферны, но мешает её применению в реальных проектах).

про сравнение бенчмарков с epoll — не знаю, у меня пока что проблема просто таймауты организовать, рано еще профилировкой заниматься.
0
powerman #
Э… А… Простите, нафига запулять 3000 sleep-ов? Ради 3000 таймеров?! Сделайте одолжение, почитайте внимательно /appl/lib/timers.b, и Вы увидите, что это вовсе не обязательно. Вообще, чтение исходников Inferno очень полезно для кармы и самообразования.
0
zhengxi #
Вариант, да.
Спасибо.

Пока Вы быстро отвечаете, ещё спрошу — с сокетами на подобный лимит не наталкивались?
Если да, если ли workaround, как этот для таймеров?

Там подобный механизм: osenter(), функция_хост_ос(), osleave()
0
zhengxi #
функция_хост_ос() — это например write()
0
powerman #
Хехе. С таймерами — это не work around. Вы же не говорите, что a+=5 это work around чтобы не писать a=a+1;a=a+1;a=a+1;a=a+1;a=a+1;. :-)

Помните тот анекдот, про сибирских мужиков и японскую бензопилу? Которую они таки сломали о железную шпалу, и пошли дальше валить деревья топорами? Всегда можно придумать дурную задачу, не имеющую нормального решения. А нужно делать нечто совершенно обратное: искать простые и элегантные решения реально имеющихся, а не теоретических (!) задач.

Что касается сокетов, насколько я читал, в Inferno нити host OS не выделяются конкретным нитям Dis навсегда. Т. е. если у Вас есть 10_000 нитей Dis делающих какие-то операции требующие функциональности нитей host OS (вроде того же sleep или работы с сокетами), а количество нитей host OS ограничено, например, 1_500, то эти 1_500 будут по очереди обслуживать все ваши 10_000 нитей Dis. При нормальном I/O это не проблема, но если получится так, что все 1_500 из 10_000 сокетов, которые в данный момент обслуживаются нитями host OS, подвисли в ожидании данных — вполне возможно что пока кто-то из этих 1_500 не получит данные другие сокеты работать не смогут. Точно не уверен, надо тестировать. Но даже если и так — Вы уверены, что это проблема реальная, а не очередная шпала для бензопилы?
0
zhengxi #
Workaround в том смысле, что могли бы все sleep'ы обслужить одним тредом OS внутри сишного кода инферны, а не выносить это в модуль на лимбо.
С сокетами тоже можно не ждать окончания работы блокирующих функций в тредах OS, а использовать один тред OS и неблокирующие функции.

Насчёт реально ли мешает мне сейчас лимит с сокетами — пока, к счастью, нет.
Лимит на sleep'ы мешал.

Хотя могу привести примеры реальных задач, где он помешает (http-spider, etc), но я их на Инферно переносить пока не планирую.

Может быть к тому времени, когда это понадобится, выйдет 5-я версия :)
0
powerman #
Я у себя в tmp откопал именно такие тесты, о которых идёт речь. Я тоже примерно с них начинал, и тоже держа в голове спайдера. :) Так вот, я стряхнул с них пыль, и потестировал снова. Запускаю 10_000 нитей, в которых выполняется sys->sleep(5000). Если Inferno действительно ограничивает кол-во одновременно работающих нитей такого типа 1_500, то тест должен отработать секунд за 30.

На практике все нити завершаются через 5 секунд, но при этом возникает небольшой затор, пока основная нить получает от них сообщения через каналы, поэтому в сумме тест отрабатывает за 6.5 секунд. (Число в последней колонке — кол-во миллисекунд прошедших с вывода предыдущей строки.)

$ emu -pmain=100M
; time sleep10k
spawned:   120
    1 sleepy threads wake up:  4881
    2 sleepy threads wake up:     0
   10 sleepy threads wake up:  1176
   50 sleepy threads wake up:   162
  100 sleepy threads wake up:    96
  150 sleepy threads wake up:     3
  200 sleepy threads wake up:     1
  250 sleepy threads wake up:     1
 1000 sleepy threads wake up:     7
 2000 sleepy threads wake up:    17
 5000 sleepy threads wake up:    40
10000 sleepy threads wake up:    59
finished:     1
0l 6.564r 6.564t
; 

sleep10k.b
0
zhengxi #
> Если Inferno действительно ограничивает кол-во одновременно работающих нитей такого типа 1_500, то тест должен отработать секунд за 30.

Там веселее, 1501'й sleep() не ставится в очередь на ожидание, а превращается в sleep(0)
Причём молча.

попробуй заменить свой
sys->sleep(5000);
на
t1 := sys->millisec();
sys->sleep(5000);
sys->print("(%d)", sys->millisec()-t1);

(да, я на Windows это проверяю, бинарник emu.exe вот отсюда: www.vitanuova.com/inferno/net_download4T.html)
0
zhengxi #
Или вот так:
func(c: chan of int)
{
t1 := sys->millisec();
sys->sleep(5000);
realsleeptime := sys->millisec()-t1;
if(realsleeptime>4000)
sleepok ++;
else
sleepaborted ++;
c <-= 1;
}

У меня в итоге:
sleepok=1501 sleepaborted=8499
0
powerman #
grep по исходникам показывает, что MAXSLEEPERS встречается только в сорцах для Nt. У меня под линухом создаётся 10_000 процессов, всё по-честному. Кстати, лучше юзайте версию из svn.

Но всё-таки столько нитей одновременно выполняющих блокирующие операции требующие выделенной нити host OS это очень вырожденный случай. А обычные нити самой Inferno действительно очень лёгкие — я сейчас проверил, 30_000 нитей работающих с каналами (что не требует выделенных нитей host OS) создалось за 6 секунд. При этом никакого заметного увеличения кол-ва процессов самого emu не наблюдалось.
+2
lostdj #
Спасибо за статьи.
У меня просьба: не могли бы Вы в следующий раз затронуть тему именно «зачем это надо»? Хотя бы тупо небольшой разбор примеров, где ОС уже применяется (личные примеры?).

P.S. habrahabr.ru/blogs/os_inferno/42829/#comment_1058397 отличный комментарий. )
0
shai_xylyd #
Инсталляция валиться на Vista. Кто-нибудь сталкивался?
–1
powerman #
Я сейчас заканчиваю собирать под XP. Не без извращений, но собирается. Vista у меня нет. Отчёты о проблемах с установкой под Vista я где-то видел, или в mail list-е, или в issue tracker-е.
+3
powerman #
Короче, собрал я Inferno под WinXP SP2. Но там всё так непросто получается, что совать это в статью никакого желания нет. Если учесть тот факт, что я с виндой не работаю вообще и Visual Studio никогда в глаза не видел… то я вполне мог что-то нахомутать и переусложнить. В общем, я готов выслушать любые рекомендации на тему как это делать менее отвратительным способом здесь, в комментариях, а в статью перенесу окончательный вариант.

Я старался выкачивать и ставить всё по-минимуму. VC++ 2005 взял из соображений «под ним точно собирали когда-то» и «2005 наверное весит меньше самой новой версии». :) SDK 2008 взял исключительно потому, что SDK 2003 не давали без проверки windows genuine, а я качал всё из линуха и видел их genuine в белых тапочках.

Идём на www.collab.net/downloads/subversion/
Качаем «CollabNet Subversion Command-Line Client v1.5.3 (for Windows)»
(они пытаются задрачивать, но это решается — логин:bugmenot с паролем:nobug)
Выкачиваем 3 MB
Ставим CollabNetSubversion-client-1.5.3-1.win32.exe
Перезапускаем открытые cmd.exe/far.exe/etc. чтобы обновить PATH

Идём на www.microsoft.com/express/2005/download/default.aspx
Качаем «Microsoft Visual C++ 2005 Express Edition»
Выкачиваем 3 MB (для начала)
Ставим vcsetup.exe
(при установке отключаем «графическую IDE», ибо нафиг оно не надо)
Оно докачивает ещё 68 MB

Идём на www.microsoft.com/downloads/details.aspx?FamilyId=E6E1C3DF-A74F-4207-8586-711EBE331CDC&displaylang=en
Качаем «Windows SDK for Windows Server 2008 and .NET Framework 3.5»
Выкачиваем меньше 1 MB (нда… это уже настораживает)
Ставим setup.exe
(при установке отключаем всё, кроме двух пунктов:
  dev tool -> windows headers and libraries
  dev tool -> windows development tools -> win32 development tools
)
Оно докачивало ещё 39 MB (если ему верить, конечно)
И вот здесь начинаются первые серьёзные проблемы. У меня оно падало в процессе установки раз 6, наверное. Но я не сдавался, тупо его перезапускал… и таки прорвался — оно успешно поставилось. Правда, на C: в корне оставило после себя кучу говна, но я не обиделся. (Я думал что уже отвык от такого, под линухом если что-то падает, то оно будет падать пока не починишь, перезапускать бессмысленно… но, как выяснилось, навык под виндой всё тупо перезапускать не выветривается с подкорки даже за очень много лет. :))

Всё вместе на винте сожрало порядка 400 MB. [censored]! (Сколько же оно сожрало бы при установке последних версий и без выключения всех галочек до каких можно дотянуться?)

Дальше выкачиваем через svn (в командной строке, как в статье) Inferno в E:\inferno.
Редактируем E:\inferno\mkconfig:
    ROOT=E:/inferno
    SYSHOST=Nt
    OBJTYPE=386

Чтобы обойти первую ошибку при сборке нужно дополнительно отредактировать E:\inferno\mkfiles\mkfile-Nt-386 и добавить параметр -force:multiple (я без понятия что это, но оно помогло):
    LDFLAGS=        $LDEBUG -nologo -incremental:no -map -force:multiple

Дальше начинается ламбада. Поскольку MS VC++ 2005 и MS SDK 2008 никогда друг о друге не слышали, то для того, чтобы при компиляции они использовались вместе, нужно ручками прописать переменные окружения PATH, INCLUDE и LIB так, чтобы в них перечислялись пути обоих. Для этого запускаем сначала:
    Menu->Visual C++ 2005 Express Edition->Visual Studio Tools->Visual Studio 2005 Command Prompt

и смотрим/копируем значение переменных VC++:
    echo %PATH%
    echo %INCLUDE%
    echo %LIB%

после чего запускаем следующего товарища:
    Menu->Microsoft Windows SDK v6.1->CMD Shell

и устанавливаем переменные в сумму обоих значений. У меня это выглядело примерно так:
PATH=C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;C:\Program Files\Microsoft Visual Studio 8\VC\BIN;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 8\VC\VCPackages;%PATH%
set INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%INCLUDE%
set LIB=C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%LIB%


Дальше всё более-менее как в статье:
    e:
    cd \inferno
    PATH=e:\inferno\Nt\386\bin;%PATH%
    mk nuke
    mk install

… в процессе оно навернётся с ошибкой типа:
    mk: limbo -c -IE:/inferno/module ...  : exit status=exit(1)

Но! Это-ж винда. Поэтому есть простое решение неизвестной проблемы:
    mk install

Ну да. А чего вы ждали? Перезапустил команду и всё собралось на ура. :)

Теперь вешаете на рабочий стол ярлык на:
    E:\inferno\Nt\386\bin\emu.exe -rE:/inferno -g1024x768 -c0


Всё. Обновлять систему как описано в статье. Только, вероятно, имеет смысл наваять .bat-файл для выставления переменных окружения.
0
artem_p #
спасибо, полюбопытствую.
0
vladon #
а можно ли выложить уже собранную? трафик — большая проблема :(
0
powerman #
Выложить-то можно, вопрос в том, что именно выложить. Если с трафиком проблема, то, вероятно, Вам обновляемая svn-версия не нужна. Возможно, вообще версия с исходниками не нужна? Тогда Вам может быть проще всего взять версию годовой давности на офф.сайте: inferno.tgz плюс Nt.tgz — где-то 20 MB в сумме. Насколько я понимаю, их должно хватить…
0
vladon #
основная проблема именно в SDK этом, Visual Studio 2008 есть… можно ли собрать только имея её?
0
powerman #
Нет, без SDK собрать не получится. Но он тянет где-то 40 MB, это вроде не много даже если сидеть на 33.600.
0
SCUKKO #
А где скриншоты?
+1
lesa80 #
+3
elmortem #
О, спасибо. Во всём треде и комментах — вы единственный, кто запостил ссылку, которая приведёт меня на страничку проекта.
А скрины — ад! ^_^
–1
powerman #
Oops. Сейчас добавлю ссылок. :) В прошлых статьях их было до чёрта, и я решил что все, кому это интересно, уже их знают. Такая глупая мысль могла прийти ко мне в голову только потому, что я не спал больше суток когда готовил статью.
0
roller #
хоть бы один скриншот!
как все уныло…
0
meako #
Вот поверьте, не ради красоты эту ось ставлят и пишут под нее…
–1
powerman #
Ну, кстати, если туда ещё и красоты добавить, то хуже от этого не станет. Иконок и тем наваять вроде никогда проблемой небыло. Только вот как с Tk быть? Там же вся графика на Tk, так что тему нужно на Tk натягивать. Я когда-то этим вопросом интересовался, и вроде темы для Tk существуют, только вот где их брать и как устанавливать так и не понял. В Inferno даже в mkconfig есть для этого настройка: TKSTYLE=std, но что с ней делать не ясно.
0
yshurik #
TKSTYLE=std влияет какой mkfile будет пользоваться в libtk, в данном случае mkfile-std. Он там и один. Все tk примитивы рисуются очень просто через draw.h. Возможно что авторы специально выбирали как можно более простую схему прорисовки чтобы работало как можно более быстрее в случае когда замаунтили удалённый /dev/draw и draw комманды бегают по сетке. Сделать свой стиль похоже не так и сложно — copy-paste оригинальный и подправить прорисовку.
0
roller #
общеизвестно что иллюстрации способствуют лУтшему восприятию статьи
0
powerman #
Полностью согласен. Может предложите, иллюстрации чего именно вставлять в статью описывающую выполнение нескольких команд в командной строке? Окна терминала с этими командами? Оно не менее скучное. Скриншоты графической оконной среды Inferno? Они к делу отношения почти не имеют, да и выглядят не самым суперским образом. Что ещё? Абстрактные картинки?
0
roller #
да, покажите скриншот операционки внутри XP например uname -a запустите или что там аналогичное. народ вообще не в курсе что за инферна такая… почему бы сразу не заинтересовать?
+1
ingeniarius #
Красота должна быть во всём, а не только в архитектуре ;)
0
powerman #
Я добавил скриншот. Так лучше? :)
0
roller #
да! кстати как собрать на маке? Xcode стоит. какие либо серьезные отличия от линуксовой установке будут?
0
powerman #
Гляньте чуть ниже.
–2
Spy #
ОС только в зачаточном состоянии, что бы из нее сделать более или менее массовый продукт, потребуется очень много времени.
0
powerman #
Любопытно, исходя из чего был сделан вывод о «зачаточном состоянии»?

У меня немного другая информация. Inferno базируется на идеях Plan9, и у них довольно много общего кода. Так что их развитие и взросление идёт параллельно — фиксы одной системы практически сразу дублируются во второй. Plan9 вышел в 1992. Inferno в 1997. Свободно распространяться в инете с обычными открытыми лицензиями Plan9 начал в 2000, Inferno примерно в 2005.

Обе системы большой популярности не имеют, но работают достаточно давно и стабильны. Так что это что угодно, только не зачаточное состояние. :)

А что касается массовости… Inferno никогда не проектировалась в качестве замены серверным или десктопным операционкам, так что массовость может быть исключительно в роли либо операционки для встроенных устройств либо виртуальной машины типа JVM.
0
powerman #
Под MacOSX проблем было чуть больше. И тупой перезапуск команд не помогал — это всё-таки не винда. :) Но проблемы мелкие, связаны с mkfile-ами, и я думаю что они скоро будут в svn исправлены, так что вы можете с ними и не столкнуться.

Надо отметить, что MacOSX у меня конкретно тормозит, скорее всего это связано с отсутствием VMware tools для хакинтоша. В частности, установка Xcode несколько раз «замирала» минут на 10 — я уже хотел её прибить.

Идём на www.collab.net/downloads/community/
Качаем «Universal Subversion 1.5.2 Binaries for MAC OS X (32 and 64 bit)»
Выкачиваем 15 MB (хмм, под винду/линух было 3-5 MB...)
Ставим Subversion 1.5.2-2 Universal.dmg
На винте оно кушает ещё 56 MB
Запускать svn нужно будет так: /opt/subversion/bin/svn (не знаю, почему /opt/subversion/bin было не добавить в PATH автоматически или не установить симлинки в /usr/bin).

Идём на connect.apple.com/
(логин:adcbugmenot с паролем:bugmenot)
Качаем в Downloads->DeveloperTools «Xcode 2.5 Developer Tools (Disk Image)»
Выкачиваем 900 MB
(Возможно Xcode есть на вашем установочном DVD, и качать его не нужно.)
При установке нужно включить раздел «Command Line Support» (полностью). Остальное можно не ставить.
Устанавливается оно в 2 GB! (винда нервно курит в сторонке)

Я устанавливал Inferno в домашний каталог (в ~/inferno/). Но, теоретически, можно ставить многопользовательский вариант так же, как описано в статье для Linux.

В mkconfig прописываем:
ROOT=/Users/powerman/inferno
SYSHOST=MacOSX
OBJTYPE=386

Чтобы обойти первый вылет по ошибке при сборке, нужно отредактировать файл appl/lib/ida/mkfile, заменив в конце
idatab.dis:N:
        ;

на
idatab.dis:N:
        ulimit -s 65536
        limbo idatab.b


Дальше всё как обычно:
export PATH=~/inferno/MacOSX/386/bin:$PATH
sh makemk.sh
mk nuke
mk install

Через некоторое время оно вылетит по ошибке, т. к. пропустит сборку одной из библиотек. Решается это так:
cd libkeyring
mk install
cd ..
mk install

Готово.
0
roller #

A /Users/rol/inferno/doc/20020628.pdf
A /Users/rol/inferno/doc/ebookimp.pdf
A /Users/rol/inferno/doc/20020715.ms
svn: In directory '/Users/rol/inferno/doc'
svn: Can't open file '/Users/rol/inferno/doc/.svn/tmp/text-base/INSTALL.ms.svn-base': No such file or directory

эээ и что дальше ?? запускал и из под обычного пользователя и из под sudo — одинаково вылетает там

0
powerman #
Я только что обновился без проблем, правда, под Linux. Скорее всего у Вас проблемы из-за того, что вчера в каталог doc/ добавили файл INSTALL.ms, хотя там уже был файл install.ms. В Linux из-за этого проблем нет, а вот под виндой были бы точно — у неё файловая система case insensitive и два таких файла в одном каталоге не выжили бы. Думаю, этот конфликт по именам файлов был создан не специально, и его скоро поправят. А пока, как вариант, Вам ничего не мешает поставить предыдущую ревизию (333).
0
roller #
оказывается не только в windows, в mac os на HFS+ по умолчанию такой же режим включен
0
powerman #
Уже пофиксили: r341.
0
tilarids #
Совет с ida весьма пригодится и линуксоидам, думаю. По крайней мере, у меня не собралось, пока не подправил файлик. Также хочу напомнить, что для запуска графической оболочки нужно еще установить DISPLAY и запускать от пользователя, который сможет достучаться до X.

А теперь по существу — система, как видно, легковесная. Но только честно говоря, мне эта легковесность не совсем по душе. Например, шелл очень неудобный. Не хочу показаться снобом, но система кроме внутренней красоты и гармонии должна еще быть удобной для пользователя и разработчика. Возможно, я не прав и ее удобнйо сделать можно. Тогда жду следующих статей :)
0
powerman #
Проблему с idatab.dis уже поправили в svn. Тупо выложили заранее скомпилированный файл с другим именем и в mkfile его копируют в idetab.dis. Проблем из-за этого никаких не будет, потому что байт-код Dis абсолютно портабельный. Проблема была в том, что idatab.b написан таким образом, что limbo при компиляции нужен очень большой стек. При запуске limbo под Inferno — это не проблема. А при запуске limbo под host OS (что и происходит при mk install) — в зависимости от настроек стека в host OS при компиляции этого файла limbo может навернуться. (Вообще дико, что при современных объёмах памяти, в некоторых системах до сих пор стек по умолчанию ограничен 8KB.)

Что касается удобства шелла. Частично проблема решается программированием. Например, у меня в /usr/powerman/profile:

fn . { args:=$*; if {! ~ $#args 0} { .=$* }; $. }

Эта кракозябра создаёт функцию (читай — команду) с именем «точка», которая при запуске с параметрами — выполняет и запоминает их, а при запуске без параметров — выполняет последние запомненные параметры. Используется примерно так:

; . echo ok
ok
; .
ok

А по сути, чтобы перестать испытывать дискомфорт из-за отсутствия поддержки readline в sh и amarok в wm/wm лично мне было достаточно осознать, что этот sh — НЕ ШЕЛЛ! Хоть и удачно им прикидывается. Это такая лазейка, дырочка, через которую можно попасть внутрь работающей виртуальной машины, и ручками её поковырять — позапускать какие-то процессы, покилять работающие, посмотреть что происходит, etc. Покажите мне хотя бы такой, без readline, sh для JVM!

Ещё один момент заключается в том, что обычно разрабочики в Inferno работают в графической среде, acme, etc. А wm/sh немного более вменяемый.
0
tilarids #
Какой-то неубедительный аргумент, почему я должен перестать испытывать дискомфорт :) Я понимаю, что «хоть что-то» лучше, чем ничего, но при этом хороший шелл был бы лучше, чем «хоть что-то». И совершенно необязательно этот тяжелый шелл тянуть с собой на конечные машины. Но для разработки был бы очень полезен.
0
powerman #
Ок, уговорили. Если Вы вызвались реализовать для sh поддержку нормального интерфейса — я только «за»! :)

Кстати, почитайте вот эти ветки:
wm/sh with tab completion
shell history
0
powerman #
Я нашёл одно важное для понимания ситуации с этими фичами письмо. Для тех, кому лень кликнуть, или плохо с английским, кратко перескажу суть.

В Inferno архитектура организована так, что окно терминала (wm/sh) не эмулирует терминал вроде vt100, как в *nix. Как следствие этого, приложения, работающие в этом окне, не имеют доступа к функциональности типа управления курсором. Вместо этого, редактирование содержимого окна реализовано в самом окне терминала (wm/sh). Благодаря этому редактирование вводимой строки доступно во всех приложениях, включая sh, и приложениям для этого вообще ничего делать не нужно — им достаточно сделать один read(stdin), и, когда юзер нажмёт Enter, он вернёт им введённую и уже отредактированную пользователем строку.

Это позволило очень многое упростить в реализации, но поставило новые вопросы: реализацию вещей типа history или tab completion возможно реализовать только на уровне окна терминала. С одной стороны — это круто, т. к. даст эти фичи сразу всем работающим в окне терминала приложениям. С другой — терминалу сложно различать какое именно приложение сейчас работает, следовательно сложно поддерживать разную history и разные фичи tab completion в разных приложениях. Кроме того, приложение может переключить терминал в raw режим (например, для ввода пароля), и тоже не совсем понятно как это совместить с этими фичами.

В общем, используется необычная архитектура (что как раз вполне обычно для Inferno :-)), со своими плюсами и минусами.
0
tilarids #
О том, что никакой интерактивности от этого sh ждать не приходится — это я уже понял, почитав исходники. Однако все же остается нерешенным вопрос, кто же отвечает за редактирование при запуске sh из командной строки (не wm/sh, а просто sh). emu?

В общем, спасибо за помощь. Буду еще ковырять. Однако все же сказывается неудобство нового языка — нет возможности просто портировать существующие приложения.
0
powerman #
Чем дальше я вникаю в исходники Inferno, тем больше я убеждаюсь, что «просто портировать существующие приложения» — это плохая идея. (Т. е. работать-то это будет, но смысла в этом мало.)

Чтобы почувствовать силу Inferno, нужно существующие приложения портировать не просто, а реализовывать их с совершенно иной архитектурой. Фактически, полностью перепроектировать их! А после этого вопрос переноса существующего кода практически полностью теряет смысл (исключая чисто алгоритмический код, обсчитывающий данные — этот от архитектуры обычно не зависит, но он и портируется с практически любого C-подобного языка на Limbo один-в-один).
0
powerman #
Я убрал из статьи команду:
chmod 1777 $INFERNO_ROOT/tmp/

Если вы её уже успели выполнить, можете вернуть обычные права:
chmod 0755 $INFERNO_ROOT/tmp/

Вместо этого в Inferno обычно используется другой подход. Каталог /tmp не доступен обычным пользователям на запись, он является просто точкой подключения временного каталога пользователя. Т. е. вы должны создать у себя в домашнем каталоге любой подкаталог для хранения временных файлов, и подключать его вместо /tmp:
; pwd
/usr/powerman
; mkdir tmp
; bind -c tmp /tmp

А чтобы не делать bind каждый раз можно его прописать в файл настраивающий ваш name space при запуске emu:
; pwd
/usr/powerman
; echo 'bind -c tmp /tmp' >> namespace

Где-то так, в общем. :)
0
powerman #
Для установки OS Inferno под Mac OS X 10.5.5 (Leopard) понадобится SVN (15 MB, берём на www.collab.net/downloads/community/) и Xcode (идёт в комплекте с лицензией, а для хакинтошей/vmware выкачиваем 995 MB на connect.apple.com/ — логин берёте на bugmenot, качать надо xcode312_2621_developerdvd.dmg).

Хорошая новость — в отличие от установки под 10.4 (Tiger) устанавливать из Xcode 2 GB всякого мусора не обязательно, достаточно установить ~300 MB. Для этого нужно вместо основного пакета ./XcodeTools.mpkg установить из подкаталога ./Packages/ вот эти пакеты:
  • DeveloperToolsCLI.pkg (55MB)
  • gcc4.0.pkg (95MB)
  • DevSDK.pkg (176MB)
  • QuickTimeSDK.pkg (3MB)
  • CoreAudioSDK.pkg (1.5MB)
  • OpenGLSDK.pkg (3.5MB)


В mkconfig прописываем:
ROOT=/Users/powerman/inferno
SYSHOST=MacOSX
OBJTYPE=386


Дальше всё как обычно:
export PATH=~/inferno/MacOSX/386/bin:$PATH
sh makemk.sh
mk nuke
mk install


P.S. У меня Leopard под VMware работает почему-то значительно медленнее Tiger, и, на глаз, inferno компилировалась тоже очень долго (примерно час).
0
powerman #
Да, забыл добавить. Под Leopard ставятся VMwareTools (которые нужно предварительно выдрать из VMwareFusion — darwin.iso 3.5 MB). Из заметных отличий — начинает работать copy&paste между host os и leopard, но, к сожалению, графика не ускоряется. :(
0
gladilin #
У меня emu падает с Segmentation Fault, если в имени первичной группы пользователя, которому принадлежит директория inferno, есть пробел. На поведение, соответствующее заранее выбранной политике не похоже ;-)

Поскольку в нашей сети у всех рядовых пользователей группа по умолчанию содержит в имени пробел, то использовать inferno, видимо, не получится — все время смотреть на падения и соображать, откуда еще какой пробел вылез — сил нет.
0
powerman #
Насколько я понимаю, пробелы в именах файлов считаются в OS Inferno хоть и допустимыми теоретически (т.к. их поддерживает протокол Styx, а вся работа с файлами идёт через него), но не рекомендуемыми (т.к. из-за пробелов возникает куча геморроя с экранированием парамеров команд в sh, и т.п.).

В результате в некоторых частях Inferno такие файлы обрабатываются нормально, а в других — нет. И это как раз похоже на «поведение, соответствующее заранее выбранной политике».
0
gladilin #
Ну, насколько я знаю, sh спроектирован так, чтобы количество проблем с пробелами уменьшить — там есть понятие списков, которые применяются вместо строк, разделенных пробелами — что шаг вперед по сравнению с юниксовыми sh.

Однако в данном случае мы имеем другую проблему — полное вылетание виртуальной машины. Мне удалось добиться интересного эффекта: я захожу по rstyx на inferno — и inferno в тот же миг падает, приходится ее перепускать. Я не гарантирую, что дело тут в пробелах, но склонен подозревать, что дело именно в них, потому что в другом месте аналогичное падение от пробелов зависело.
0
powerman #
А что выступает в роли клиента rstyx? Другая Inferno? Почему тогда не падает она? Вообще, Вы бы описали ситуацию более конкретно, может я под vmware смогу проверить этот баг… и, кстати, описывать её лучше сразу в трекере.

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