ch
Feedback
GNU/Linux | Notes

GNU/Linux | Notes

前往频道在 Telegram

Open Source, GNU/Linux, Debian/Ubuntu, Dotfiles, Software, Scripts, Notes, Terminal, Shell, Tools, Games, Fun, Misc, Music, Geek, Free Software Movement. Почта: krekhov.dev@gmail.com Кто я: https://t.me/krxnotes/246 GitHub: https://github.com/krekhovx

显示更多
2 236
订阅者
无数据24 小时
-27 天
-330 天
帖子存档
Локализация. Набор переменных, который определяет язык приложений, консоли и т.д. Например, разбор en_US.UTF8 en - язык. US - региональная настройка. UTF8 - кодировка. Язык - тут думаю понятно =) Региональная настройка - это определенные параметры, такие как формат даты и времени, валюта, числовой формат и другие локальные настройки, которые могут отличаться от других стран. Кодировка - определяет соответствие между символами и числовыми значениями, которые используются компьютером для их хранения и обработки. Получить все доступные локализации:
$ locale -a
Чтобы изменить локализацию можно задать:
$ export LANG=en_US.UTF8
Если при выводе выдаются ошибки типа: Cannot set LC_CTYPE to default locale: No such file or directory То скорее всего задается локализация, которая не была сгенерирована. Для этого нужно подправить /etc/locale.gen файл. В этом файле нужно раскомментировать нужную локализацию, например en_US.UTF-8 UTF-8 Затем выполнить:
$ locale-gen
Появится новая локализация:
$ locale -a
Можно запустить приложение с другим языком, например:
$ LANGUAGE=zh_TW vim
LANG - Локализация, установленная в этой переменной используется в качестве значения для всех остальных LC_* переменных. LANGUAGE - Запасные локализации (нужно для вывода сообщений на разных языках). ——— @krxnotes

Что такое upstream ? Процесс клонирования — это, в сущности, создание собственного репозитория (Б) на основе существующего (А) с целью добавить к продукту какие-то собственные изменения. Это называется fork (клонирование). Так вот, (Б) — это форк/клон, а (А) — это upstream. Создатель форка может быть никак не связан с создателями проекта и обычно может вносить изменения в форк, но не в upstream. В upstream он может только предлагать изменения. Поддержкой upstream занимаются мейнтейнеры (сопровождающие) проекта. Их версия является "канонической", и все изменения, которые они принимают, обычно в конечном счёте попадают в форки, которые от них зависят. В этом смысле они "выше по течению": те изменения, что они принимают, "растекаются вниз" по форкам. Отсюда и название. В целом, эти термины характеризуют определённый вид отношений между двумя репозиториями. Это необязательно должны быть два серверных репозитория. Эти термины применимы и к ситуации, когда у вас есть локальный клон репозитория с сервера. Репозиторий на сервере — это upstream, а у вас, в некотором смысле, форк. ——— @krxnotes

Поддерживаю! ——— @krxnotes
Поддерживаю! ——— @krxnotes

Настройка компиляции и линковки (переменные). CC Относится к компилятору (gcc, cc и т.д.). CFLAGS Этап компиляции. (Compiler Flags) - это флаги, передаваемые компилятору (например, gcc) для управления процессом компиляции исходного кода. Они могут включать опции для оптимизации кода, установки уровня предупреждений, определения макросов и т.д. Например: -Wall, -g3, -O0, -I/usr/local/include LDFLAGS Этап компоновки. (Linker Flags) - это флаги, передаваемые компоновщику (линкеру) для управления процессом компоновки объектных файлов в исполняемый файл или библиотеку. Они могут включать опции для указания путей к библиотекам, которые нужно подключить, установки версии библиотеки, определения символов и т.д. Например: -lm LIBS Включает в себя статические и динамические библиотеки (-lm, archive.a). CPPFLAGS Дополнительные флаги для препроцессора. Переменные вида CXX относятся к C++, например CXXFLAGS Опции предупреждений gcc: -Werror, -Wall Языковой стандарт: -std=c99 -ansi ——— @krxnotes

