Уже не школьник & Bсё ещё блогер

Хочу сказать, что поток моих мыслей по своей деликатности ограничивается лишь законами РФ. Всё, за что ещё нельзя сесть в тюрьму(такого, по-моему, не осталось...), я не стесняюсь писать здесь. Поэтому, если вы не хотите оскорбиться либо вконец разочароваться во мне, то я рекомендую вам закрыть вкладку от греха подальше.

Моё портфолио лежит в /projects


2028-11-20 00:47

Введение

Есть первая версия этой заметки, в которой я больше душу изливал, чем делился подробностями реализации. Эту заметку я писал, пока делал автоматизацию, т.к. уже 3 месяца я перезапускаю это вручную, отчего я устал ещё в первый день. То есть, я опять же для себя стараюсь, чтобы потом легче было это поддерживать.

Автоматизация запуска

Юнит systemd

[Unit]
Description=Privoxy/Squid transparent proxy
After=network.target

[Service]
ExecStart=/root/startup_proxy.sh      # <--запуск
ExecStop=/root/stopdown_proxy.sh      # <--очистка
RemainAfterExit=yes
Type=simple

[Install]
WantedBy=multi-user.target

Он элементарен, на нём останавливаться не буду.

Скрипт запуска

Далее скрипт запуска:

  1. Для работы Proxy нужен отдельный netns, т.к. перехват трафика реализован через подмену DNS. Таким образом, для моих устройств ресурсы, требующие обхода, будут разрешать в IP, принадлежащий этому отдельному netns:
NETNS_NAME="proxy"   
NETNS_EXEC="ip netns exec $NETNS_NAME"   
  
ip netns add $NETNS_NAME || exit 10   
  1. Ну и настройка veth для связи между netns и доступом в Интернет из proxy. Отмечу также, что я решил повесить шейпер на исходящий из proxy интерфейс. Важно не забыть:
    1. Добавить маршрут из proxy в Интернет, т.к. маршрута по умолчанию там не создаётся;
    2. Поднять петлю lo, т.к. в новом netns он создастся, но не поднимется;
    3. Настроить SNAT из proxy в Интернет.
ip link add to_proxy type veth peer name to_global || exit 20   
ip addr add ${GLOBAL_NETNS_IP}/24 dev to_proxy || exit 21   
ip link set to_proxy up || exit 22   
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source ${OUTER_IP} || exit 23   
  
ip link set to_global netns $NETNS_NAME || exit 30   
$NETNS_EXEC ip addr add ${PROXY_NETNS_IP}/24 dev to_global || exit 31   
$NETNS_EXEC tc qdisc add dev to_global root tbf rate 15mbit latency 50ms burst 512k || exit 32   
$NETNS_EXEC ip link set to_global up || exit 33   
$NETNS_EXEC ip ro add default via ${GLOBAL_NETNS_IP} || exit 34
$NETNS_EXEC ip link set lo up || exit 35
  1. Запуск всех процессов. В данном списке нет Tor и ещё одного экземпляра Bind9. Они упущены потому, что они уже настроены и ими я пользуюсь и отдельно, и начал пользоваться задолго до поднятия прозрачного прокси.
    1. named — Bind9. Этот экземпляр настроен на пропуск всех запросов стороннему DNS, таким образом он будет разрешать DNS-имена в реальные IP, по которым будут ходить прокси;
    2. privoxy — Прокси-сервер. Он умеет в прозрачность, но не умеет в подмену сертификатов. Используется на 80 порту как прозрачный, и им же пользуется Squid как непрозрачным для MITM атаки на HTTPS на своём 443 порту;
    3. squid — Прокси сервер, который умеет в подмену сертификатов. Запускается он весьма экстравагантно, да. В моём репозитории довольно старая версия, возможно с этим связано. С тонной отладочных сообщений в консоли он — субъективное ощущение — работает стабильней, чем без.
$NETNS_EXEC /usr/sbin/named -4 -d 9 -u bind -c /etc/bind/named.conf.proxy || exit 40
$NETNS_EXEC /usr/sbin/privoxy /etc/privoxy/privoxy.config || exit 41
nohup $NETNS_EXEC /usr/sbin/squid -YCNX -d 5 -f /etc/squid/squid_privoxy.conf > /dev/null 2>&1 &  
disown

На этом скрипт запуска пока заканчивается.

Скрипт остановки

Со скриптом остановки всё проще, т.к. не надо расстраивать интерфейсы — достаточно их удалить.

  1. Убиваем все запущенные процессы в proxy. Squid иногда не хочет останавливаться, поэтому ему мы можем послать SIGKILL.
NETNS_NAME="proxy"
ip netns pids $NETNS_NAME | xargs -r kill
sleep 3
ip netns pids $NETNS_NAME | xargs -r kill -SIGKILL
  1. Подчищаем сеть, удалив один из veth(по идее, удалится вместо с братом при удалении netns, но на всякий случай я продублировал) и netns целиком:
ip link delete to_proxy
ip netns delete $NETNS_NAME
  1. Подчищаем правила iptables. По идее, дубликаты правила для SNAT погоды не сделают, т.к., судя по счётчикам, дубликаты не отрабатывают, но для красоты я их всё-таки подчищаю:
while iptables -t nat -D POSTROUTING -o eth0 -j SNAT --to-source ${OUTER_IP}; do : ; done

Конфигурационные файлы

Bind9 основной

В нём мне необходимо подменять ответы DNS-сервера на мой IP. Для этого я подключил файл, в котором перечислены зоны, которые я хочу подменять. Все они достаточно высокого уровня, то есть каждая охватывает конкретный домен, по сути.

Сам файл нет смысла приводить полностью, опишу пару записей для примера:

zone "xvideos.com" IN {
    type master;
    file "/etc/bind/db.myip.ru";
};
zone "xvideos-cdn.com" IN {
    type master;
    file "/etc/bind/db.myip.ru";
};

Как видно, эти настройки говорят обращаться к файлу db.myip.ru. А это уже стандартный файл БД для DNS-сервера:

;
; BIND data file for t-proxy
;
$TTL    604800
@       IN      SOA     . root. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ${OUTER_IP}
@       IN      A       ${PROXY_NETNS_IP}
*       IN      A       ${PROXY_NETNS_IP}

Перед тем, как публиковать заметку, я максимально обобщил базу данных таким образом, чтобы на любой запрос она отправляла ${PROXY_NETNS_IP}. Работоспособность при этом не пострадала.

Bind9 для прокси

Здесь DNS-сервер уже должен разрешать домены в настоящие адреса, по которым будет ходить прокси. По большому счёту, из-за этого и заводился отдельный netns: чтобы разделить два DNS-сервера на уровне системы. Его конфиг, по сути, является стандартным конфигом Bind9, но с пробросом всех запросов на сторонний DNS.

