Тема: Что я наделал со своим зверьком...
За последню неделю много чего делал со своим N900. Не блага ради или быстроты, а просто ради интереса и любопытства. Конечно есть какой-то и положительный эффект, но все это далось не легко и не просто...Опишу все, что я наделал со совим зверьком!
Поскольку вендой я совсем не пользуюсь, все манипуляции производились разумеется на GNU/Linux, а конкретне - ArchLinux...
1. Ext4 на встроенном eMMC.
Сперва первым шагом было избавление от vfat раздела и создание на флэшке только swap раздела и все остальное в ext3 под /home. Самый просто способ я нашел, используя миговское ядро для восстановления и загрузка его в рам тела с помощью флэшера.. Ибо на тот момент у меня еще небыло backupmenu и я даж не знал, что в нем можно тоже выдать компу весь eMMC и это было бы в разы проще и не потребовался бы flasher . Эта операция прошла очень просто. Через GParted снес имеющиеся разделы, создал большущий раздел для /home и обычные 768мб swap. Создал ext3 на большом разделе, скинул назад все папки и после этого телефон сразу и безболезненно загрузился.Был правда один нюанс со встроенным файловым менеджером, но об этом позже.
В общем пришла пора мигрировать на ext4. Однако тут есть пара неприятных нюансов:
1) ext4 поддерживается только в kernel-power и никак не в заводском ядре... что накладывает некоторые проблемы...
2) Требуется переписывать загрузочные скрипты и менять все упоминания ext3 на ext4 для раздела /home
3) журнал надо обязательно выключать, дабы сэкономить жизнь флэшки, но это несет риск потери незаписанных данных при спонтанном выключени устройства.
"Волков бояться - в лес не ходить!" (с) русская народная пословица. вроде...
С редактированием скриптов возник у меня один нюанс - я никак не мог понять решения нокии генерировать fstab через еще один скрипт (genfstab.awk). В общем я сделал так - из скрипта rcS-late вырезал весь код, использующий genfstab.awk и заменил его обычными echo с нужными мне строками fstab. Стало проще изменять его структуру и маневрировать разделами...
Скрипт rcS-late был изменен так, что fstab создавался прям в нем, так же все упоминания ext3 были заменены на ext4. Дальше выключение, загрузка backupmenu (на тот момент я его уже поставил - и не зря, просто мощнейшая штуковина!), доступ к eMMC и на линухе уже переформатируем раздел в ext4. Тут из-за пару статей, о том, как вырубить журнал - я нарвался на очень большую проблему, после которой тело находилось в постоянном ребуте, но решение которой оказалось элементарным и простым:
журнал вырубается так:
tune2fs -o journal_data_writeback /dev/sdd1
Это выставляет "пометку" для ОС, что монтировать ФС надо без журнала..
/dev/sdd1 - это так у меня в линухе появляется emmc раздел для /home.
А дальше уже на самом теле в опциях монтирования в fstab указвыается data=writeback.
И вуаля - /home теперь в ext4. В качестве бонуса - лучше скорость чтения/записи, нежели у ext3, но с добавленным риском утери незаписанных данных при спонтанном выключении девайса...
Хотя ext3 монтируется с точно таким же араметром и сомневаюсь, что у него дела в этом плане обстоят лучше
Проблема, всплывающая при отсутствии примонтированного отела MyDocs - в файловом менеджере да и почти во всех далогах открытия файла - будет видна только карта памяти...
Цивильным путем я решить эту проблему не смог, поэтому сделал оч простой костыль...
1) Создал файлик на 512кб в корне (/n900) командочкой
dd if=/dev/zero of=/n900 bs=1k count=512
Дальше его надо примонтировать, как диск, дя этого сперва делаем так:
losetup /dev/loop0 /n900
теперь нужно создать файловую систему на нашем новом "диске".
Я выбрал ext2 - чтоб можно было создать симлинк на домашний каталог
mkfs.ext2 /dev/loop0
и все - теперь монтируем:
mount /dev/loop0 /mnt
Теперь можно в этом диске создать симлинк на домашний каталог и добавить все это дело в rcS-late, чтобы автоматически создавался loop0 и монтировался в нужный нам каталог. Лично я монтирую его в /media/n900 и теперь в файловом менеджере будет карта памяти и эта примонтированная папка.(последний скрин в конце поста)
2. cgroups и волшебный патч.
Может многие, кто увлекается линуксом, читали про вошебный 200 строчный патч, повышающий отзывчивость системы при нагрузках. А так же про его альтернативу в 4 строчки с использованием cgroups. Так вот, бродя по просторам вселенной, а точнее talk.maemo.org - там же нашел вариант для нашей N900 с его применением. Судить пока об улучшении сложно. Так-то патч работает, вроде местами становится лучше, но нифига не ясно. Может просто это эффект плацебо...
3. stripe swap 768+768
Вроде вся фишка в использовании одновременно двух swap разделов. Дело вовсе не в увеличенном обьеме,,а именно в том, что используется одновременно 2 swap раздела, что немного повышает скорость скидывания в него ненужной памяти, а так же наоборот - при чтении из него обратно в память. Информация по этой теме была найдена, разумеется, на talk.maemo.org в данной теме И само собой, для того, чтобы все это работало при каждой загрузке - надо все эти изменения занести в rcS-late.
4. BASH вместо busybox для user и root.
Следующим шагом было осущствление давней затеи - использовать bash как дэфолтный шэл вместо busybox. Само собой для этого надо было установить собственно сам bash и gnu утилиты для пущей радости! Дальше танцы, пляски с бубном и в итоге сладкий бонус, который нам дают bash и утилиты GNU - красивое приветствие терминала , цветной вывод ls и прочие пряности и сладости.
Для установки BASH требует установить таковой из репозиториев - там их несколько - bash, bash3, bash4
я ставил просто bash:
Все операции выполняются с правами root! Будьте внимательны - ошибки и можно получить кирпич, вместо телефона!
apt-get install bash
apt-get install coreutils-gnu
Перед тем, как продолжать, рекомендую в терминале проверить работоспособность баш вводом команды:
/bin/bash
Если все впоряде, вы должны увидеть приветсвие баша, тогда пишем exit и продолжаем!
дальше следовательно надо изменть наш дефолтный шелл:
usermod -s /bin/bash user
usermod -s /bin/bash root
сохраняемся и можно перезапустить терминал.
В конфиг /etc/bashrc следует добавить новую переменную пути, чтоб использовать по умолчанию утилиты GNU
export PATH="/usr/bin/gnu:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/bin/X11"
Конфиг для баша создается в /etc/bashrc, а дальше для пользователя и рута делается симлинк
ln -s /etc/bashrc /home/user/.bashrc
ln -s /etc/bashrc /root/.bashrc
А в конец файла /etc/profile добавить строку
source /etc/bashrc
и желательно перезагрузиться.
После этого всего последовало написание .bashrc с красивым приветствием.
И вуаля - bash по дэфолту, утилиты gnu и просто красотище!(смотрите ниже bashrc)
Делается так, ибо PS1 для обоих одинаков. Если хотите совсем разные, то для каждого надо делать свой в домашнем каталоге, либо же есть и другие варианты, но это уже каждый для себя найдет сам.
5. Как бы получить права root через sudo без сторонних утилит.
Дальше мне захотелось использовать встроенный sudo по прямому назначению, а не всякие rootsh и sudser Покопавшись по файлику sudoers понял - что некий скрипт update-sudoers порти весь шоколад и пишет в /etc/sudoers кучу ереси. Методом проб и ошибок нашел вырный способ это похабство прекратить:
внести в файл /etc/sudoers 2 красивых строчки с правами для root и user на выполение всего и вся без пароя, а так же очистить скрипт update-sudoers, ибо ели его нету - некоторые скрипты установки/удаления программ начинают матюкаться и не хотят работать.. а так он есть, исполняем, но пуст. и теперь работает стандартный вариант debian/ubuntu для получения прав рута:
1) либо просто - sudo <programm>
2) либо для перехода под root - sudo -i или sudo su - Говорят sudo -i правильней...
Распишу этот пункт поподробней, ибо смотрю некоторым стало интересно.
- - - - - - - - - - -!!!!!!!!!! ОПАСНО !!!!!!!!!!- - - - - - - - - - -
ЕСЛИ ВЫ ГДЕ-ТО ОШИБЕТЕСЬ!!!!! БЕЗ БЭКАПА ROOTFS ВЫ УЖЕ НИКОГДА НЕ ПОЛУЧИТЕ ПРАВА РУТА И ПРИДЕТСЯ ПЕРЕПРОШИВАТЬСЯ!!!!! ФУНКЦИОНИРОВАНИЕ С BUSYBOX НЕ ПРОВЕРЕНО!!!!! ЛУЧШЕ НЕ ПРОБУЙТЕ, ЕСЛИ У ВАС НЕТУ BACKUPMENU и НЕТУ СВЕЖЕНЬКОГО БЭКАПА ROOTFS!!!!!!
Для того, чтоб это провернуть - изначально всеравно надо rootsh, чтоб изменить файл sudoers и update-sudoers. Значится делаем так с правами рут, иначе не выйдет:
echo "" > /usr/sbin/update-sudoers
echo "root ALL = (ALL) NOPASSWD: ALL" > /etc/sudoers
echo "user ALL = (ALL) NOPASSWD: ALL" >> /etc/sudoers
chmod 0440 /etc/sudoers
chown root:root /etc/sudoers
Далее требуется ребут и можно спокойно удалять rootsh и sudser.
- - - - - - - - - - -!!!!!!!!!! ОПАСНО !!!!!!!!!!- - - - - - - - - - -
но вроде должно быть окей...
6. Подправленная раскладка клавиатуры
Подправил клавиатурную раскладку, добавив на неё <, >, |, {, }, [, ], Page Up, Page down, Home, End. В русском варианте на стрелочках буквы и стрелки работают с нажатым Ctrl.
В аттачменте 2 файлика, которые пришлось изменить:
/usr/share/X11/xkb/types/nokia - В нем пришлость скостылить вариант для стрелочек с биндом через Ctrl, ибо по стандарту для них есть только 2 уровня, дабы оставить рабочим выделение с зажатым шифтом, и добавить еще 6 уровней, ибо иначе по ctrl+space не переключается на 5й уровень
/usr/share/X11/xkb/symbols/nokia_vndr/rx-51 - собсна сам конфиг раскладки.
П.С.Ниже в спойлерах измененный rcS-late, bashrc, nokia, rx-51 и несколько скринов.
Выкладываю свой измененный /etc/event.d/rcS-late скрипт
description "late rcS actions"
start on started hal
stop on stopping hal
console none
script
#mount /home; fix ext4 and retry mounting if 1st attempt fails
mount_home ()
{
/bin/mount /home && grep -q "/home ext4 rw" /proc/mounts
if [ $? -eq 0 ]
then
return 0
else
grep -q "/home ext4 ro" /proc/mounts
if [ $? -eq 0 ]
then
umount /home
fi
HOME_DEV=`grep "/home ext4" /etc/fstab | cut -d' ' -f1`
fsck.ext4 -y $HOME_DEV >> /var/lib/fsck_ext4_home.log 2>&1
sync
/bin/mount /home && grep -q "/home ext4 rw" /proc/mounts
return $?
fi
}
ACT_DEAD=0
HOME_MOUNTED=0
#check act_dead
if [ -e /tmp/ACT_DEAD ]; then
ACT_DEAD=1
fi
# Generate fstab and mount /home
. /etc/default/mount-opts
fstab=/etc/fstab
tmp_fstab=/tmp/fstab
#echo "Defaults env_check+=\"HOME DISPLAY\""
#echo "Defaults env_keep+=\"HOME DISPLAY\""
#echo "root ALL = (ALL) NOPASSWD: ALL" > /etc/sudoers
#echo "user ALL = (ALL) NOPASSWD: ALL" >> /etc/sudoers
#chmod 0440 /etc/sudoers
#chown root:root /etc/sudoers
losetup /dev/loop0 /n900
echo "rootfs / rootfs defaults,errors=remount-ro,noatime 0 0" > $tmp_fstab
echo "/dev/mmcblk0p1 /home ext4 rw,noatime,nodiratime,errors=continue,commit=1,data=writeback 0 0" >> $tmp_fstab
echo "/home/opt /opt none bind" >> $tmp_fstab
echo "/dev/mmcblk0p2 none swap sw 0 0" >> $tmp_fstab
echo "/dev/mmcblk1p1 /media/mmc1 vfat noauto,nodev,noexec,nosuid,noatime,nodiratime,utf8,uid=29999,shortname=mixed,dmask=000,fmask=0133,rodir 0 0" >> $tmp_fstab
echo "/dev/loop0 /media/N900 ext2 rw,noatime,nodiratime" >> $tmp_fstab
# sfdisk -l /dev/mmcblk0 | /bin/busybox awk \
# -v home_opts="$home_opts" -v fat_opts="$fat_opts" \
# -f /usr/lib/genfstab.awk > $tmp_fstab
cmp -s $tmp_fstab $fstab || cp $tmp_fstab $fstab
rm -f $tmp_fstab
if [ $ACT_DEAD -eq 0 ]; then
/usr/sbin/swapon -p 1 /dev/mmcblk0p2 || echo "Failed to enable paging partition."
/usr/sbin/swapon -p 1 /dev/mmcblk1p3 || echo "Failed to enable paging partition"
# Setup lowmem module
echo 32768 > /proc/sys/vm/lowmem_deny_watermark_pages
echo 98304 > /proc/sys/vm/lowmem_notify_high_pages
echo 131072 > /proc/sys/vm/lowmem_notify_low_pages
echo 1024 > /proc/sys/vm/lowmem_nr_decay_pages
# Exclude some UIDs from memory allocation denial.
# 30000 is messagebus, 30001 could be used by Matchbox
echo "30000 30001 30002 30003" > /proc/sys/vm/lowmem_allowed_uids
fi
mount_home && HOME_MOUNTED=1
# If failed to mount /home and system has been already optified - reboot
if [ $HOME_MOUNTED -eq 0 ]
then
if [ -e /var/lib/maemo-optify-firstboot-do-not-clean-home-opt ]; then
telinit 6
fi
else
[ ! -d /home/opt ] && mkdir /home/opt
[ ! -d /opt ] && mkdir /opt
fi
if [ $ACT_DEAD -eq 0 ]
then
if [ $HOME_MOUNTED -eq 1 ]
then
if [ -x /usr/sbin/maemo-optify-firstboot.sh ]; then
. /usr/sbin/maemo-optify-firstboot.sh
fi
fi
fi
/bin/mount /opt || echo "Failed to mount(bind) /opt."
/bin/mount /media/N900 || echo "Failed to mount N900."
/bin/mount /media/mmc1 || echo "Failed to mount mmc1."
if [ $ACT_DEAD -eq 0 ]
then
if [ $HOME_MOUNTED -eq 1 ]
then
if [ -x /usr/sbin/maemo-optify-auto-opt.sh ]; then
. /usr/sbin/maemo-optify-auto-opt.sh
fi
fi
if [ -d /home/preinstalled -a -d /home/user ]
then
rm -rf /home/user
fi
if [ ! -d /home/user ]
then
if [ -d /home/preinstalled ]
then
mv /home/preinstalled /home/user
else
mkdir /home/user
fi
cd /etc/skel
cp -a . /home/user
chown -R user:users /home/user
sync
fi
fi
if [ ! -d /home/user ]
then
mkdir /home/user
chown user:users /home/user
sync
fi
# We can safely continue booting now.
initctl emit MOUNTS_OK
# Adjust flushing of memory card buffers
echo 40 > /proc/sys/vm/dirty_ratio
echo 10 > /proc/sys/vm/dirty_background_ratio
# Initialize PRNG pool with the HW RNG. Slow, but that's ok.
URANDOM_POOLSZ=512
if [ -e /dev/hwrng ]; then
echo "Seeding entropy pool"
dd if=/dev/hwrng of=/dev/urandom bs=$URANDOM_POOLSZ count=1
fi
# Data for the panic info driver
mount -t debugfs nodev /sys/kernel/debug
modprobe panic_info_buff
sleep 1
osso-product-info > /sys/kernel/debug/panic_info_buff
end script
normal exit 0
umask 022
export EDITOR="/usr/bin/nano -w"
# Color Codes
col_bold="\033[1m"
col_red="\033[1;31m"
col_green="\033[1;32m"
col_yellow="\033[1;33m"
col_blue="\033[1;34m"
col_purple="\033[1;35m"
col_cyan="\033[1;36m"
col_normal="\033[0;39m"
function advice
{
adv=/etc/advices
/usr/bin/gnu/shuf -n 1 $adv
}
PS1="\e[0;31m\]?[\[ \e[0;32m\]\u\e[0;31m\]]+[\e[0;32m\]N900\e[0;31m\]]+[\e[0;32m\]$('advice')\e[0;31m\]]\[\e[0;31m\]\n\\[\017\]\e[0;31m\]?[\[\[\e[0;32m\]\w\[\e[0;31m\]]--> \[\e[0m\]"
alias ls='ls --color=auto'
alias lsc='ls --color=never'
alias df='df -h'
alias psg='ps -e | grep'
alias recal='history | grep'
alias nano='/usr/bin/nano -w'
LS_COLORS='di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:su=37;41:sg=30;43:tw=01;42:ow=01;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.zip=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.cpio=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.avi=01;35:*.flv=01;35:*.pdf=00;32:*.ps=00;32:*.txt=00;32:*.patch=00;32:*.diff=00;32:*.log=00;32:*.tex=00;32:*.doc=00;32:*.mid=00;36:*.midi=00;36:*.mp3=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36'
export LS_COLORS
export PATH="/usr/bin/gnu:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/bin/X11"
// $Xorg: pc,v 1.3 2000/08/17 19:54:48 cpqbld Exp $
//
partial default xkb_types "default" {
// Some types that are used by Nokia devices and keyboard.
virtual_modifiers LevelThree;
virtual_modifiers RControl;
virtual_modifiers LControl;
type "PC_FN_LEVEL2" {
modifiers = LevelThree;
map[None] = Level1;
map[LevelThree] = Level2;
level_name[Level1] = "Base";
level_name[Level2] = "Fn";
};
type "PC_FN_LEVEL4" {
modifiers = Control+LevelThree+LevelFive;
map[None] = Level1;
map[Control] = Level2;
map[LevelThree] = Level3;
map[Control+LevelThree] = Level4;
map[LevelFive] = Level5;
map[Control+LevelFive] = Level6;
map[LevelThree+LevelFive] = Level7;
map[Control+LevelThree+LevelFive] = Level8;
level_name[Level1] = "Base";
level_name[Level2] = "Control";
level_name[Level3] = "Alt Base";
level_name[Level4] = "Control Alt";
level_name[Level5] = "X";
level_name[Level6] = "X Control";
level_name[Level7] = "X Alt Base";
level_name[Level8] = "X Control Alt";
};
};
default partial alphanumeric_keys
xkb_symbols "common" {
include "nokia_vndr/rx-51(common_keys)"
include "nokia_vndr/rx-51(modifiers)"
// This section should not be included by any other section.
// It's referenced only once by rule file to allow multiple layout configurations.
// More than one layout at the same time could be set for instance as follows:
// setxkbmap -rules evdev \
// -model nokiarx51 \
// -option grp:ctrl_shift_toggle \
// -layout us,cz \
// -variant ",qwerty"
// Notice the similarity:
// "pc+us+cz(qwerty):2+grp:XYZ" vs.
// "nokia_vndr/rx-51(common)+nokia_vndr/rx-51(us)+nokia_vndr/rx-51(cz_qwerty):2+grp:XYZ"
// where XYZ is one of xkb_symbols section usually located in file symbols/group.
// Bear in mind that option XYZ could replace current keys configuration!!!
// For instance using symbols/group(ctrl_shift_toggle) redefines LCTL and LFSH keys
// which may disallow opening of virtual symbol table (Multi_key).
// Fortunately the Multi_key is defined in 3rd and 4th level a ctrl_shift_toggle
// redefines first two levels only. But RX-51 has not right Ctrl nor Shift therefore
// pressing Ctrl+Shift will switch to previous layout, not to the next one.
// For RX-51 device there is a lot of restrictions if more than one layout is
// is configured at the same time because some modifiers and special cases are
// handled by hildon layer (especially with eight-level layout):
// - settings may be done from terminal only (GUI doesn't and won't support it)
// - virtual symbol table is not updated according to current layout
// - for unknown reasons the eight-level layout (nordic,ru) works properly
// only if it's configured as first layout (e.g. "ru,us,cz" not "us,cz,ru")
// otherwise it's not possible to access levels 5-8
// - Ctrl+Space related problems:
// - If eight-level layout is used as first layout one of eight-level layouts has to
// be also chosen in GUI - otherwise the Ctrl+Space "switch" is disabled
// - Ctrl+Space has no effect if only four-level layouts are chosen
// (don't forget the layout configured in GUI - despite of it's not reachable)
// - a few keys in 2nd layer could be mixed with other layouts when Ctrl+Space is "turned on" (why?)
// in case eight- and four-level layouts are configured simultaneously
// - Ctrl+Space is "turned on" by default and has to be "turned off" for four-level layouts
// in case eight- and four-level layouts are configured simultaneously
// - four-level layout on first place doesn't work at all when Ctrl+Space is "turned on"
// in case the 2nd, 3rd or 4th layout is eight-level layout
};
////////////////////////////////////////////////////////////////////////////////
partial alphanumeric_keys
xkb_symbols "us" {
include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_4btns)"
name[Group1] = "U.S. English";
};
partial alphanumeric_keys
xkb_symbols "pl" {
include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_4btns)"
name[Group1] = "Polish";
};
partial alphanumeric_keys
xkb_symbols "fise" {
include "nokia_vndr/rx-51(nordic_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "Finnish/Swedish";
// 2. row
key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam ] };
key <UP> { [ adiaeresis, Adiaeresis, question, question ] };
};
partial alphanumeric_keys
xkb_symbols "dano" {
include "nokia_vndr/rx-51(nordic_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "Danish/Norwegian";
// 2. row
key <AB09> { [ oslash, Oslash, exclam, exclam ] };
key <UP> { [ ae, AE, question, question ] };
};
partial alphanumeric_keys
xkb_symbols "nordic" {
include "nokia_vndr/rx-51(nordic_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "Danish/Finnish/Norwegian/Swedish";
key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
// 2. row
key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam, oslash, Oslash, exclam, exclam ] };
key <UP> { [ adiaeresis, Adiaeresis, question, question, ae, AE, question, question ] };
};
partial alphanumeric_keys
xkb_symbols "ptes" {
include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "Portuguese/Spanish";
// 1. row
key <AB08> { [ dead_acute, dead_acute, dead_grave, dead_grave ] };
// 2. row
key <AC05> { [ g, G, exclamdown, exclamdown ] };
key <AC06> { [ h, H, exclam, exclam ] };
key <AC07> { [ j, J, questiondown, questiondown ] };
key <AC08> { [ k, K, question, question ] };
key <AC09> { [ l, L, dead_diaeresis, dead_diaeresis ] };
key <AB09> { [ ntilde, Ntilde, dead_tilde, dead_tilde ] };
key <UP> { [ ccedilla, Ccedilla, dead_circumflex,dead_circumflex ] };
// 3. row
key <AB01> { [ z, Z, parenleft, parenleft ] };
key <AB02> { [ x, X, parenright, parenright ] };
key <AB03> { [ c, C, slash, slash ] };
key <AB04> { [ v, V, quotedbl, quotedbl ] };
key <AB05> { [ b, B, apostrophe, apostrophe ] };
key <AB06> { [ n, N, colon, colon ] };
key <AB07> { [ m, M, semicolon, semicolon ] };
key <LEFT> { [ period, comma, comma, comma ] };
};
partial alphanumeric_keys
xkb_symbols "fr" {
include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "French";
// 1. row
key <AD01> { [ a, A, 1, 1 ] };
key <AD02> { [ z, Z, 2, 2 ] };
key <AB08> { [ agrave, Agrave, ccedilla, Ccedilla ] };
// 2. row
key <AC01> { [ q, Q, asterisk, asterisk ] };
key <AC02> { [ s, S, plus, plus ] };
key <AC03> { [ d, D, numbersign, numbersign ] };
key <AC04> { [ f, F, minus, minus ] };
key <AC05> { [ g, G, underscore, underscore ] };
key <AC06> { [ h, H, exclam, exclam ] };
key <AC07> { [ j, J, question, question ] };
key <AC08> { [ k, K, colon, colon ] };
key <AC09> { [ l, L, dead_circumflex,dead_circumflex ] };
key <AB09> { [ m, M, ugrave, Ugrave ] };
key <UP> { [ eacute, Eacute, egrave, Egrave ] };
// 3. row
key <AB01> { [ w, W, EuroSign, EuroSign ] };
key <AB03> { [ c, C, parenleft, parenleft ] };
key <AB04> { [ v, V, parenright, parenright ] };
key <AB05> { [ b, B, slash, slash ] };
key <AB07> { [ comma, comma, apostrophe, apostrophe ] };
key <LEFT> { [ semicolon, period, period, period ] };
};
partial alphanumeric_keys
xkb_symbols "de" {
include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "German";
// 1. row
key <AD06> { [ z, Z, 6, 6 ] };
key <AB08> { [ udiaeresis, Udiaeresis, ssharp, ssharp ] };
// 2. row
key <AC08> { [ k, K, semicolon, semicolon ] };
key <AC09> { [ l, L, colon, colon ] };
key <AB09> { [ odiaeresis, Odiaeresis, exclam, exclam ] };
key <UP> { [ adiaeresis, Adiaeresis, question, question ] };
// 3. row
key <AB01> { [ y, Y, EuroSign, EuroSign ] };
key <AB03> { [ c, C, equal, equal ] };
key <LEFT> { [ period, comma, comma, comma ] };
};
partial alphanumeric_keys
xkb_symbols "ch" {
include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "Swiss";
// 1. row
key <AD06> { [ z, Z, 6, 6 ] };
key <AB08> { [ udiaeresis, Udiaeresis, egrave, Egrave ] };
// 2. row
key <AC06> { [ h, H, equal, equal ] };
key <AC07> { [ j, J, parenleft, parenleft ] };
key <AC08> { [ k, K, parenright, parenright ] };
key <AC09> { [ l, L, colon, colon ] };
key <AB09> { [ odiaeresis, Odiaeresis, eacute, Aacute ] };
key <UP> { [ adiaeresis, Adiaeresis, agrave, Agrave ] };
// 3. row
key <AB01> { [ y, Y, question, question ] };
key <AB02> { [ x, X, exclam, exclam ] };
key <AB03> { [ c, C, ccedilla, Ccedilla ] };
key <LEFT> { [ period, comma, comma, comma ] };
};
// Levels 5-8 are Russian, levels 1-4 US English, for shortcut reasons.
partial alphanumeric_keys
xkb_symbols "ru" {
# include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_4btns_m)"
name[Group1] = "Russian";
key.type[Group1] = "EIGHT_LEVEL_SEMIALPHABETIC";
// 1. row
key <AD01> { [ q, Q, 1, 1, Cyrillic_shorti, Cyrillic_SHORTI, 1, 1 ] };
key <AD02> { [ w, W, 2, 2, Cyrillic_tse, Cyrillic_TSE, 2, 2 ] };
key <AD03> { [ e, E, 3, 3, Cyrillic_u, Cyrillic_U, 3, 3 ] };
key <AD04> { [ r, R, 4, 4, Cyrillic_ka, Cyrillic_KA, 4, 4 ] };
key <AD05> { [ t, T, 5, 5, Cyrillic_ie, Cyrillic_IE, 5, 5 ] };
key <AD06> { [ y, Y, 6, 6, Cyrillic_en, Cyrillic_EN, 6, 6 ] };
key <AD07> { [ u, U, 7, 7, Cyrillic_ghe, Cyrillic_GHE, 7, 7 ] };
key <AD08> { [ i, I, 8, 8, Cyrillic_sha, Cyrillic_SHA, 8, 8 ] };
key <AD09> { [ o, O, 9, 9, Cyrillic_shcha, Cyrillic_SHCHA, 9, 9 ] };
key <AD10> { [ p, P, 0, 0, Cyrillic_ze, Cyrillic_ZE, 0, 0 ] };
key <AB08> { [ comma, semicolon, equal, equal, Cyrillic_ha, Cyrillic_HA, equal, equal ] };
// 2. row
key <AC01> { [ a, A, asterisk, asterisk, Cyrillic_ef, Cyrillic_EF, asterisk, asterisk ] };
key <AC02> { [ s, S, plus, plus, Cyrillic_yeru, Cyrillic_YERU, plus, plus ] };
key <AC03> { [ d, D, numbersign, numbersign, Cyrillic_ve, Cyrillic_VE, numbersign, numbersign ] };
key <AC04> { [ f, F, minus, minus, Cyrillic_a, Cyrillic_A, minus, minus ] };
key <AC05> { [ g, G, underscore, underscore, Cyrillic_pe, Cyrillic_PE, underscore, underscore ] };
key <AC06> { [ h, H, parenleft, braceleft, Cyrillic_er, Cyrillic_ER, parenleft, braceleft ] };
key <AC07> { [ j, J, parenright, braceright, Cyrillic_o, Cyrillic_O, parenright, braceright ] };
key <AC08> { [ k, K, ampersand, ampersand, Cyrillic_el, Cyrillic_EL, ampersand, ampersand ] };
key <AC09> { [ l, L, exclam, bar, Cyrillic_de, Cyrillic_DE, exclam, bar ] };
key <AB09> { [ period, colon, question, question, Cyrillic_zhe, Cyrillic_ZHE, question, question ] };
# key <UP> { [ Up, Up, Page_Up, Page_Up, Cyrillic_e, Cyrillic_E, Up, Up ] };
// 3. row
key <AB01> { [ z, Z, sterling, sterling, Cyrillic_ya, Cyrillic_YA, Cyrillic_yu, Cyrillic_YU ] };
key <AB02> { [ x, X, dollar, dollar, Cyrillic_che, Cyrillic_CHE, dollar, dollar ] };
key <AB03> { [ c, C, EuroSign, EuroSign, Cyrillic_es, Cyrillic_ES, EuroSign, EuroSign ] };
key <AB04> { [ v, V, slash, less, Cyrillic_em, Cyrillic_EM, slash, slash ] };
key <AB05> { [ b, B, backslash, greater, Cyrillic_i, Cyrillic_I, backslash, backslash ] };
key <AB06> { [ n, N, quotedbl, bracketleft, Cyrillic_te, Cyrillic_TE, quotedbl, bracketleft ] };
key <AB07> { [ m, M, apostrophe, bracketright, Cyrillic_softsign, Cyrillic_hardsign, apostrophe, bracketright ] };
# key <LEFT> { [ Left, Left, Home, Home, Cyrillic_be, Cyrillic_BE, Cyrillic_yu, Cyrillic_YU ] };
# key <DOWN> { [ Down, Down, Page_Down, Page_Down, Left, Left, Down, Down ] };
# key <RGHT> { [ Right, Right, Right, Right, Right, Right, Up, Up ] };
key <SPCE> { [ space, space, at, at, space, space, at, at ] };
};
partial alphanumeric_keys
xkb_symbols "it" {
include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "Italian";
// 1. row
key <AB08> { [ egrave, Egrave, eacute, Eacute ] };
// 2. row
key <AC06> { [ h, H, semicolon, semicolon ] };
key <AC07> { [ j, J, colon, colon ] };
key <AC08> { [ k, K, exclam, exclam ] };
key <AC09> { [ l, L, question, question ] };
key <AB09> { [ ograve, Ograve, igrave, Igrave ] };
key <UP> { [ agrave, Agrave, ugrave, Ugrave ] };
// 3. row
key <AB01> { [ z, Z, EuroSign, EuroSign ] };
key <AB02> { [ x, X, parenleft, parenleft ] };
key <AB03> { [ c, C, parenright, parenright ] };
key <LEFT> { [ period, comma, comma, comma ] };
};
partial alphanumeric_keys
xkb_symbols "cz" {
include "nokia_vndr/rx-51(english_base)"
include "nokia_vndr/rx-51(arrows_2btns)"
name[Group1] = "Czech";
// 1. row
key <AD06> { [ z, Z, 6, 6 ] };
key <AB08> { [ dead_acute, dead_acute, sterling, sterling ] };
// 2. row
key <AC08> { [ k, K, semicolon, semicolon ] };
key <AC09> { [ l, L, colon, colon ] };
key <AB09> { [ uring, Uring, EuroSign, EuroSign ] };
key <UP> { [ dead_caron, dead_caron, dollar, dollar ] };
// 3. row
key <AB01> { [ y, Y, equal, equal ] };
key <AB02> { [ x, X, slash, slash ] };
key <AB03> { [ c, C, backslash, backslash ] };
key <AB04> { [ v, V, apostrophe, apostrophe ] };
key <AB05> { [ b, B, quotedbl, quotedbl ] };
key <AB06> { [ n, N, exclam, exclam ] };
key <AB07> { [ m, M, question, question ] };
key <LEFT> { [ period, comma, comma, comma ] };
};
partial alphanumeric_keys
xkb_symbols "cz_qwerty" {
include "nokia_vndr/rx-51(cz)"
name[Group1] = "Czech - qwerty";
// Do not use the layout "cz_qwerty" directly if it is the only layout and compat rules enabled.
// There is one compat rule that converts "cz_qwerty" to "pc+cz(qwerty)" which is not correct for RX-51.
// Use either the layout "cz(qwerty)" or the general "cz" with variant "qwerty".
// 1. row
key <AD06> { [ y, Y, 6, 6 ] };
// 3. row
key <AB01> { [ z, Z, percent, percent ] };
};
////////////////////////////////////////////////////////////////////////////////
partial hidden alphanumeric_keys
xkb_symbols "nordic_base" {
include "nokia_vndr/rx-51(english_base)"
// 1. row
key <AB08> { [ aring, Aring, equal, equal ] };
// 2. row
key <AC08> { [ k, K, semicolon, semicolon ] };
key <AC09> { [ l, L, colon, colon ] };
// 3. row
key <AB01> { [ z, Z, EuroSign, EuroSign ] };
key <AB03> { [ c, C, sterling, sterling ] };
key <LEFT> { [ period, comma, comma, comma ] };
};
partial hidden alphanumeric_keys
xkb_symbols "english_base" {
// 1. row
key <AD01> { [ q, Q, 1, 1 ] };
key <AD02> { [ w, W, 2, 2 ] };
key <AD03> { [ e, E, 3, 3 ] };
key <AD04> { [ r, R, 4, 4 ] };
key <AD05> { [ t, T, 5, 5 ] };
key <AD06> { [ y, Y, 6, 6 ] };
key <AD07> { [ u, U, 7, 7 ] };
key <AD08> { [ i, I, 8, 8 ] };
key <AD09> { [ o, O, 9, 9 ] };
key <AD10> { [ p, P, 0, 0 ] };
key <AB08> { [ comma, semicolon, equal, equal ] };
// 2. row
key <AC01> { [ a, A, asterisk, asterisk ] };
key <AC02> { [ s, S, plus, plus ] };
key <AC03> { [ d, D, numbersign, numbersign ] };
key <AC04> { [ f, F, minus, minus ] };
key <AC05> { [ g, G, underscore, underscore ] };
key <AC06> { [ h, H, parenleft, parenleft ] };
key <AC07> { [ j, J, parenright, parenright ] };
key <AC08> { [ k, K, ampersand, ampersand ] };
key <AC09> { [ l, L, exclam, exclam ] };
key <AB09> { [ period, colon, question, question ] };
// 3. row
key <AB01> { [ z, Z, sterling, sterling ] };
key <AB02> { [ x, X, dollar, dollar ] };
key <AB03> { [ c, C, EuroSign, EuroSign ] };
key <AB04> { [ v, V, slash, slash ] };
key <AB05> { [ b, B, backslash, backslash ] };
key <AB06> { [ n, N, quotedbl, quotedbl ] };
key <AB07> { [ m, M, apostrophe, apostrophe ] };
key <SPCE> { [ space, space, at, at ] };
};
partial hidden alphanumeric_keys
xkb_symbols "common_keys" {
// all other common keys
key <BKSP> { [ BackSpace, Delete, BackSpace, Delete ] };
key <TAB> { [ Tab ] };
// broken UI spec.
key <RTRN> { [ KP_Enter ] };
key <KPEN> { [ Return ] };
key <ESC> { [ Escape ] };
key <FK01> { [ F1 ] };
key <FK02> { [ F2 ] };
key <FK03> { [ F3 ] };
key <FK04> { [ F4 ] };
key <FK05> { [ F5 ] };
key <FK06> { [ F6 ] };
// Swap +/- keys intentionally. The VOL+/VOL- keys are located physically
// on left/right and up/down in landscape/portrait orientation. This does
// not feel natural for the user and therefore we want the VOL+/VOL- keys
// map to -/+.
//
// The only exception is an active call in portrait mode where we want to
// use the real meanings of the keys. This special case and management of
// +/- keys in general is handled in maemo-statusmenu-volume.
key <FK07> { [ F8 ] };
key <FK08> { [ F7 ] };
key <FK09> { [ F9 ] };
key <FK10> { [ F10 ] };
key <FK11> { [ F11 ] };
};
partial hidden alphanumeric_keys modifier_keys
xkb_symbols "modifiers" {
// Shift switches between current level and level+1
key <LFSH> {
type[Group1] = "ONE_LEVEL",
symbols[Group1] = [ Shift_L ]
};
modifier_map Shift { Shift_L };
// Fn+Ctrl virtual symbol table (Multi_key)
// Ctrl+Space switches between 1st and 5th level (hardcoded in hildon)
key <LCTL> {
type[Group1] = "FOUR_LEVEL",
symbols[Group1] = [ Control_L, Control_L, Multi_key, Multi_key ]
};
modifier_map Control { Control_L };
// Fn key (right alt) switches to 3rd level
include "level3(ralt_switch)"
};
partial hidden alphanumeric_keys
xkb_symbols "arrows_2btns" {
// rx-51 specific arrows mapping
// normal 2nd level must not be enumerated to allow text selection with Shift key
key <DOWN> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Left, Up ] };
key <RGHT> { type[Group1] = "PC_FN_LEVEL2", symbols[Group1] = [ Right, Down ] };
};
partial hidden alphanumeric_keys
xkb_symbols "arrows_4btns" {
// standard arrows mapping
// normal 2nd level must not be enumerated to allow text selection with Shift key
key <UP> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Up ] };
key <LEFT> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Left ] };
key <DOWN> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Down ] };
key <RGHT> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Right ] };
};
partial hidden alphanumeric_keys
xkb_symbols "arrows_4btns_m" {
key <UP> { type[Group1] = "PC_FN_LEVEL4", symbols[Group1] = [ Up, Up, Page_Up, Page_Up, Cyrillic_e, Cyrillic_E, Up, Page_Up ] };
key <LEFT> { type[Group1] = "PC_FN_LEVEL4", symbols[Group1] = [ Left, Left, Home, Home, Cyrillic_be, Cyrillic_BE, Left, Home ] };
key <DOWN> { type[Group1] = "PC_FN_LEVEL4", symbols[Group1] = [ Down, Down, Page_Down, Page_Down, Cyrillic_yu, Cyrillic_YU, Down, Page_Down ] };
key <RGHT> { type[Group1] = "PC_FN_LEVEL4", symbols[Group1] = [ Right, Right, End, End, Cyrillic_hardsign, Cyrillic_hardsign, Right, End ] };
};
В аттаче файлик advices для приветствия bash с некоторыми советами. ложить в /etc
Опять же повторюсь - это все делалось интересу ради и just for fun
BASH default shell, root without sudser & rootsh, modded pulseaudio[/size]