gcc (GNU Compiler Collection). Получение объектного файла (-с (compile) означает только компиляция - без компоновки):
$ gcc -c main.c
Процесс сборки, получение бинарного файла (-o задает имя исполняемого файла):
$ gcc -o exe a.o b.o
Компиляция одиночного файла:
$ gcc main.c -o program
Поместить отладочную информацию в объектный/исполняемый файл:
$ gcc -g<level>
$ gcc -g3 main.c
Удалить отладочную информацию из ELF файла:
$ strip -s a.out
Различные уровни оптимизации 0-3, 0 - НЕ оптимизировать код:
$ gcc -O0 main.c
-O3 означает оптимизировать код (улучшает его производительность, уменьшает размер кода и т.д.) Даже если программа собрана с -O3, volatile все равно говорит компилятору - НЕ оптимизировать код. Вывод сообщений о всех предупреждениях или ошибках, возникающих во время компиляции:
-Wall
Дополнительные предупреждения:
-Wextra
Эти флаги служат для поиска библиотек, передается компоновщику:
-L<путь> -l<библ>
Для поиска заголовочных файлов -I/usr/local/include
-I<путь>
В этой команде линкуется (связывается) exe с библиотекой math
gcc -o exe sums.c -lm
Бывают случаи когда нужной библиотеки нет в стандартной библиотеке и компиляцию придется осуществлять с дополнительным флагом, например так:
$ gcc main.c -lpthread
——— @krxnotes

sync. Всё что хранилось в памяти, буферах, кэшах, будет записано на диск, предотвращается потеря данных. Ядро хранит данные в памяти во избежание частых (обычно медленных) дисковых операций чтения и записи. Это повышает производительность, но если компьютер аварийно завершает работу, данные могут быть утеряны, либо может быть повреждена файловая система. sync гарантирует, что все, что хранилось в памяти, будет записано на диск. Например в выводе команды:
$ free -h
В секции buff/cache можно увидеть кол-во используемой памяти и вот именно она будет сброшена на диск. Например:
$ sync; umount /mnt
Так как это обеспечит более надежное сохранение данных на диск. Команда sync гарантирует, что все данные, находящиеся в оперативной памяти, будут записаны на диск перед тем как размонтировать файловую систему. Команда sync в Linux предназначена для записи данных из кэша (включая буфер и кэш страниц) на диск. Однако она не очищает кэш и буферы. То есть, после выполнения команды sync, данные остаются в кэше, но они уже записаны на диск, что обеспечивает их сохранность в случае отключения питания или сбоя. Поэтому, если вы используете команду sync и затем проверяете секцию buff/cache с помощью команды free -h, вы не увидите уменьшения этой секции. Это нормальное поведение. ——— @krxnotes

Этапы разработки (коротко). 1. Сбор и обработка требований 2. Получение технических заданий, планы работ 3. Разработка - Дизайн - Кодирование - Тестирование - Документирование 4. Поддержка - Внедрение (Установка ПО, обучение пользователей) - Сопровождение (Исправление выявленных ошибок, поддержка пользователей) ——— @krxnotes

Этапы компиляции. 1. Препроцессинг (обработка - cpp компонент)
$ gcc -E main.c -o main.i
Текст обрабатывается, производится: - замена комментариев пустыми строками - обрабатывает директивы #define / #ifdef - включает #include (копирует содержимое файлов как текст) 2. Трансляция кода в ассемблер (cpp компонент)
$ gcc -S main.i -o main.s
- транслирует исходный текст программы в ассемблерный код 3. Компиляция (объектный файл - as компонент)
$ as main.s -o main.o
- транслирует ассемблерный код в машинный код (бинарный модуль) - обработка и анализ кода - выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла - генерация кода из преобразованного, получается объектный файл Объектный файл - это программа машинных кодов с частичным сохранением символьной информации, необходимой в процессе сборки. При отладочной сборке возможно сохранение большого количества символьной информации (переменные, функции, типы). 4. Компоновка - линковка (связывание воедино всех объектных файлов - ld компонент)
$ gcc main.o -o program
- определяет связь объектных файлов, нужно чтобы файл А увидел переменную в файле Б, этой задачей занимается компоновщик. Когда программа делает ссылку на функцию, содержащуюся в библиотеке, компоновщик отыскивает эту функцию (например printf()) и добавляет ее код к программе. Таким образом, к программе добавляются только те функции, которые действительно будут в ней использоваться. При этом возможны ошибки связывания, если объявили функцию не в том месте, то получим ошибку на этом этапе. 5. Загрузка Вызвать загрузчик для загрузки нашей программы в память. Кратко: исходный текст -> препроцессинг -> ассемблер -> машинный код -> компоновка -> загрузка. Можно не вызывать данные компоненты напрямую, в компиляторе они уже включены: cpp - препроцессор as - ассемблер gcc - компилятор ld - линковка ——— @krxnotes