options {
    directory "/var/cache/bind";
    forwarders {
        8.8.8.8;
    };
    dnssec-validation no;
    auth-nxdomain no;    # conform to RFC1035
    listen-on {
        127.0.0.1;
    };
    allow-query {
        127.0.0.1;
        10.48.0.0/24;
    };
};
include "/etc/bind/named.conf.default-zones";

Также прямо в этот же конфиг я добавил проброс некоторых запросов в Tor. Теоретически, есть ресурсы, доступ к которым можно производить внутри сети Tor, не выходя из её выходного узла.

zone "xvideos.com" IN {
    type forward;
    forwarders {
        ${OUTER_IP} port 9053; //TOR
    };
};
zone "xvideos-cdn.com" IN {
    type forward;
    forwarders {
        ${OUTER_IP} port 9053; //TOR
    };
};

Privoxy

Для Privoxy у меня почти стандартная конфигурация. Выглядит так, если отсеять комментарии:

user-manual /usr/share/doc/privoxy/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.
actionsfile default.action   # Main actions file
actionsfile user.action      # User customizations
filterfile default.filter
filterfile user.filter      # User customizations
logfile logfile
debug     8192 # Log the destination for each request Privoxy let through. See also debug 1024.
listen-address  ${PROXY_NETNS_IP}:80
toggle  0
enable-remote-toggle  0
enable-remote-http-toggle  0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 4096
enable-proxy-authentication-forwarding 0
forward-socks5t   /               ${OUTER_IP}:9050 .
forwarded-connect-retries  0
accept-intercepted-requests 1
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 300
tolerate-pipelining 1
socket-timeout 300
max-client-connections 512
log-messages   1

По факту, наибольшую пользу наносят следующие две строчки:

listen-address  ${PROXY_NETNS_IP}:80   # <-- откуда слушать
forward-socks5t   /               ${OUTER_IP}:9050 .   # <-- куда проксировать

Squid

По традиции, конфигурация Squid тоже близка к стандартной:

http_access allow all
icp_access allow all
htcp_access allow all
dns_nameservers 127.0.0.1
https_port ${PROXY_NETNS_IP}:443 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
acl step1 at_step SslBump1
ssl_bump peek step1 all
ssl_bump splice all
ssl_bump server-first all
ssl_bump none all
never_direct allow all
cache_peer ${PROXY_NETNS_IP} parent 80 0 no-query proxy-only no-digest default
cache_peer_access ${PROXY_NETNS_IP} allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 16MB
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
logfile_rotate 4
pid_filename /var/run/squid.pid

Из особенностей здесь, как раз, настройка прозрачности HTTPS(Peek and splice):

acl step1 at_step SslBump1
ssl_bump peek step1 all
ssl_bump splice all
ssl_bump server-first all
ssl_bump none all
never_direct allow all

Ещё, по идее, для Squid нужно ключей сгенерировать. Приведу сюда листинг команд для генерации из старой заметки.

openssl genrsa -out /etc/squid/ssl/squid.key
openssl req -new -key /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.csr
openssl x509 -req -days 3650 -in /etc/squid/ssl/squid.csr -signkey /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.pem
openssl x509 -in /etc/squid/ssl/squid.pem -outform DER -out squid.der

2022-06-04 18:33

Введение

Эту заметку я по большей части для себя пишу, т.к. сейчас всё делается костылями, чтобы собрать все растяжки. Именно описание всех этих растяжек на пути к рабочему решению и есть цель этой заметки.

Проблема

Всё больше ресурсов блокируют в последнее время. У меня уже довольно давно имеется входная точка Tor внутри моего VPN. Однако, для того, чтобы ходить через Tor в Интернет необходимо настроить клиент соответствующим образом, чтобы он использовался socks-proxy. Если только, не проксировать трафик прозрачно!

Однако, надо иметь в виду, что я не хочу гнать весь трафик через свой VPN.

Что есть?

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

Входная точка Tor у меня тоже есть — об этом уже сказал.

Остальное, думаю, не имеет значения.

Что же получилось в итоге

На текущий момент я уже поднял костыльное решение. Оно работает, хожу в twitter через него. Начну с конца.

Для того, чтобы сходить в Интернет через Tor, нужен клиент socks-proxy. Но я хочу прозрачный прокси, ещё и с перехватом. Прозрачно перехватывать HTTP трафик умеет privoxy. Чтобы не возиться с редиректами и маршрутами можно просто подменить DNS запись. Таким образом, клиентское устройство будет само отправлять запрос моему прокси серверу.

Но есть нюанс: privoxy не умеет HTTPS. Но, есть squid — в нём, конечно, полно мин, но его можно заставить атаковать мои устройства по принципу MITM.

Приведу диаграмму в качестве примера. На ней gosuslugi.ru — ресурс, к которому я хочу ходить напрямую, а example.com — ресурс, к которому я хочу ходить анонимно через Tor. Буковы рядом с доменами — условные IP адреса.

Итак, два дня мучений

2022.03.05

Начинаю новый раунд: ставлю squid. Дело в том, что sslsplit, как оказалось, не умеет работать с прокси. Но squid должен уметь. Правда, не из коробки, но можно собрать с поддержкой MITM-атаки.

Для сборки нужно сначала установить зависимости:

apt build-dep squid
apt install libssl-dev

Внезапно, (я не знал) можно скачать сорцы через apt:

apt source squid

Далее, в файл debian/rules в переменную DEB_CONFIGURE_EXTRA_FLAGS нужно добавить ключи конфигурации для включения SSL:

--enable-ssl \
--enable-ssl-crtd \
--with-openssl

По идее, теперь нужно только собрать да установить пакет в систему:

dpkg-buildpackage -d -uc -us
dpkg -i ../squid*.deb

Наткнулся на следующую ошибку:

In file included from ../../src/anyp/PortCfg.h:18:0,  
                from PortCfg.cc:10:  
../../src/ssl/gadgets.h:83:45: error: ‘CRYPTO_LOCK_X509’ was not declared in this scope  
typedef LockingPointer<X509, X509_free_cpp, CRYPTO_LOCK_X509> X509_Pointer;  
                                            ^~~~~~~~~~~~~~~~  
../../src/ssl/gadgets.h:83:61: error: template argument 3 is invalid  
typedef LockingPointer<X509, X509_free_cpp, CRYPTO_LOCK_X509> X509_Pointer;  
                                                            ^  
../../src/ssl/gadgets.h:89:53: error: ‘CRYPTO_LOCK_EVP_PKEY’ was not declared in this scope  
typedef LockingPointer<EVP_PKEY, EVP_PKEY_free_cpp, CRYPTO_LOCK_EVP_PKEY> EVP_PKEY_Pointer;  
                                                    ^~~~~~~~~~~~~~~~~~~~  
../../src/ssl/gadgets.h:89:73: error: template argument 3 is invalid  
typedef LockingPointer<EVP_PKEY, EVP_PKEY_free_cpp, CRYPTO_LOCK_EVP_PKEY> EVP_PKEY_Pointer;  
                                                                        ^  
