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 235
المشتركون
+324 ساعات
+17 أيام
لا توجد بيانات30 أيام
أرشيف المشاركات
2 230
Что такое fingerprint ?
При первом подключении по SSH к удаленной машине генерируется fingerprint и добавляется в файл
~/.ssh/known_hosts, наш ПК запоминает эту комбинацию и сверяет ее при каждом входе, если кто-то переустановит SSH сервер или OC, то мы об этом узнаем, потому что изменится fingerprint.
———
@krxnotes2 230
Локализация.
Набор переменных, который определяет язык приложений, консоли и т.д.
Например, разбор 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 - Запасные локализации (нужно для вывода сообщений на разных языках).
———
@krxnotes2 230
Что такое upstream ?
Процесс клонирования — это, в сущности, создание собственного репозитория (Б) на основе существующего (А) с целью добавить к продукту какие-то собственные изменения. Это называется fork (клонирование).
Так вот, (Б) — это форк/клон, а (А) — это upstream.
Создатель форка может быть никак не связан с создателями проекта и обычно может вносить изменения в форк, но не в upstream. В upstream он может только предлагать изменения.
Поддержкой upstream занимаются мейнтейнеры (сопровождающие) проекта. Их версия является "канонической", и все изменения, которые они принимают, обычно в конечном счёте попадают в форки, которые от них зависят. В этом смысле они "выше по течению": те изменения, что они принимают, "растекаются вниз" по форкам. Отсюда и название.
В целом, эти термины характеризуют определённый вид отношений между двумя репозиториями. Это необязательно должны быть два серверных репозитория. Эти термины применимы и к ситуации, когда у вас есть локальный клон репозитория с сервера. Репозиторий на сервере — это upstream, а у вас, в некотором смысле, форк.
———
@krxnotes
2 230
Настройка компиляции и линковки (переменные).
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
2 230
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
———
@krxnotes2 230
sync.
Всё что хранилось в памяти, буферах, кэшах, будет записано на диск, предотвращается потеря данных. Ядро хранит данные в памяти во избежание частых (обычно медленных) дисковых операций чтения и записи. Это повышает производительность, но если компьютер аварийно завершает работу, данные могут быть утеряны, либо может быть повреждена файловая система. sync гарантирует, что все, что хранилось в памяти, будет записано на диск.
Например в выводе команды:
$ free -h
В секции buff/cache можно увидеть кол-во используемой памяти и вот именно она будет сброшена на диск.
Например:
$ sync; umount /mnt
Так как это обеспечит более надежное сохранение данных на диск. Команда sync гарантирует, что все данные, находящиеся в оперативной памяти, будут записаны на диск перед тем как размонтировать файловую систему.
Команда sync в Linux предназначена для записи данных из кэша (включая буфер и кэш страниц) на диск. Однако она не очищает кэш и буферы. То есть, после выполнения команды sync, данные остаются в кэше, но они уже записаны на диск, что обеспечивает их сохранность в случае отключения питания или сбоя. Поэтому, если вы используете команду sync и затем проверяете секцию buff/cache с помощью команды free -h, вы не увидите уменьшения этой секции. Это нормальное поведение.
———
@krxnotes2 230
Этапы разработки (коротко).
1. Сбор и обработка требований
2. Получение технических заданий, планы работ
3. Разработка
- Дизайн
- Кодирование
- Тестирование
- Документирование
4. Поддержка
- Внедрение (Установка ПО, обучение пользователей)
- Сопровождение (Исправление выявленных ошибок, поддержка пользователей)
———
@krxnotes
2 230
Этапы компиляции.
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 - линковка
———
@krxnotes2 230
Компилятор. Термины - коротко.
Компилятор распознает язык по расширению файла.
Исходник
Исходный файл содержит код на языке Си, файл оканчиваются на .c, например file.c
Компиляция
Исходный код пропускается через компилятор, проверка на ошибки и т.д.
Результат
Бинарный файл.
Компилятор создает новый файл (исполняемый файл/бинарник), содержит машинный код, поток единиц и нулей, понятные ПК, это и есть программа.
Кодирование - бинарный код (текст воспроизводится в бинарный код (0/1)).
Декодирование - бинарный код воспроизводится в текст.
Трансляторы:
Компилятор -> СКОРОСТЬ
Интерпретатор -> ГИБКОСТЬ
———
@krxnotes
2 230
Что такое 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
———
@krxnotes2 230
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
———
@krxnotes2 230
Как смотреть журналы в 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
———
@krxnotes2 230
Как пользоваться утилитой 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.
———
@krxnotes2 230
Ричард Столлман считает, что закрытое ПО приведет мир к тотальной слежке и бесконтрольной передаче данных 3 лицам. Он считает, что закрытые программы ограничивают свободу пользователей и подвергают их контролю со стороны разработчиков.
"Программное обеспечение, которое не является свободным, это инструмент контроля над нами. Это нас унижает и лишает свободы". Это война с корпорациями зла Google, Microsoft. Не стоит закрывать глаза на дыры в своей безопасности. Данные, информация, это очень важно.
Ричард Столлман неоднократно подвергался давлению среди данных корпораций. Он невыгоден системе. Американское сообщество натравили на него ЛГБТ сообщества, лесбиянок, геев, трансгендеров, и пытались добиться его ухода из сообщества СПО. Отличный пример того как работает американская система.
———
@krxnotes
2 230
GNU GPL License и коммерческие компании (продажа).
Если компания взяла программу под GNU GPL лицензией, внесла в неё изменения и начала продавать, но при этом ограничила доступ к своим измененным исходным кодам, она нарушает принципы данной лицензии. GNU GPL обязывает распространять исходный код программы и любые изменения к нему под той же лицензией, чтобы сохранить свободу программы для всех пользователей. Такие действия могут привести к правовым последствиям и претензиям со стороны сообщества свободного программного обеспечения. Для коммерческого ПО открывать исходники всем - это не принято, НО придется бесплатно предоставлять исходники проекта конечным получателям, даже если вы распространяете продукт за деньги. Да, продажа программы лицензией вполне разрешена. Предоставлять исходники можно как вместе с программой, так и отдельно.
———
@krxnotes
2 230
GNU GPL License (General Public License).
Это свободная лицензия, которая позволяет свободно использовать, изменять и распространять программное обеспечение. Она устанавливает условия, при которых можно использовать программу и ее исходный код. Свободное использование в контексте GNU GPL лицензии означает, что пользователи имеют право свободно запускать программу в любых целях, изучать ее и изменять по своему усмотрению, а также распространять ее исходный код или измененные версии программы.
Использование GNU GPL лицензии позволяет разработчикам и пользователям программного обеспечения свободно обмениваться идеями, улучшать и дополнять программы, а также создавать новые продукты на их основе. Это способствует развитию открытого и свободного программного обеспечения, а также способствует распространению знаний и технологий.
Пользователи, которые получили программу под GNU GPL лицензией и внесли изменения в исходный код программы, обязаны предоставить доступ к своим изменениям исходного кода. Это означает, что они должны распространять свои измененные версии программы также под GNU GPL лицензией и предоставить доступ к своему исходному коду другим пользователям. Этот принцип обеспечивает сохранение свободы программы и позволяет другим разработчикам изучать, улучшать и распространять эти изменения.
———
@krxnotes
2 230
Интересные мысли из лекций Ричарда Столлмана.
Кто задает инструкции вашему компьютеру ? Пользователь или корпорации ? В большинстве случаев CPU обрабатывает огромное кол-во инструкций необходимых именно корпорациям, а не пользователю. ПК не подчиняется вашим инструкциям. ПК выполняет пользовательские инструкции в той мере, в которой ему позволяют корпорации. Либо пользователь контролирует программы, либо программы контролируют пользователя. Корпорации превращают пользовательские данные в звонкую монеты, они жадные, и найдут способы как саботировать пользователя и создать из этого прибыль. Большие компании делают большие деньги контролируя пользователей.
С закрытым ПО программист вряд ли чему-то научится, а с СПО все иначе. Программисты анализируют и дезасамблируют закрытое ПО чтобы затем написать открытое ПО. Это ужасно нелогично и затрагивает большое количество времени (это тяжелая работа). В нашей жизни компьютеры стали настолько важны, что свобода ПО стоит на первом месте по решению проблем/задач, это необходимость.
Хороший пример с человеческим организмом, люди контролируют свое питание, прием жидкости, витаминов, фруктов и т.д, а почему вычисления компьютера нельзя контролировать ? Это несправедливо. Корпорации чувствуют власть над пользователями и поэтому злоупотребляют ей, они лучше знают как надо пользователю (видите ли), они постоянно испытывают искушение плохо обращаться с пользователями, таким образом корпорации внедряют различные зловредные функции (шпионаж) и пользователи не смогут это исправить, ведь ПО несвободное. В проприетарном ПО слежка уже является нормой. Windows, Mac OS, Android, IOS, Amazon - главные шпионы. Но люди все равно будут соглашаться на слежку, потому что уже не представляют свою жизнь без этих коммерческих продуктов.
Данные пользователей отправляются на сервер, который контролирует корпорация. Затем корпорация может извлекать от туда данные и делать с ними все что угодно, например, продавать другим компаниям (рекламным) и т.д. Если производитель закрытого ПО закроет свои сервера, пользователь не сможет пользоваться приложениями без них. Потому что данные передаются круглосуточно.
Почему корпорации делают все вышеописанное ? Что дает им мотивацию ? Прибыль, деньги. На слежке, на контроле пользователей можно делать деньги, и они это отлично понимают. Иногда корпорации творчески притворяются, что уважительно относятся к пользователю, но это не так, это уловка.
Свободное ПО, как правило, честное.
А проприетарное ПО, как правило, вредоносное.
Сейчас не нужно через силу заставлять людей внедрять чипы, чтобы следить за ними, они и сами это сделают за бесплатные услуги корпораций. Нас подсаживают на бесплатные облака, музыку, фильмы и т.д. Нужно бороться ...
———
@krxnotes
2 230
Ричард Столлман является основателем движения свободного ПО (СПО). Автор концепции «копилефта», призванной защищать идеалы движения; эту концепцию он с помощью юристов позже воплотил в лицензии GNU General Public License (GNU GPL) для ПО. Ранее также известный программист. Из авторских программ можно отметить GNU Emacs, Коллекция компиляторов GNU (GCC) и Отладчик GNU (GDB). С середины 1990-х годов Столлман стал программировать значительно меньше, посвятив себя распространению идей свободного ПО.
———
@krxnotes
2 230
В мейнтейнерской среде часто используется инструмент eatmydata для ускорения установки пакетов и выполнения операций. Этот инструмент позволяет временно отключить синхронизацию данных на диске, что может значительно ускорить выполнение операций ввода-вывода. eatmydata обходит использование системных вызовов, связанных с синхронизацией данных на диске, таких как fsync(), fdatasync() и msync(). Он также может обходить вызовы, связанные с блокировками файлов, такие как flock().
Однако, следует помнить, что использование eatmydata может повлечь за собой потерю данных в случае аварийного отключения компьютера или других проблем. Поэтому его использование следует рассматривать с осторожностью и только в тех случаях, когда ускорение работы действительно необходимо. (
man 1 eatmydata)
$ sudo apt-get install eatmydata
$ eatmydata apt-get install <a lot of packages>
———
@krxnotes