Компилятор. Термины - коротко. Компилятор распознает язык по расширению файла. Исходник Исходный файл содержит код на языке Си, файл оканчиваются на .c, например file.c Компиляция Исходный код пропускается через компилятор, проверка на ошибки и т.д. Результат Бинарный файл. Компилятор создает новый файл (исполняемый файл/бинарник), содержит машинный код, поток единиц и нулей, понятные ПК, это и есть программа. Кодирование - бинарный код (текст воспроизводится в бинарный код (0/1)). Декодирование - бинарный код воспроизводится в текст. Трансляторы: Компилятор -> СКОРОСТЬ Интерпретатор -> ГИБКОСТЬ ——— @krxnotes

Что такое ELF ? Executable and Linkable Format. Файл ELF является выходным файлом компилятора или линкера и имеет двоичный формат. Вместо того чтобы напрямую использовать язык CPU, мы используем ЯП, имеющий стандартные функции. Компилятор транслирует эти функции в объектный код. Этот объектный код затем линкуется в полную программу (с помощью ld). Результатом является двоичный файл, который может быть выполнен на конкретной платформе и конкретном типе CPU. Объектные файлы, библиотеки, дампы ядра, a.out файлы, всё это ELF файлы.
$ file a.out
a.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=7478e8fc71c172b058f3633fabcafb3b110c00a0, for GNU/Linux 3.2.0, not stripped ——— @krxnotes

X clipboards. Primary Старый и традиционный вид буфера. Копирование в Primary: с помощью мыши. Вставка из Primary: Middle click, Shift + insert. Clipboard Более современный буфер обмена. Копирование в Clipboard: Ctrl + C. Вставка из Clipboard: Ctrl + V. Secondary Используется реже и имеет меньшее значение в повседневной работе. Его использование зависит от конкретных приложений и инструментов. Работа с буферами обмена через утилиту xsel: Зачистка clipboard буфера:
$ xsel -b -c
Зачистка primary буфера:
$ xsel -p -c
Вставка в clipboard буфер:
$ echo "this is clipboard" | xsel -b -i
Вставка в primary буфер:
$ echo "this is primary" | xsel -p -i
——— @krxnotes

Как смотреть журналы в Linux (dmesg, journalctl). journalctl - системный журнал (читает /var/log/journal). Вывод в реальном времени:
$ journalctl -f
Отобразить сегодняшние записи:
$ journalctl -S today
Вывести только err уровень:
$ journalctl -S today -p err
err, warning уровни:
$ journalctl -S today -p 3..4
Показывает журнал конкретного сервиса:
$ journalctl -u <name>.service
dmesg - системный журнал ядра (читает /var/log/kern.log или напрямую из ядра). less вывод:
$ dmesg -H
Читабельный формат:
$ dmesg -T
Показывает уровень (приоритет):
$ dmesg -x
Вывод в реальном времени:
$ dmesg -w
В сумме:
$ dmesg -HTx
Зачистить dmesg:
$ dmesg -C
——— @krxnotes

Как пользоваться утилитой strace. Отследить работу процесса a.out:
$ strace a.out
Вывод в файл log:
$ strace -o my-log a.out
Отслеживание конкретного процесса:
$ strace -p <pid>
Отследить встроенную команду:
$ strace bash -c 'cd /tmp'
Например, команда 'mount -t nfs ...' возвращает отрицательный статус, можно проанализировать вывод утилиты strace.
$ strace -o mount.strace -s1024 -f -i -k -n mount -t nfs <path> <to-path>
Разбор: -s1024 длина сообщений будет полная, а не обрезанная (32 длиной). -f отслеживать дочерние процессы (если они будут созданы - fork()). -i указатель инструкции во время системного вызова. -k трассировка выполнения отслеживаемых процессов. -n номера системных вызовов. Данные трюки я использовал при отладке ПО. Работая системным программистом часто приходилось пользоваться strace. Если strace не работает, можно обратиться к файлу /proc/sys/kernel/yama/ptrace_scope, про него описано в man 2 ptrace. ——— @krxnotes