../../src/ssl/gadgets.h:116:43: error: ‘CRYPTO_LOCK_SSL’ was not declared in this scope  
typedef LockingPointer<SSL, SSL_free_cpp, CRYPTO_LOCK_SSL> SSL_Pointer;  
                                          ^~~~~~~~~~~~~~~  
../../src/ssl/gadgets.h:116:58: error: template argument 3 is invalid  
typedef LockingPointer<SSL, SSL_free_cpp, CRYPTO_LOCK_SSL> SSL_Pointer;

Если ты из ESR — ставь лайк! Да, надо поставить другую версию SSL библиотеки: libssl1.0-dev.

Так, у меня ещё одна ошибка:

ErrorDetailManager.cc: In member function ‘virtual bool Ssl::ErrorDetailFile::parse(const char*, int, boo  
l)’:  
ErrorDetailManager.cc:215:35: error: invalid conversion from ‘const char*’ to ‘size_t {aka long unsigned  
int}’ [-fpermissive]  
            if (!parser.parse(s, e)) {  
                                  ^  
In file included from ../../src/HttpMsg.h:16:0,  
                from ../../src/HttpRequest.h:16,  
                from ErrorDetailManager.h:13,  
                from ErrorDetail.h:13,  
                from ErrorDetailManager.cc:10:  
../../src/HttpHeader.h:223:9: note:   initializing argument 2 of ‘int HttpHeader::parse(const char*, size  
_t)’  
    int parse(const char *header_start, size_t len);  
        ^~~~~

Попробую использовать этот патч:

From f42a67c56f8b16ce1b09df6caef1543d30ebc1c7 Mon Sep 17 00:00:00 2001
From: Christos Tsantilas <chtsanti@users.sourceforge.net>
Date: Sun, 9 Nov 2014 14:45:46 +0200
Subject: [PATCH] Parser-NG: fixes to allow ecap and ssl subsystems build

---
 src/adaptation/ecap/MessageRep.cc | 3 +--
 src/ssl/ErrorDetailManager.cc     | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/adaptation/ecap/MessageRep.cc b/src/adaptation/ecap/MessageRep.cc
index 4002856b042..8bbfeb1ae93 100644
--- a/src/adaptation/ecap/MessageRep.cc
+++ b/src/adaptation/ecap/MessageRep.cc
@@ -235,8 +235,7 @@ Adaptation::Ecap::RequestLineRep::method(const Name &aMethod)
         theMessage.method = HttpRequestMethod(static_cast<Http::MethodType>(id));
     } else {
         const std::string &image = aMethod.image();
-        theMessage.method = HttpRequestMethod(image.data(),
-                                              image.data() + image.size());
+        theMessage.method.HttpRequestMethodXXX(image.c_str());
     }
 }

