Как увеличить размер смонтированного раздела ext4 / home gpt без потери данных?

Начиная с Linux kernel v4.2-rc5 невозможно перехватывать напрямую, используя интерфейсы, используемые libpcap. libpcap использует специфичный для Linux домен AF_PACKET (псевдоним PF_PACKET), который позволяет захватывать данные только для данных, проходящих через "netdevice" (например, интерфейсы Ethernet).

Не существует интерфейса ядра для захвата данных из AF_UNIX сокетов. Стандартный Ethernet-захват имеет Ethernet-заголовок с источником/назначением и т.д. Unix-сокеты не имеют такого фальшивого заголовка, и в реестре типов заголовков канального уровня нет ничего, связанного с этим.

Основными точками входа для данных являются unix_stream_recvmsg и unix_stream_sendmsg для SOCK_STREAM (SOCK_DGRAM и SOCK_SEQPACKET имеют аналогично названные функции). Данные буферизуются в sk->sk_receive_queue и в unix_stream_sendmsg функции, нет кода, который в конечном итоге привел бы к вызову tpacket_rcv функции для захвата пакетов. Смотрите этот анализ от osgx на SO для более подробной информации о внутреннем устройстве захвата пакетов в целом.

Возвращаясь к первоначальному вопросу о AF_UNIX мониторинге сокетов, если вас интересуют в основном данные приложения, у вас есть несколько вариантов:

  • Пассивный (также работает для уже запущенных процессов):
    • Использовать strace и перехватывать возможные системные вызовы, выполняющие ввод/вывод. Их много, read, pread64, readv, preadv, recvmsg и многие другие... См. пример @Stéphane Chazelas для xterm. Недостатком этого подхода является то, что сначала нужно найти дескриптор файла, и тогда вы можете пропустить системные вызовы. С strace вы можете использовать -e trace=file для большинства из них (pread покрывается только -e trace=desc, но он, вероятно, не используется для Unix сокетов большинством программ).
    • Включаем/изменяем unix_stream_recvmsg, unix_stream_sendmsg (или unix_dgram_* или unix_seqpacket_*) в ядре и выводим данные, куда-нибудь. Вы можете использовать SystemTap для установки таких точек трассировки, вот пример для мониторинга исходящих сообщений. Требуется поддержка ядра и наличие отладочных символов.
  • Активный (работает только для новых процессов):

    • Используйте прокси, который также записывает файлы. Вы можете написать быстрый мультиплексор самостоятельно или взломать что-то вроде этого, что также выводит pcap (помните об ограничениях, например, AF_UNIX может передавать дескрипторы файлов, AF_INET - нет):

      # поддельный TCP-сервер подключается к настоящему сокету Unix
      socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CONNECT:some.sock
      # запустить перехват пакетов на указанном порту
      tcpdump -i lo -f 'tcp port 6000'
      # клиенты подключаются к этому сокету Unix
      socat UNIX-LISTEN:fake.sock,fork TCP-CONNECT:127.0.0.1:6000
      
    • Используйте специальный прокси для приложений. Для X11 есть xscope (git, manual).

Предложенная опция CONFIG_UNIX_DIAG, к сожалению, здесь также не поможет, она может использоваться только для сбора статистики, а не для получения данных в реальном времени по мере их поступления (см. linux/unix_diag.h).

К сожалению, на данный момент не существует идеальных трассировщиков для сокетов домена Unix, которые производят pcaps (насколько мне известно). В идеале должен существовать формат libpcap, который имеет заголовок, содержащий PID источника/деста (если он доступен), затем необязательные дополнительные данные (учетные данные, дескрипторы файлов) и, наконец, данные. Если этого нет, то лучшее, что можно сделать, это отслеживание системных вызовов.


Дополнительная информация (для заинтересованного читателя), вот некоторые бэктрейсы (полученные с помощью GDB взлома на unix_stream_* и rbreak packet.c:. , Linux в QEMU и socat на основной Linux 4.2-rc5):

# echo foo | socat - UNIX-LISTEN:/foo &
# echo bar | socat - UNIX-CONNECT:/foo
unix_stream_sendmsg at net/unix/af_unix.c:1638
sock_sendmsg_nosec at net/socket.c:610
sock_sendmsg at net/socket.c:620
sock_write_iter at net/socket.c:819
new_sync_write at fs/read_write.c:478
__vfs_write at fs/read_write.c:491
vfs_write at fs/read_write.c:538
SYSC_write at fs/read_write.c:585
SyS_write at fs/read_write.c:577
entry_SYSCALL_64_fastpath at arch/x86/entry/entry_64.S:186

unix_stream_recvmsg at net/unix/af_unix.c:2210
sock_recvmsg_nosec at net/socket.c:712
sock_recvmsg at net/socket.c:720
sock_read_iter at net/socket.c:797
new_sync_read at fs/read_write.c:422
__vfs_read at fs/read_write.c:434
vfs_read at fs/read_write.c:454
SYSC_read at fs/read_write.c:569
SyS_read at fs/read_write.c:562