Ричард Столлман считает, что закрытое ПО приведет мир к тотальной слежке и бесконтрольной передаче данных 3 лицам. Он считает
Ричард Столлман считает, что закрытое ПО приведет мир к тотальной слежке и бесконтрольной передаче данных 3 лицам. Он считает, что закрытые программы ограничивают свободу пользователей и подвергают их контролю со стороны разработчиков. "Программное обеспечение, которое не является свободным, это инструмент контроля над нами. Это нас унижает и лишает свободы". Это война с корпорациями зла Google, Microsoft. Не стоит закрывать глаза на дыры в своей безопасности. Данные, информация, это очень важно. Ричард Столлман неоднократно подвергался давлению среди данных корпораций. Он невыгоден системе. Американское сообщество натравили на него ЛГБТ сообщества, лесбиянок, геев, трансгендеров, и пытались добиться его ухода из сообщества СПО. Отличный пример того как работает американская система. ——— @krxnotes

GNU GPL License и коммерческие компании (продажа). Если компания взяла программу под GNU GPL лицензией, внесла в неё изменения и начала продавать, но при этом ограничила доступ к своим измененным исходным кодам, она нарушает принципы данной лицензии. GNU GPL обязывает распространять исходный код программы и любые изменения к нему под той же лицензией, чтобы сохранить свободу программы для всех пользователей. Такие действия могут привести к правовым последствиям и претензиям со стороны сообщества свободного программного обеспечения. Для коммерческого ПО открывать исходники всем - это не принято, НО придется бесплатно предоставлять исходники проекта конечным получателям, даже если вы распространяете продукт за деньги. Да, продажа программы лицензией вполне разрешена. Предоставлять исходники можно как вместе с программой, так и отдельно. ——— @krxnotes

GNU GPL License (General Public License). Это свободная лицензия, которая позволяет свободно использовать, изменять и распрос
GNU GPL License (General Public License). Это свободная лицензия, которая позволяет свободно использовать, изменять и распространять программное обеспечение. Она устанавливает условия, при которых можно использовать программу и ее исходный код. Свободное использование в контексте GNU GPL лицензии означает, что пользователи имеют право свободно запускать программу в любых целях, изучать ее и изменять по своему усмотрению, а также распространять ее исходный код или измененные версии программы. Использование GNU GPL лицензии позволяет разработчикам и пользователям программного обеспечения свободно обмениваться идеями, улучшать и дополнять программы, а также создавать новые продукты на их основе. Это способствует развитию открытого и свободного программного обеспечения, а также способствует распространению знаний и технологий. Пользователи, которые получили программу под GNU GPL лицензией и внесли изменения в исходный код программы, обязаны предоставить доступ к своим изменениям исходного кода. Это означает, что они должны распространять свои измененные версии программы также под GNU GPL лицензией и предоставить доступ к своему исходному коду другим пользователям. Этот принцип обеспечивает сохранение свободы программы и позволяет другим разработчикам изучать, улучшать и распространять эти изменения. ——— @krxnotes