diff --git a/src/ssl/ErrorDetailManager.cc b/src/ssl/ErrorDetailManager.cc
index b798d4b2762..43fc4b00529 100644
--- a/src/ssl/ErrorDetailManager.cc
+++ b/src/ssl/ErrorDetailManager.cc
@@ -212,7 +212,7 @@ Ssl::ErrorDetailFile::parse(const char *buffer, int len, bool eof)

         if ( s != e) {
             DetailEntryParser parser;
-            if (!parser.parse(s, e)) {
+            if (!parser.parse(s, e - s)) {
                 debugs(83, DBG_IMPORTANT, HERE <<
                        "WARNING! parse error on:" << s);
                 return false;

В bash это будет выглядеть так:

wget https://github.com/squid-cache/squid/commit/f42a67c56f8b16ce1b09df6caef1543d30ebc1c7.patch -O debian/patches/9990-fix-ssl.patch
echo 9990-fix-ssl.patch >> debian/patches/series

Да, надо засовывать его в иерархию dpkg, иначе dpkg-source ругаться будет.[^1]

[^1]: Вывод: надо собирать всё из свежих сорцов своими руками — убивать на это больше времени, зато потом сидеть-пердеть и в ус не дуть, и оно рано или поздно точно соберётся (можно же самому всё починить!).

И ещё одна ошибка:

MessageRep.cc: In member functionvirtual void Adaptation::Ecap::RequestLineRep::method(const Name&)’:  
MessageRep.cc:236:27: error: ‘class HttpRequestMethod’ has no member named ‘HttpRequestMethodXXX’; did yo  
u mean ‘HttpRequestMethod’?  
        theMessage.method.HttpRequestMethodXXX(image.c_str());  
                          ^~~~~~~~~~~~~~~~~~~~

Откатываю правку в этом файле из патча, который мы скачали. Надеюсь, сработает.

In file included from client_side.cc:132:0:  
ssl/certificate_db.h:56:0: error: "Here" redefined [-Werror]  
#define Here __FILE__, __LINE__  

In file included from ../src/base/TextException.h:15:0,  
                from ../src/SBufExceptions.h:12,  
                from ../src/SBuf.h:14,  
                from ../src/http/MethodType.h:12,  
                from ../src/HttpRequestMethod.h:12,  
                from ../src/AccessLogEntry.h:18,  
                from acl/FilledChecklist.h:12,  
                from client_side.cc:61:  
../src/base/Here.h:15:0: note: this is the location of the previous definition  
#define Here() SourceLocation(__FUNCTION__, __FILE__, __LINE__)

Пошёл по пути наименьшего сопротивления, решил её, отредактировав патч debian/patches/CVE-2019-12526.patch, чтобы макрос назывался в нём по-другому: Here1.

А ещё я словил virtual memory exhausted: Cannot allocate memory. Полагаю, дело лишь в количестве оперативы на моём VPS (2 ГиБ). Попробовал дать ключик, чтоб он собирал одним потоком, но не помогло. Придётся локально собирать. Это уже завтра. Могу попробовать запустить образ из reg.ru в виртуалке, но, КМК, достаточно репу такую же собрать и каталог squid_biuld стянуть.

2022.03.06

Пришлось поставить локально машину на Debian. К сожалению, нашёл только 9.13 (на моём хосте 9.11). Кажется, не должно ничего сломать. Собралось нормально.

Так, по крайней мере теперь он понимает директивы для настройки перехвата HTTPS. Однако, надо теперь с ключами разобраться:

[root@GRayCloud squid_deb]# /usr/sbin/squid -YCN -d 9 -f /etc/squid/squid_privoxy.conf  
FATAL: No valid signing SSL certificate configured for HTTPS_port 10.XXX.0.1:443  
Squid Cache (Version 3.5.23): Terminated abnormally.  
CPU Usage: 0.016 seconds = 0.012 user + 0.004 sys  
Maximum Resident Size: 60176 KB  
Page faults with physical i/o: 0

Собственно, ключи этими командами генерировал:

openssl genrsa -out /etc/squid/ssl/squid.key
openssl req -new -key /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.csr
openssl x509 -req -days 3650 -in /etc/squid/ssl/squid.csr -signkey /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.pem
openssl x509 -in /etc/squid/ssl/squid.pem -outform DER -out squid.der

По идее, squid.der надо установить на клиентское устройство. Однако, например, на моём телефоне браузер не жалуется. Может быть, это как-то связано с моим VPN, который также по сертификатам работает.

Блять... Оказывается, squid, когда перехватывает HTTPS, не ходит в DNS разрешать доменное имя! Он берёт IP из оригинального запроса! Что сделал squid, когда я попытался сходить на myip.ru? Залупился сам в себя! 10/10.

Попробую закомментировать данный кусок кода. Правда, я сначала закомментировал, а потом посмотрел патч: там, оказывается, ещё правки есть. В любом случае, откатить это на версии 3.5.23 не получится без правки патча.

Изучаю логи с отладкой. Кажется, я обосрался. Он прям печатает запрос:

2022/03/06 16:49:50.347| 11,2| client_side.cc(2352) parseHttpRequest: HTTP Client local=10.XXX.0.1:443 remote=10.YYY.0.30:58290 FD 13 flags=33
2022/03/06 16:49:50.347| 11,2| client_side.cc(2353) parseHttpRequest: HTTP Client REQUEST:
---------
CONNECT 10.XXX.0.1:443 HTTP/1.1
Host: 10.XXX.0.1:443

То есть, запрос изначально отправляется с IP, а не с DNS именем.

Честно говоря, я уже и не понимаю: что происходит. Я перечитал ещё раз эту статью. Есть вероятность, что я обосрался, и мне нужен четвёртый сквирт.

Обратил внимание, что автор использует некий "Peek and splice". Толком не читал: что это, но могу предположить, что имеется в виду. Думаю, речь о том, чтобы установить соединение с клиентом, принять от него условный GET и только потом пойти к настоящему серверу по адресу, в который разрешится домен из запроса.

В общем, я добавил следующие опции в конфигу:

acl step1 at_step SslBump1  
ssl_bump peek step1 all  
ssl_bump splice all  
ssl_bump server-first all  
ssl_bump none all  
never_direct allow all

— и всё заработало как надо. Дальше уже была возня с DNS, чтоб в твиттер пускало. И оно пускает!


2022-03-07 14:20

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


2022-02-12 15:49

По заветам Никласа Лумана я начал пользоваться ящиком для заметок. Конечно, я приложил его на свой рабочий поток. Соответственно, некие статьи, интерпретации каких-то технических вещей стали появляться у меня сами собой. И я подумал: почему бы не выкладывать их хоть куда-то? Предлагать хабру свои статьи у меня совести не хватит, но сюда можно и выложить. Представляю вашему вниманию: заметка по buddy аллокатору в Linux.

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

Для того, чтобы избежать негативного эффект от фрагментации, можно:

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

Оба варианта дорогие. У второго это по формулировке видно, а первый так или иначе потребует трансляции адресов (хорошо, если аппаратной) и управление этой трансляцией для каждого выделенного кусочка памяти.

Ядро предпочло второй вариант. На это есть несколько причин:

  • Не всегда достаточно непрерывного участка линейного адресного пространства, иногда нужен именно непрерывный участок физической памяти. Например, для DMA, большинство реализаций которого не смогут транслировать адрес. Хотя да, есть аппаратные средства, например, у ARM это SMMU(System Memory Management Unit), который позволяет транслировать адреса как со стороны CPU, так и со стороны других подсистем машины. В частности, это помогает реализовывать виртуализацию аппаратных блоков, а также полезно для DPDK.
  • Для реализации проецирования памяти пришлось бы реализовать механизм, который бы часто изменял таблицу страниц памяти, которая отвечает за трансляцию, что привело бы к повышению среднего времени доступа к памяти. Это не совсем очевидно, но чтобы обновить таблицу трансляций, нужно также очистить кэш как на локальном, так и на остальных CPU, т.к. в момент изменения таблицы трансляций, записи в кэше станут невалидными (физический адрес записи в кэше мог поменяться).
  • Большие участки физической памяти могут быть доступны через страницы по 4 МБ, что сокращает промахи в TLB (Translation Lookaside Buffer). Таким образом, уменьшается среднее время доступа к памяти.

Разработчики Linux назвали свой алгоритм "buddy memory allocation" в честь так называемой "системы приятелей". Система приятелей заключается в том, что два человека могут объединить усилия в каком-либо деле, тем самым контролируя друг друга.

В рамках этого алгоритма все свободные страницы формируются в группы по 1,2,4,8..1024 (и т.д., в зависимости от аппаратной платформы) блоков. Начальный адрес каждой группы является произведением размера этой группы. Например, для группы по 16 страниц начальным адресом будет 16 * 2^12, где 2^12 — типичный размер страницы в 4 КБ. Понятно, что речь идёт о смещение относительно некоторого начала памяти для buddy allocator.

Приведу пример работы этого алгоритма:

Допустим, мы хотим выделить 1 МБ непрерывной физической памяти, то есть 256 страниц. Первым делом алгоритм проверит наличие свободного блока по 256 страниц. Если такой блок есть, то алгоритм отдаёт его, и работа закончена. Если такого блока нет, то алгоритм будет искать свободный блок по 512 страниц. Если такой блок есть, то алгоритм разобьёт его на два блока по 256 страниц, один отдаст пользователю, второй сохранит в группе других блоков по 256 страниц. Если и по 512 страниц блока не нашлось, тогда алгоритм попробует найти блок по 1024 страницы. Таким образом, блок по 1024 страницы будет разбит на три блока: один по 512, два по 256. Как только алгоритм дошёл до группы наибольшего размера и не нашёл свободной памяти, способной удовлетворить запрос, алгоритм безуспешно завершает свою работу и сигнализирует об ошибке.

Обратное действие — освобождение памяти — отсылает к названию алгоритма. Если мы хотим освободить участок непрерывной памяти размером в 1 МБ, то алгоритм попытается найти рядом свободный блок такого же размера и слить их в один блок. Таким образом, если рядом с только что освобождённым блоком по 256 страниц имеется ещё один блок по 256 страниц, то алгоритм объединит их в один блок по 512 страниц. В свою очередь, новообразованный блок по 512 страниц также может быть объединён с соседом в блок по 1024 страницы, если таковой сосед, конечно, имеется.

Формально описать правила для "приятелей", которых следует объединить, можно так:

  • Оба блока одинакового размера.
  • Оба блока находятся в одном непрерывном диапазоне физических адресов.
  • Физический адрес первой страницы в первого блока является произведением 2 * [размер блока] * [размер страницы].

UPD:

Есть дополненная версия этой статьи здесь.


2022-01-16 18:00

Стоял роутер. На нём стоял LEDE (форк OpenWRT). Прекрасный дистрибутив, окромя отсутствия некоторых пакетов из-коробки. Есть провайдер. Провайдер в чём-то косякнул (судя по фразе "а, понятно" после того, как мать назвала им время отключения интернета). Обычно я звоню им, но меня дома не было. Инженер, видите ли, не смог попасть к нам на роутер в веб-морду (интересно как он собирался это сделать, если почти на всех, в том числе и на моём доступ туда из WAN'а закрыт) и насоветовал матери сбросить настройки кнопкой. А у меня там флешка примонтирована оверлеем на корень фс. Ну и всё: минус пакеты, минус конфиги. И порт WAN не работает - возможно, что из-за отсутствия пакетов (было доставлено пару модулей ядра). Причём, у меня получилось завернуть трафик через LAN в ноутбук и таким образом раздавать дальше интернет с роутера. Но даже если я подставляю ноут в порт WAN и пингую именно через этот интерфейс - ничего не возвращается. Со стороны провайдера сейчас всё ок, напрямую всё работает. Вообще, такое ощущение, что меня специально что-то дропает, потому что первые ~30 пингов до гугла проходят, но если попытаться в этот момент загрузить что-нибудь большое, то пакеты теряются сразу же. Как-будто ограничение по трафику для конкретного MAC-адреса. Причём, после этого я даже до шлюза достучаться не могу и на бродкаст никто не отвечает.

Вообще, очень странный анамнез. Потому что MAC-адрес я менял, но ничего не изменилось. Как всё происходит: втыкаю WAN, запускаю пинг 8.8.8.8. Пинги идут, идут... Подключаюсь телефоном к роутеру, телефон начинает ходить в интернет по своим делам и всё — даже до шлюза постучаться не могу. Если телефон уже сходил куда надо и подключен, то после повторения процедуры достаточно открыть любую страницу в Интернете, чтобы всё упало.

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


2018-05-07 08:46

Итак, меня зовут Сергей, мне 21 год и я... Я - программист. Что это значит для меня? Вообще, я считаю, что программист - это профессия. То есть, умение программировать не делает тебя программистом. Что делает? Ну, раз это профессия, то логично, что программистом тебя делает запись в трудовой.

Но вот возьмём программирование как инструмент. Если взглянуть на жизнь среднестатистического программиста со стороны, то можно заметить, что этим инструментом он пытается "чинить" вещи, которые другому человеку показались бы вовсе не сломанными. Вот захотел ты почистить историю сообщений в ВК: накатал небольшой скрипт, который прошёлся по всем чатам и нажал на крестик. Облачные хранилища? Можно ведь поднять файлопомойку у себя на роутере. И так во всём.

Написать этот текст меня сподвигла история с моим callme. Дело в том, что он мне немного облегчил жизнь в плане того, что мне не надо проверять долгоиграющие команды на предмет факта их выполнения - я жду уведомление в телегу. И что делает РКН? Пытается его заблокировать. Но я же умный шибко. Я завернул траффик в Tor. Пришлось заново собирать жирный бинарник у которого аргументы для компилятора заняли половину экрана. А вот не выёбывался бы - никуда лезть не пришлось бы. Уведомлялки для торрентов падают постоянно. Просто сами. С десктопом тоже можно много чего натворить. Одна клавиатура, проброшенная в виртуалку с виндой ради дров, чего стоит.

И это работает совсем не идеально. Я бы даже сказал, что с горем пополам. Зато оно работает. Пусть и создаёт новые проблемы для новых костылей и велосипедов.


2018-05-01 16:11
Взял новый нуббук. Что можно сказать: он почти на сантиметр тоньше — им бриться можно, SoC Apollo Lake, то есть Celeron, нормальный звук, который, кстати, спрятан в торце под экраном, аллюминевый корпус, чуть больше оперативы, экран FullHD.

Итак, самое главное: Linux сюда встал. Причём, я юзаю кеду. И она почти не лагает. Скажем так, не больше, чем на десктопе. Просто я довольно сильно преображаю интерфейс, на фото видно. И это Celeron. С Celeron'ом у ядра линуха нет таких проблем как с Atom'ом. Никаких проблем с графоном, никаких проблем со звуком. Даже вай-фай, вроде, из коробки заработал. Неправильно, правда, но на установку хватило. А там я уже собрал правильные дрова для вафли.

Вообще, должен сказать, что это просто космическая вещь. Это я понял ещё со старым ноутом, но здесь это сильнее проявляется. Он маленький, он лёгкий. Производительности мне здесь выше крыши, ведь самое требовательное ПО у меня — браузер. Я думаю от какого-нибудь MacBook 2015 этот эффект ещё сильнее. И по большому счёту, я бы мог взять его... Положим, не один месяц подкопив... Но я понимаю, что, когда ты берёшь ноут практически всегда и во все места, он рискует кончить раньше времени. Поэтому я трачу ту сумму, которую мне было бы не так жаль выкинуть. То есть, это определённо деньги, да. Неплохие деньги даже, наверно. Но это не та сумма, из-за которой я бы стал страдать, потеряв её. А вот потеряв 90к, я бы прихуел, да.

Итак, немножко горького: у ядра линуха проблем нет, но с grub'ом данная мамка не дружит. У меня в голове эта мысль вообще не расширяется. Но я особо и не вникал. Как-то, когда ты начинаешь работать в этой сфере, отдыхать в ней не хочется. Поэтому, понадобился rEFInd. И rEFInd здесь, как я сейчас понимаю, из-за винды, не встал нормально. Но мне удалось ручками добавить UEFI запись и загрузиться, куда надо. Семь часов я провозился с установкой и настройкой. Оно того стоило, поссаны. А вот сегодня я понял, что забыл swap-раздел сделать. И тут понеслось...

Партишн менеджер KDE выпал в ошибку на середине применения изменений. Дело в том, что он решил, что я хочу перенести системный раздел на 51 МБ вправо. Я даже знать не хочу, с чего это он. И соответственно, таблица похерилась и мой раздел оказался там, не знаю где. Но, я же знаю, где настоящее начало раздела. На 51 МБ влево. Но чем можно переписать начало..? Я так и не нашёл ответ на этот вопрос, но я нашёл утилиту gpart. Она сама нашла мой раздел и именно на том месте, которое мне нужно было. Осталось только записать новую таблицу и вуа-ля. Окромя загрузчика. Он куда-то проебался. Не знаю. Знать не хочу. Оно само. Я пытался восстановить запись, но rEFInd не отзывался. Я плюнул, форматнул EFI-раздел и поставил его заново. Всё заработало.

Кстати, по поводу rEFInd: он реально не умеет обновлять путь до initrd? 2018 год, к'мон. Мне пришлось через systemd перед шутдауном дёргать скрипт, который записывает в refind_linux.conf путь к последнему initrd. Потому что после обновления ядра, имя initrd поменялось, и я пососал дуду. Но я, сука, самец. В такие моменты чувствуешь себя кулхацкером.


2018-03-18 20:31

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


2017-12-26 12:32

Как же меня бесит путаница обывателей с тремя, ставшими матерными, буквами: VPN — это: и программа для смены ip-адреса, и прокси-сервер, и луковичная маршрутизация, подразумевающая предыдущие два пункта. Естественно, люди вовсе не разбираются в этих терминах. Конечно же, они и не обязаны.

Но, блять, доходит до настолько смешного, что уже не смешно. Опущу более-менее привычные случаи. Пару постов назад я рассказывал про то, как поднимал у себя VPN. После того, как я рассказал матери, в том числе о том, что внешний ip будет нашим домашним, она спросила: "а в чём тогда смысл?". А ведь человек по работе пользуется данной технологией.

Основной смысл VPN как раз в том, чтобы получить себе virtual network — стать частью локальной сети — и private network — обеспечить трафик этой сети шифрованием, чтобы его нельзя было посмотреть вне нашей virtual network. Я, в частности, в шифровании особо не нуждаюсь: всё, что можно подслушать в моём трафике — абсолютно бесполезная информация. За исключением пары реп, но там в любом случае всё ходит по шифрованным каналам. Но зато теперь я могу получить доступ к samba-шарам и RDP/VNC со своих устройств из любой точки доступа в интернет, не открывая лишний раз доступ извне внутрь своей локальной сети.

Люди, пожалста, хватит насиловать терминологию! Называйте эти штуки штуками, ну которые, ну ты понил( '-').


2018-03-18 20:31

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


2017-12-26 12:32

Как же меня бесит путаница обывателей с тремя, ставшими матерными, буквами: VPN — это: и программа для смены ip-адреса, и прокси-сервер, и луковичная маршрутизация, подразумевающая предыдущие два пункта. Естественно, люди вовсе не разбираются в этих терминах. Конечно же, они и не обязаны.

Но, блять, доходит до настолько смешного, что уже не смешно. Опущу более-менее привычные случаи. Пару постов назад я рассказывал про то, как поднимал у себя VPN. После того, как я рассказал матери, в том числе о том, что внешний ip будет нашим домашним, она спросила: "а в чём тогда смысл?". А ведь человек по работе пользуется данной технологией.

Основной смысл VPN как раз в том, чтобы получить себе virtual network — стать частью локальной сети — и private network — обеспечить трафик этой сети шифрованием, чтобы его нельзя было посмотреть вне нашей virtual network. Я, в частности, в шифровании особо не нуждаюсь: всё, что можно подслушать в моём трафике — абсолютно бесполезная информация. За исключением пары реп, но там в любом случае всё ходит по шифрованным каналам. Но зато теперь я могу получить доступ к samba-шарам и RDP/VNC со своих устройств из любой точки доступа в интернет, не открывая лишний раз доступ извне внутрь своей локальной сети.

Люди, пожалста, хватит насиловать терминологию! Называйте эти штуки штуками, ну которые, ну ты понил( '-').


2017-10-19 15:07

Сидел, "перепаивал" свой wakepeka под новый роутер. Изначально всё задумывалось как "поменять ip'шник — profit!". Однако, каким-то чудом(скорее всего распиздяйством провайдера) я получил ip старого договора. Полагаю, по старому договору теперь интернет получить не получится. Да и без ранзницы, на самом деле. Просто меня чёрт дёрнул на новом зверьке аутентификацию исключительно по ключам сделать. Библиотека, которую я юзал, вполне поддерживает ключи, но не всё так просто. Мне пришлось прям джаву вспоминать, чтобы её туда вкорячить.

Если не пускаться в неудачные попытки, то начать нужно с того, что опытным (и очень длинным) путём установлено, что клиент библиотеки не мог договориться с сервером. Тыкая пальцем в гугл, я нашёл предложение воткнуть в конфиг openSSH строчку с Kex алгоритмами. Это всё, конечно, замечательно, но у меня стоял dropbear и у него порядка 8 параметров. Может, где-то лежит ещё один конфиг, но я его не нашёл, а я искал.

В конце концов, конечно же, я психанул. Я поставил OpenSSH вместо(рядом с растроенным) dropbear. Собственно, мою проблему это не решило. А с чего бы. И та строчка с Kex не сработала. Проблема не здесь была. А узнать, где проблема, мне помогла возможность запуска OpenSSH с ручным указанием лог-файла. А проблема была в том, что по дефолту в параметре Ciphers нет тех алгоритмов, которые просит библиотечка.

А на этом всё!


2017-10-19 02:10

Всё началось с того, что один старый мудак, который год назад громче всех топал, что провода для пидоров и ему нужен ваф-ляй, сказал, что я забрал у него кабель от интернета, и он провёл себе новый интернет(от другого провайдера). О чём, конечно же, мы узнали предыдущим вечером. Попросили этого фанфурика провести себе отдельный кабель, на что тот ответил "я проложу так, как мне удобно". Эти умники из эМТээСа повесели, блять, на бельевую верёвку новый роутер(старый оказался "сломаным"(на нём стоял OpenWRT, судя по формулировке, они даже в Luci не попали)) и отчекрыжили старый кабель. Вся соль в том, что у моего провайдера железо в соседнем подъезде. По итогу, часть кабеля соединили с огрызком старого кабеля (неиспользуемые жилки) и всё вроде как заработало... Но это я до софта не дошёл

Предвкушая новую игрушку, я сразу же побежал в магазин за новым роутером. Взял на пару линеек младше, но из-за разницы в возрасте он оказался мощнее. Всё-таки на 32мб оперативы у меня tor вообще не поднимался. И понеслось, с утра до вечера: аутентификация ssh по ключам, проброс портов, samba, ftp, tor, openvpn. В течение этого процесса я закомментил конфиг с WAN сетью в файле uci и он у меня потерялся. По итогу, я вообще не смог вспомнить, как он должен выглядеть. С самого роутера доступ есть, всех пингую, всё работает, а в LAN не раздаёт. Хотя на днях мне пришлось маршрутизировать для этих целей трафик между мтсовским роутером и новым роутером своей пекарней. Вот такой я извращенец, да. А вы чего думали: засунул между пк и роутером, и на usb-сетевухе сэкономил? Нее, она должна свои ~300 деревянных окупить хоть как-то. Всё закончилось тем, что я тупо ресетнул всё. Пришлось заново накатывать overlay с флешки, всё заново настраивать, но большую часть я сделал гораздо быстрее, чем на днях

Вот только VPN... Сука, я трахался с ним часа 4, я теперь даже дрочить перед сном не пойду. Это просто жесть. Сначала с горем пополам настроил его в режими TAP — "Android only support TUN (not TAP)". Перенастроил под TUN. Траффик не в какую не форвардился никаким образом. Единственное, что я мог — пинговать сервер. Настроил tor на телефоне. Хоть что-то... Потом, полез дальше разбираться и как-то так получилось, что я перекрыл VPN'овской сетью LAN'овскую. А это значит пермаментный дисконнект SSH по LAN. Хорошо, что я не такой нуб, чтобы не смочь всё исправить: полез по SSH с телефона через VPN — всё получилось, только пришлось менять приватный ключ в телефоне на ключ пекарни(я отключил вход по паролю).

В общем, я сам не понял как, но сейчас myip.ru показывает мне мой домашний ip, а ping достукивается до моей пекарни — это всё, что я хотел. По-тихоньку откажусь от проброса портов в пользу включения устройства в локальную сеть. Кстати, я использую VPN не исключительно как прокси, да-да — я существую!


2017-10-18 01:03

Наконец-таки допилил своё приложения для показа слайдов. Очень топорно, но теперь, по крайней мере, не нужно иметь техническое образование, чтобы им воспользоваться. И я окончательно разучился верстать, это да.

Прочекать, что у меня получилось можно здесь.


2017-09-23 19:16

Кажется, у меня зависимость от программирования. Прямо взаправдашняя( '-'). Раньше такое тоже случалось, конечно. И я-то как раз не удивлён. Просто я никогда этим ни с кем не делился.

Началось всё часов 5 назад. Я хотел быстренько наклипать пример использования LogitechLCDSDK, а в итоге вывел самую настоящую картинку из файла, разрисованную попутно в самой программе. Это, мягко говоря, больше, чем я задумывал. И у меня всё болит. И то, на чём сижу, и то, чем я смотрю, и прочее. Пойду я спать, поздно уже.


2017-09-18 01:06

Так, итак, я сделал страничку с портфолио.

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


2017-09-02 00:04

Пилю свой "тык". Уже потрачено много часов. Причём, заюзана библиотека, которую я пилил не так давно, главный файл которой имеет в себе порядка 700 строчек.

Мерить труд программиста в строчках — такое себе, конечно, но а как ещё, окромя часов?

Итак, суть в чём: предоставить сервис для показа презентаций. Да, подавляющая часть компьютеров, с которых показываются презентации имеют на себе установленную прогу PowerPoint, НО: я, например, как и 5% юзеров десктопов (юзверей линуха) не имею никакой возможности установить непосредственно на хост-систему Microsoft Office. Я обычно пользуюсь LibreOffice и прекрасно понимаю, что о 100%'ой совместимости с микромягким офисом можно не мечтать. Есть выход — юзать PDF. Но тут мы напарываемся на такой сук, что есть необходимость двигаться, махать руками, взаимодействовать с публикой и иметь возможность "тыкать" презентацию.

Тут поподробнее. Я много раз видел людей, которые втыкали донгл от собственной беспроводной мыши. /* - Йо, чувак, юзай кликеры! - Йо, чувак, давай я твою м#!#&шу поюзаю!*/ Кликеры — действительно удобная вещь. Только видел я их исключительно в магазинах.

— Четыре телека?

— Да пожалуйста!

— Самый дешманский пульт для презентаций?

— Ога, а дуду тебе не поласкать?

Таким образом, я подвёл к основному функционалу данного сервиса — "тыканье" слайдов. Открываете страничку в браузере на проекторе, открываете страничку в браузере на телефоне — profit! Сделав свой телефон хостом на данном показе, гостевые устройства начинают повторять переключение слайдов. БАМ, С#!А, БАМ! Ну, а когда вы можете переключать слайды на проекторе простым свайпом в телефоне, возникает вопрос: неужели все эти технологии пущены практически вникуда? Когда гостевым устройством может стать любой телефон или ноутбук в зале, неужели весь функционал в таком случае — смотреть презентацию на родном устройстве?

И тут я пришёл к выводу, что это — та точка, которая является просто бесконечным пространством для фантазии. Ну сёрьёзно: было бы прикольно, если бы слушатель, прежде чем задать вопрос, указал, что именно ему непонятно? "Тыкнул" бы себе в экран, а это нажатие увидели все. Интерактивная указка..? Наверно, так и назову.

Да и неплохо было бы засунуть конспект выступающему. Да ещё чтоб с "якорями", чтобы текст проматывался просто от перелистывания слайдов.

А ещё было бы замечательно прикрутить сюда нормальные посты. А то как-то не найс такие простыни выкладывать, когда они несколько экранов занимают. Я вообще планировал этот бложик больше в стиле твиттера... Но я до сих пор не сделал ему морду и пишу посты через mysql-workbench


2017-05-10 00:34

Внезапно: упала кеда. Если точнее, то плазма. Может быть, она обновилась на 5.9 и умерла, хотя я вроде не обновлял... Да и не должно быть 5.9 в репах Ubuntu 16.10, а упала она до do-release-upgrade

Это может означать только одно - ухожу на дебиан. Буду юзать пакеты трёхлетней давности, зато система не будет рандомно уходить в чёрный экран

Недавно с ноутом плюнул на линяху и начал юзать винду...

Куда я качусь...

И по учёбе говно...

З.Ы.

Пробовал я и конфиги дропать, и кэш - толку нет

З.З.Ы.

Перекантуюсь на LXDE пару дней. Всё равно стоит для удалёнки.


2017-04-19 00:09

Дорогой дневник, сегодня я настроил в виртуалке сервер, который отдаёт статику, используя nginx, и взаимодействует с бэкендом через Apache.

Я устал :С


2017-03-20 15:42

Вот если бы не название поста, то я бы просто подписал это как "Вот и гадайте, почему у меня приложение на Java под Android пишет мне, что она — Linux, и вообще у неё MIPS-процессор. Может система думает, что она стоит на тостере?". Но к сожалению уже не прокатит.

Планирую написать приложение для часов, которое бы включало мой компьютер. И фиг бы с ним, разбираться с Sony Add-on SDK, даже фиг с тем, что мне надо разбираться с разработкой под Android — мне вообще нужно начинать с Java. Благо, как оказалось, Java вполне можно изучать на примере Android. По-тихоньку двигаюсь, но всё-таки не терпится всё доделать.

Вот сейчас как раз остановился на том, что успешно принял ответ от команды "uname -a" по SSH. До этого, вчера успешно исполнил команду, пишущую файл на маршрутизаторе. Работаю сразу с домашним маршрутизатором, потому что именно он у меня "будит" "магическим" пакетом мою ПеКарню.


2017-02-16 01:25

Тут я вообще не понял. Честно говоря, я почти забыл, что такое было, и что я записал видео.

В какой-то момент, поставив плеер на зарядку от комплюхтера, я нажал на плей, чтобы проверить наушники и из колонок заиграла музыка. Я бы в принципе понял, если бы плеер вдруг начал играть музыку, используя звуковуху от пекарни. Вот это бы поместилось у меня в голове. Но чёрт возьми: линуха перехватила нажатие кнопки и включила музыку в Amarok (стандартный кедный плеер).

Кстати, один только вконтактовский фрейм увеличил время загрузки страницы "на холодную" на ~8-10 секунд. На минуточку: эти 8-10 секунд прибавились к двум секундам. И это время по вафле, не по кабелю. Пэтому вот ссыль, держи


2017-02-10 01:36

Тот момент, когда сам у себя хочешь украсть данные карты


2017-02-10 01:26

Ну, тут я могу только похвастаться. Ну, ещё про SSH.NET упомянуть: он есть.

Меня постепенно начало напрягать, что роутер висящий как бы с делом (всякие ftp- samba- серверы, wol через него осуществляю и т.д.) перезагружают /* ВНИМАНИЕ: */ вилкой и розеткой. Точнее их размыканием.

Ну вот я могу как все нормальные люди всего лишь научить мать пользоваться веб-интерфейсом... Ну да, по три минуты логиниться, блуждать в хитросплетении вкладок, искать заветную кнопку *eboot.

Хоспаде, конечно же я так не сделал. Я взял свой прикладной домашний C# (по крайней мере в этом году), собрал после недолгого гугленья библеотечку SSH.NET и подцепил к небольшому проектику, в который накидал две кнопки: "выход" и заветный *eboot. Последняя собственно отправляет нужную команду по ssh прямиком на заряженный священным OpenWRT роутер

Результат, собственно, на скрине


2017-01-25 00:19

Сидел, допиливал один проектик, ориентированный на юзанье в браузере с телефона. Естественно, логично было бы после всего, что я сделал, открыть страничку на телефоне и проверить: работает там чё-нить ваще или нет. Прогрузилась, картина маслом: всё поехало, что-то вообще без стилей...

Знакомьтесь, кэш. Дело в том, что браузер положил себе на диск всю загруженную статику, а затем спокойно решил грузить стили с диска, а не с сервера. Это значительно ускоряет загрузку страниц, однако после изменений может пройти значительное время, а пользователи так и будут смотреть на съехавшее изображение.

Что делать? Дать ему новый файл. Влом каждый раз переименовывать? Ясень перец, это нормально. Файл мы оставим прежним, а вот ссылку поменяем. Достаточно передать параметр и браузер железно пройдёт по ссылке - сервер действительно мог бы отдать ему отличный файл в зависимости от параметра. Но в нашем случае он будет бесполезным. Должно получиться что-то вроде:

style.css?dsa=0

Но согласитесь, каждый раз при изменении стилей лезть перебивать ссылки: а если у вас страниц таких 20-30? А если больше? Есть ещё один вариант. Подробно расписывать не буду, так как вариант тоже не очень удобен. Можно этот переданный параметр рандомить каждый раз. Тогда каждый раз, при открытии, будет новая ссылка. Но, к сожалению, тогда пользователи остануться совсем без кэша.

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

<link rel="stylesheet" type="text/css" href="style/main.css?d=<?php
echo date("dHis", filemtime('style/main.css'));
?>"/>

Тогда ссылка примет вид:

style/main.css?d=17223450

Таким образом, при обновлении файла браузер найдёт обновлённую ссылку и пойдёт качать новый.


2017-01-18 06:21

Решил я использовать СД'шку с планшета в каких-то более оправданных целях, чем третья квака и 7 гигов досовских игр: воткнуть в ноут и поставить Visual Studio.

Сюрприз: инсталлятор меня послал, сказав, что нельзя ставить на сменные носители. Я послал его, создав символическую ссылку и задав её как папку назначения установки. Из 15-ти гигов, 4 он действительно поставил на СД'шку, а стальные 24 папки (ещё где-то 5-6 ГБ) кинул в Program Files. Микромягкие, вы там совсем..? Вот вы — те, кто вернул 2007 в предыдущем посте.

Ну, я кинул папули на флешку и запилил под них символические ссылки, но всё оставшееся находилось в папке Windows. Не то чтобы я ссу, но всякие библиотеки и прочее кидать на СД'шку второго класса со скоростью чтения <10 МБ/с... Ну такое...


2017-01-16 04:27

С горем пополам встала лубунта 17-ая с вот отсюда. Да, образы для стиков изначально делались, но разницы особой нет.

Сам думал, что дистры, производные от бубунты ничем не отличаются, кроме окружения, но был неправ, видимо. Например MATE я даже поставить не смог: просто вырубался во время загрузки, даже с подключенным монитором. Интелы жутко намудрили с видео здесь: как я понял здесь на экран картинка выводится через hdmi-выход... ( '-')

Энивэй, без звука поживу, зато блюпуп настроил.

Ладно, пошёл я VS ставить на огрызок винды оставшийся

Оставлю тут "скриншот" Atom + MySQL Wb + Chrome


2017-01-14 15:52

Взял себе планшет, с несъёмной клавиатурой и без сенсорного экрана, зато на 14 дюймов.

Из этого, собственно, и вытекло то, что установить на него линукс ещё сложнее (в виду intel'овского проца и их секса с hdmi-портом), чем на простой android-планшет. Кучу дистров перепробывал: то понос, то золотуха. Хубунты 16.04, 16.10 не знаю ни о bluetooth, ни о звуке в этом ноуте, а Убунта 17.04 альфа-бета-гама-тета-дриснета упорно вырубает всё, кроме лампочки питания. Сама установка протекает странно: через hdmi к монитору, иначе такая же дрисня. Хубунты заводились после установки нормально, но во время — точно так же, как и убунта 17.04.

Сейчас он на зарядке, позже попробую убунту 16.10. Если так же откажется работать со своим экраном, то копать в сторону дистра, а если потеряет звук с блюпупом, то копать в сторону ядра.

meeeeh..

UPD:

Поставил Убунту — опять вырубился после загрузки. По-моему вырубается не только экран. Даже мышка гаснет. Возможно, ноут весь падает.

UPD2:

Что-то рука дёрнулась Лубунту лайв запустить без hdmi и она заработала. Но теперь я не могу поставить: инсталлятор не запускается. Чекну отдельный пункт граба с флешки.

UPD3:

Сутки воевал с этой дриснёй и всё, чего я добился, это блюпуп. И странный глюк с иксами Просто ничего не воспроизводит. Ни онлайн, ни локально, ни видео, ни аудио. Пиняю на звук, как наладить - хз. Вот сейчас понял, что надо бы тире настроить. Завтра норм пост напишу.

З.Ы.

Даже винда не детектит автоматом эти устройства и не ставит дрова. Не то чтобы винда эталон, но это тот случай, когда производителю реально пришлось ставить какое-то необходимое ПО, а при переустановке ОС без этих дров ничего не заведётся. Что за п#*ор вернул 2007?


2017-01-13 09:52

Ничего необычного, просто МуСКуЛ на телефоне.

Я ещё Bluefish поставил, но не стал "скринить". Не очень как-то душа к нему: я только-только с Notepad++ на Atom пересел, а тут ни первого, ни второго в репах нет. Думал уже atom собрать, но потом такой — meeeeh...


2017-01-09 02:03

Первые три тестовых поста удалять не буду, пожалуй. Изюменка ( '-')


2017-01-06 06:26

Ну вот, ай'м бэк'нулся.

Это первый и последний пост, который я восстановлю. Хотя нет — фигу на него. Просто пытался написать пост о том, что я починил базу, после того как случайно дропнул таблицу с постами, как оказалось, что моя база думает, что я — швед. Ну да неважно.

meeeeeh...


2017-01-06 05:55
dsagsaaew

2017-01-06 04:37
dsadsadsa

2017-01-06 00:35
gfdnkjhgfdskjgfd

0000-00-00 00:00