# tcpdump -i lo &
# echo foo | socat - TCP-LISTEN:1337 &
# echo bar | socat - TCP-CONNECT:127.0.0.1:1337
tpacket_rcv at net/packet/af_packet.c:1962
dev_queue_xmit_nit at net/core/dev.c:1862
xmit_one at net/core/dev.c:2679
dev_hard_start_xmit at net/core/dev.c:2699
__dev_queue_xmit at net/core/dev.c:3104
dev_queue_xmit_sk at net/core/dev.c:3138
dev_queue_xmit at netdevice.h:2190
neigh_hh_output at include/net/neighbour.h:467
dst_neigh_output at include/net/dst.h:401
ip_finish_output2 at net/ipv4/ip_output.c:210
ip_finish_output at net/ipv4/ip_output.c:284
ip_output at net/ipv4/ip_output.c:356
dst_output_sk at include/net/dst.h:440
ip_local_out_sk at net/ipv4/ip_output.c:119
ip_local_out at include/net/ip.h:119
ip_queue_xmit at net/ipv4/ip_output.c:454
tcp_transmit_skb at net/ipv4/tcp_output.c:1039
tcp_write_xmit at net/ipv4/tcp_output.c:2128
__tcp_push_pending_frames at net/ipv4/tcp_output.c:2303
tcp_push at net/ipv4/tcp.c:689
tcp_sendmsg at net/ipv4/tcp.c:1276
inet_sendmsg at net/ipv4/af_inet.c:733
sock_sendmsg_nosec at net/socket.c:610
sock_sendmsg at net/socket.c:620
sock_write_iter at net/socket.c:819
new_sync_write at fs/read_write.c:478
__vfs_write at fs/read_write.c:491
vfs_write at fs/read_write.c:538
SYSC_write at fs/read_write.c:585
SyS_write at fs/read_write.c:577
entry_SYSCALL_64_fastpath at arch/x86/entry/entry_64.S:186

tpacket_rcv at net/packet/af_packet.c:1962
dev_queue_xmit_nit at net/core/dev.c:1862
xmit_one at net/core/dev.c:2679
dev_hard_start_xmit at net/core/dev.c:2699
__dev_queue_xmit at net/core/dev.c:3104
dev_queue_xmit_sk at net/core/dev.c:3138
dev_queue_xmit at netdevice.h:2190
neigh_hh_output at include/net/neighbour.h:467
dst_neigh_output at include/net/dst.h:401
ip_finish_output2 at net/ipv4/ip_output.c:210
ip_finish_output at net/ipv4/ip_output.c:284
ip_output at net/ipv4/ip_output.c:356
dst_output_sk at include/net/dst.h:440
ip_local_out_sk at net/ipv4/ip_output.c:119
ip_local_out at include/net/ip.h:119
ip_queue_xmit at net/ipv4/ip_output.c:454
tcp_transmit_skb at net/ipv4/tcp_output.c:1039
tcp_send_ack at net/ipv4/tcp_output.c:3375
__tcp_ack_snd_check at net/ipv4/tcp_input.c:4901
tcp_ack_snd_check at net/ipv4/tcp_input.c:4914
tcp_rcv_state_process at net/ipv4/tcp_input.c:5937
tcp_v4_do_rcv at net/ipv4/tcp_ipv4.c:1423
tcp_v4_rcv at net/ipv4/tcp_ipv4.c:1633
ip_local_deliver_finish at net/ipv4/ip_input.c:216
ip_local_deliver at net/ipv4/ip_input.c:256
dst_input at include/net/dst.h:450
ip_rcv_finish at net/ipv4/ip_input.c:367
ip_rcv at net/ipv4/ip_input.c:455
__netif_receive_skb_core at net/core/dev.c:3892
__netif_receive_skb at net/core/dev.c:3927
process_backlog at net/core/dev.c:4504
napi_poll at net/core/dev.c:4743
net_rx_action at net/core/dev.c:4808
__do_softirq at kernel/softirq.c:273
do_softirq_own_stack at arch/x86/entry/entry_64.S:970

-1
27.05.2018, 13:46
1 ответ

No he usado fdisken mucho tiempo. Uso gdisk, y con gdiskpuede eliminar /dev/sda5, y luego eliminar /dev/sda4, y luego crear sda4 nuevamente con el mismo desplazamiento inicial (, tenga cuidado)como antes, pero con el tamaño establecido en lo que quieres que sea. Una vez hecho esto, guarde y salga. Es posible que deba ejecutarpartprobe(desdeparted)para actualizar el /proc/partitions. Una vez que /proc/partitionsse actualiza con el tamaño actualizado de /dev/sda4y /dev/sda5desaparece, ejecute resize2fs /dev/sda4para cambiar su tamaño. También en fdiskantes de realizar cualquier cambio, asegúrese de configurar las unidades de visualización en sectores (usando el comando u).

1
28.01.2020, 05:10

Теги

Похожие вопросы