Интересные мысли из лекций Ричарда Столлмана. Кто задает инструкции вашему компьютеру ? Пользователь или корпорации ? В большинстве случаев CPU обрабатывает огромное кол-во инструкций необходимых именно корпорациям, а не пользователю. ПК не подчиняется вашим инструкциям. ПК выполняет пользовательские инструкции в той мере, в которой ему позволяют корпорации. Либо пользователь контролирует программы, либо программы контролируют пользователя. Корпорации превращают пользовательские данные в звонкую монеты, они жадные, и найдут способы как саботировать пользователя и создать из этого прибыль. Большие компании делают большие деньги контролируя пользователей. С закрытым ПО программист вряд ли чему-то научится, а с СПО все иначе. Программисты анализируют и дезасамблируют закрытое ПО чтобы затем написать открытое ПО. Это ужасно нелогично и затрагивает большое количество времени (это тяжелая работа). В нашей жизни компьютеры стали настолько важны, что свобода ПО стоит на первом месте по решению проблем/задач, это необходимость. Хороший пример с человеческим организмом, люди контролируют свое питание, прием жидкости, витаминов, фруктов и т.д, а почему вычисления компьютера нельзя контролировать ? Это несправедливо. Корпорации чувствуют власть над пользователями и поэтому злоупотребляют ей, они лучше знают как надо пользователю (видите ли), они постоянно испытывают искушение плохо обращаться с пользователями, таким образом корпорации внедряют различные зловредные функции (шпионаж) и пользователи не смогут это исправить, ведь ПО несвободное. В проприетарном ПО слежка уже является нормой. Windows, Mac OS, Android, IOS, Amazon - главные шпионы. Но люди все равно будут соглашаться на слежку, потому что уже не представляют свою жизнь без этих коммерческих продуктов. Данные пользователей отправляются на сервер, который контролирует корпорация. Затем корпорация может извлекать от туда данные и делать с ними все что угодно, например, продавать другим компаниям (рекламным) и т.д. Если производитель закрытого ПО закроет свои сервера, пользователь не сможет пользоваться приложениями без них. Потому что данные передаются круглосуточно. Почему корпорации делают все вышеописанное ? Что дает им мотивацию ? Прибыль, деньги. На слежке, на контроле пользователей можно делать деньги, и они это отлично понимают. Иногда корпорации творчески притворяются, что уважительно относятся к пользователю, но это не так, это уловка. Свободное ПО, как правило, честное. А проприетарное ПО, как правило, вредоносное. Сейчас не нужно через силу заставлять людей внедрять чипы, чтобы следить за ними, они и сами это сделают за бесплатные услуги корпораций. Нас подсаживают на бесплатные облака, музыку, фильмы и т.д. Нужно бороться ... ——— @krxnotes

Ричард Столлман является основателем движения свободного ПО (СПО). Автор концепции «копилефта», призванной защищать идеалы дв
Ричард Столлман является основателем движения свободного ПО (СПО). Автор концепции «копилефта», призванной защищать идеалы движения; эту концепцию он с помощью юристов позже воплотил в лицензии GNU General Public License (GNU GPL) для ПО. Ранее также известный программист. Из авторских программ можно отметить GNU Emacs, Коллекция компиляторов GNU (GCC) и Отладчик GNU (GDB). С середины 1990-х годов Столлман стал программировать значительно меньше, посвятив себя распространению идей свободного ПО. ——— @krxnotes

В мейнтейнерской среде часто используется инструмент eatmydata для ускорения установки пакетов и выполнения операций. Этот инструмент позволяет временно отключить синхронизацию данных на диске, что может значительно ускорить выполнение операций ввода-вывода. eatmydata обходит использование системных вызовов, связанных с синхронизацией данных на диске, таких как fsync(), fdatasync() и msync(). Он также может обходить вызовы, связанные с блокировками файлов, такие как flock(). Однако, следует помнить, что использование eatmydata может повлечь за собой потерю данных в случае аварийного отключения компьютера или других проблем. Поэтому его использование следует рассматривать с осторожностью и только в тех случаях, когда ускорение работы действительно необходимо. (man 1 eatmydata)
$ sudo apt-get install eatmydata
$ eatmydata apt-get install <a lot of packages>
——— @krxnotes

Только владелец должен иметь доступ, достаточный для полноценной работы с файлами и каталогами, а остальные вообще не должны иметь прав. Эту ситуацию можно исправить изменением маски. Я рекомендую установить ее в 077. В этом случае для каталогов права будут определены так: 777 - 077 = 700 (drwx------), а для файлов: 666 - 077 = 600 (или -rw-------). Тогда доступ к файлу имеет только владелец. Все остальные - отдыхают. Выдержка из книги Linux глазами хакера, 4 издание - Михаил Фленов. Можно прописать в .profile или .bashrc:
# set 077 umask for the user
# files -> 600 (rw-------)
# directories -> 700 (rwx------)
# for all users need change /etc/profile
# https://wintelguy.com/umask-calc.pl
(( $(umask) != 077 )) && umask 077
——— @krxnotes